完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
一.问题现象
问题:发现对LCD进行数据更新时,LCD屏幕闪烁背光不稳定,删除LCD数据更新程序时,背光稳定 软件实现:背光是在250us中断中对端口PC8操作实现对亮度的控制 二.原因 LCD进行数据更新显示时,大量的对多个IO端口输出状态进行操作,这些操作会影响中断中对LCD背光端口的操作,假如非中断中大量对GPIOC的任意端口进行操作时,中断中对GPIOC操作就可能失效!
b. 使用r0~r3的通用寄存器修改端口值、 c.将值写回外设寄存器中 2.若执行了步骤a,但未执行到c时被中断打断,此时r0值(即从外设读取的值)被压栈,,中断中执行io操作修改了当前外设寄存器的值,退出中断后r0出栈,然后又写回外设寄存器,导致中断中操作的值失效变回进入中断前的值 三.测试分析 1.汇编测试 汇编释义: R0 = POARTA寄存器的基地址(猜测是0x40013000) 将地址R0+0x10地址(PORTA->DO寄存器地址)的数据放在r0 将0x1放在R3 R1 = 255 R1=255+1=256=0x100 用r1给r0或运算后值存入r0 R1 = POARTA寄存器的基地址 将r0写到r1+x10地址的数据中去 仿真现象: 在执行上面这段汇编的中间过程如果被中断打断,在中断中会修改PA端口DO寄存器的值,退出中断,且执行完上面最后一句后,中断中修改的值失效 2.示波器分析 波形发现对一个io进行操作后极短的时候又恢复到原样,很可能就是退出中断后还未完成非中断时io操作,在完成io操作之后,中断中操作的端口的寄存器的值又变回压栈前的值 图片: 无 3.文档支持 在cortexM3权威指南发现下面这段话 上面的内容解释了为什么中断修改的io会在退出中断后恢复 四.解决方案 1.最推荐的方案就是使用SET和RESET寄存器,不使用DO寄存器,因为SET和RESET寄存器是只读寄存器,底层汇编读取这个寄存器值时其实是0,而这个寄存器写1有效,写0无效,所以不会有DO寄存器的相关问题 2如果你非要用DO寄存器,那么尽量避免非中断中的GPIO操作和中断中操作的GPIO是相同类型的GPIO(比如都是GPIOA)。 附件 1.我使用的单片机的寄存器分布 2.中断内中执行的测试程序 |
|
|
|
只有小组成员才能发言,加入小组>>
3314 浏览 9 评论
2995 浏览 16 评论
3494 浏览 1 评论
9059 浏览 16 评论
4088 浏览 18 评论
1179浏览 3评论
605浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
599浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2335浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1896浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 14:04 , Processed in 1.270546 second(s), Total 78, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号