https://m.toutiao.com/is/iRSWjuR9/
STM32开发——外部中断
一、外部中断
中断的作用和意义
1、实时控制:在确定时间内对相对应的事件作出响应
2、故障处理:检测到故障,需要第一时间处理
3、数据传输:不确定数据何时会来,处理串口数据接收
中断的意义:高效处理紧急程序,不会一直占用CPU资源
中断分为外部中断和内部中断,外部中断是依赖GPIO接收外设的中断请求。STM32 中的中断优先级由NVIC中的“中断优先级(8Bit 位宽)”将优先级分为:抢占优先级、响应优先级。当两个或者多个中断的抢占式优先级和响应优先级相同时,那么就遵循自然优先级,看中断向量表的中断排序,数值越小,优先级越高。
NVIC 寄存器
NVIC 相关的寄存器定义了可以在 core_cm3.h 文件中,其定义如下:
typedef struct{ __IOM uint32_t ISER[8U]; /* 中断使能寄存器 */uint32_t RESERVED0[24U]; __IOM uint32_t ICER[8U]; /* 中断清除使能寄存器 */uint32_t RSERVED1[24U]; __IOM uint32_t ISPR[8U]; /* 中断使能挂起寄存器 */uint32_t RESERVED2[24U]; __IOM uint32_t ICPR[8U]; /* 中断解挂寄存器 */uint32_t RESERVED3[24U]; __IOM uint32_t IABR[8U]; /* 中断有效位寄存器 */uint32_t RESERVED4[56U]; __IOM uint8_t IP[240U]; /* 中断优先级寄存器(8Bit 位宽) */uint32_t RESERVED5[644U]; __OM uint32_t STIR; /* 软件触发中断寄存器 */} NVIC_Type;
NVIC 部分常用相关函数
1.
HAL_NVIC_SetPriorityGrouping 函数
ST 公司把 core_cm3.h 文件的 NVIC 相关函数封装到 stm32f1xx_hal_cortex.c 文件中,
HAL_NVIC_SetPriorityGrouping 是设置中断优先级分组函数。其声明如下:
void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup);
函数形参:是中断优先级分组号,可以选择范围:NVIC_PRIORITYGROUP_0 到NVIC_PRIORITYGROUP_4(共 5 组)
2. HAL_NVIC_SetPriority 函数
HAL_NVIC_SetPriority 是设置中断优先级函数。其声明如下:
void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority,uint32_t SubPriority);
函数形参:
形参 1 是中断号,可以选择范围:IRQn_Type 定义的枚举类型,定义在 stm32f103xe.h。
形参 2 是抢占优先级,可以选择范围:0 到 15。
形参 3 是响应优先级,可以选择范围:0 到 15。
3. HAL_NVIC_EnableIRQ 函数
HAL_NVIC_EnableIRQ 是中断使能函数。其声明如下:
void HAL_NVIC_EnableIRQ(IRQn_Type IRQn);
函数形参:形参 IRQn 是中断号,可以选择范围:IRQn_Type 定义的枚举类型,定义在 stm32f103xe.h。
4. HAL_NVIC_DisableIRQ 函数
HAL_NVIC_DisableIRQ 是中断除能函数。其声明如下:
void HAL_NVIC_disableIRQ(IRQn_Type IRQn);
函数形参:形参 IRQn 是中断号,可以选择范围:IRQn_Type 定义的枚举类型,定义在 stm32f103xe.h。
5. HAL_NVIC_SystemReset 函数
HAL_NVIC_SystemReset 是系统复位函数。其声明如下:
void HAL_NVIC_SystemReset(void);
二、EXTI
EXTI 即是外部中断和事件控制器,它是由 20 个产生事件/中断请求的边沿检测器组成。每一条输入线都可以独立地配置输入类型(脉冲或挂起)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。每个输入线都可以独立地被屏蔽。挂起寄存器保持着状态线的中断请求。
①,边沿检测 ②,软件触发 ③,中断屏蔽/清除 ④,事件屏蔽
中断和事件的理解:
中断:要进入NVIC,有相应的中断服务函数,需要CPU处理
事件:不进入NVIC,仅用于内部硬件自动控制的,如:TIM、DMA、ADC
三、AFIO简介(F1)
AFIO即复用功能IO,主要用于重映射和外部中断映射配置
1、调试IO配置:AFIO_MAPR[26:24],配置JTAG/SWD的开关状态
2、重映射配置:AFIO_MAPR,部分外设IO重映射配置
3、外部中断配置:AFIO_EXTICR1~4,配置EXTI中断线0~15对应具体哪个IO口
特别注意:配置AFIO寄存器之前要使能AFIO时钟,方法如下:
__HAL_RCC_AFIO_CLK_ENABLE(); 对应RCC_APB2ENR寄存器 位0
四、EXTI 与 IO对应关系
AFIO_EXTICR1的 EXTI0[3:0]位控制(F1)
五、如何使用中断
STM32 EXTI的配置步骤(外部中断)
1,使能GPIO时钟:使能GPIO时钟
2,设置GPIO输入模式:上/下拉/浮空输入
3,使能AFIO/SYSCFG时钟:设置AFIO/SYSCFG时钟开启寄存器
4,设置EXTI和IO对应关系:选择PA~PK到底哪组IO对应EXTI输入线,AFIO_EXTICR/ SYSCFG_EXTICR
5,设置EXTI屏蔽,上/下沿:设置EXTI对应通道的屏蔽和上升沿/下降沿触发,IMR、 RTSR/FTSR
步骤2 - 5使用 HAL_GPIO_Init 一步到位
6,设置NVIC:分3步,见前面内容,即:设置优先级分组、设置优先级、使能中断
7,设计中断服务函数:编写对应中断的中断服务函数!清中断标志!
STM32 EXTI的HAL库设置步骤(外部中断)
1,使能GPIO时钟——使用:
__HAL_RCC_GPIOx_CLK_ENABLE
2,GPIO/AFIO(SYSCFG)/EXTI——使用:HAL_GPIO_Init,一步到位
3,设置中断分组——使用:
HAL_NVIC_SetPriorityGrouping(此函数仅需设置一次)
4,设置中断优先级——使用: HAL_NVIC_SetPriority
5,使能中断——使用: HAL_NVIC_EnableIRQ
6,设计中断服务函数——编写:EXTIx_IRQHandler,中断服务函数,清中断标志!
STM32仅有:EXTI0~4、EXTI9_5、EXTI15_10,7个外部中断服务函数
六、通用外设驱动模型(四步法)
通用外设驱动模型
七、HAL库中断回调处理机制
中断回调函数大概原理
以上是对第三天学习的了内容做了大概的总结,由于我个人选择的是STM32F1系列的开发进行学习,所总结的大部分内容仅限于F1系列使用。由于篇幅受限,很多地方有缩略,欢迎小伙伴们在评论区相互交流。今天的内容到此结束,打工仔只能不定期更新,再见!#30天学会STM32##STM32#
联系客服