[技术问答] 菜鸟初学M058S之一个符号引发的血案

[复制链接]
1999|6
 楼主| niuyaliang 发表于 2013-12-15 20:10 | 显示全部楼层 |阅读模式
本帖最后由 niuyaliang 于 2013-12-15 20:22 编辑

调试了一下午的定时器,出现了一个问题,觉得很有必要提出来
SYSCLK->CLKSEL1 |= SYSCLK_CLKSEL1_TMR3_IRC10K;
SYSCLK->CLKSEL1 = SYSCLK_CLKSEL1_TMR3_IRC10K;

上面这两行代码有什么区别呢,看上去没什么区别呀,都是把设置好的值先进去,区别在于前者是保留其他位的值,后者则把其他位的值置零,一般情况下不会影响程序的。可是!!!偏偏,这句就出问题了!!!
 楼主| niuyaliang 发表于 2013-12-15 20:16 | 显示全部楼层
本帖最后由 niuyaliang 于 2013-12-15 20:17 编辑

原来,M058S在复位后,CLKSEL1寄存器的值为0xFFFF_FFFF,
在库中SYSCLK_CLKSEL1_TMR3_IRC10K的定义为#define SYSCLK_CLKSEL1_TMR3_IRC10K       0x00500000UL,
于是,在执行第一条语句后,CLKSEL1的值为0xFFFF_FFFC;
可是在执行第二条语句后,CLKSEL1的值为0x0050_0000,则CLKSEL1的20-22位出现了差异了,因此导致定时器的时间出现了偏差。
 楼主| niuyaliang 发表于 2013-12-15 20:21 | 显示全部楼层
但是我们在实际中,一般不会改变系统复位后的默认值,经常会用“|=”的写法,所以,在系统复位后全为1的寄存器中,这种写法要慎重使用,我们最好还是把需要用到的寄存器全部初始化一遍,不用的就置零,对于这种写法,大侠们是如何避免这个问题发生呢?
ZG11211 发表于 2013-12-15 22:13 | 显示全部楼层
以前遇到过,现在学乖了,不过没发生过“血”案;P
徐晓笨 发表于 2013-12-15 23:07 | 显示全部楼层
学习学习
黄小俊 发表于 2013-12-15 23:17 | 显示全部楼层
注意点。
从小木丁丁 发表于 2013-12-16 10:38 | 显示全部楼层
注意点就不会出现血案
您需要登录后才可以回帖 登录 | 注册

本版积分规则

212

主题

2427

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部