首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

stm32 NVIC中断管理实现[直接操作寄存器](转)(3)

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位 表示  相应优先级                                       
中断管理实现如下:
01//设置向量表偏移地址

02//NVIC_VectTab:基址

03//Offset:偏移量

04

05void 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

19void 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

54void 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}
继承事业,薪火相传
返回列表