stm32 NVIC中断管理实现[直接操作寄存器](转)(3)
- UID
- 1029342
- 性别
- 男
|
stm32 NVIC中断管理实现[直接操作寄存器](转)(3)
IPR寄存器描述:
stm32将中断分为5组,组0~4. 该分组由SCB->AIRCR寄存器的[10:8]三位来定义。具体关系如下:
组 AIRCR[10:8] 分配情况 分配结果 0 111 .xxxx0000 0位 表示 抢占优先级,4位 表示 相应优先级 1 110 y.xxx0000 1位 表示 抢占优先级,3位 表示 相应优先级 2 101 yy.xx0000 2为 表示 抢占优先级,2位 表示 相应优先级 3 100 yyy.x0000 3位 表示 抢占优先级,1位 表示 相应优先级 4 011 yyyy.0000 4位 表示 抢占优先级,0位 表示 相应优先级
中断管理实现如下:
05 | void Nvic_SetVectorTable(u32 NVIC_VectTab, u32 Offset) |
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区 |
17 | //NVIC_Group:NVIC分组 0~4 总共5组 |
19 | void Nvic_PriorityGroupConfig(u8 NVIC_Group) |
25 | Nvic_SetVectorTable(NVIC_VectTab_RAM, 0x0); |
27 | Nvic_SetVectorTable(NVIC_VectTab_FLASH, 0x0); |
30 | temp1=(~NVIC_Group)&0x07;//取后三位 |
32 | temp=SCB->AIRCR; //读取先前的设置 |
33 | temp&=0X0000F8FF; //清空先前分组 |
34 | temp|=0X05FA0000; //写入钥匙 |
36 | SCB->AIRCR=temp; //设置分组 |
41 | //NVIC_PreemptionPriority:抢占优先级 |
42 | //NVIC_SubPriority :响应优先级 |
45 | //注意优先级不能超过设定的组的范围!否则会有意想不到的错误 |
52 | //NVIC_SubPriority和NVIC_PreemptionPriority的原则是,数值越小,越优先 |
54 | void Nvic_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group) |
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); |
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;//设置响应优先级和抢断优先级 |
|
|
|
|
|
|