大家好,又见面了,我是你们的朋友全栈君。
NVIC相关内容(补充)
中断编程的三个部分——
1.配置NVIC_Config()函数
NVIC 是嵌套向量中断控制器,控制着整个芯片中断相关的功能,它跟内核紧密耦合,是内核里面的一个外设。因此控制中断的进行与NVIC_Config函数的配置密切相关。
2.配置EXTI_Config()函数
EXIT(External interrupt/event controller):外部中断/事件控制器,管理了控制器的 20个中断/事件线。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。 EXTI 可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。
(开启相应GPIO的时钟,初始化要与EXIT相连的GPIO(配置EXIT并连接GPIO引脚),初始化GPIO外设,配置中断/事件线。)
3.编写中断服务函数
中断并不是程序一开始就判断好会在那里发生,或者会在什么时候发生。中断发生的完全是随机的,中断源连接到硬件,由硬件来产生触发中断
中断只做了两件事,就是获取中断类型,然后加入队列中,其余复杂的程序处理都在主函数中完成
中断服务函数的重点就是要判断某个中断是否发生以及发生后清除某个标志位(退出中断前要清楚中断标志位,否则在退出中断后,标志位没有清除。会再一次进入中断)
一.
寄存器SCB—AIRCR的8—10位共三位可设置值来表明中断优先级分组,具体分组情况参考上一笔记中表格
对于每一个中断都有一个IP寄存器,它的4—7位共四位来给其设置该组的抢占优先级和响应优先级(分组情况和优先级分配是一一对应的,意思是设置了该组,则其优先级就是该组对应的唯一优先级分配,具体对应参照上一笔记分组)。如果两个中断的两个优先级都是一样的,则哪个中断先发生就先执行。对于上一个笔记所说的分组配置,一般通过NVIC_PriorityGroupConfig(uint32_t NVIC_Priority)函数,通过配置SCB—AIRCR寄存器来配置(入口参数范围是NVIC_PriorityGroup0——NVICPriorityGroup4)
注:具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。
与上一笔记分组对应的5组配置
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;
//设置中断源
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
// 指定抢占式优先级别1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
// 指定响应优先级别1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//设置中断使能(或失能)
中断设置相关寄存器:
__IO uint8_t IP[240];//中断优先级控制的寄存器组
__IO uint32_t ISER[8];//中断使能寄存器组
__IO uint32_t ICER[8];//中断失能寄存器组
__IO uint32_t ISPR[8];//中断挂起寄存器组,可挂起正在执行的中断
__IO uint32_t ICPR[8];//中断解挂寄存器组,可解除被挂起的中断
__IO uint32_t IABR[8];//中断激活标志位寄存器组,可读取该寄存器正在执行的中断是什么,只读
各寄存器配置及作用
分清IP与IPR
(IPR)中断优先级寄存器为60个32位寄存器,st的结构体中用了240个8位的字节数组NVIC->IP[240]来映射,每一个对应一个中断的优先级
下图为配置函数结构体
NVIC_InitTypeDef结构体,第一个成员变量用来确定需要使用的中断是哪一个中断响应函数接口(或通道)(82个外部中断向量表中选取),第二个成员变量是用来设置抢占优先级,第三个成员变量是用来设置响应优先级,第四个成员变量是用来使能这个通道(IRQ是中断请求的简称,因此第四成员变量也是指中断入口地址)
二.
配置EXTI的初始化结构体,结构体如下:
typedef struct
{
uint32_t EXTI_Line; // 中断/事件线
EXTIMode_TypeDef EXTI_Mode; // EXTI 模式
EXTITrigger_TypeDef EXTI_Trigger; // 触发类型
FunctionalState EXTI_LineCmd; // EXTI 使能
} EXTI_InitTypeDef;
配置此结构体主要是:选择相应的EXTI线、选择触发模式、选择产生的结果(中断还是事件)、是否使能EXTI线。
EXTI_Line:中断线选择,可选 EXTI_0 至 EXTI_19(一共20个)。既然刚才配置好了与GPIO引脚对应的EXTI线,所以初始化结构体中的EXTI线就是与GPIO连接的那个线。
EXTI_Mode: EXTI 模式选择,可选为产生中断或者产生事件。就是决定信号的发展方向,是产生中断呢?还是产生事件呢?此处是中断。
EXTI_Trigger: EXTI 边沿触发模式,可选上升沿触发、下降沿触发或者上升沿和下降沿都触发触发信号。
EXTI_LineCmd:控制是否使能 EXTI 线,可选使能 EXTI 线或禁用。
初始化结构体配置完毕后交由初始化函数写入相应的寄存器中。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/140486.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...