中断应用
HAL库还是配合CubeMX用比较轻松快捷又准确,学的时候直接跳过CubeMX了……
HAL库中,没有NVIC以及EXTI的初始化结构体函数。
EXTI的初始化设置归纳在GPIO_InitTypeDef 结构体中。在该结构体的Mode中,可设置某GPIO为中断或者事件。中断 (IT) 与事件 (EVT)都各有三种可选模式。
1.NVIC
NVIC 是嵌套向量中断控制器,控制着整个芯片中断相关的功能,它跟内核紧密耦合,是内核里面的一个外设。
1.1 优先级
只用高四位表达优先级,为了能够表示所有的优先级,采用了分组优先级的方法。
比较时:先比较分组优先级,再比较子优先级,具体操作如下:
1.2 编程要点
2.EXTI
外部中断/事件控制器 (EXTI) 管理了控制器的 23 个中断/事件线。每个中断/事件线都对应有一个 边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。EXTI 可以实现对每个中断/事件 线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。
- 很多在信号线上打一个斜杠并标注“23”字样,这个表示在控制器内部类似
的信号线路有 23 个
HAL库已经把NVIC和EXTI的初始化包含进GPIO的初始化定义里了,所以,代码相对就简单很多
2.1 一些注意点
2.2 程序
硬件平台:STM32G431RBT6
void GPIO_Init()
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOB,&GPIO_InitStruct);
HAL_NVIC_SetPriority(EXTI1_IRQn,0,0);
HAL_NVIC_EnableIRQ(EXTI1_IRQn);
}
void EXTI1_IRQHandler()
{
if(__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_1) != RESET)
{
LED_Toggle(3);
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_1);
}
}
void EXTI1_IRQHandler()
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_1);
}
如果一个引脚用了相同的中断号,那不能实现???(问题遗留) 比如G431里面的PA0和PB0引脚,一个是按键B4,一个是按键B1
附 参考
SysTick学习
|