本文章用于对于HAL库RTC代码进行分析,并同时关心cubemx是如何使用hal库进行初始化的。芯片基于F429/F767两种。
前面从cubemx开始,到函数使用,再到具体的代码的分析。

cubemx设置

通常情况下,我们会选择LSE作为RTC的时钟源,一般f RTCCLK = f LSE = 32.768KHz. 然后经过预分频器PRER分频生成1Hz的时钟用于更新日历,为了最大程度的降低功耗,一般同步预分频器设置为较大的值,例如PREDIV_S=255,PREDIV_A=127,计算公式为: f CK_SPRE = f RTCCLK /{ ( PREDIV_A+1 ) * ( PREDIV_S+1 ) } = 32.768/{ ( 127+1 ) *(255+1)}=1HZ。

Hour Format : 时制
Asynchronous Predivider value: 异步分频值
Synchronous Predivider value:同步分频值

Data Format: BCD码模式或者 Binary data format 所谓BCD码就是 0x10 表示 10的意思,Bin 0x10 表示 16,另外寄存器是BCD码的
Hours : 默认小时
Minutes:默认分钟
Seconds:默认秒
Day Light Saving:设置日历,增加1小时 ,还是减小1小时,或者不变,一般用于夏时令或者冬时令。
Store Operation:存储操作,可以理解为一个类似于RTC备份域的寄存器,主要用于标记。比如如上增加了1个小时,把这个寄存器设置为1.记录一下。另外我国没有夏时令,基本用不上。

Weak Day: 星期
Month:月份
Data:日期
Year:年

RTC唤醒
设置WakeUp 为 internal Wake Up 会有一个唤醒设置
Wake Up Clock :唤醒时钟
Wake Up Counter: 唤醒时间
自动复位值,实测可以再待机模式中唤醒

闹钟功能
设置 ALarm A 或者 Alarm B为Internal Alarm 或者 Routed to AFR,会有闹钟设置

Hours:小时
Minutes:分钟
Seconds:秒
Sub Seconds:亚秒
Alarm Mask Data Week day:功能掩码,表示对应设置参数是否有效,这个表示Data是否进行比较
Alarm Mask Hours:表示Hours是否进行比较
Alarm Mask Minutes:表示Minutes是否进行比较
Alarm Mask Seconds:表示Seconds是否进行比较
Alarm Sub Second Mask:如上
Alarm Date Week Day Sel:Alarm Date表示的是Data还是Week
Alaram Date :根据上面设置表示日期或者星期 日期可以是(0-31)

关于Mask的说明,disable表示不使能亚秒,即该位需要比较,例如我们闹钟是设置11号每小时的11分钟11秒,那么小时由于每小时都有用则应该设置able,而data,min,sec都有对应的值不使用mask设置disable,这样再11号那一天的每个小时中的11分11秒都会产生一个闹钟事件。闹钟也可以用于低功耗唤醒

时间戳
有个Timestamp Routed to AF1选项,设置后有如下参数
Time Stamp Pin Edge:时间戳引脚边沿信号。
时间戳的作用时,引脚检测到目标边沿信号,那么会当前时间记录再时间戳寄存器中,如果设置了中断,也会产生中断事件。另外时间戳事件也可以用于低功耗唤醒,这意味这除了RTC唤醒引脚外还有其它的引脚进行低功耗唤醒。

其它的一些参考时钟,输入校准因为没使用过就不进行分析了。

API操作

HAL_StatusTypeDef HAL_RTC_Init(RTC_HandleTypeDef *hrtc);   //初始化
HAL_StatusTypeDef HAL_RTC_DeInit(RTC_HandleTypeDef *hrtc); //去初始化//需要注意的的时cubemx你使用的时BCD还是Binary。
// 最简单的时钟日历功能
HAL_StatusTypeDef HAL_RTC_SetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format); //设置当前时间
HAL_StatusTypeDef HAL_RTC_GetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format); //获取时间
HAL_StatusTypeDef HAL_RTC_SetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format); //设置日期
HAL_StatusTypeDef HAL_RTC_GetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format);// 获取日期//闹钟功能
HAL_StatusTypeDef HAL_RTC_SetAlarm(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format); // 设置闹钟
HAL_StatusTypeDef HAL_RTC_SetAlarm_IT(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format); //设置闹钟并开中断
HAL_StatusTypeDef HAL_RTC_DeactivateAlarm(RTC_HandleTypeDef *hrtc, uint32_t Alarm); // 关闭闹钟
HAL_StatusTypeDef HAL_RTC_GetAlarm(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Alarm, uint32_t Format); //获取闹钟
void                HAL_RTC_AlarmIRQHandler(RTC_HandleTypeDef *hrtc); //闹钟中断会调用
HAL_StatusTypeDef   HAL_RTC_PollForAlarmAEvent(RTC_HandleTypeDef *hrtc, uint32_t Timeout); //等待到闹钟A事件或者超时。
void         HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc); //闹钟A回调
void              HAL_RTCEx_AlarmBEventCallback(RTC_HandleTypeDef *hrtc);    //等待到闹钟B事件或者超时。
HAL_StatusTypeDef HAL_RTCEx_PollForAlarmBEvent(RTC_HandleTypeDef *hrtc, uint32_t Timeout); //闹钟B回调//时间戳
HAL_StatusTypeDef HAL_RTCEx_SetTimeStamp(RTC_HandleTypeDef *hrtc, uint32_t TimeStampEdge, uint32_t RTC_TimeStampPin);//设置时间戳
HAL_StatusTypeDef HAL_RTCEx_SetTimeStamp_IT(RTC_HandleTypeDef *hrtc, uint32_t TimeStampEdge, uint32_t RTC_TimeStampPin);//设置时间戳并开中断
HAL_StatusTypeDef HAL_RTCEx_DeactivateTimeStamp(RTC_HandleTypeDef *hrtc);//关闭时间戳
HAL_StatusTypeDef HAL_RTCEx_SetInternalTimeStamp(RTC_HandleTypeDef *hrtc);//设置内部时间戳
HAL_StatusTypeDef HAL_RTCEx_DeactivateInternalTimeStamp(RTC_HandleTypeDef *hrtc);//关闭内部时间戳
HAL_StatusTypeDef HAL_RTCEx_GetTimeStamp(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTimeStamp, RTC_DateTypeDef *sTimeStampDate, uint32_t Format);//获取当前记录的时间戳//入侵检查
HAL_StatusTypeDef HAL_RTCEx_SetTamper(RTC_HandleTypeDef *hrtc, RTC_TamperTypeDef* sTamper); //设置入侵
HAL_StatusTypeDef HAL_RTCEx_SetTamper_IT(RTC_HandleTypeDef *hrtc, RTC_TamperTypeDef* sTamper); //设置入侵并开中断
HAL_StatusTypeDef HAL_RTCEx_DeactivateTamper(RTC_HandleTypeDef *hrtc, uint32_t Tamper);//关闭入侵检查
void              HAL_RTCEx_TamperTimeStampIRQHandler(RTC_HandleTypeDef *hrtc);//入侵以及时间戳中断
//入侵跟备份域相关,这个用于防止别人拆机,比如你机器关键部分打开后,某个引脚端口产生一个信号,这个信号会直接把备份域中的信息删除,达到保护功能。或者再中断中想办法把你芯片锁死,或者程序不在运行等。。。void              HAL_RTCEx_Tamper1EventCallback(RTC_HandleTypeDef *hrtc);  //AF1引脚入侵中断回调
void              HAL_RTCEx_Tamper2EventCallback(RTC_HandleTypeDef *hrtc);  //AF2引脚入侵中断回调
void              HAL_RTCEx_Tamper3EventCallback(RTC_HandleTypeDef *hrtc);  //AF3引脚入侵中断回调
void              HAL_RTCEx_TimeStampEventCallback(RTC_HandleTypeDef *hrtc); //时间戳中断回调
HAL_StatusTypeDef HAL_RTCEx_PollForTimeStampEvent(RTC_HandleTypeDef *hrtc, uint32_t Timeout);//阻塞等待一个时间戳事件直到超时
HAL_StatusTypeDef HAL_RTCEx_PollForTamper1Event(RTC_HandleTypeDef *hrtc, uint32_t Timeout); //同上
HAL_StatusTypeDef HAL_RTCEx_PollForTamper2Event(RTC_HandleTypeDef *hrtc, uint32_t Timeout);//同上
HAL_StatusTypeDef HAL_RTCEx_PollForTamper3Event(RTC_HandleTypeDef *hrtc, uint32_t Timeout); //同上//唤醒函数
HAL_StatusTypeDef HAL_RTCEx_SetWakeUpTimer(RTC_HandleTypeDef *hrtc, uint32_t WakeUpCounter, uint32_t WakeUpClock); //设置唤醒
HAL_StatusTypeDef HAL_RTCEx_SetWakeUpTimer_IT(RTC_HandleTypeDef *hrtc, uint32_t WakeUpCounter, uint32_t WakeUpClock); //设置唤醒并开中断
uint32_t          HAL_RTCEx_DeactivateWakeUpTimer(RTC_HandleTypeDef *hrtc); //关闭唤醒
uint32_t          HAL_RTCEx_GetWakeUpTimer(RTC_HandleTypeDef *hrtc); //获取唤醒
void              HAL_RTCEx_WakeUpTimerIRQHandler(RTC_HandleTypeDef *hrtc); //唤醒中断以及其处理
void              HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc); //唤醒回调函数
HAL_StatusTypeDef HAL_RTCEx_PollForWakeUpTimerEvent(RTC_HandleTypeDef *hrtc, uint32_t Timeout); //阻塞等待一个唤醒事件知道超时//备份域 //备份域还是蛮有用的,希望多使用,它是一个ram,但是电源时RTC电池提供的,也就是RTC电池一直有电,这个可以当一个EEPROM使用。可以用于防止突然断电,或者有预谋的软件复位等等。
void              HAL_RTCEx_BKUPWrite(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister, uint32_t Data); //写备份域
uint32_t          HAL_RTCEx_BKUPRead(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister);//读备份域

代码分析
有空再说。

HAL - RTC分析相关推荐

  1. STM32 HAL RTC配置及优化

    STM32 HAL RTC配置及优化 STM32内部的RTC实时时钟模块,可以配置实现日历和时间的运转,并在外部备用电池的辅助下,可以在主电源关闭的情况下保持运行,且RTC备份寄存器也可以在电池供电状 ...

  2. stm32 HAL库分析之CAN

    stm32 HAL库分析之CAN 阻塞发送 HAL_StatusTypeDef HAL_CAN_Transmit(CAN_HandleTypeDef* hcan, uint32_t Timeout) ...

  3. Android系统的HAL层分析 -- Sensors

    Android系统HAL层分析 -- Sensors 0 前言 1 HAL层Sensors代码分析/注释 0 前言 1 HAL层Sensors代码分析/注释

  4. stm32 hal库分析之uart

    hal库 uart 基本概念: 同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式. 异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式. 同步是阻塞 ...

  5. GPS模块HAL层分析和调试

    主控: Samsung   Cortex  ARM A8  smdkc110  1G Gps:    Ublox-G6010 系统:  android 2.3 在android里关于普通GPS模块(俗 ...

  6. Android HAL层分析 (gralloc显示模块 举例)

     Android的HAL是为了保护一些硬件提供商的知识产权而提出的,是为了避开linux的GPL束缚.思路是把控制硬件的动作都放到了Android HAL中,而linux driver仅仅完成一些 ...

  7. 博通Broadcom SDK源码学习与开发7——HAL硬件抽象层分析

    声明:原创作品,严禁用于商业目的. 本系列文章将全面剖析以Bcm33xxx芯片开发Cablemodem产品的SDK源码为例,从编译系统到各个功能模块进行分析与探讨. 文章目录 0.写在前篇 1. HA ...

  8. STM32F1+HAL RTC PC13作为普通IO使用

    @STM32F1+HAL PC13作为普通IO使用 PC13是RTC的入侵检测引脚,配置了RTC以后发现无法将PC13进行拉高拉低,代码是使用CubeMX进行配置的 在网上查了资料之后说是将入侵检测关 ...

  9. STM32的HAL库分析及使用

    STM32的三种开发方式 通常新手在入门STM32的时候,首先都要先选择一种要用的开发方式,不同的开发方式会导致你编程的架构是完全不一样的.一般大多数都会选用标准库和HAL库,而极少部分人会通过直接配 ...

  10. Sensor HAL框架分析之二

    1.1  Sensor应用程序框架 这部分对于上层写应用的朋友来比较熟悉,我们通过一个简单的应用来分析框架层和底层的实现. 通常编写一个传感器的应用程序有以下步骤: l  通过调用 Context.g ...

最新文章

  1. portlet java_探秘企业门户开发:Java Portlet入门(2)
  2. 方法论 | 产品经理的原型工作流
  3. 窃喜,第一次修改开源的东西
  4. sqlite DLL load failed
  5. web图片铺满网页_html5的video的背景图片poster铺满全屏大小方法
  6. BUUCTF Web [强网杯 2019]随便注
  7. python安装pymssql等包时出现microsoft visual c++ 14.0 is required问题无需下载visualcppbuildtools的解决办法...
  8. MySQL主从复制: MHA
  9. 2012考研英语--前辈的高分复习经验
  10. 谈一谈软件系统的可用性
  11. 阿里云弹性云桌面解决方案、高性能GPU型云桌面用于设计、建模、影视制作
  12. Google Search Console使用教程_谷歌管理员工具用法
  13. 七大江河水系--海河
  14. 获取天气预报ajax,Ajax 通过城市名获取数据(全国天气预报API)
  15. Failed to introspect Class [org.springframework.cloud.gateway.config.GatewayAutoConfiguration$NettyC
  16. 如何学photoshop
  17. python爬取动态加载的网页之爬取猫眼电影实时票房
  18. Hbase hive kudu的区别和使用场景
  19. 【ESP32_02】【DAC输出正弦波】
  20. maya藤蔓插件_Maya植物生长王牌插件 Greenworks XFrog v5.3 For Maya 2015

热门文章

  1. PostgreSQL RULE
  2. craig gentry_为Craig投票!
  3. 遥感影像地图编制流程
  4. html5 电子白板 直播,基于HTML5的电子白板的设计与实现
  5. JS格式化JSON,JSON着色
  6. HTML系列之水平线标签hr
  7. 新加坡读计算机专业,【去新加坡读计算机专业】 - 环外新加坡留学网
  8. android 串口 汉字乱码,Arduino软串口出现乱码
  9. 商汤科技面试——CV算法面经
  10. python偶数统计_Python中查询后的偶数总数