NVIC
中断资源
10个内核中断,60个外部中断,16个中断优先级
中断向量表
定义在启动文件,发生中断,CPU会自动执行中断服务函数
NVIC相关寄存器
相关寄存器 | 位数 | 寄存器个数 | 备注 |
中断使能寄存器(ISER) | 32 | 8 | 每个位控制一个中断 |
中断除能寄存器(ICER) | 32 | 8 | 每个位控制一个中断 |
应用程序中断及复位控制寄存器(AIRCR) | 32 | 1 | 位[10:8]控制优先级分组 |
中断优先级寄存器(IPR) | 8 | 240 | 8个位对应一个中断优先级 而STM32只使用高4位 |
此外NVIC还有中断挂起,解挂,激活标志等非常用功能
NVIC工作原理
中断优先级介绍
抢占优先级:高抢占可以打断低抢占
响应优先级:响应高优先响应,但不能互相打断
自然优先级:中断向量表的顺序
优先级数值越小,表示优先级越高
优先级分组
优先级分组 | AIRCR[10:8] | IPRx bit[7:4]分配 | 分配结果 |
0 | 111 | None :[7:4] | 0位抢占优先级,4位响应优先级 |
1 | 110 | [7] :[6:4] | 1位抢占优先级,3位响应优先级 |
2 | 101 | [7:6] :[5:4] | 2位抢占优先级,2位响应优先级 |
3 | 100 | [7:5] :[4] | 3位抢占优先级,1位响应优先级 |
4 | 011 | [7:4] :None | 4位抢占优先级,0位响应优先级 |
只需设置一次优先级,且优先级在
HAL_Init();
定义过了
NVIC配置步骤
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2); //设置优先级分组2;AIRCR[10:8]
HAL_NVIC_SetPriority(EXTI0_IRQn, 2, 0);//设置中断优先级,抢占2,响应0;IPRx bit[7:4]
HAL_NVIC_EnableIRQ(EXTI0_IRQn);//使能中断;ISERx
EXTI
F1拥有20条EXTI线
EXTI工作原理
可以分为四个步骤
边沿检测-》软件触发-》中断屏蔽/清除-》事件屏蔽
EXTI可配置事件输入CPU唤醒
唤醒功能不妨先理解未电脑的睡眠模式
AFIO
复用功能IO,主要用于引脚重复,把功能重新映射到另外的引脚
在定时器时再好好讲讲
中断配置布骤
代码演示
void EXTI_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;
__HAL_RCC_GPIOA_CLK_ENABLE();//使能时钟
GPIO_InitStructure.Mode = GPIO_MODE_IT_RISING; //上升沿中断
GPIO_InitStructure.Pin = GPIO_PIN_0; //PA0
GPIO_InitStructure.Pull = GPIO_PULLDOWN; //默认下拉
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH; //高速
HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化
//中断线0-PA0
HAL_NVIC_SetPriority(EXTI0_IRQn, 2, 0); //设置优先级,中断分组在HAL_Init();
HAL_NVIC_EnableIRQ(EXTI0_IRQn); //使能中断
}
void EXTI0_IRQHandler() //中断服务函数
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); //中断公共服务函数,会清理标志位,且会调
//用回调函数
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) //回调函数,编写中断内容
{
}
该文章参考正点原子资料,请勿商用
有错误地方请大家指点