有大神能讲解这句代码吗?能否配置成寄存器那样,MY_NVIC_Init(1,3,TIM3_IRQn,2);

2019-07-20 23:02发布


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
14条回答
下页
2019-07-21 18:52
关于void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group) 函数

复制代码
1 //设置向量表偏移地址
2 //NVIC_VectTab:基址
3 //Offset:偏移量            
4 void MY_NVIC_SetVectorTable(u32 NVIC_VectTab, u32 Offset)     
5 {            
6     SCB->VTOR = NVIC_VectTab|(Offset & (u32)0x1FFFFF80);//设置NVIC的向量表偏移寄存器
7     //用于标识向量表是在CODE区还是在RAM区
8 }
9 //设置NVIC分组
10 //NVIC_Group:NVIC分组 0~4 总共5组            
11 void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group)     
12 {
13     u32 temp,temp1;      
14     temp1=(~NVIC_Group)&0x07;//取后三位
15     temp1<<=8;
16     temp=SCB->AIRCR;  //读取先前的设置
17     temp&=0X0000F8FF; //清空先前分组
18     temp|=0X05FA0000; //写入钥匙
19     temp|=temp1;      
20     SCB->AIRCR=temp;  //设置分组                                 
21 }
22 //设置NVIC
23 //NVIC_PreemptionPriority:抢占优先级
24 //NVIC_SubPriority       :响应优先级
25 //NVIC_Channel           :中断编号
26 //NVIC_Group             :中断分组 0~4
27 //注意优先级不能超过设定的组的范围!否则会有意想不到的错误
28 //组划分:
29 //组0:0位抢占优先级,4位响应优先级
30 //组1:1位抢占优先级,3位响应优先级
31 //组2:2位抢占优先级,2位响应优先级
32 //组3:3位抢占优先级,1位响应优先级
33 //组4:4位抢占优先级,0位响应优先级
34 //NVIC_SubPriority和NVIC_PreemptionPriority的原则是,数值越小,越优先      
35 void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group)     
36 {
37     u32 temp;   
38     MY_NVIC_PriorityGroupConfig(NVIC_Group);//设置分组
39     temp=NVIC_PreemptionPriority<<(4-NVIC_Group);      
40     temp|=NVIC_SubPriority&(0x0f>>NVIC_Group);
41     temp&=0xf;//取低四位  
42     NVIC->ISER[NVIC_Channel/32]|=(1<<NVIC_Channel%32);//使能中断位(要清除的话,相反操作就OK)
43     NVIC->IP[NVIC_Channel]|=temp<<4;//设置响应优先级和抢断优先级                                    
44 }

一周热门 更多>