1.1.2 中断源的理解打断正在执行程序的事件称为中断源。
1.1.3 中断的意义While(!(USART1->SR & (1 << 5))); rec = USART1->DR;
可以节省CPU的内存。
中断满足条件:快进快出
1.2 NVIC的介绍1.2.1 NVIC的概述NVIC:全称:嵌套向量中断控制器。 它就是一个控制器,控制什么?控制中断。
已经内嵌在Cortex-M内核中。
NVIC的中断架构 -- 《M3-M4权威指南 第7章》
一共可以支持256个中断,其中16个内部中断,240个外部中断。 《权威指南英文第7章》
1.2.2 NVIC中断优先级
1.2.3 NVIC中断优先级的分类分类:人为优先级 和 自然优先级
人为优先级 : 抢占优先级 和 响应优先级
抢占优先级: 不同等级间可以嵌套,高优先级可以抢占低优先级,优先级等级编号越小优先级高越高。
响应优先级: 不同等级间不可以嵌套,响应高优先级的事件,优先级等级编号越小优先级高越高。
自然优先级:NVIC内部给所有中断分配的中断序列号。
当抢占优先级和响应优先级相同的中断源,同时发生了中断,
CPU优先执行自然优先级高的中断。中断等级数字越小,优先级越高。
1.2.4 NVIC优先级分组RAM公司利用8个位来管理人为优先级,用3个位管理优先级等级编码。
第0组 用8个位管理响应优先级,等级范围:0~255, 等级编码:0x07
第1组 用7个位管理响应优先级,等级范围:0~127,
用1个位管理抢占优先级,等级范围:0~1, 等级编码:0x06
第2组 用6个位管理响应优先级,等级范围:0~63,
用2个位管理抢占优先级,等级范围:0~3, 等级编码:0x05
第3组 用5个位管理响应优先级,等级范围:0~31,
用3个位管理抢占优先级,等级范围:0~7, 等级编码:0x04
第4组 用4个位管理响应优先级,等级范围:0~15,
用4个位管理抢占优先级,等级范围:0~15, 等级编码:0x03
第5组 用3个位管理响应优先级,等级范围:0~7,
用5个位管理抢占优先级,等级范围:0~31, 等级编码:0x02
第6组 用2个位管理响应优先级,等级范围:0~3,
用6个位管理抢占优先级,等级范围:0~63, 等级编码:0x01
第7组 用1个位管理响应优先级,等级范围:0~1,
用7个位管理抢占优先级,等级范围:0~127, 等级编码:0x00
注意:Conter-M4最大支持256个中断入口,但是最大只支持128级中断嵌套。
并且一个工程程序中只能有一种优先级分组,确定了分组,实际上就是确定了各个优先级的等级数量。
1.1 STM32F4xx中断介绍ST公司利用4个位来管理人为优先级,用3个位管理优先级等级编码
NXP公司利用5个位来管理人为优先级,用3个位管理优先级等级编码
第0组 用4个位管理响应优先级,等级范围:0~15, 等级编码:0x07
第1组 用3个位管理响应优先级,等级范围:0~7,
用1个位管理抢占优先级,等级范围:0~1, 等级编码:0x06
第2组 用2个位管理响应优先级,等级范围:0~3,
用2个位管理抢占优先级,等级范围:0~3, 等级编码:0x05
第3组 用1个位管理响应优先级,等级范围:0~1,
用3个位管理抢占优先级,等级范围:0~7, 等级编码:0x04
第4组 用4个位管理抢占优先级,等级范围:0~15,等级编码:0x03
1.1.1 STM32F40xx中断优先级的库函数在core_cm4.h的文件中找对应的库函数
1. void NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -- 在1435行
1)函数功能:设置优先级分组
2)形参:优先级编码
例如:设置优先级分组为第2组
NVIC_SetPriorityGrouping(0x05); //NVIC_SetPriorityGrouping(7-2);
2.uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) --- 1592行
1)函数功能:设置具体的等级范围编码
2)形参:PriorityGroup:优先级编码
PreemptPriority:抢占优先级等级编码
SubPriority:响应优先级编码
3)返回值:具体的等级编码
3.void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -- 1550行
1)函数功能:设置中断源优先级
2)形参:IRQn:中断源的优先级 -- stm32f4xx.h 中查找
priority :具体的优先级等级编码
4.void NVIC_EnableIRQ(IRQn_Type IRQn) --- 1467行
1)函数功能:使能具体的中断源
2)形参:具体的中断源
5.void NVIC_DisableIRQ(IRQn_Type IRQn) -- 1480行
1)函数功能:禁止具体中断源
2)形参:具体的中断源
1.2 中断服务函数中断需要执行的事件。
注意:遵循原则:快进快出 flag=1 IF(flag == 1)
Void 中断服务函数名(void)
{
1. 清标志位
2. 中断需要执行的事件
}
注:中断服务函数名在 startup_stm32f40_41xxx.s文件中找
1.3 中断编写流程1. 中断源初始化 -- 在没有用中断时怎么初始化就怎么初始化
2. 使能对应的中断 -- 接收中断
3. 配置NVIC -- 例如第2组
uint32_t Priority;
1) NVIC_SetPriorityGrouping(7 - 2);
2) Priority = NVIC_EncodePriority (7-2, 1 , 2) ;
3) NVIC_SetPriority(USART1_IRQn, Priority );
4) NVIC_EnableIRQ(USART1_IRQn) ;
4. 使能串口
5. 编写中断服务函数
1.3.1 实验1. 串口助手发送数据,MCU接收数据,MCU接收到的数据再返回给串口助手
2. 在串口助手中发送字符串,MUC接收字符串
如果发送"LED_ON#", MCU接收后点亮所有LED灯,
如果发送"LED_OFF#", 关闭所有LED灯,
如果发送错误,则返回”指令错误,请重新发送”
如果错误次数超过3次,则返回“错误超过3次,请报警!”,响蜂鸣器