目录
2.AFIO:复用功能IO,主要用于重映射和外部中断映射配置编辑
中断的意义:高效处理紧急程序,不会一直占用CPU资源

NVIC:嵌套向量中断控制器,属于内核,支持256个中断(16内核,240外部),支持256个优先级,允许裁剪为16个(ST的)
中断向量表:定义一块固定的内存,以四字节对齐,存放在各个中断服务函数程序的首地址,定义在启动文件中



优先级:一般一个工程中只进行一次优先级分组就行,否则可能会导致优先级混乱,如果真的设置了多次,那就会以最后一次设置为准

注意:NVIC的函数都存放在cortex.c里面
![]()

EXTI:外部(扩展)中断事件控制器,F1包含20个产生事件/中断请求的边沿检测器,即F1有20条EXTI线
中断:进NVIC,有服务函数,需要CPU处理
事件:不进NVIC,仅用于内部硬件自动控制的,如TIM,DMA,ADC等











利用按键进行中断的实现,由图,按键是外部下拉了,所以配置下拉输入,然后中断触发方式可以配置为上升沿触发
与标准库不同的是,这个触发方式是直接可以用GPIO结构体直接配置
回调函数是已经被库弱定义了,我们直接再次定义一下就行,但是不用我们去声明
- #ifndef __EXTI_H
- #define __EXTI_H
-
- #include "./SYSTEM/sys/sys.h"
- void EXTI_Init(void);
-
-
-
- #endif
- #include "exti.h"
-
- void EXTI_Init(void)
- {
- //开启时钟
- __HAL_RCC_GPIOA_CLK_ENABLE();
- __HAL_RCC_GPIOC_CLK_ENABLE();
- __HAL_RCC_AFIO_CLK_ENABLE();
-
- //初始化结构体
- GPIO_InitTypeDef GPIO_Init;
-
- GPIO_Init.Pin = GPIO_PIN_0;
- GPIO_Init.Mode=GPIO_MODE_IT_RISING;//设置为上升沿触发中断
- GPIO_Init.Pull = GPIO_PULLDOWN;//外部下拉
- HAL_GPIO_Init(GPIOA,&GPIO_Init);
- GPIO_Init.Pin = GPIO_PIN_13;
- HAL_GPIO_Init(GPIOC,&GPIO_Init);
-
- HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2);//优先级分组
-
- HAL_NVIC_SetPriority(EXTI0_IRQn,0, 1);//配置优先级
- HAL_NVIC_SetPriority(EXTI15_10_IRQn,0, 2);
-
- HAL_NVIC_EnableIRQ(EXTI0_IRQn);//使能中断
- HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
- }
-
- void EXTI15_10_IRQHandler(void)//中断服务函数
- {
- HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);//HAL库中断处理共用函数
- }
-
- void EXTI0_IRQHandler()//中断服务函数
- {
- HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);//HAL库中断处理共用函数
- }
-
- void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)//HAL库数据处理回调函数
- {
- if(GPIO_Pin==GPIO_PIN_13)
- {
- if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13)==1)//如果按键按下
- {
- HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_0);//翻转电平
- }
- }
- if(GPIO_Pin==GPIO_PIN_0)
- {
- if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==1)
- {
- HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
- }
- }
- }
-
- #include "./SYSTEM/sys/sys.h"
- #include "./SYSTEM/usart/usart.h"
- #include "./SYSTEM/delay/delay.h"
- #include "led.h"
- #include "key.h"
- #include "exti.h"
-
-
-
- int main(void)
- {
- HAL_Init(); /* 初始化HAL库 */
- sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
- delay_init(72); /* 延时初始化 */
- LED_Init(); /* LED初始化 */
- KEY_Init();
- EXTI_Init();
- while(1)
- {
-
-
- }
- }