当前位置:网站首页>第四篇,STM32中断控制编程
第四篇,STM32中断控制编程
2022-07-06 17:07:00 【车水码浓】
1.中断概念
中断指的是在计算机工作期间,出现了需要立即停止正在运行的程序,转而去处理意外发生的情形。发生中断之后,CPU会去执行事先写好的处理中断的代码,处理完成后回到被打断的位置继续执行。
编写中断程序需要注意事项:
a.中断处理程序执行事件尽量短(不能睡眠以及延时),给其他程序让出CPU。
b.中断程序中访问的共享数据必须进行保护。
Stm32中断流程,Stm32中,中断源产生中断信号,提交给向量中断控制器(NVIC),中断控制器做进一步处理再提交给CPU,CPU执行中断处理中断处理程序
2.向量中断控制器(NVIC)
(1)NVIC介绍
NVIC外部中断(中断信号来自于芯片外部),一共有23个外部中断源,包括16个GPIO中断和7个其他中断。
(2)中断优先级 (数字越小,优先级越高) 这点需要特别注意。
stm32的中断优先级分为2类:抢占优先级和响应优先级
抢占优先级:抢占优先级高的中断可以打断抢占优先级低的中断
响应优先级:响应优先级高的不能打断响应优先级低的中断,当两个抢占优先级相同的两个中断同时发生,CPU优先处理响应优先级比较高的中断。抢占优先级和响应优先级一起最多占8位或者4位字节,配置两个优先级所占的位数叫做中断优先级分组。
以上NVIC的配置,通过库函数NVIC_Init()来实现
优先级分组是通过NVIC_PriorityGroupConfig来配置,该函数只能在程序开头调用,并且只能调用一次
NVIC配置函数
void NVIC_Init (NVIC_InitTypeDef* NVIC_InitStruct);
//传入NVIC初始化结构体
typedef struct
{
uint8_t NVIC_IRQChannel; /*!< 中断通道 @ref IRQn_Type */
uint8_t NVIC_IRQChannelPreemptionPriority; /*!< 抢占优先级 */
uint8_t NVIC_IRQChannelSubPriority; /*!< 响应优先级 */
FunctionalState NVIC_IRQChannelCmd; /*!< 使能/禁止 ENABLE or DISABLE */
} NVIC_InitTypeDef;
优先级分组配置函数
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
参数:
* @arg NVIC_PriorityGroup_0: 0 bits for pre-emption priority
* 4 bits for subpriority
* @arg NVIC_PriorityGroup_1: 1 bits for pre-emption priority
* 3 bits for subpriority
* @arg NVIC_PriorityGroup_2: 2 bits for pre-emption priority
* 2 bits for subpriority
* @arg NVIC_PriorityGroup_3: 3 bits for pre-emption priority
* 1 bits for subpriority
* @arg NVIC_PriorityGroup_4:4 bits for pre-emption priority
* 0 bits for subpriority
3.外部中断源EXIT
(1)EXIT主要的特性(在编写程序时常用特性)
每个中断/事件线上都具有独立的触发和屏蔽
每个中断线具有专用的状态位
支持多达23个软件事件/中断请求
(2)EXIT处理框图
(3)外部中断源映射
在stm32中,一共有16个GPIO中断,stm32中的GPIO引脚,一共有16(A~I)组引脚,每一个GPIO都能配置成一个外部中断,通过不同的引脚序号将不同中断触发源分成不同的组,这也是stm32的一个强大之处。
PA0,PB0,PC0, ... ...PH0,PI0为一组中断源,以此类推,一共有16组中断源,每一组只能有一个中断触发源工作,那么,整个中断源做多工作的也就16个外部中断。STM32F103 的中断控制器⽀持 19 个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独⽴的触发和屏蔽设置。STM32F103 的19 个外部中断为:
中断线 0~15:对应外部 IO 的输入中断。
中断线 16:连接到 PVD 输出。
中断线 17:连接到 RTC 闹钟事件。
中断线 18:连接到 USB 唤醒事件
注意:GPIO设置为外部中断时需要将其配置为中断模式
——————————————————————————————————————————————————————————————————————————————————————
4.编程实现GPIO中断,主要步骤如下。
工程中添加中断库函数文件
(1)配置中断优先级分组,下面函数中,抢占优先级和响应优先级一共占4位
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
参数: //抢占优先级占0位,响应优先级占4位
* @arg NVIC_PriorityGroup_0: 0 bits for pre-emption priority *
4 bits for subpriority
* @arg NVIC_PriorityGroup_1: 1 bits for pre-emption priority *
3 bits for subpriority
* @arg NVIC_PriorityGroup_2: 2 bits for pre-emption priority *
2 bits for subpriority
* @arg NVIC_PriorityGroup_3: 3 bits for pre-emption priority *
1 bits for subpriority
* @arg NVIC_PriorityGroup_4: 4 bits for pre-emption priority *
0 bits for subpriority
——————————————————————————————————————————-
(2)外部中断源初始化
(3)GPIO时钟和SYSCFG时钟初始化
RCC_AHB1... //初始化GPIO时钟,此处省略
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); //初始化SYSCFG时钟
——————————————————————————————————————————
(4)GPIO配置为输入模式
GPIO_init(); //此处省略
- 设置GPIO和外部中断线的关系
Void SYSCFG_EXITLineConfig(uint8_t EXIT_PortSourceGPIOx,uint8_t EXIT_PinSourcex);
参数:EXIT_PortSourceGPIOx 哪一组引脚
EXIT_PinSourcex 哪个脚
———————————————————————————————————————————
(5)初始化外部中断
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
参数:
typedef struct
{
uint32_t EXTI_Line; /*!< 哪条外部中断线 @ref EXTI_Lines */
EXTIMode_TypeDef EXTI_Mode; /*!< 模式选择事件/中断 @ref EXTIMode_TypeDef */
EXTITrigger_TypeDef EXTI_Trigger; /*!< 触发边沿选择 @ref EXTITrigger_TypeDef */
FunctionalState EXTI_LineCmd; /*!< 使能/禁止 ENABLE or DISABLE */
} EXTI_InitTypeDef;
——————————————————————————————————————————
NVIC向量中断控制器初始化
(6)初始化NVIC
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
//传入NVIC初始化结构体
typedef struct
{ uint8_t NVIC_IRQChannel; /*!< 中断通道 @ref IRQn_Type */
uint8_t NVIC_IRQChannelPreemptionPriority; /*!< 抢占优先级 */
uint8_t NVIC_IRQChannelSubPriority; /*!< 响应优先级 */
FunctionalState NVIC_IRQChannelCmd; /*!< 使能/禁止 ENABLE or DISABLE */
} NVIC_InitTypeDef;
———————————————————————————————————————————
(7)实现中断处理函数
函数名在启动文件的异常向量表中去找,比如:EXTI0_IRQHandler
中断处理函数无参无返回值
中断处理函数中必须清除中断标志
———————————————————————————————————————————
(8)清除中断标志位
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);
//传入初始化的外部中断线
边栏推荐
- Matlab learning notes
- 深度学习简史(一)
- Cross-entrpy Method
- Web project com mysql. cj. jdbc. Driver and com mysql. jdbc. Driver differences
- 【vulnhub】presidential1
- 【软件逆向-求解flag】内存获取、逆变换操作、线性变换、约束求解
- Lombok makes ⽤ @data and @builder's pit at the same time. Are you hit?
- 以机房B级建设标准满足等保2.0三级要求 | 混合云基础设施
- 代码克隆的优缺点
- Encryption algorithm - password security
猜你喜欢
equals()与hashCode()
C9 colleges and universities, doctoral students make a statement of nature!
Interface master v3.9, API low code development tool, build your interface service platform immediately
Uniapp uploads and displays avatars locally, and converts avatars into Base64 format and stores them in MySQL database
AI super clear repair resurfaces the light in Huang Jiaju's eyes, Lecun boss's "deep learning" course survival report, beautiful paintings only need one line of code, AI's latest paper | showmeai info
Js+svg love diffusion animation JS special effects
【批处理DOS-CMD命令-汇总和小结】-字符串搜索、查找、筛选命令(find、findstr),Find和findstr的区别和辨析
基於GO語言實現的X.509證書
Chapter II proxy and cookies of urllib Library
Configuring OSPF basic functions for Huawei devices
随机推荐
equals()与hashCode()
工程师如何对待开源 --- 一个老工程师的肺腑之言
Distributed cache
Leecode brush question record sword finger offer 56 - ii Number of occurrences of numbers in the array II
Learn to use code to generate beautiful interface documents!!!
Mujoco produces analog video
Matlab learning notes
Data analysis course notes (III) array shape and calculation, numpy storage / reading data, indexing, slicing and splicing
Model-Free Prediction
Attention SLAM:一種從人類注意中學習的視覺單目SLAM
接口(接口相关含义,区别抽象类,接口回调)
【批處理DOS-CMD命令-匯總和小結】-字符串搜索、查找、篩選命令(find、findstr),Find和findstr的區別和辨析
37頁數字鄉村振興智慧農業整體規劃建設方案
建立自己的网站(17)
C9高校,博士生一作发Nature!
什么是时间
Slow database query optimization
On February 19, 2021ccf award ceremony will be held, "why in Hengdian?"
Dr selection of OSPF configuration for Huawei devices
Learn self 3D representation like ray tracing ego3rt