打印
[技术问答]

菜鸟初学M058S之一个符号引发的血案

[复制链接]
1309|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

使用特权

评论回复
5
徐晓笨| | 2013-12-15 23:07 | 只看该作者
学习学习

使用特权

评论回复
6
黄小俊| | 2013-12-15 23:17 | 只看该作者
注意点。

使用特权

评论回复
7
从小木丁丁| | 2013-12-16 10:38 | 只看该作者
注意点就不会出现血案

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

212

主题

2427

帖子

7

粉丝