我在CH32V208WBU6的評(píng)估板上進(jìn)行實(shí)驗(yàn),程序是官方例程中的Standby_Mode,我修改了main.c文件,想實(shí)現(xiàn)RTC鬧鐘喚醒待機(jī)模式的功能,我修改的代碼如下:
void MyRTC_Init(void)
{
? ? /*開啟時(shí)鐘*/
? ? RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);? ? ?//開啟PWR的時(shí)鐘
? ? RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP, ENABLE);? ? ?//開啟BKP的時(shí)鐘
? ? /*備份寄存器訪問使能*/
? ? PWR_BackupAccessCmd(ENABLE);? ? ? ? ? ? ? ? ? ? ? ? ? ? //使用PWR開啟對(duì)備份寄存器的訪問
? ? if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)? ? ? ? ? //通過寫入備份寄存器的標(biāo)志位,判斷RTC是否是第一次配置
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //if成立則執(zhí)行第一次的RTC配置
? ? {
? ? ? ? RCC_LSEConfig(RCC_LSE_ON);? ? ? ? ? ? ? ? ? ? ? ? ? //開啟LSE時(shí)鐘
? ? ? ? while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) != SET);? //等待LSE準(zhǔn)備就緒
? ? ? ? RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);? ? ? ? ? ? ?//選擇RTCCLK來源為L(zhǎng)SE
? ? ? ? RCC_RTCCLKCmd(ENABLE);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //RTCCLK使能
? ? ? ? RTC_WaitForSynchro();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//等待同步
? ? ? ? RTC_WaitForLastTask();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //等待上一次操作完成
? ? ? ? RTC_SetPrescaler(32768 - 1);? ? ? ? ? ? ? ? ? ? ? ? //設(shè)置RTC預(yù)分頻器,預(yù)分頻后的計(jì)數(shù)頻率為1Hz
? ? ? ? RTC_WaitForLastTask();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //等待上一次操作完成
? ? ? ? RTC_SetCounter(100);? ? ? ? ? ? ? ? ? ? ? ?//將秒計(jì)數(shù)器寫入到RTC的CNT中
? ? ? ? RTC_WaitForLastTask();? ? ? ? ? ? ? ? ? ? ? ? ? //等待上一次操作完成
? ? ? ? BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);? ? ? ? ? ?//在備份寄存器寫入自己規(guī)定的標(biāo)志位,用于判斷RTC是不是第一次執(zhí)行配置
? ? }
? ? else? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //RTC不是第一次配置
? ? {
? ? ? ? RTC_WaitForSynchro();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//等待同步
? ? ? ? RTC_WaitForLastTask();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //等待上一次操作完成
? ? }
}
int main(void)
{
? ? GPIO_InitTypeDef GPIO_InitStructure = {0};
? ? SystemCoreClockUpdate();
? ? Delay_Init();
? ? USART_Printf_Init(115200);
? ? MyRTC_Init();
? ? RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);? ? ? //開啟PWR的時(shí)鐘
? ? RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);? ? ? ?//開啟PWR的時(shí)鐘
? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
? ? GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
? ? GPIO_Init(GPIOD, &GPIO_InitStructure);
? ? GPIO_ResetBits(GPIOD, GPIO_Pin_4);
? ? printf("SystemClk:%d\r\n", SystemCoreClock);
? ? printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );
? ? printf("Standby Mode Test\r\n");
? ? PWR_WakeUpPinCmd(ENABLE);? ? ? ? ? ? ? ? ? ? ? ?//使能位于PA0的WKUP引腳,WKUP引腳上升沿喚醒待機(jī)模式
? ? /*設(shè)定鬧鐘*/
? ? uint32_t Alarm = RTC_GetCounter() + 10;? ? ? ? ?//鬧鐘為喚醒后當(dāng)前時(shí)間的后10s
? ? RTC_SetAlarm(Alarm);? ? ? ? ? ? ? ? ? ? ? ? ? ? //寫入鬧鐘值到RTC的ALR寄存器
? ? RTC_WaitForLastTask();
? ? while(1)
? ? {
? ? ? ? Delay_Ms(3000);
? ? ? ? PWR_EnterSTANDBYMode();
? ? }
}
實(shí)驗(yàn)現(xiàn)象是PD4連接的LED燈亮了3秒之后熄滅進(jìn)入待機(jī)模式,但是之后LED就不會(huì)再亮了,似乎芯片一直處于待機(jī)模式,RTC鬧鐘事件并沒有將其喚醒,我不知道是什么原因,能請(qǐng)各位大大幫忙看看嗎?