posts - 9,  comments - 0,  views - 3821
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

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   xiao_fei  阅读(254)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示