CH32V307 RTC定時喚醒

開發(fā)板CH32V307V-R0-1V0,參照移植到307 PWR STOP_MODE項目,每s喚醒一次。鬧鐘喚醒停機(jī)模式>

u8 RTC_Alarm_Set(void)

{

? ? u32 seccount = 0;

? ? seccount = RTC_GetCounter()+1;

? ? RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

? ? PWR_BackupAccessCmd(ENABLE);

? ? RTC_SetAlarm(seccount);

? ? RTC_WaitForLastTask();

? ? return 0;

}


void RTCAlarm_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));

void RTCAlarm_IRQHandler( void )

{

? ? //RTC_Alarm_Set();

? ? if( RTC_GetITStatus( RTC_IT_ALR ) != RESET )

? ? {

? ? }

? ? RTC_WaitForLastTask();

????RTC_ClearITPendingBit( RTC_IT_ALR );

? ? RTC_WaitForLastTask();

}

int main( void )

{

.....

????RTC_Alarm_Set();

? ? while(1)

? ? {

????????RTC_Alarm_Set();

? ? ? ? RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);

? ? ? ? printf("\r\n ********** \r\n");

? ? ? ? PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);

? ? ? ? printf("\r\n ########## \r\n");

? ? ? ? Delay_Ms(1000);

? ? ? ? printf("Run in main\r\n");

? ? }

}

其中鬧鐘配置放在主while循環(huán)內(nèi),可以實現(xiàn)1s喚醒一次,放在RTCAlarm_IRQHandler中不可實現(xiàn)。如果想要精確實現(xiàn)1ms喚醒一次,100us喚醒一次,應(yīng)該如何實現(xiàn)?主while中調(diào)用RTC_Alarm_Set()可能會有延遲。

謝謝!

您好,目前你配置低功耗模式為STOP模式,喚醒方式可使用外部中斷或事件進(jìn)行喚醒。目前使用RTC的話,最快方式也就是秒中斷。若想實現(xiàn)1ms或100us喚醒一次,可將GPIO引腳配置為外部中斷或事件,每個1ms或100us給一次觸發(fā)?;蚰憧蓪⒌凸哪J脚渲脼樗吣J?,采用定時器中斷喚醒方式,可精確實現(xiàn)1ms或100us喚醒一次。后續(xù)若有問題,可通過郵箱(lzs@wch.cn)和我溝通。


我通過使用512K外部有源LSE,RTC_SetPrescaler(511),RTC_SetAlarm(RTC_GetCounter()+1);實現(xiàn)1ms喚醒一次,調(diào)整PrescalerValue可獲得更低的喚醒周期。我遇到的問題是,不能在中斷函數(shù)中RTCAlarm_IRQHandler進(jìn)行RTC_SetAlarm()。只能在主while循環(huán)中RTC_SetAlarm()。


您好,若方便可將你的工程發(fā)至我的郵箱,這邊具體看一下測試一下


我找到問題了,我把PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);放在了RTCAlarm_IRQHandler()中,該語句放在主while中就OK了。

但是又發(fā)現(xiàn)個問題,RTC_SetAlarm(RTC_GetCounter()+0);才能實現(xiàn)1s喚醒一次,RTC_GetCounter()+1是2s喚醒一次。


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

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