#申请原创# 本次测试使用的APM32F103VC_MINI板子,该款芯片支持睡眠、停止和待机三种低功耗模式。下面以 StandBy 模式也就是待机模式为例进行组件的使用分析,唤醒方式采用 RTC闹钟中断的方式进行唤醒。
APM32F103 待机模式介绍: APM32F103待机模式的各种特性如下所示。在待机模式下除了关闭所有的时钟,还把 1.2V 区域的电源区也完全关闭了,也就是说,从待机模式唤醒后,由于没有之前代码的运行备份,相当于对芯片复位,重新检测 boot 条件,从头开始执行程序。唤醒方式有WKUP 引脚的上升 沿、RTC 闹钟事件、NRST 引脚上的外部复位,IWDT复位,下面来看下RTC闹钟事件是如何唤醒的。
实验设计: MCU启动后让LED2闪烁,然后延时4s后时钟闹钟唤醒时间,发生唤醒时间后唤醒MCU并点亮LED3。
1、相关时钟的初始化,以及LED的初始化。 int i =0;
RCM_EnableAPB1PeriphClock((RCM_APB1_PERIPH_T)(RCM_APB1_PERIPH_PMU | RCM_APB1_PERIPH_BAKR));
APM_MINI_LEDInit(LED2);
APM_MINI_LEDInit(LED3);
APM_MINI_LEDOff(LED2);
APM_MINI_LEDOff(LED3);
SysTick_Init(); //LED2闪烁
void SysTick_Handler(void)
{
APM_MINI_LEDToggle(LED2);
}
2、RTC初始化 PMU_EnableBackupAccess();
RTC_Init();
3、 通过SB**判断是上电复位还是RTC闹钟事件,如果是中STAND_BY唤醒则点亮LED3 void RTC_Init(void)
{
if(PMU_ReadStatusFlag(PMU_FLAG_SB) == SET) //从standby模式唤醒
{
APM_MINI_LEDOn(LED3);
PMU_ClearStatusFlag(PMU_FLAG_SB);
RTC_WaitForSynchro();
}
else //上电复位
{
BAKPR_Reset();
RCM_ConfigLSE(RCM_LSE_OPEN);
while(RCM_ReadStatusFlag(RCM_FLAG_LSERDY) == RESET);
RCM_ConfigRTCCLK(RCM_RTCCLK_LSE);
RCM_EnableRTCCLK();
RTC_WaitForSynchro();
RTC_ConfigPrescaler(32767);
RTC_WaitForLastTask();
}
}
4、延时4s,然后进入STAND_BY模式 for(i=0;i<=0x1ffffff;i++); //延时4s
RTC_ConfigAlarm(RTC_ReadCounter()+ 3);
RTC_WaitForLastTask();
PMU_EnterSTANDBYMode();
有兴趣的小伙伴,也来测试一下吧~
|