新手上路
- 积分
- 26
- 金钱
- 26
- 注册时间
- 2020-6-23
- 在线时间
- 4 小时
|
3金钱
本帖最后由 泛黄的秋 于 2020-7-19 22:59 编辑
做了一个程序,不进入stop模式,RTC的中断可以正常进入,但是进入STOP模式的时候,就进不了RTC中断了,也无法唤醒芯片,好奇怪???但是其他的外部中断可以唤醒。芯片是F103CBT6. 大家有没有什么建议啊
睡眠前的代码
RTC_Alarm_Configuration();
LED_1=1;
LED_2=1;
Uart1_SendStr("enter sleep mode\r\n");
PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
初始化代码
void RTC_Alarm_Configuration(void)
{
u16 count=0;
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP|RCC_APB1Periph_PWR,ENABLE);
PWR_WakeUpPinCmd(ENABLE);
PWR_BackupAccessCmd(ENABLE);
BKP_DeInit();
RCC_LSICmd(ENABLE);;
while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET && count<2000)
{
count++;
delay_ms(1);
}
EXTI_ClearITPendingBit(EXTI_Line17);
RTC_WaitForLastTask();
RTC_ClearITPendingBit(RTC_IT_SEC|RTC_IT_OW|RTC_IT_ALR);
RTC_WaitForLastTask();
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
RCC_RTCCLKCmd(ENABLE);
RTC_WaitForLastTask();
RTC_WaitForSynchro();
RTC_SetPrescaler(31999);
RTC_WaitForLastTask();
RTC_ITConfig(RTC_IT_ALR, ENABLE);
RTC_WaitForLastTask();
EXTI_ClearITPendingBit(EXTI_Line17);
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_InitStructure.NVIC_IRQChannel = RTCAlarm_IRQn; //
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn; //
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
RTC_EnterConfigMode();
RTC_SetCounter(0); //
RTC_WaitForLastTask();
RTC_SetAlarm(RTC_GetCounter()+5); //
RTC_WaitForLastTask();
RTC_ExitConfigMode();
}
中断函数代码
void RTCAlarm_IRQHandler(void)
{
EXTI_ClearITPendingBit(EXTI_Line17);
RTC_WaitForLastTask();
RTC_Wake_Flag=1;
LED_2=0;//监控输出
delay_ms(500);
}
void RTC_IRQHandler(void)
{
RTC_WaitForSynchro();
if(RTC_GetITStatus(RTC_IT_ALR|RTC_IT_ALR) != RESET)
{
RTC_ClearITPendingBit(RTC_IT_SEC|RTC_IT_OW|RTC_IT_ALR);
RTC_WaitForLastTask();
}
}
|
最佳答案
查看完整内容[请看2#楼]
自问自答吧。这个问题解决了。查了网上的资料存在下面两个问题。
1. 这个是Alarm 唤醒,所以用内部line 17这个线,不要激活wakeuppin,这个是不同的唤醒方式。
解决方法,注释这一条//PWR_WakeUpPinCmd(ENABLE);
2. 第二,一开始没有加RTCAlarm_IRQn这个中断,后来加的,但是忘记添加NVIC_Init,所以实际一直未激活这个中断。
3. 也是网上很多都提到的,就是中断优先级,一定是RTCAlarm_IRQn要高于RTC_IRQn
希望大家也能成功
...
|