完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
最近在调试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内核文档是这么讲的: [size=0.83em]1.jpg (62.66 KB, 下载次数: 0) 下载附件 [color=rgb(153, 153, 153) !important]2014-3-20 10:49 上传 图1 |
|
|
相关推荐
|
|
|
而M4内核就不一样,是可以字节操作的,这点在M4的内核文档上也可以找到。 所以,我认为,原来arm_cm0.c中set_irq_priority (int irq, int prio)函数不能实现优先级正确设置的原因之一,是由于采用了8位操作的方式如下: uint8 *prio_reg; prio_reg = (uint8 *)((uint32)&NVIC_IP(div)); *prio_reg = ( (prio&0x3) << (8 - ARM_INTERRUPT_LEVEL_BITS) ); 定义需要修改为: uint32 *prio_reg; prio_reg = (unsigned long *)((uint32)&NVIC_IP(div));//div 第二,从原来的代码可以看出,并不能准确的实现具体irq的定位与值的修改。 假设我们需要设置: set_irq_priority(17, 3); 可以看出,上面错误的代码只能实现irq=16值的修改,原因其只是定位到了NVIC_IPR4中的低字节,而没有在IPR4中4个字节做偏移,所以只能修改irq=16的优先级。 根据我们的reference manual可以知道,在每组IPR中,具体定位IRQ,可以通过8*(IRQ mod 4)+6的方法,注意mod是取余数,程序中是“%”,不要理解为“/”. 综合上面两点,我将set_irq_priority函数修改如下: void set_irq_priority (int irq, int prio) { /*irq priority pointer*/ uint8 *prio_reg; uint8 err = 0; uint8 div = 0; uint32 temp=0; uint32 *prio_reg1; /* Make sure that the IRQ is an allowable number. Right now up to 32 is * used. * * NOTE: If you are using the interrupt definitions from the header * file, you MUST SUBTRACT 16!!! */ if (irq > 32) { printf("nERR! Invalid IRQ value passed to priority irq function!n"); err = 1; } if (prio > 3) { printf("nERR! Invalid priority value passed to priority irq function!n"); err = 1; } if (err != 1) { /* Determine which of the NVICIPx corresponds to the irq */ div = irq / 4; prio_reg1 = (unsigned long *)((uint32)&NVIC_IP(div));//div *prio_reg1 = ( (prio&0x3) << ((8 - ARM_INTERRUPT_LEVEL_BITS) + 8*(irq%4))); } } |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
太不错的资料了
|
|
|
|
|
|
|
|
|
太不错的资料了
|
|
|
|
|
|
|
|
|
太不错的资料了
|
|
|
|
|
|
|
|
|
太不错的资料了
|
|
|
|
|
|
|
|
|
太不错的资料了
|
|
|
|
|
|
|
|
|
太不错的资料了
|
|
|
|
|
|
|
|
|
太不错的资料了
|
|
|
|
|
|
|
|
|
太不错的资料了
|
|
|
|
|
|
|
|
|
太不错的资料了
|
|
|
|
|
|
|
|
|
太不错的资料了
|
|
|
|
|
|
|
|
|
太不错的资料了
|
|
|
|
|
|
|
|
|
太不错的资料了
|
|
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
2139个成员聚集在这个小组
加入小组我的项目我做主,使用GN+Ninja来完成构建系统(VSCode开发RT106X)
37411 浏览 0 评论
NXP IMX8应用处理器快速入门必备:技巧、使用、设计指南
6803 浏览 1 评论
7833 浏览 1 评论
7667 浏览 0 评论
NXP i.MX6UL开发板(linux系统烧录+规格+硬件+模块移植)使用手册
5090 浏览 0 评论
1586浏览 2评论
关于NINA-W132 Wi-Fi模块SPI通信遇到的疑问求解
1225浏览 2评论
如何在MPC PowerPC MCU上首次刷写后禁用BDM?
770浏览 1评论
将HFREFR和LFREFR寄存器值设置为错误的值来将故障注入CMU,但CMU_ISR值始终为零,为什么?
761浏览 1评论
将SPSDK for FRDM-MCX-W71 SDK与VS一起安装时出现hidapi构建错误怎么解决?
706浏览 1评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-15 13:49 , Processed in 1.061504 second(s), Total 78, Slave 68 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖