尝试着使用了下STM32的BKP数据寄存器,试着RESET后仍旧保持之前的RTC,但是遇到了问题,BKP_DR寄存器中的值RESET之后就不见了。(试过BKP_DR34这个貌似直接写不进去,BKP_DR3可以写进去,写完后读出来也对,但RESET之后就没有了) 请教下为什么?应该怎么做能让BKP_DR在RESET后依旧有值。
int main() { RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP, ENABLE); RCC_RTC_Configuration(); ... } void RCC_RTC_Configuration() { volatile uint16_t val = 0, val1 = 0; PWR_BackupAccessCmd(ENABLE); BKP_ClearFlag(); BKP_DeInit(); RCC_LSEConfig(RCC_LSE_ON); while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET); RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); RCC_RTCCLKCmd(ENABLE); val = BKP_ReadBackupRegister(BKP_DR3); //这里复位后每次读的值都为0x0000 if(val == 0x3434) { //BackUp register Set // PWR_BackupAccessCmd(DISABLE); RCC_ClearFlag(); } else { //BackUp register Unset // BKP_DeInit(); RTC_WaitForLastTask(); RTC_EnterConfigMode(); RTC_SetPrescaler(0x7FFF); RTC_WaitForLastTask(); RTC_ITConfig(RTC_IT_ALR | RTC_IT_SEC, ENABLE); RTC_ExitConfigMode(); RTC_WaitForLastTask(); BKP_WriteBackupRegister(BKP_DR3, (uint16_t)0x3434); //这里改为BKP_DR34后下面读出来的val1为0x0000 val1 = BKP_ReadBackupRegister(BKP_DR3); val1 = BKP_ReadBackupRegister(BKP_DR3); // PWR_BackupAccessCmd(DISABLE); RCC_ClearFlag(); } }
请检查纽扣电池供电是否正常。 用的核心板,直接用5V供电的,貌似没接VBAT,好吧...我试试接一个。 另外BKP_DR34写不进去是为什么呢? 小容量产品是指闪存存储器容量在16K至32K字节之间的STM32F101xx、STM32F102xx和 STM32F103xx微控制器。 中容量产品是指闪存存储器容量在64K至128K字节之间的STM32F101xx、STM32F102xx和 STM32F103xx微控制器。 大容量产品是指闪存存储器容量在256K至512K字节之间的STM32F101xx和STM32F103xx微控 制器。 互联型产品是指STM32F105xx和STM32F107xx微控制器。
BKP特性 ● 20字节数据后备寄存器(中容量和小容量产品),或84字节数据后备寄存器(大容量和互联型 产品)
|