您的位置 首页 知识

STM32完成对RTC闹钟唤醒的规划

STM32实现对RTC闹钟唤醒的设计-工程中用到低功耗的控制,本来想使用待机模式,后来发现待机后所有IO口为高阻态,这样对于一些IO口控制的外设有些不妥,想过外部上拉一个电阻可是功耗不好控制放弃该方案选用停止模式。停止模式后IO口保持停止前的状态,但是不像待机模式那样可以轻松通过闹钟唤醒,只能通过中断线实现唤醒。

工程中用到低功耗的操控,本来想运用待机形式,后来发现待机后一切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)所以运用外部晶振的需求重新装备时钟体系

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/346868.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部