問題如題,在這個(gè)型號(hào)上使用rtc鬧鐘中斷沒有效果,換成ch32v203c8t6的開發(fā)板測(cè)試可以實(shí)現(xiàn),是什么問題
void rtc_init(void)
{
? ? RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);? ? ?//開啟PWR的時(shí)鐘
? ? RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP, ENABLE);? ? ?//開啟BKP的時(shí)鐘
? ? /*備份寄存器訪問使能*/
? ? PWR_BackupAccessCmd(ENABLE);? ? ? ? ? ? ? ? ? ? ? ? ? ? //使用PWR開啟對(duì)備份寄存器的訪問
? ? BKP_TamperPinCmd(DISABLE);
? ? if (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) != SET) {
? ? ? ? RCC_LSICmd(ENABLE);
//? ? ? ? int temp = 0;
? ? ? ? while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET) {
? ? ? ? ? ? // TODO lsi boot failed, not sleep?
//? ? ? ? ? ? temp++;
//? ? ? ? ? ? if (temp >= 250) {
//? ? ? ? ? ? ? ? break;
//? ? ? ? ? ? }
//? ? ? ? ? ? rt_thread_mdelay(10);
? ? ? ? }
//? ? ? ? if (temp >= 250) {
//? ? ? ? ? ? elog_e(TAG, "LSI don't start expectly in 2.5s: %d\n", temp);
//? ? ? ? }
? ? }
? ? RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
? ? RCC_RTCCLKCmd(ENABLE);
? ? RTC_WaitForLastTask();
? ? RTC_EnterConfigMode();
? ? RTC_WaitForLastTask();
? ? RTC_SetPrescaler(0);
? ? RTC_WaitForLastTask();
? ? RTC_SetAlarm(0);
? ? RTC_WaitForLastTask();
? ? RTC_SetCounter(1);
? ? RTC_WaitForLastTask();
? ? EXTI_InitTypeDef EXTI_InitStructure = {0};
? ? EXTI_InitStructure.EXTI_Line = EXTI_Line17;
? ? EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
? ? EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
? ? EXTI_InitStructure.EXTI_LineCmd = ENABLE;
? ? EXTI_Init(&EXTI_InitStructure);
? ? NVIC_InitTypeDef NVIC_InitStructure = {0};
? ? NVIC_InitStructure.NVIC_IRQChannel = RTCAlarm_IRQn;
? ? NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
? ? NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
? ? NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
? ? NVIC_Init(&NVIC_InitStructure);
}
static void RTC_Alarm(uint32_t count) {
? ? RTC_SetCounter(0);
? ? RTC_WaitForLastTask();
? ? RTC_SetAlarm(count);
? ? RTC_WaitForLastTask();
? ? EXTI_ClearITPendingBit(EXTI_Line17);
? ? RTC_ClearITPendingBit(RTC_IT_ALR);
? ? RTC_ITConfig(RTC_IT_ALR, ENABLE);
? ? RTC_WaitForLastTask();
? ? EXTI_ClearITPendingBit(EXTI_Line17);
? ? RTC_ClearITPendingBit(RTC_IT_ALR);
}
void RTCAlarm_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
void RTCAlarm_IRQHandler(void) {
? ? EXTI_ClearITPendingBit(EXTI_Line17);
? ? RTC_ClearITPendingBit(RTC_IT_ALR);
//? ? printf( "RTCAlarmIRQHandler %d", RTC_GetCounter());
? ? RTC_ITConfig(RTC_IT_ALR, DISABLE);
? ? RTC_WaitForLastTask();
? ? printf( "RTCAlarmIRQHandler %d\n", RTC_GetCounter());
}
/*********************************************************************
?* @fn? ? ? main
?*
?* @brief? ?Main program.
?*
?* @return? none
?*/
int main(void)
{
? ? NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
? ? SystemCoreClockUpdate();
? ? Delay_Init();
? ? USART_Printf_Init(115200);
? ? printf("SystemClk:%d\r\n", SystemCoreClock);
? ? printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );
? ? printf("Stop Mode Test\r\n");
? ? rtc_init();
? ? RTC_Alarm(10000);
//? ? EXTI0_INT_INIT();
//? ? Delay_Ms(5000);
//? ? RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
//? ? printf("\r\n ********** \r\n");
//? ? PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
//? ? printf("\r\n ########## \r\n");
? ? while(1)
? ? {
? ? ? ? Delay_Ms(1000);
? ? ? ? printf("Run in main\r\n");
? ? }
}
這個(gè)是測(cè)試的代碼,本來是用來作為rtthread的pm電源管理的deep喚醒,發(fā)現(xiàn)怎么都喚不醒
您好,可以參考一下附件例程,附件例程測(cè)試喚醒是沒有問題的,如下圖
我測(cè)試了你給的代碼了,就是會(huì)出現(xiàn)進(jìn)入stop后rtc并沒有去定時(shí)喚醒,然后我就先把進(jìn)stop的部分屏蔽,單獨(dú)測(cè)了一下會(huì)不會(huì)定時(shí)打印,但還是不行,但是那個(gè)rtc秒中斷的例程可以運(yùn)行,這樣的情況有沒有可能是電路設(shè)計(jì)的問題導(dǎo)致的,看起來就是rtc沒問題但是鬧鐘中斷無效
您好,例程我這邊測(cè)試過都是沒問題的,定時(shí)10s后喚醒,就是10s后喚醒。正常若直接用例程測(cè)試的話應(yīng)該是沒問題的,你可以將你的現(xiàn)象和我具體描述一下或截圖發(fā)我(lzs@wch.cn)看一下,后面問題也可以通過郵箱溝通。
我把相關(guān)的郵件發(fā)給你了,我看了一下批次號(hào),這個(gè)是第零批的,跟批次號(hào)有關(guān)系么?我同事用的一批次的是沒問題的
您好,已郵件回復(fù)你,你可以按照我郵件回復(fù)試一下,后續(xù)溝通可直接通過郵件溝通。