工程中用到低功耗的控制,本来想使用待机模式,后来发现待机后所有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)所以使用外部晶振的需要重新配置时钟系统
USB Type-C应用与技术趋势
Operas“无限” VPN服务现已推出Android版!
每个人的区块链即将出版可以让学者进一步的了解区块链
华为Mate9与OPPOR9S对比评测:外观、拍照、续航、性能对比分析,华为Mate9、OPPOR9S你选谁?
基于物联网的机房空调数据采集方案
STM32实现对RTC闹钟唤醒的设计
光电器件的可靠性要求(一)
金立S11人脸识别体验 解锁速度令人满意
关于瞬态响应的发生过程及其对设计的影响的研究和应对
2018年全球前10大无晶圆厂IC设计公司排名
继7nm量产后,台积电公布了3nm制程工艺计划
大气污染环境监测仪的介绍
指令系统,指令系统是什么意思
万物互联离不开传感器,气体传感器未来创新如何破局
两家运营商决定用诺基亚取代华为
5G进一步激活车联网、智能工厂、远程医疗等大量智能社会的云应用场景
线性稳压器和DCDC的工作原理
高通即将彻底完成对于NXP的收购案
创基Type-C扩展坞适配多种场所拓展
福建移动为长乐区医院提出了5G+远程测温整体信息化解决方案