STM32L中的系统时间——硬件RTC的使用

发布者:美好梦想最新更新时间:2017-10-07 来源: eefocus关键字:STM32L  系统时间  硬件RTC 手机看文章 扫描二维码
随时随地手机看文章

鼓捣了将近一天。。。因为之前用过STM32F103芯片,而这次是STM32L151,这个L系列和F系列的RTC使用方式不同。废话少说,上代码:

RTC初始化:


  1. //硬件RTC时钟初始化  

  2. void RTC_Configuration()  

  3. {  

  4.   /* Allow access to the RTC */  

  5.   PWR_RTCAccessCmd(ENABLE);  

  6.   

  7.   /* Reset RTC Backup Domain */  

  8.   RCC_RTCResetCmd(ENABLE);  

  9.   RCC_RTCResetCmd(DISABLE);  

  10.   

  11.   /* LSE Enable */  

  12.   RCC_LSEConfig(RCC_LSE_ON);  

  13.   

  14.   /* Wait until LSE is ready */  

  15.   while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);  

  16.   

  17.    /* RTC Clock Source Selection */   

  18.   RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);   

  19.   

  20.   /* Enable the RTC */  

  21.   RCC_RTCCLKCmd(ENABLE);     

  22.     

  23. }  




读写RTC时间:


  1. //设置本地硬件RTC时间  

  2. void SetRTC(long hhmmss,long ddmmyy)  

  3. {  

  4.   RTC_TimeTypeDef RTC_TimeStruct;  

  5.   RTC_DateTypeDef RTC_DateStruct;  

  6.   RTC_TimeStruct.RTC_Hours = hhmmss/10000;  

  7.   RTC_TimeStruct.RTC_Minutes = hhmmss/100%100;  

  8.   RTC_TimeStruct.RTC_Seconds = hhmmss%100;  

  9.   RTC_TimeStruct.RTC_H12 = 0; //程序中不使用上午/下午  

  10.   RTC_SetTime(RTC_Format_BIN,&RTC_TimeStruct);  

  11.   RTC_DateStruct.RTC_Year = ddmmyy%100;  

  12.   RTC_DateStruct.RTC_Date = ddmmyy/10000;  

  13.   RTC_DateStruct.RTC_Month = ddmmyy/100%100;  

  14.   RTC_DateStruct.RTC_WeekDay = 1;//程序中不使用星期  

  15.   RTC_SetDate(RTC_Format_BIN,&RTC_DateStruct);  

  16. }  

  17.   

  18. //获取本地硬件RTC时间  

  19. void GetRTC(long *hhmmss,long *yymmdd)  

  20. {  

  21.   RTC_TimeTypeDef time;  

  22.   RTC_DateTypeDef date;  

  23.   RTC_GetTime(RTC_Format_BIN,&time);  

  24.   RTC_GetDate(RTC_Format_BIN,&date);  

  25.     

  26.   *hhmmss = time.RTC_Hours*10000 + time.RTC_Minutes*100 + time.RTC_Seconds;  

  27.   *yymmdd = date.RTC_Year*10000 + date.RTC_Month*100 + date.RTC_Date;  

  28. }  




主函数:


  1. char coord[64];//当前经纬度  

  2. long date,time;//当前UTC时间  

  3.   

  4.   

  5. int main(void)  

  6. {   

  7.     Init();  

  8.     

  9.   SetRTC(115921,140203);  

  10.   while(1){  

  11.     GetRTC(&time,&date);  

  12.     sprintf(coord,"%06d,%06d",date,time);  

  13.     delay_s(1);  

  14.   }  

  15. }  




另外我使用的是8Mhz(8000000Hz)的外部晶振作为系统时间。因此把系统时钟RCC的初始化也贴上来,有需要的读者自行取用:)


  1. /********************************************************************** 

  2. * 名    称:RCC_Configuration() 

  3. * 功    能:配置时钟 

  4. * 入口参数:  

  5. * 出口参数: 

  6. ----------------------------------------------------------------------- 

  7. * 说明:使用库函数 

  8. ***********************************************************************/  

  9. void RCC_Configuration(void)  

  10. {  

  11.    ErrorStatus HSEStartUpStatus;  

  12.      

  13.      RCC_DeInit();  

  14.     //使能外部晶振  

  15.    RCC_HSEConfig(RCC_HSE_ON);  

  16.     //等待外部晶振稳定  

  17.    HSEStartUpStatus = RCC_WaitForHSEStartUp();  

  18.     //如果外部晶振启动成功,则进行下一步操作  

  19.    if(HSEStartUpStatus==SUCCESS)  

  20.    {  

  21.          //设置HCLK(AHB时钟)=SYSCLK  

  22.          RCC_HCLKConfig(RCC_SYSCLK_Div1);  

  23.   

  24.               

  25.                //PCLK2(APB2) = HCLK  

  26.          RCC_PCLK2Config(RCC_HCLK_Div1);  

  27.               

  28.         //PCLK1(APB1) = HCLK/2  

  29.          RCC_PCLK1Config(RCC_HCLK_Div2);  

  30.          FLASH_SetLatency(FLASH_Latency_1);  

  31.          FLASH_PrefetchBufferCmd(ENABLE);  

  32.   

  33.      //等待PLL稳定  

  34.     // while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);  

  35.         while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);           

  36.           

  37.          //系统时钟SYSCLK来  

  38.      // RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);  

  39.        RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);  

  40.               

  41.      //切换时钟后等待系统时钟稳定  

  42.      // while(RCC_GetSYSCLKSource()!=0x0C);  

  43.      while(RCC_GetSYSCLKSource()!=0x08);               

  44.      }  

  45.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);  

  46.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);  

  47.   

  48. }  



运行效果就是,使用Keil uVision4.70的debug模式,可以看到Watch窗口中的coord变量实时显示出当前的时间。


之前我还搜到将SysTick作为系统时间的方法,其实就是借助SysTick中断来自行计时,虽然也能满足项目需求(比较简单),但后来经同事提醒才发觉STM32L里面有内置的硬件RTC时钟,包含了年月日时分秒,才开始了这一天的鼓捣。

今天看了半天stm32l1xx_rtc.h和.c文件,这是在STM32L-Discovery工程里面内置的,包含了对当前芯片的RTC功能的API接口定义和实现,还有充足的注释,个人感觉这个比文档更清晰。不过这没能解决问题。

最后还是用谷歌搜STM32L和RTC搜到的这个网页,才是解决问题的关键。里面包含了STM32L中RTC初始化的代码,测试可用,算是突破。之后就顺利了。


关键字:STM32L  系统时间  硬件RTC 引用地址:STM32L中的系统时间——硬件RTC的使用

上一篇:STM32处理器输入捕获分析
下一篇:基于stm32处理器的PWM 异步驱动蜂鸣器

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

IR推出高温高压DC-DC转换器 可减少井下工具的设计时间系统成本
全球功率半导体和管理方案领导厂商 – 国际整流器公司 (International Rectifier,简称IR) 推出隔离混合封闭式直流-直流转换器HTH27022S和HTM27092S,适用于钻油工具、泥浆涡轮发电机等高温和强烈震动的环境。   HTH27022S和HTM27092S是商用现货 (Commercial off-the-shelf,简称COTS) 转换器,其外壳操作温度为165oC,瞬态温度高达175oC,加上270V的高额定输入电压,能够大幅减少高温应用的设计周期时间、尺寸和设计成本。   IR亚太区销售副总裁潘大伟表示:“新产品采用了混合式密封封装,不仅为钻油工具等要求严格的应用提供高可靠性,还能实现
[模拟电子]
IR推出高温高压DC-DC转换器 可减少井下工具的设计<font color='red'>时间</font>与<font color='red'>系统</font>成本
CPLD器件在时间统一系统中的应用
   引言   随着电子技术的发展,对遥测信号的帧结构的可编程度、集成度的要求越来越高,用于时间统一系统的B码源的设计也趋于高度集成化。为了适应现代靶场试验任务的要求,我们采用Altera的CPLD器件,将用于产生B码的各种门电路集成在一个芯片,通过高度集成的系统可以用于产生标准的串行时间码向测量设备发送,测量设备对接收到的B码进行解调能产生出系统所需的绝对时间和各种控制信号。此B码产生系统可作为基地设备检测调试用,也可作实践教学设备。    1 IRIG-B码介绍   在靶场试验中随着设备所需信息量的增加,对标准化时统设备要求也就越来越高,其中关键的问题之一就是选用什么样的时间码。IRIG-B(美国靶场仪器组-B型格式)D
[嵌入式]
CPLD器件在<font color='red'>时间</font>统一<font color='red'>系统</font>中的应用
硅光电倍增管用于直接飞行时间测距应用(二):改变系统变量的影响
系统设计参数将根据特定应用的要求而变化。本节的目的是利用直接ToF测距系统的模型,证明采集的数据是如何受到七个关键参数的影响。也体现与目标的距离和环境光照度的影响。关键点总结在表2中。以下各节显示的直方图是通过仿真得到的,可以假定每个直方图都包括在单帧中获得的整个数据集。为了计算速度,所显示的直方图对应于一个较短的采集时间。 改变系统变量的影响 系统设计参数将根据特定应用的要求而变化。本节的目的是利用直接ToF测距系统的模型,证明采集的数据是如何受到七个关键参数的影响。也体现与目标的距离和环境光照度的影响。关键点总结在表2中。以下各节显示的直方图是通过仿真得到的,可以假定每个直方图都包括在单帧中获得的整个数据集。为了计算速
[测试测量]
硅光电倍增管用于直接飞行<font color='red'>时间</font>测距应用(二):改变<font color='red'>系统</font>变量的影响
s3c6410硬件RTC实时时钟
1、OVERVIEW综述 The Real Time Clock (RTC) unit can be operated by the backup battery when the system power is off. The data include the time by second, minute, hour, date, day, month, and year. The RTC unit works with an external 32.768 KHz crystal and can perform the alarm function. 当系统电源关闭时,通过备用电源可以运行实时时钟(RTC)单元。数据包含的
[单片机]
s3c6410<font color='red'>硬件</font><font color='red'>RTC</font>实时时钟
ARM内核目标系统中的代码运行时间测试
在 ARM 系统中,有时需要精确的时间测量。通常 , 取时间的 C 函数(如 gettime() 等)不仅通用性差(必须包含头文件 DOS.H ,且不支持 Unix 、 Linux 和标准 C ),明显不适用于 ARM 系统 ;更成问题的是,其最短时间只能到 10-2 秒级,不能提供更短的时间分度。根本原因在于: 这类函数是基于系统实时时钟( RTC )的,而 RTC 通常采用标准化钟表晶振,频率只有 32.768 kHz 而已 。 然而很多应用涉及 μs 级的时间计量,这是标准化了的 RTC 以及基于它的时间函数所无能为力的。笔者在移植 DES 算法到 ARM 系统的实验过程中,便遇到过要定量评估加密算法耗
[应用]
美国大学研发智能交通信号灯系统 可将平均出行时间减少25%
据外媒报道,美国卡内基梅隆大学(Carnegie Mellon University)的研究人员与机器人专家在城市工程师和基金会资助的帮助下,研发和部署了一项技术,以保持交通畅通。 智能交通信号灯系统Surtrac就是卡内基梅隆大学机器人研究所研究教授Stephen Smith领头研发的,他的团队专注于多主体决策研究工作。Smith表示:“我们关注的问题是,不由一个主体负责,而是协作做出决策,特别适用于交通信号灯。” 软件可以让信号灯之间“互相交谈”,每个信号灯都通过感知不断接近的交通流,生成优化十字路口交通的时间规划。然后,此类信号灯会与相邻的信号灯共享时间规划,以协调行动。 该系统利用人工智能技术,根据交通状况协调
[汽车电子]
美国大学研发智能交通信号灯<font color='red'>系统</font> 可将平均出行<font color='red'>时间</font>减少25%
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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