问题如题,在这个型号上使用rtc闹钟中断没有效果,换成ch32v203c8t6的开发板测试可以实现,是什么问题
void rtc_init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //开启PWR的时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP, ENABLE); //开启BKP的时钟
/*备份寄存器访问使能*/
PWR_BackupAccessCmd(ENABLE); //使用PWR开启对备份寄存器的访问
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");
}
}
这个是测试的代码,本来是用来作为rtthread的pm电源管理的deep唤醒,发现怎么都唤不醒
您好,可以参考一下附件例程,附件例程测试唤醒是没有问题的,如下图
我测试了你给的代码了,就是会出现进入stop后rtc并没有去定时唤醒,然后我就先把进stop的部分屏蔽,单独测了一下会不会定时打印,但还是不行,但是那个rtc秒中断的例程可以运行,这样的情况有没有可能是电路设计的问题导致的,看起来就是rtc没问题但是闹钟中断无效
您好,例程我这边测试过都是没问题的,定时10s后唤醒,就是10s后唤醒。正常若直接用例程测试的话应该是没问题的,你可以将你的现象和我具体描述一下或截图发我(lzs@wch.cn)看一下,后面问题也可以通过邮箱沟通。
我把相关的邮件发给你了,我看了一下批次号,这个是第零批的,跟批次号有关系么?我同事用的一批次的是没问题的
您好,已邮件回复你,你可以按照我邮件回复试一下,后续沟通可直接通过邮件沟通。