发 帖  
原厂入驻New

[经验] 关于STM32中断知识

2020-1-10 11:04:22  6121 单片机 STM32 嵌入式
分享
0
1.1 中断的理解1.1.1 中断概念
程序正在执行,突然有外部信号或者内部信号打断正在执行的程序,需要执行该事件,
执行完后再回到当前打断的位置继续往下执行程序的过程称为中断
例如:
正在写代码      --   程序正在执行
微信信息        --   事件发生    --> 中断请求
看微信信息      --   执行事件    --> 中断执行
继续写代码      --   继续执行代码 --> 中断返回
1.png
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章》
2.png
1.2.2 NVIC中断优先级 3.jpg
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级中断嵌套。
        并且一个工程程序中只能有一种优先级分组,确定了分组,实际上就是确定了各个优先级的等级数量。
分组编号
SCB->AIRCR[10:8]
抢占优先级        等级范围
响应优先级        等级范围
0
0x07
0
0
Bit[0:7]
0~255
1
0x06
Bit[7]
0~1
Bit[0:6]
0~127
2
0x05
Bit[7:6]
0~3
Bit[0:5]
0~63
3
0x04
Bit[7:5]
0~7
Bit[0:4]
0~31
4
0x03
Bit[7:4]
0~15
Bit[0:3]
0~15
5
0x02
Bit[7:3]
0~31
Bit[0:2]
0~7
6
0x01
Bit[7:2]
0~63
Bit[0:1]
0~3
7
0x00
Bit[7:1]
0~127
Bit[0]
0~1
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次,请报警!”,响蜂鸣器

sdfsdg5 2020-2-8 11:37:47
学习了 谢谢分享
回复

举报

评论

高级模式
您需要登录后才可以回帖 登录 | 注册

发经验
关闭

站长推荐 上一条 /6 下一条

快速回复 返回顶部 返回列表