求助:CH32V208 RTC鬧鐘喚醒待機(jī)模式疑問

我在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)各位大大幫忙看看嗎?

去搜一下官方發(fā)布的103 RTC例程參考一下。有沒有使能鬧鐘中斷,和EXTI17 中斷。主要是EXTI17。


image.png

可手冊(cè)里從待機(jī)模式下喚醒,僅需要配置鬧鐘事件就行啊。


您好,需要將EXTI_Line17配置成事件模式,如下圖。附件是基于你的代碼修改的例程,測(cè)試是沒問題的,你可以參考一下。后續(xù)若有問題,可郵箱(lzs@wch.cn)和我溝通.

icon_rar.gifCH32V208 待機(jī)模式喚醒.zip

image.png



只有登錄才能回復(fù),可以選擇微信賬號(hào)登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频