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. ST 公司把 core_cm3.h 文件的 NVIC 相关函数封装到 stm32f1xx_hal_cortex.c 文件中,
函数形参:是中断优先级分组号,可以选择范围: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 是中断使能函数。其声明如下:
函数形参:形参 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 是系统复位函数。其声明如下:
二、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时钟——使用: 2,GPIO/AFIO(SYSCFG)/EXTI——使用:HAL_GPIO_Init,一步到位 3,设置中断分组——使用: 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# |
|
来自: 山峰云绕 > 《电子工程与单片机io字符显示技术》