【经验分享】关于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资料大本营飞思卡尔论坛支持小组【经验分享】帖汇总链接进入。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
FSL_TICS_ZJJ
1楼-- · 2020-02-20 20:54
 精彩回答 2  元偷偷看……
zhongyb
2楼-- · 2020-02-20 23:11
KL系列总共有四个优先级,0-3,0为最高优先级,在ARM CMSIS里面提供了设置中断优先级的接口函数。
zhongyb
3楼-- · 2020-02-21 01:32
函数名为NVIC_SetPriority,比如设置PORTD外部中断为最高优先级,NVIC_SetPriority(PORTD_IRQn, 0);
xinyinxing
4楼-- · 2020-02-21 02:57
这个到时没有注意!感谢经验分享。
cmheia
5楼-- · 2020-02-21 07:44
这是arm捣鬼?
每天学一点
6楼-- · 2020-02-21 13:33
 精彩回答 2  元偷偷看……

一周热门 更多>