中断
当cpu在执行指令时,遇到一些突发状况,不得不先处理这些突发状况,处理完毕后再返回原来执行指令处继续执行,这里的突然状况被称为中断或异常。
中断示意图如下:
STM32F103的中断系统很强大,有专门的中断控制器NVIC,多个中断优先级,且可以配置。中断优先级又分为抢占优先级和响应优先级。
Cortex-M3 中断异常表:
Cortex-M3 中断优先级分组
STM32把中断优先级的寄存器修改为4个bit,4个bit对应的中断优先级分组如下:
- 高抢占优先级可以打断正在执行的低抢占优先级。
- 抢占优先级相等,高响应优先级不能打断低响应优先级。
- 抢占优先级相等,两个中断同时发生,高响应优先级先执行。
- 抢占优先级和响应优先级都相等,先来先执行。
- 抢占优先级和响应优先级都相等,同时来则根据向量表中的位置决定,靠前的先执行。
注意:中断优先级分组一般只进行一次。随意改变会产生意想不到的执行结果。
可见STM32F103系列最多有16级可编程优先级,STM32F103不使用PRIGROUP来命名分组,而采用NVIC_PRIORITYGROUP_x的方式命名 , 即 NVIC_PRIORITYGROUP_0 对应第0组。
在“stm32f1xx_hal_cortex.h”有相关定义。
GPIO中断
GPIO产生中断经过的模块如下:
中断模式是指外部信号产生电平变化时,EXTI将该信号给NVIC处理,从而触发中断,执行中断服务函数,完成对应操作。
事件模式是指外部信号产生电平变化时,EXTI根据配置,联动ADC或TIM执行相关操作。
中断和事件的产生源是一样的,中断需要软件实现相应功能,而事件是由硬件触发后执行相应操作。
前者需要CPU参与功能实现,可以实现的功能更多,后者无需CPU参与,具有更高的响应速度。
结合对GPIO中断的理解,用STM32CubeMX配置下中断尝试下。
这里采用的硬件是百问网STM32F103开发板,板子上有一个按键和LED。
LED的配置,输出,无上下拉,别名LED。
按键的配置,外部输入中断,无上下拉,别名DDD。
电脑装的是win7系统,文字输入特别卡,应该是STM32CubeMX的bug。
中断和中断优先级的配置:
看下生成的代码:
HAL_GPIO_EXTI_Callback是个虚函数,把它实现,如下:
在百问网STM32F103开发板上测试,功能正常。