F003系列低功耗有四种:
1.暂停模式(standby,RTC定时或IO信号唤醒);
2.休眠模式(sleep,RTC定时或IO信号唤醒);
3.深度休眠模式(deepsleep,RTC定时或IO信号唤醒);
4.停止模式(stop,IO信号唤醒);
RTC定时器的功能实现(RTC由32.768Hz工作)
rtc.c
#include "rtc.h" uint8_t Flag_Second = 0; //秒中断标志 uint8_t Flag_Alarm = 0; //闹钟中断标志 uint8_t Flag_OverFlow = 0; //溢出中断标志 //RTC初始化 void RTC_Test(void) { RTC_InitTypeDef RTC_InitStruct; RTC_InitStruct.Second = 320000; //秒寄存器赋值 10s RTC_InitStruct.Alarm = 320000; //闹钟寄存器赋值 10s RTC_InitStruct.Second_IE = 0; //秒中断使能 RTC_InitStruct.Alarm_IE = 1; //闹钟中断使能 RTC_InitStruct.OverFlow_IE = 1; //溢出中断使能 RTC_Init(&RTC_InitStruct); //RTC初始化 RTC_Start(); //启动RTC } //RTC中断服务程序 void RTC_Handler(void) { if(RTC_IntSecondStat()) //秒中断状态为1 { RTC_IntSecondClr(); //清除秒中断状态 Flag_Second = 1; //秒中断标志置1 } if(RTC_IntAlarmStat()) //闹钟中断状态为1 { RTC_IntAlarmClr(); //清除闹钟中断状态 Flag_Alarm = 1; //闹钟中断标志置1 } if(RTC_IntOverFlowStat()) //溢出中断状态为1 { RTC_IntOverFlowClr(); //清除溢出中断状态 Flag_OverFlow = 1; //溢出中断标志置1 } }
rtc.h
#ifndef __RTC_H #define __RTC_H
#include "HM1001.h"
extern uint8_t Flag_Second; extern uint8_t Flag_Alarm; extern uint8_t Flag_OverFlow; void RTC_Test(void);
#endif
main.c
#include "HM1001.h" #include "led.h" #include "uart.h" #include "stdio.h" #include "rtc.h" //1us HCLK选择32MHz 1个周期就是1/32 *10^-6 s ==>1/32 us 一个周期 void SysTick_Init_nus(uint_least32_t CK) { SysTick->CTRL |= 0; //失能定时器 SysTick->LOAD = 32*CK;//填充值 SysTick->VAL = 0; // 初始值 SysTick->CTRL |= 0x01;//使能定时器 while(0 == (SysTick->CTRL&(0x01<<16))); SysTick->CTRL &=~ (0x01<<16); } //1ms void SysTick_Init_nms(uint_least32_t CK) { SysTick->CTRL |= 0; //失能定时器 SysTick->LOAD = 32000*CK; //填充值 SysTick->VAL = 0; // 初始值 SysTick->CTRL |= 0x01; //使能定时器 while(0 == (SysTick->CTRL&(0x01<<16))); SysTick->CTRL &=~ (0x01<<16); } //低功耗暂停模式,秒唤醒 void PMU_STANDBY_Init(void) { PMU->LPMD_WKEN = 0x01<<1; //RTC秒信号唤醒使能 PMU->RCHFCR = 0x01; //RTC使能 PMU->LPOW_MD = 0x01; //选择暂停模式 } //低功耗暂停模式,闹钟唤醒 void PMU_STANDBY_Alarm_Init(void) { PMU->LPMD_WKEN = 0x01; //RTC秒信号唤醒使能 PMU->RCHFCR = 0x01; //RTC使能 PMU->LPOW_MD = 0x01; //选择暂停模式 } //低功耗睡眠模式 void PMU_SLEEP_Init(void) { PMU->LPMD_WKEN = 0x01<<1; //RTC秒信号唤醒使能 PMU->RCHFCR = 0x01; //RTC使能 PMU->LPOW_MD = 0x01<<1; //选择休眠模式 } //深度休眠模式 void PMU_DEEPSLEEP_Init(void) { PMU->LPMD_WKEN = 0x01<<1; //RTC秒信号唤醒使能 PMU->RCHFCR = 0x01; //RTC使能 PMU->LPOW_MD = 0x01<<2; //选择深度休眠模式 } //停止模式,必须由外部IO来唤醒,此例并没有配置IO唤醒 void PMU_STOP_Init(void) { PMU->LPMD_WKEN = 0x01<<1; //RTC秒信号唤醒使能 PMU->RCHFCR = 0x01; //RTC使能 PMU->LPOW_MD = 0x01<<3; //选择停止模式 } int main(void) { int i= 0; SystemInit(SYS_CLK_XTAL); //32MHz Led_Init(); LED_R_Y_Init(); Uart_Init(); //串口初始化 RTC_Test(); //rtc定时器初始化 while(1) { printf("AAAA\n"); LED1_ON; LED2_ON; LED3_ON; LEDY_ON; LEDR_ON; SysTick_Init_nus(1000000);//1s LED1_OFF; LED2_OFF; LED3_OFF; LEDY_OFF; LEDR_OFF; SysTick_Init_nms(1000);//1s i++; if(i == 10) { i = 0; // PMU_STANDBY_Init(); //进入暂停模式 // PMU_SLEEP_Init(); //进入休眠模式 PMU_DEEPSLEEP_Init(); //进入深度休眠模式 } if(Flag_Alarm == 1) { // PMU->LPOW_MD = 0x00; //退出暂停模式 // PMU->LPOW_MD = 0x00<<1; //退出休眠模式 PMU->LPOW_MD = 0x00<<2; //退出深度休眠模式 Flag_Alarm = 0; } } }
1.1 暂停模式初始化化
//低功耗暂停模式,秒唤醒 void PMU_STANDBY_Init(void) { PMU->LPMD_WKEN = 0x01<<1; //RTC秒信号唤醒使能 PMU->RCHFCR = 0x01; //RTC使能 PMU->LPOW_MD = 0x01; //选择暂停模式 }
1.2 退出暂停模式
PMU->LPOW_MD = 0x00; //退出暂停模式
2.1 低功耗睡眠模式
//低功耗睡眠模式 void PMU_SLEEP_Init(void) { PMU->LPMD_WKEN = 0x01<<1; //RTC秒信号唤醒使能 PMU->RCHFCR = 0x01; //RTC使能 PMU->LPOW_MD = 0x01<<1; //选择休眠模式 }
2.2 退出睡眠模式
PMU->LPOW_MD = 0x00<<1;
3.1 深度休眠模式
//深度休眠模式 void PMU_DEEPSLEEP_Init(void) { PMU->LPMD_WKEN = 0x01<<1; //RTC秒信号唤醒使能 PMU->RCHFCR = 0x01; //RTC使能 PMU->LPOW_MD = 0x01<<2; //选择深度休眠模式 }
3.2 退出深度休眠模式
PMU->LPOW_MD = 0x00<<2; //退出深度休眠模式
4.1 停止模式
//停止模式,必须由外部IO来唤醒,此例并没有配置IO唤醒 void PMU_STOP_Init(void) { PMU->LPMD_WKEN = 0x01<<1; //RTC秒信号唤醒使能 PMU->RCHFCR = 0x01; //RTC使能 PMU->LPOW_MD = 0x01<<3; //选择停止模式 }
4.2 退出停止模式
PMU->LPOW_MD = 0x00<<3; //退出停止模式