目录
1、为什么使用GPIO外部中断控制LED亮灭?
实现LED亮灭控制有很多方式,其中一种就是在main函数的while循环里面不断地检测GPIO引脚的电平变化实现输出的电平变化从而实现LED的亮灭控制。但是这种轮询的方式让CPU在不断地运行,不仅消耗电量而且消耗算力。
另一种方式就是使用GPIO外部中断,这是一种可以由硬件自动触发任务执行的方式,只有需要进行控制的时候,CPU才会介入控制。
2、NVIC嵌套向量中断控制器
NVIC属于STM32的内核外设,用于响应外设请求并让CPU跳转到指定的指令地址进行执行任务。STM32F103C8T6单片机只有10个系统异常和60个可屏蔽中断。
STM32可以精确的控制60种中断的具体抢占优先级和响应优先级。原因是IPR寄存器组有15个寄存器。每个寄存器32位,8位控制一种中断,那么有15*4一共60个控制方式,用于解决多个相同中断的优先级处理问题。
另外,除了上面的60个具体中断类型的控制,AIRCR寄存器还提供了对这60种中断的总的控制方式,AIRCR寄存器是一个32位寄存器,其中的10-8位用于设置总的优先级。具体位比特值对应的控制形式如下图。
AIRCR寄存器的值会直接影响IPR寄存器8位控制位中的高四位,IPR高4位的不同组合的控制也如上图所示。
中断向量表:就是每种中断对应跳转的函数地址,比如ADC1中断在A地址,IIC中断在C地址等。这些地址都已经被编译器提取确定无法修改,但是虽然有60种中断,但是电平变化的引脚却不止60个,所以需要在中断服务函数里面手动判定是哪个引脚触发了中断。
3、EXTI外部中断
外部中断主要来自GPIO引脚以及STM32芯片内部的外设。具体如下:
- 0-15:对应GPIO_PIN 0-15中断;
- 16:PVD输出;
- 17:RTC闹钟事件;
- 18:USB唤醒事件;
- 19:连接到以太网唤醒事件(只适用于互联型产品)
4、项目的硬件排线
具体的布线如下。系统板来自江科大最小系统板,PC13是该系统板自己集成的LED灯。
5、STM32CUBE_MX配置
第一步:配置烧录方式
第二步:配置PA8引脚功能
第三步:配置PC13引脚功能
6、HAL库代码
复杂下面的代码到main.c里面即可。HAL_GPIO_EXTI_Callback表示GPIO外部中断的回调函数,
cpp
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
if (GPIO_Pin == GPIO_PIN_8) {
// 切换PC13引脚的电平
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
}
}
7、实际效果
请大家多多点赞。
LED_EXTI