背景
上一讲 STM32 CubeMX 学习:GPIO的使用 以及介绍了如何配置以及操作GPIO引脚。
这一讲我们通过中断来控制按键。关于中断的概念不做介绍。
HOST-OS : Windows-10
STM32 Cube :v5.6
MCU : STM32F429
LIB : stm32cube_fw_f4_v1250
知识
cortex-M4支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。
NVIC
是嵌套向量中断控制器(Nested Vectored Interrupt Controller),控制着整个芯片中断相关的功能,它跟内核紧密耦合,是内核里面的一个外设。但是各个芯片厂商在设计芯片的时候会对Cortex-M4
内核里面的NVIC
进行裁剪,把不需要的部分去掉,所以说STM32
的NVIC
是Cortex-M4
的NVIC
的一个子集。
NVIC
负责控制中断响应,主要有三个参数:中断使能(Interrupts Enabled),抢占优先级(Preemption Priority),响应优先级(Sub Priority)。(优先级数值越小,优先级别越高)
- 中断使能:表面是否开启中断,如果开启中断,则满足中断触发条件时程序会跳到中断服务程序运行,否则不响应中断主程序继续运行。
抢占优先级:用来判断一个中断是否可以打断另外一个中断的中断服务程序抢先运行。
例如A中断触发,正在运行A中断的服务程序,此时B中断也触发,如果B中断的抢占优先级比A的高,则程序会打断A的中断服务程序,去运行B的中断服务程序,即中断嵌套。等B的中断服务程序运行完后继续运行A的中断服务程序。如果B的抢占优先级没有高过A的抢占优先级,则程序不会打断A的中断服务程序,而是待定A的中断服务程序运行完成后才运行B的中断服务程序。
响应优先级:用来判断抢占优先级相同的几个中断那个中断会优先响应。如果几个抢占优先相同的中断同时触发,那么响应优先级高的最先运行。
判断中断的优先级,先看抢占优先级,抢占优先级高的中断优先级别高。抢占优先级相同的情况下,响应优先高的中断优先级别高。抢占优先级和响应优先级相同的情况下,根据中断向量表确定。
优先级分组(Priority Group)
STM32以4个比特位表示中断的抢占优先级和响应优先级。中断优先级分组是为了给抢占式优先级
和响应优先级
在中断优先级寄丛器的四个比特位分配各个优先级数字所占的位数。
例如3位用于抢占优先级(优先级有2^3=8种优先级),1位用于响应优先级(优先级有2^1=2种优先级)。
在开发中,STM32中执行中断主要分三部分:
1)配置NVIC_Config()函数
2)配置EXTI_Config()函数
3)编写中断服务函数
CubeMx 对 中断 的配置
1)在Pinout& Confiurgation
页的Pinout view
中,点击引脚,设置为GPIO_EXTI..
。
2)点击左栏的GPIO
,选择配置的引脚,在界面下方中部靠左的位置可以看到 类似PF4 Configuration
这一栏,有以下选项:
GPIO mode(模式)
External Interrupt Mode with Rising edge trigger detection(上升沿式外部中断模式)
、External Interrupt Mode with Falling edge trigger detection(下降沿式外部中断模式)
、External Interrupt Mode with Rising/Falling edge trigger detection(上升下降沿式外部中断模式)
- GPIO Pull-up/Pull-down(上下拉):默认设置为
No pull-up and no pull-down
User Label(用户标签): 可以标记这个引脚是做什么用的,提高可读性。
3)点击左侧NVIC
- 根据需要设置
Priority Group
- 勾选对应的中断使能(Enabled)
- 根据需要填写抢占优先级(Preemption Priority),响应优先级(Sub Priority)
3)点击右上角的GENERATE CODE
生成工程
4)使用外部的工具链编译工程,确保没有问题。