【经验分享】关于Kinetis L系列中断优先级设置问题的解决...

2020-02-20 20:35发布

本帖最后由 FSL_TICS_Robin 于 2014-7-18 13:54 编辑

关于Kinetis L系列中断优先级设置问题的解决方案
最近在调试Kinties L系列的时候,使用官方例程中arm_cm0.c,使用其中的void set_irq_priority (int irq, int prio)函数设置了中断优先级,然后仿真的时候,在寄存器窗口发现NVIC_IPRx寄存器的值并没有改变,然后查看寄存器具体的地址的内存发现也没有改变, 后来将NVIC_IPRx寄存器地址的值赋给一个变量,然后使用printf将该变量打印出来,发现第一次能够打印正确的值,但是连续第二次打印,值又变为了0.当时感觉很奇怪,然后仔细阅读了下ARM Cortex-M0的内核文档:The Definitive Guide to the ARM cortex M0.pdf.
发现对于中断优先级的操作,和ARM Cortex-M4还是有区别的:主要在于对于M0+内核的NVIC_IPRx寄存器,每次操作都是一组32位操作,若要改变寄存器的值,首先先要读出相应的值,然后改变一个字节,再将值写回到原来的地址上。
M0内核文档是这么讲的:
3.jpg (111.26 KB, 下载次数: 0) 下载附件 2014-3-20 10:56 上传
图3

可以看到,结果已经成功改变。
希望该经验能够帮到大家。
附件为修改后的arm_cm0.c
arm_cm0.rar (1.47 KB, 下载次数: 7) 2014-3-20 10:56 上传 点击文件名下载附件




PS:本帖可从飞思卡尔版块置顶帖:飞思卡尔Kinetis资料大本营飞思卡尔论坛支持小组【经验分享】帖汇总链接进入。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。