工程中用到低功耗的操控,本来想运用待机形式,后来发现待机后一切IO口为高阻态,这样关于一些IO口操控的外设有些不当,想过外部上拉一个电阻可是功耗欠好操控抛弃该计划选用中止形式。中止形式后IO口坚持中止前的状况,可是不像待机形式那样能够轻松经过闹钟唤醒,只能经过中止线完成唤醒。为了完成RTC闹钟唤醒搜得一段代码,现贴过来剖析一下
void RTC_EXTI_INITIAL(FuncTIonalState interrupt_en_or_dis)
{
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
//————EXTI17 装备 ——————-
EXTI_InitStructure.EXTI_Line = EXTI_Line17;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = interrupt_en_or_dis;
EXTI_Init(&EXTI_InitStructure);
//————设置 中止——————-
NVIC_InitStructure.NVIC_IRQChannel = RTCAlarm_IRQn;//防拆
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = interrupt_en_or_dis;
NVIC_Init(&NVIC_InitStructure);
//——————————————-
}
void RTC_SET_ALARM(u32 sec)
{
//DEBUG_COM_STREAM(“-闹钟-”,NULL);
RTC_SetAlarm(RTC_GetCounter()+sec);
//DEBUG_COM_STREAM(“-闹钟1-”,NULL);
RTC_WaitForLastTask();
//DEBUG_COM_STREAM(“-闹钟2-”,NULL);
RTC_ITConfig(RTC_FLAG_ALR,ENABLE);
}
void RTC_AWU_SET(void)
{
//启用PWR和BKP的时钟(from APB1)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
//后备域解锁
PWR_BackupAccessCmd(ENABLE);
RTC_ITConfig(RTC_IT_SEC, DISABLE);
RTC_SET_ALARM(5);
//PWR_BackupAccessCmd(DISABLE);
RTC_EXTI_INITIAL(ENABLE);
}
void RTCAlarm_IRQHandler(void)
{
EXTI_ClearITPendingBit(EXTI_Line17);
//SYS.wake_id|=1《《17;
}
void RTC_IRQHandler(void)
{
if (RTC_GetITStatus(RTC_IT_SEC) != RESET)
{
RTC_ClearITPendingBit(RTC_IT_SEC);
RTC_WaitForLastTask();
//TIME_COUNT=RTC_GetCounter();
//RTC_WaitForLastTask();
}
if (RTC_GetITStatus(RTC_FLAG_ALR) != RESET)
{
RTC_ClearITPendingBit(RTC_FLAG_ALR);
RTC_WaitForLastTask();
//SYS.wake_id|=1《《1;
}
}
关于上述代码阐明3点问题:
(1)为什么设置中止线17
STM32F10x有20条中止线,其间16条用于IO口中止运用,还有4条用于内部中止事情。EXTI17便是用于内部RTC闹钟唤醒中止事情时运用,所以初始化中除了翻开RTC闹钟中止一起翻开了EXTI17中止线。
(2)为什么RTC闹钟中止服务程序铲除EXTI17中止标志位?
由于中止线17接到了RTC闹钟上,RTC闹钟中止后会触发中止线17发生中止事情,所以在RTC中止内铲除标志位,这一起是RTC闹钟唤醒中止形式的原因。详细看下图手册描绘
(3)唤醒后程序在哪履行?
经过试验得到当体系唤醒后程序是在原中止方位次序向下履行。
PS:唤醒后时钟源默许切换到内部高速时钟(HSI)所以运用外部晶振的需求重新装备时钟体系