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;          //退出停止模式

 

posted on 2021-07-16 16:38  xiao_fei  阅读(248)  评论(0编辑  收藏  举报