stm32 rtc 实时时钟

发布者:会哭的蓝精灵最新更新时间:2019-01-04 来源: eefocus关键字:stm32  rtc  实时时钟 手机看文章 扫描二维码
随时随地手机看文章

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\n", 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  实时时钟 引用地址:stm32 rtc 实时时钟

上一篇:stm32 i2c eeprom 24C02
下一篇:stm32 待机模式

推荐阅读最新更新时间:2024-03-16 16:21

STM32通过按键中断点亮led灯
首先是led头文件,其中调用的一些库是原子的我只是借鉴一下 侵删 #ifndef __LED_H #define __LED_H #include sys.h #define LED PCout(13) // PA8 void LED1_Init(void);//³õʼ»¯ #endif led的c文件 #include led.h //初始化PB5和PE5为输出口.并使能这两个口的时钟 //LED IO初始化 void LED1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockC
[单片机]
STM32寄存器编程思路 - 从51到stm32开发入门,真干货
本文转自 https://www.amobbs.com/thread-5462507-1-3.html 第23楼 尊重原作不做任何修改 =============以下正文=============== 本来只是路过,写详细一点。 我看楼主浮躁得不得了。现在什么都不要做了,先去看几遍《不要做浮躁的嵌入式工程师》这篇文章,想清楚了, 再动手吧。 我做了个实例,不用ST的库来点LED,解答你的问题 我的 KeilMDK 3.5 我的STM32板子奋斗版是 ,IC 是 STM32F103VET6 调试工具 JLINK V8 LED 接在 PB5 ,高电平点亮 既然楼主说一定懂C语言了,那么对于下面我的问题,不查百度,完全靠自己,懂多少?
[单片机]
STM32 VBAT外围电路接法详解
给大家看几块开发板的VBAT外围电路的设计图: (1) (2) (3) (4) (5) stm32芯片手册要求:(大体上就这两个要求,具体要求看AN2586供电方案) (1)如果应用中没有使用外部电池,VBAT必须连接到VDD引脚上。 (2)如果没有外部电池,这个引脚必须和100nF的陶瓷电容一起连接到VDD电源上 (3)在VDD上升阶段(tRSTTEMPO)或者探测到PVD之后,VBAT和VDD之间的电源开关仍会保持连接在 VBAT。在VDD上升阶段,如果VDD在小于tRSTTEMPO的时间内达到稳定状态(关于tRSTTEMPO可参考数 据手册中的相关部分),且VDD VBAT + 0.6V时,电流
[单片机]
<font color='red'>STM32</font> VBAT外围电路接法详解
STM32驱动12bit AD TLC2543(I/O模拟方式)
/****************************************************************************************** * 文件名称 :tlc2543.c * 版权 : * 模块名称 :TLC2543驱动程序 * cpu : stm32f103rct6 主频:72M * 作者 : * 创建日期 :2009-10-13 * 功能概要 : *----------------------------------------修改历史------------------------------------------ * 当前版本 :
[单片机]
STM32的串口应用总结
首先总结一下串口232,422,485 串口232:可双向传输,全双工,最大速率20Kbps,负逻辑电平,-15V~-3V逻辑“1”,+3V~+15V逻辑“0”。 串口422:可双向传输,4线全双工,2线单工。 串口485:可双向传输,4线全双工,2线单工,最大速率10Mb/s,差分信号,发送端:+2V~+6V逻辑“1”,-2V~-6V逻辑“0”,接收端:+200mV逻辑“1”,-200mV逻辑“0”。 对于串口的实现有以两个方案: 方案一,和原子的《例说STM32》一样,首先接收,然后处理,没有消息验证处理,这样就会出现消息覆盖,消息出错后死机,无法明确区分命令,无法及时应答握手信号。方案二,借鉴uC/OSII的消息队列,进入中
[单片机]
基于STM32的Uart2串口问题
买了一块1元的活动板子,移植了RTT(RT-THREAD)的国人嵌入式操作系统。系统能够正常跑起来,接着就按照RTT的官网教程,写了一个串口驱动。 原来定义的是UART1的端口,但是没有找到板子的USART1的引脚,虽然STM32可以映射,但是仍然没有看到有甩出来的引脚。初略看了一下官网的使用手册,发现图上有USART2引出来。 上图看一下, 好家伙,那就直接接地,接TX与RX到PC端的USB转串口吧。 杯具来了,发现无论如何自己的程序都没有输出打印,怀疑自己的代码有问题。用mbed的示例BIN文件试试,也发现不行。难道是电平问题?换了别人使用的开发板与PC的USB转串口,oh mygod!!还是不行。 心灰意冷,
[单片机]
基于<font color='red'>STM32</font>的Uart2串口问题
关于STM32精准采频率的实现
这次做训练题遇到了采频率的问题,做单项并网问题,需要实时了解频率的相关信息。 尝试直接用他们提供的输入捕获,发现并不是很好用,琢磨了半天,实现了自己的部分采用。 这里就不一步一步的分析了,估计看的情况也比较少。 直接上手,不过,博主是从正点原子那里直接得到的库里面查找的信息。 一般定时器的配置 pwm_in_mode.h文件 这里介绍了两个配置函数 #ifndef __TIMER_H #define __TIMER_H #include stm32f4xx.h void TIM2_CH2_Cap_Init(void); void TIM2_IRQHandler(void); #endif 看自己
[单片机]
关于<font color='red'>STM32</font>精准采频率的实现
STM32的ADC及内部温度传感器的使用
STM32自带1-3个ADC模块,采样精度达到了12位,比起当年使用的AVR单片机的10位来说,上了个小档次了~本测试程序采用了ADC DMA的中断方式,这样CPU就可以把ADC的任务交给DMA这个勤劳肯干的部下了,当DMA完成了一次任务之后会产生中断,告诉CPU可以来查收结果了!DMA也是在嵌入式系统中非常常用的,例如在LCD中,数据拷贝中等。。。在STM32F103RBT6中,ADC1和ADC2共用一组管脚   总体编程思路和顺序如下:   1.初始化RCC相关,使得系统有时钟,功能模块如ADC、DMA有时钟。   2.GPIO相关初始化,比如常用的指示灯,ADC的管家要设置为输入等。   3.NVIC向量中断的配置,
[模拟电子]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved