您好,欢迎光临本网站![请登录][注册会员]  
文件名称: STM32的中断优先级.pdf
  所属分类: C
  开发工具:
  文件大小: 242kb
  下载次数: 0
  上传时间: 2019-07-15
  提 供 者: tuhanwu********
 详细说明:STM32的中断优先级,非常实用的手册。可以收藏查阅STⅥ32的NVIC优先级 如果用分组(7)来分配这8个优先级的话则[7:5表示子优先级。 表11 用3位来表达优先级, Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bitl BitO 采用分组7的情况 子优先级 未使用 如果用分组(6)来分配这8个优先级的话则[7表示抢占优先级,[6:5表示子优先级。 表12 用3位来表达优先级, Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bitl BitO 采用分组6的情况 抢占优子优先级 未使用 先级 如果用分组(5)来分配这8个优先级的话则[7:6表示抢占优先级,而[5则表示了优先级 表13 用3位来衣达优先级, Bi7 BiL6 Bits Bil4 Bit3 Bil2 Bitl Bilo 采用分组5的情况 抢占优先级子优 未使用 先级 如果用分组(40)来分配这8个优先级的话则[7:5都表示抢占优先级 表14: 用3位来表达优先级, Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bito 采用分组4的情况 抢占优先级 未使用 到这里已经很清晰了,其实STM32用4位来表示优先级,则有16个优先级。如下: 在NVCH文件中有 e Preemption Priority Group #define nvic Priority Group 0 ((u32 )0x700)/0 bits for pre-emption priority 4 bits for subpriority * #define nvic priority Group 1 ((u32)0x600)/*1 bits for pre-emption priority 3 bits for subpriority o/ tdefine NVIC Priority Group 2 ((u32)0x500)/2 bits for pre-emption priority 2 bits for subpriority */ #deline nvic Priority Group 3 ((u32)0x400)/3 bits for pre-emption priority I bits for subpriority * #define n vic Priority Group 4 ((u32 )0x300)/*4 bits for pre-emption priority 0 bits for subpriority 注意: NVIC.里这个定义的顺序是跟CM3里 PRIGROUP的顺序刚好相反的,就是说 define NvIc_ Priority Group_0—对应 PRIGROUP7 # define NviC Priority Group1—对应 PRIGROUP6 #define nvic priority Group 2 对应 PRIGROUP5 # define nvic Priority Group3—对应 PRIGROUP4 # define NvIC Priority Group4—对应 PRIGROUP3 STⅥ32的NVIC优先级 下面的分析将按照CM3实际的 PRIGROUP进行,而不是 NVIC.H里定义的 NVIC Priority Group x 分组(3)则16个优先级都表示抢占优先级 表15 分组寄存器中[10:8]的配置情况:优先缴寄存器的配置情况: 采用分组3的情况 采用分组3的情况 PRIGROUP BIT10 BIT9 BIT8 Bit7 Bit6 Bits Bit4 Bit3 Bit2 Bitl Bito 抢占优先级 未使用 分组(4)则16个优先级表现为8个抢占优先级,每个抢占优先级里包含2个子优先级 表16: 分组寄存器中[10:8]的配置情况 优先级寄存器的配置情况: 采用分组4的情况 采用分组4的情况 PRIGROUP BIT10 BIT9 BIT8 Bit7 Bito Bits Bit4 Bit3 Bit2 BitI bito 抢占优先级 子优先级 未使用 分组(5)则16个优先级表现为4个抢占优先级,每个抢占优先级里包含4个子优先级 表17: 分组寄存器[0:8的配置情况:优先级寄存器的配置情况: 采用分组5的情况 采用分组5的情况 PRIGROUP BITI0 BIT9 BIT8 Bit7 Bit6 Bits Bit4 Bit3 Bit2 Bitl bito 5 抢占优先级子优先级 未使用 分组(6)则16个优先级表现为2个抢占优先级,每个抢占优先级里包含8个子优先级 表18: 分组寄存器中0:8的配置情况: 优先级寄存器的配置情况: 采用分组6的情况 采用分组6的情况 PRIGROUPBIT10 BIT9 BIT8 Bit7 Bit6 Bits Bit4 Bit3 Bit2 Bitl Bito 6110抢优子优先级 未使用 分组(7)则16个优先级表小子优先级 表19: 分组寄存器中[10:8]的配置情况: 优先级寄存尜的配置情况: 采用分组7的情况 采用分组7的情况 PRIGROUP BIT10 BIT9 BIT8 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bitl BitO 子优先级 未使用 SIM32的64个中断,除了那3个CM3固定的异常外,每个中断都可以分配优先级,如果 有N个中断的优先级相冋则按中断号最低的那个最先等到响应。 为了判断你使用的芯片到底使用了多少位来表达优先级,可以使用下面的方法:往某个优先 级寄存器里写入0XFF,再读回来。则从MSB开始,有多少位是1就有多少位表达优先级, 最少要使用3个位 STⅥ32的NVIC优先级 第二篇优先级的实现方法 以下红色字体为 NVIC INIT这个函数的内容以及一位网友对这些内容的解释。在此对这位网友表示感谢! NVIC INIT tmppriority=(0x700-(SCB-AiRC &(u32)0x700))>>0x08; ∥算出来得到的就是抢占优先级的位数占四位中的几位 tmppre=(0x4-tmppriority) ∥算出来得到的就是了优先级的位数占四位中的几位 例如:结合上面对STM32的分组我们可以得到 分组(3)0x300: Lmpprionity=(0x700-0×300)>>0x08-0x4;/抢占优先级的位数 占满四位 tmppre-0x4-0x4-0 ∥优先级占零位 分组(4)0X400: tmppriority=(0x700-0x400)>0x08-0x3:/抢占优先级的位数 占3位 tmppre=0x4-0x3=1; ∥优先级占1位 分组(5)0x500: tmppriority=(0x700-0x500)>0x08-0x2;抢占优先级的位数 /占2位 tmppre-0x4-0x2-2, ∥优先级占2位 其他几种分组情况也相同就不一一列出了。 先级的 psub > tmppriority;然后将四位掩码通过抢占优先级位数得到子优 tmpsub = ti 例如:采用分组5则得到抢占优先级为2,子优先级为2。 Tmpsub为4位掩码初 始值为0xF: 表20.pub-0xf>0x2-0x3;/子优先级的掩码为3。 分组 GROUP抢占优先级 子优先级 子优先级掩码(二进制) tmppriority tmppre tmpsub= tmpsub tmppriority; 4 0 0000 4 0001 0011 0111 0 子优先级掩码有什么用? 继续看下面的程序就知道了 tmppriority=(u32)NVIC InitStruct->NVIC IRQChannelPreemption Priority NVIC IRQChannelSubPriority tmpsub ∥,与上子优先级掩码得到单纯的子优先级 ∥然后或上子优先级得到了该中断通道8位的优先级数 例如:在上面例子采用分组5的前提下,我们选择 了优先级 NVIC IRQChannelSubPriority-1 结果: tmppriority-0x4(1&0x3)-0x5 先与上子优先级掩码得到单纯的子优先级: 表22 子优先子优先Bi7B6Bit5Bit4Bit3 Bit2 BitlBitO 级 级 掩码 0011 0 0011 01 001l 然后或上子优先级得到了该中断通道8位的优先级数: 表23 抢占子优先「Bit7Bit6Bi5Bit4Bit3Bit2 BitlBit0 优先级级 00 0 01 01 10 10 0011 以上就是掩码的作用了,接下来: tmppriority= tmppriority<<0x04;∥首先将这个优先级数左移四位放置到相应通 道优先级寄存器8位的高四位(优先级8位从左边算起的) 例如: tmppriority-0x5<<0x40x50 tmppriority -((u32)tmppriority) <<((NVIC InitStruct->NVIC IRQChannel (u8)0x03)*0x08) /为一个32位中包含4个8位,而这些32位的优先级寄存器又排列在一块连 STⅥ32的NVIC优先级 续的空间中组成优先级寄存器阵列,这样的话,需要有一个对准的问题,比如我 现在是第六个通道,我就需要将其放置到第二个32位中的第二个八位(从左边 数),具体算法是: 首先将该通道在32位中的第几个八位算出来,所以同0x03相与, ∥然后再乘以8得到的便是该通道在32位中的第几位, 有0°8=0,1*8=8,2*8=16,3*8=24,这四种情况 )将该优先级左移这么多位就得到它在32位寄存器中的位置了。 ∥总之该语句将该通道优先级寄存在其32位当中从第几位开始的8位找出来 ∥放在 tmppriority相应的地方中 例如通道6: tmppriority=0x50(0x6&0x3)*0x8)=0x50000 表24:优先级寄存器阵列 Bit[31.24 Bit23.16]|Bt8 Bit[7.0] 0xE000E400 CHANNEL3 CHANNEL2 CHANNELI CHANNEL0第0个32位 Bit11.24]Bi[23.16 Bit[ 15.8 Bit[7.0] 0xE000E4004 CHANNEL7 CHANNEL6 CHANNEL5 CHANNEL4第1个32位 Bt31.24B23.16 Bit[15.8 BitL7.o] 0xE000E4008 CHANNEL1 CHANNEL10 CHANNEL9 CHANNEL8第2个32位 tmpreg-NVIC->Priority(NVIC InitStruct->NVIC IRQChannel>>0x02) 接下来将通道数除以四(这里通道移位来运算除法的),得到的其实就是该通道 ∥在第几个32位优先级寄存器上,把这个32位寄存结果读出来放在 tmpreg中。 例如通道6: tmpreg=NVC→> Priority[];/第1个32位优先级寄存器 tmpmask-(u32)0xFF<<(NVIC InitStruct->NVIC IRQChannel&(u8 )0x03)*0x08) ∥该语句将该通道优先级寄存器在32位当中的第几位开始的八位加上了掩码,以 后面方便写入到该通道优先级寄存器的八位上 例如 tmpmask=0xf<(0x6&0x03)*0x08)=0xm000 表25: 0xE000E4004Bit[3124] Bit[23.16 Bit[15.8 Bit[7.0] 通道 CHANNEL7 CHANNEL6 CHANNEL5 CHANNEL4 掩码 0000 FF 00 00 tmpreg &=-tmpmask; ∥将该通道在32位的优宄级寄存器组上的8位清零,其他位也就是其它通道的 ∥优先级寄存器保证同1相与,不会改变 例如 tmpreg&=0x0omf //tmppriority &= tmpmask ∥只保留该通道的优先级寄存器在32位上的八位,其他的通道的优先级寄存 ∥器全部用0屏蔽 例如 tmppriority=0x60000&of0000×50000 tmpreg= tmppriority; ∥终于现在, mprog中该通道优先级寄存器的8位全部为0,其他通道优先级寄 器的8位(还有三组)全部为原来本身的数而没有改变 / tmppriority屮该通道优先级寄存器的8位数据完好,其他通道优先级寄存器的 ∥8位(还有三组)全部为0 两者相"或",该32位 tmpreg便是已经包含了本次用户输入的通道中断优先 ∥级寄存器的8位信息 STⅥ32的NVIC优先级 例如 tmpreg=0x500000006 NVIC->Priority[(NVIC InitStruct->NVIC IRQChannel >>0x02)]=tmpreg 输入到包含该通道中断了优先级寄存器的32位寄存器中,可以看出,本质上也 是一个读-修改-写的过程
(系统自动生成,下载前可以参看下载内容)

下载文件列表

相关说明

  • 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
  • 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度
  • 本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用WinRAR最新版进行解压.
  • 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
  • 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
  • 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.
 相关搜索: STM32的中断优先级.pdf
 输入关键字,在本站1000多万海量源码库中尽情搜索: