关于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,急盼大师指点!
这个程序是原子的RTC实验里的,RTC.C里的程序,那个判断语句是告诉你,是否是第一次上电,如果是就往下,如果不是就把备份寄存器写入0x5050,但是这个的前提是32.768K晶振工作,否则就会出错。换句话说你的32.768K晶振没有成功启动,如果启动了,程序就会正常往下运行。你可以把LSE换成LSI 就是内部晶振测试下。
页:
[1]