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(); } } 后来搞定了,发现是代码有问题, C/C++ code?
1 2 3 4 5 6 7 8 9 |
void RCC_RTC_Configuration() { volatile uint16_t val = 0, val1 = 0; PWR_BackupAccessCmd(ENABLE); BKP_ClearFlag(); //BKP_DeInit(); //这个函数注释掉,因为里面最后调了PWR_BackupAccessCmd(DISABLE); .... } |
|