stm32 rtc 实时时钟

摘要:
STM32的实时时钟是一个独立的计时器。通常,在备用区域的电源端添加一个纽扣电池。当主电源关闭时,RTC不会停止工作。如果VDD电源有效,RTC可以触发第二次中断、溢出中断和闹钟中断。备份寄存器BKP是42个16位寄存器。它们在备份域中。当VDD电源切断时,它们仍由VBAT=bkp_Data供电)//读取备份数据{bkp_DeInit();//重置备份区域RCC_LSEConfig;//启用外部低速振荡器,同时(RCC_GetFlagStatus(RCC_FLAG_LSERVERY)!

STM32的实时时钟是一个独立的定时器

通常会在后备区域供电端加一个纽扣电池,当主电源没有电的时,RTC不会停止工作

若VDD电源有效,RTC可以触发秒中断、溢出中断和闹钟中断

备份寄存器BKP
备份寄存器是42个16位的寄存器,他们处在备份域里,当VDD电源被切断,他们仍然由VBAT维持供电。当系统在待机模式下被唤醒或系统复位或电源复位时,他们也不会被复位

RTC配置步骤

1.使能电源时钟和后备区域时钟
2.取消后备区域的写保护,DBP
3.复位备份区域
4.外部低速振荡器使能,LSE
5.RTC时钟源选择,LSE
6.RTC时钟使能

7.进入配置模式
8.设置RTC预分频装载值
9.设置RTC计数器值
10.退出配置模式

11.初始化NVIC外设,设置RTC中断优先级
12.编写RTC中断处理函数

举例

typedef struct
{
    u32 hour;
    u32 min;
    u32 sec;
}time_t;
time_t g_time;

void RTC_get()
{
    u32 counter;

    counter = RTC_GetCounter(); //读取计数器值
    g_time.hour = counter / 3600;
    g_time.min = (counter % 3600) / 60 ;
    g_time.sec = counter % 60 ;
}

void RTC_IRQHandler()
{
    if(RTC_GetFlagStatus(RTC_FLAG_SEC) == SET)
    {
        RTC_get();
        printf("time %02d:%02d:%02d
", g_time.hour, g_time.min, g_time.sec);
    }
    RTC_ClearFlag(RTC_FLAG_SEC);
}

void RTC_init()
{
    u16 bkp_data = 0xa5a5;
    u16 prescaler = 32768 - 1;
    NVIC_InitTypeDef nvic = 
    {
        RTC_IRQn,
        2,
        2,
        ENABLE
    };

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能电源时钟和后备区域时钟

    PWR_BackupAccessCmd(ENABLE); //取消后备区域的写保护

    if(BKP_ReadBackupRegister(BKP_DR1) != bkp_data) //读备份数据
    {
        BKP_DeInit(); //复位备份区域

        RCC_LSEConfig(RCC_LSE_ON); //外部低速振荡器使能
        while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) != SET)
        {
            delay_ms(10);
        }

        RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //LSE振荡器作为RTC时钟
        RCC_RTCCLKCmd(ENABLE); //RTC时钟开启
        RTC_WaitForLastTask(); //RTC操作关闭(上一次对RTC寄存器的写操作已经完成)
        RTC_WaitForSynchro(); //寄存器同步标志(寄存器已经被同步)

        RTC_ITConfig(RTC_IT_SEC, ENABLE); //屏蔽中断请求(允许秒中断)
        RTC_WaitForLastTask();

        RTC_EnterConfigMode(); //配置标志(进入配置模式)

        RTC_SetPrescaler(prescaler); //预分频装载值
        RTC_WaitForLastTask();

        RTC_SetCounter(0xf73f); //设置计数器值(17:34:55)
        RTC_WaitForLastTask();

        RTC_ExitConfigMode(); //退出配置模式(开始更新RTC寄存器)

        BKP_WriteBackupRegister(BKP_DR1, bkp_data); //写备份数据
    }
    else
    {
        RTC_WaitForSynchro();
        RTC_ITConfig(RTC_IT_SEC, ENABLE);
        RTC_WaitForLastTask();
    }

    NVIC_Init(&nvic);   

    RTC_get();
}

免责声明:文章转载自《stm32 rtc 实时时钟》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇TreeSet使用strcmp 与 _tcscmp下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Thinkpad 笔记本待机亮度变低解决办法

        当你发现笔记本从待机恢复后,屏幕亮度变低,即使你调节亮度,它也很低而且亮度并不正常的。解决办法就是拔掉电源,然后重新插上,亮度就能恢复。当然我之前都是重启电脑解决。         但是,有的时候却不会变低。这是为什么呢?大家可以做这样一个实验:在待机的时候,笔记本有插电源和不插电源之分,插电源代表A,不插电源代表B。从待机恢复也有插电源和...

爱普生EPSON打印机 ME1+ (ME1)清零软件及方法

        今天单位有台EPSON ME1+出现“打印机的部件到了使用寿命。请与爱普生授权服务中心联系,可浏览爱普生公司主页”提示,呵。。。,又是打印计数器问题,出现问题,解决问题,咱打印计数器清零啰。。。。。。。。。。。         清零步骤 当您的爱普生ME1打印机出现绿色电源指示灯和红色错误指示灯交替闪烁的时候,就表示打印机内置的废墨计数器...

4个设计绝招教你减少PCB板电磁干扰

电子设备的电子信号和处理器的频率不断提升,电子系统已是一个包含多种元器件和许多分系统的复杂设备。高密和高速会令系统的辐射加重,而低压和高灵敏度 会使系统的抗扰度降低。   因此,电磁干扰(EMI)实在是威胁着电子设备的安全性、可靠性和稳定性。我们在设计电子产品时,PCB板的设计对解决EMI问题至关重要。   本文主要讲解PCB设计时要注意的地方,从而...

线性电源与开关电源的区别

一、线性电源的原理 线性电源主要包括工频变压器、输出整流滤波器、控制电路、保护电路等。如图1。 图1 线性电源是先将交流电经过变压器变压,再经过整流电路整流滤波得到未稳定的直流电压,要达到高精度的直流电压,必须经过电压反馈调整输出电压,这种电源技术很成熟,可以达到很高的稳定度,波纹也很小,而且没有开关电源具有的干扰与噪音。但是它的缺点是需要庞大而笨重的变...

ZD6转辙机

1 转辙机的分类直流转辙机:ZD6 交流转辙机:ZYJ7、S700K 2 ZD6转辙机电路图ZD6转辙机电路图如下图所示。 ZD6转辙机的额定电压是DC160V,工作电流≤2A。 3 基础知识3.1 名词解释 缩略词 解释 说明 DBJ 定位表示继电器 偏极继电器,线圈电流从1到4为吸起,反方向落下 FBJ 反位表示继电器 偏极继电器,线圈电...

笔记本光驱接口怎么外接台式机硬盘?

笔记本光驱位的硬盘托架已经很成熟了, 但是只能放2.5寸的硬盘, 就算用延长线连接出来, 也因为缺少12V供电, 不能驱动3.5寸硬盘. 这次改造就是添加额外的12V供电. 淘宝搜索    笔记本 SATA 7+6P公对母 光驱延长线  DC2.5*5.5电源母头 首先把延长线的母头供电部分锯掉丢弃, 只留下线缆部分, 剩下的数据7pin部分打磨好, 要...