1.1 中断的理解1.1.1 中断概念程序正在执行,突然有外部信号或者内部信号打断正在执行的程序,需要执行该事件,执行完后再回到当前打断的位置继续往下执行程序的过程称为中断。 例如:正在写代码 -- 程序正在执行微信信息 -- 事件发生 --> 中断请求看微信信息 -- 执行事件 --> 中断执行继续写代码 -- 继续执行代码 --> 中断返回 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级中断嵌套。 并且一个工程程序中只能有一种优先级分组,确定了分组,实际上就是确定了各个优先级的等级数量。分组编号SCB->AIRCR[10:8]抢占优先级 等级范围响应优先级 等级范围00x0700Bit[0:7]0~25510x06Bit[7]0~1Bit[0:6]0~12720x05Bit[7:6]0~3Bit[0:5]0~6330x04Bit[7:5]0~7Bit[0:4]0~3140x03Bit[7:4]0~15Bit[0:3]0~1550x02Bit[7:3]0~31Bit[0:2]0~760x01Bit[7:2]0~63Bit[0:1]0~370x00Bit[7:1]0~127Bit[0]0~11.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,等级编码:0x031.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次,请报警!”,响蜂鸣器 |
共6条
1/1 1 跳转至页
关于STM32中断知识
关键词: STM32 中断 知识
共6条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |