你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32 中断分组和优先级

[复制链接]
STMCU小助手 发布时间:2022-1-30 01:00
看了大半天,终于把原子哥的例程中的中断分组和优先级看懂了,勉勉强强知道了怎么设置中断分组和优先级,,不容易啊。下面就是我收集的资料及我的理解
( C0 \( o8 g; \5 E$ w$ P; ~
分组不是很难,就是有一点知道就就全部明白了:
899650-20160326205120042-2124027163.png 4 l5 G" U6 g  K# M% y' @; L

. M$ ]- ~  K) A, S8 m5 R
// 设置NVIC分组
//NVIC_Group:NVIC 分组 0~4  总共 5 组   
void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group)     
{  
    u32 temp,temp1;   
    temp1=(~NVIC_Group)&0x07;//取后三位 见后注释
    temp1<<=8;                //因为优先级分组在8-10位
    temp=SCB->AIRCR;  //读取先前的设置
    temp&=0X0000F8FF; //清空先前分组
    temp|=0X05FA0000; //写入钥匙   看上寄存器
    temp|=temp1;      
    SCB->AIRCR=temp;  //设置分组                     
}
       temp1=(~NVIC_Group)&0x07;//取后三位 为什么NVIC_Group要取反?和CM3分组不是反了吗?仔细查看《CM3权威指南》和对比《STM32不完全手册》可以发现,STM32是把CM3内核中第7分组定义为STM32的第0分组!原子哥撇开STM的库函数自己写,其实写的就是内核驱动,所以现在我们要控制的不是STM32,而是CM3,为了和STM32文档对应,那么我们应该对NVIC_Group取反!比如说我现在要用到STM32中的第1分组,其实是CM3中的第6分组,那我应该是把0x600写进CM3!

6 a( O  I5 R) {% c 899650-20160326205425292-1254359084.png / z8 t  i: s' v  A- f0 E

/ Y- [+ b5 r) X# G# Z; W! G
//设置NVIC
//NVIC_PreemptionPriority:抢占优先级
//NVIC_SubPriority       :响应优先级
//NVIC_Channel           :中断编号
//NVIC_Group             :中断分组 0~4
//注意优先级不能超过设定的组的范围!否则会有意想不到的错误
//组划分:
//组0:0位抢占优先级,4位响应优先级
//组1:1位抢占优先级,3位响应优先级
//组2:2位抢占优先级,2位响应优先级
//组3:3位抢占优先级,1位响应优先级
//组4:4位抢占优先级,0位响应优先级
//NVIC_SubPriority和NVIC_PreemptionPriority的原则是,数值越小,越优先         
void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group)  
{
       u32 temp;      
       MY_NVIC_PriorityGroupConfig(NVIC_Group);//设置分组(见上分析)
       temp=NVIC_PreemptionPriority<<(4-NVIC_Group); //有上图可知bit4-7是设置优先级的。
                                                                                        而优先级设定是由分组决定的
                                                                                       0组时:0位抢占优先级,4位响应优先级(bit4-7)
                                                                                       1组时:1位抢占优先级(bit7),3位响应优先(bit4-6)级
                                                                                       2组时:2位抢占优先级(bit6-7),2位响应优先级(bit4-5)
                                                                                       。。。。  所以这里要减去NVIC_Group
       temp|=NVIC_SubPriority&(0x0f>>NVIC_Group);
       temp&=0xf;                                                     //取低四位
       NVIC->ISER[NVIC_Channel/32]|=(1<<NVIC_Channel%32);      //stm32最多好像有200多个中断吧,不记得了,NVIC_Channl代表的其中一个,例如USART2_IRQn = 38。这些中断由8个32位寄存器使之使能,就拿USART2_IRQn来说,38/32 =1,38%32=6,所以要使USART2中断使能的话,必须设置NVIC->ISER[1]第六位为1(看看下面的寄存器)
       NVIC->IP[NVIC_Channel]|=temp<<4;              //设置响应优先级和抢断优先级  
}

# y* c) E  }: F% d  c7 O2 |
再插张一张NVIC寄存器吧,(在M3权威指南):  {1 t( H; R2 h9 f, i3 I
899650-20160326205833636-648803054.png

- e$ ~. L! s$ ~: Z+ ]# a

+ t2 D6 [: P1 E& ^/ @
收藏 评论0 发布时间:2022-1-30 01:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版