目录
一、中断简介
二、NVIC
1.寄存器
2.工作原理
3.优先级
4.使用NVIC
三、EXTI
1.简介
2.AFIO:复用功能IO,主要用于重映射和外部中断映射配置编辑
3. 中断使用
4.HAL库配置使用
一、中断简介
中断的意义:高效处理紧急程序,不会一直占用CPU资源
NVIC:嵌套向量中断控制器,属于内核,支持256个中断(16内核,240外部),支持256个优先级,允许裁剪为16个(ST的)
中断向量表:定义一块固定的内存,以四字节对齐,存放在各个中断服务函数程序的首地址,定义在启动文件中
二、NVIC
1.寄存器
2.工作原理
3.优先级
优先级:一般一个工程中只进行一次优先级分组就行,否则可能会导致优先级混乱,如果真的设置了多次,那就会以最后一次设置为准
注意:NVIC的函数都存放在cortex.c里面
4.使用NVIC
三、EXTI简介
EXTI:外部(扩展)中断事件控制器,F1包含20个产生事件/中断请求的边沿检测器,即F1有20条EXTI线
中断:进NVIC,有服务函数,需要CPU处理
事件:不进NVIC,仅用于内部硬件自动控制的,如TIM,DMA,ADC等
2.AFIO:复用功能IO,主要用于重映射和外部中断映射配置
3. 中断使用流程
4.HAL库配置使用步骤
四、HAL库实现
利用按键进行中断的实现,由图,按键是外部下拉了,所以配置下拉输入,然后中断触发方式可以配置为上升沿触发
与标准库不同的是,这个触发方式是直接可以用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){ }
}