参考:
正点原子NVIC

NVIC

基本概念

stm分抢占优先级和响应优先级

抢占优先级高优先级可以打断低优先级中断

响应优先级高优先级不能打断低优先级中断

相同优先级中断按自然优先级(中断号)顺序执行
中断号位置在 ‘hal库相关函数’ 处讲解

相关寄存器

hal库相关函数

位置:

1
2
3
4
5
6
7
8
9
10
11
12
13
/*
PriorityGroup:中断优先级分组配置
NVIC_PRIORITYGROUP_0 抢占优先级0位,响应优先级4位
NVIC_PRIORITYGROUP_1 抢占优先级1位,响应优先级3位
NVIC_PRIORITYGROUP_2 抢占优先级2位,响应优先级2位
NVIC_PRIORITYGROUP_3 抢占优先级3位,响应优先级1位
NVIC_PRIORITYGROUP_4 抢占优先级4位,响应优先级0位
*/
HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup);

HAL_NVIC_SetPriority(中断号, 抢占优先级, 响应优先级); // 设置中断优先级
HAL_NVIC_EnableIRQ(中断号); // 使能中断
HAL_NVIC_DisableIRQ(中断号); // 禁用中断

中断函数位置参考:中断向量表->中断向量表位置
中断号位置

中断向量表

基本概念

存储中断服务函数的地址

中断向量表位置

内核中断

外设中断

hal库回调函数

处理机制

中断服务函数位置参考:中断向量表->中断向量表位置

回调函数是弱定义,系统在回调函数中没有实现,需要在用户程序中重写

步骤:

  1. 在需要处理中断的中断函数中写入对应中断处理公共函数(自己写)
  2. 中断处理公共函数清除相应标志位,并调用对应回调函数处理中断(hal库已经写好,无需改动)
  3. 然后重写相应回调函数,将需要的功能在回调函数中实现(自己写)

本质:系统触发中断进入中断函数->自己在中断函数中写入中断处理公共函数->
中断处理公共函数根据中断的内容调用对应的回调函数,并清除相应标志位->
自己在回调函数中实现需要的功能

hal库各外设回调函数位置

在外设对应.h文件中按ctrl+F

搜索Callback查找相应回调函数

搜索IRQHandler查找对应中断处理公共函数位置

搜索方法:

回调函数初步搜索结果:

根据初步搜索结果详细搜索实际回调函数:

中断处理公共函数: