你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于STM32F时钟初始化问题

[复制链接]
freede 提问时间:2016-5-14 11:50 /
代码如下:
.....
1)RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);       
2)PWR_BackupAccessCmd(ENABLE);       
3)if(BKP_ReadBackupRegister(BKP_DR1) != 0x5050)
{                
        ......    //其它语句                 
4)        BKP_WriteBackupRegister(BKP_DR1, 0x5050);     //  写备份寄存器
        ......    //其它语句         
}
问题:复位运行时3)行判断永远为真,{...}中的语句永远执行不了,后发现BKP_ReadBackupRegister(BKP_DR1)返回的值永远是4)行中的0x5050。如果把3)行和4)行中的0x5050改成0x0505,那么3)行中的BKP_ReadBackupRegister(BKP_DR1)返回的值奇怪地永远是0x0505,我保证此前没有执行过4)语句。
为了证明这一点,我把代码改成:
INT16U  DR1;   //全局变量
.....
1)RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);       
2)PWR_BackupAccessCmd(ENABLE);       
3)DR1=BKP_ReadBackupRegister(BKP_DR1);
4)if(DR1 != 0x5050)
{                
        ......    //其它语句                 
5)        BKP_WriteBackupRegister(BKP_DR1, 0x5050);     //  写备份寄存器
        ......    //其它语句         
}
把断点设置在3)行,非常奇怪,当单步执行了3)后,DR1的值绝对是5)行中的值。现在把5)行中的值改为0x1234,编译后debug,运行到断点3),单步运行3)后DR1的值变为0x1234,莫名其妙!我保证没有执行5)行!似乎read的结果永远是write中的设置。
后来我把5)中的值用全局变量代替,郁闷的是无论这个变量赋值为多少,3)行的结果永远是这个变量的值。
cpu是STM32F105RBT6,急盼大师指点!

收藏 评论1 发布时间:2016-5-14 11:50

举报

1个回答
五哥1 回答时间:2018-5-26 00:15:23
这个程序是原子的RTC实验里的,RTC.C里的程序,那个判断语句是告诉你,是否是第一次上电,如果是就往下,如果不是就把备份寄存器写入0x5050,但是这个的前提是32.768K晶振工作,否则就会出错。换句话说你的32.768K晶振没有成功启动,如果启动了,程序就会正常往下运行。你可以把LSE换成LSI 就是内部晶振测试下。

评分

参与人数 1蝴蝶豆 +4 收起 理由
zero99 + 4

查看全部评分

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版