4位
表示 抢占优先级,0位 表示 相应优先级01 | //设置向量表偏移地址 |
02 | //NVIC_VectTab:基址 |
03 | //Offset:偏移量 |
04 |
05 | void Nvic_SetVectorTable(u32 NVIC_VectTab, u32 Offset) |
06 | { |
07 | //检查参数合法性 |
08 | assert_param(IS_NVIC_VECTTAB(NVIC_VectTab)); |
09 | assert_param(IS_NVIC_OFFSET(Offset)); |
10 | SCB->VTOR = NVIC_VectTab|(Offset & (u32)0x1FFFFF80);//设置NVIC的向量表偏移寄存器 |
11 | //用于标识向量表是在CODE区还是在RAM区 |
12 |
13 | } |
14 |
15 |
16 | //设置NVIC分组 |
17 | //NVIC_Group:NVIC分组 0~4 总共5组 |
18 |
19 | void Nvic_PriorityGroupConfig(u8 NVIC_Group) |
20 | { |
21 | u32 temp,temp1; |
22 |
23 | //配置向量表 |
24 | #ifdef VECT_TAB_RAM |
25 | Nvic_SetVectorTable(NVIC_VectTab_RAM, 0x0); |
26 | #else |
27 | Nvic_SetVectorTable(NVIC_VectTab_FLASH, 0x0); |
28 | #endif |
29 |
30 | temp1=(~NVIC_Group)&0x07;//取后三位 |
31 | temp1<<=8; |
32 | temp=SCB->AIRCR; //读取先前的设置 |
33 | temp&=0X0000F8FF; //清空先前分组 |
34 | temp|=0X05FA0000; //写入钥匙 |
35 | temp|=temp1; |
36 | SCB->AIRCR=temp; //设置分组 |
37 | } |
38 |
39 |
40 | //设置NVIC |
41 | //NVIC_PreemptionPriority:抢占优先级 |
42 | //NVIC_SubPriority :响应优先级 |
43 | //NVIC_Channel :中断编号 |
44 | //NVIC_Group :中断分组 0~4 |
45 | //注意优先级不能超过设定的组的范围!否则会有意想不到的错误 |
46 | //组划分: |
47 | //组0:0位抢占优先级,4位响应优先级 |
48 | //组1:1位抢占优先级,3位响应优先级 |
49 | //组2:2位抢占优先级,2位响应优先级 |
50 | //组3:3位抢占优先级,1位响应优先级 |
51 | //组4:4位抢占优先级,0位响应优先级 |
52 | //NVIC_SubPriority和NVIC_PreemptionPriority的原则是,数值越小,越优先 |
53 |
54 | void Nvic_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group) |
55 | { |
56 | u32 temp; |
57 |
58 | u8 IPRADDR=NVIC_Channel/4; //每组只能存4个,得到组地址 |
59 | u8 IPROFFSET=NVIC_Channel%4;//在组内的偏移 |
60 | IPROFFSET=IPROFFSET*8+4; //得到偏移的确切位置 |
61 | Nvic_PriorityGroupConfig(NVIC_Group);//设置分组 |
62 | temp=NVIC_PreemptionPriority<<(4-NVIC_Group); |
63 | temp|=NVIC_SubPriority&(0x0f>>NVIC_Group); |
64 | temp&=0xf;//取低四位 |
65 |
66 | if(NVIC_Channel<32)NVIC->ISER[0]|=1<<NVIC_Channel;//使能中断位(要清除的话,相反操作就OK) |
67 | else NVIC->ISER[1]|=1<<(NVIC_Channel-32); |
68 | NVIC->IPR[IPRADDR]|=temp<<IPROFFSET;//设置响应优先级和抢断优先级 |
69 | } |
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |