freede 发表于 2016-5-14 11:50:09

关于STM32F时钟初始化问题

代码如下:
.....
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)语句。
为了证明这一点,我把代码改成:
INT16UDR1;   //全局变量
.....
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 发表于 2018-5-26 00:15:23

这个程序是原子的RTC实验里的,RTC.C里的程序,那个判断语句是告诉你,是否是第一次上电,如果是就往下,如果不是就把备份寄存器写入0x5050,但是这个的前提是32.768K晶振工作,否则就会出错。换句话说你的32.768K晶振没有成功启动,如果启动了,程序就会正常往下运行。你可以把LSE换成LSI 就是内部晶振测试下。
页: [1]
查看完整版本: 关于STM32F时钟初始化问题