public:: true
-
NVIC
- Nested vectored interrupt controller,嵌套向量中断控制器,属于Cortex-M3内核
- NVIC支持:256个中断(16内核 + 240外部),支持:256个优先级,允许裁剪
-
中断向量表
- 定义一块固定的内存,以4字节对齐,存放各个中断服务函数程序的首地址,其位置在启动文件.s中,发生中断时,CPU会自动执行中断函数
-
NVIC相关寄存器
- 中断使能寄存器(ISER)Interrupt set-enable registers
logseq.order-list-type:: number - 中断除能寄存器(ICER)Interrupt clear-enable registers
logseq.order-list-type:: number - 应用程序中断及复位控制寄存器(AIRCR)
logseq.order-list-type:: number- AIRCR为异常模型提供优先级分组控制,为数据访问提供端序状态,并对系统进行重置控制。
- 中断优先级寄存器(IPR)Interrupt priority registers
logseq.order-list-type:: number
- 中断使能寄存器(ISER)Interrupt set-enable registers
-
STM32中断优先级概念
-
- 抢占优先级:高抢占优先级可以打断正在执行的低抢占优先级中断
- 2.响应优先级:当抢占优先级相同时,响应优先级高的先执行,但是不能互相打断
-
- 抢占和响应都相同的情况下,自然优先级越高的,先执行
-
- 自然优先级:中断向量表的优先级
-
- 数值越小,表示优先级越高
-
-
NVIC 的使用
- 1、设置优先级分组(AIRCR[10:8]) [[$green]]^HAL_NVIC_SetPriorityGrouping^
- 2、设置中断优先级(IPRx bit[7:4])[[$green]]^HAL_NVIC_SetPriority^
- 3、使能中断(ISERx)[[$green]]^HAL_NVIC_EnableIRQ^
-
EXTI
-
External(Extended) interrupt/event Controller,外部(扩展)中断事件控制器
-
包含20个产生事件/中断请求的边沿检测器,即总共:20条EXTI线(F1)
-
中断:要进入NVIC,有相应的中断服务函数,需要CPU处理
-
事件:不进入NVIC,仅用于内部硬件自动控制的,如:TIM、DMA、ADC
-
EXTI工作原理
-
1、中断屏蔽寄存器(EXTI_IMR)
-
2、事件屏蔽寄存器(EXTI_EMR)
-
3、上升沿触发选择寄存器(EXTI_RTSR)
-
4、下降沿触发选择寄存器(EXTI_FTSR)
-
5、软件中断事件寄存器(EXTI_SWIER)
-
6、挂起寄存器(EXTI_PR)
-
EXTI和IO映射关系
- AFIO(F1)
- Alternate Function IO,即复用功能IO,主要用于重映射和外部中断映射配置
- AFIO(F1)
-
AFIO_EXTICR14,配置EXTI中断线015对应具体哪个IO口
-
AFIO_EXTICR1(0-3)AFIO_EXTICR2(4-7)AFIO_EXTICR3(8-11)
-
配置AFIO寄存器之前要使能AFIO时钟,方法如下:
-
__HAL_RCC_AFIO_CLK_ENABLE(); 对应RCC_APB2ENR寄存器 位0
- -
-
如何使用中断
-
1、使能GPIO时钟_HAL_RCC_GPIOx_CLK_ENABLE
-
2、设置GPIO口输入模式(上拉、下拉、浮空)
-
3、使能AFIO或SYSCFG时钟
-
4、设置EXTI与IO口对应关系
-
5、设置EXTI屏蔽,上下沿触发(IMR、 RTSR/FTSR)
-
HAL_GPIO_Init,一步到位
```c /** * description: 中断初始化 * return {*} */ void exti_led_init(void) { GPIO_InitTypeDef gpio_init_structure; __HAL_RCC_GPIOA_CLK_ENABLE(); gpio_init_structure.Pin = KEY_PIN;//KEY_PIN; gpio_init_structure.Mode = GPIO_MODE_IT_RISING;//中断上升沿触发 gpio_init_structure.Pull = GPIO_PULLDOWN;//下拉 HAL_GPIO_Init(KEY_PIN_PORT, &gpio_init_structure);//初始化 HAL_NVIC_SetPriority(EXTI0_IRQn, 2, 2);//设置中断优先级 HAL_NVIC_EnableIRQ(EXTI0_IRQn);//使能中断 } ```
-
-
- 设置NVIC(设置优先级分组、设置优先级、使能中断)
- HAL_NVIC_SetPriorityGrouping,此函数仅需设置一次!
- HAL_NVIC_SetPriority
-HAL_NVIC_EnableIRQ
-
- 设置中断服务函数(编写对应中断的中断服务函数!清中断标志!)
- 编写:EXTIx_IRQHandler,中断服务函数,清中断标志!
- 中断发生时,会先调用中断服务函数,中断服务函数调用中断处理函数,中断处理函数内部会清除中断标志位,然后调用中断回调函数。
-
/** * description: 中断服务函数 * return {*} */ void EXTI0_IRQHandler(void) //中断服务函数 { HAL_GPIO_EXTI_IRQHandler(KEY_PIN); //中断处理函数 // HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_4); __HAL_GPIO_EXTI_CLEAR_IT(KEY_PIN); /* HAL库默认先清中断再处理回调,退出时再清一次中断,避免按键抖动误触发 */ } void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) //中断回调函数 { if (HAL_GPIO_ReadPin(KEY_PIN_PORT, KEY_PIN) == GPIO_PIN_SET) { if (HAL_GPIO_ReadPin(KEY_PIN_PORT, KEY_PIN) == GPIO_PIN_SET) { HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); while (HAL_GPIO_ReadPin(KEY_PIN_PORT, KEY_PIN) == GPIO_PIN_RESET); } } }
-STM32仅有:EXTI0~4、EXTI9_5、EXTI15_10,7个外部中断服务函数