本文主要是介绍STM32H7-RTC介绍与测试,Wakeup Timer测试,alarm测试,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
功能框图
功能描述
入侵检测
什么是入侵检测,我在网上搜索到了一个应用,假如你的设备有外壳,在外壳缝隙连接一个开关电路,另一端连接到上图中的RTC_TAMPx中。当设备被外界打开的时候,检测到入侵,清除备份寄存器和备份RAM。这里从上图可以看到,过欠压和过温的时候,也可以触发入侵。
入侵事件发生的时候,默认触发时间戳记录,时间戳在下一节
时间戳
时间戳这个功能主要用于,当我们检测到外界的某个信号时候,保存当前的实时时间。上图可以看到,时间戳寄存器有两个来源,一个是外界引脚,一个是影子寄存器(当前时间的一个备份寄存器)。时间戳可以触发TSF中断
日历
日历是RTC的核心功能,日历时钟来源有外部参考时钟,LSE,分频HSE,LSI,最终输入到RTC。RTC有一个实时计数器,我们如果直接读取该计数器的数据可能会出现数据不一致的问题,如下面的例子,读完的数据比实际时间快约一整天
所以,STM32内部放了影子寄存器,当时间变化的时候实时计数器里的数据被复制到影子寄存器。我们读取影子寄存器的时候有硬件锁定机制,保证数据一致性。
周期唤醒定时器
简单的一个定时器,做长定时的话可用。最长定时可达到36H,可触发中断WUTF
闹钟
STM32H750有两个闹钟,通过比对预设值和影子寄存器中的值是否一致来触发闹钟。可以设置比对日历中的任何一个字段,比如3秒钟的时候闹钟“响”,26分钟的时候响,今天早上8点半响,2099年响。。。。。
闹钟可输出到引脚,可以触发中断/事件
闹钟AB都有输出功能,AB没有区别,图上只画了A
多一嘴:RTC输出源除了闹钟,还可以是两个级联的分频器(1HZ)
测试
cubemx
只测试了闹钟和定时器
开启闹钟A,唤醒定时器
设置当前时间为0时0分0秒,日期也全0
唤醒定时器设置为1Hz,计数器默认向下计数自动重装,初值设置为4
开启闹钟中断和唤醒定时器中断
代码编写
RTC_TimeTypeDef time;RTC_DateTypeDef data;uint32_t wakeup_data;//这里必须选清除wakeup中断标志位,否则可能触发不了中断__HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(&hrtc, RTC_FLAG_WUTF);while (1){HAL_RTC_GetTime(&hrtc,&time,RTC_FORMAT_BIN);HAL_RTC_GetDate(&hrtc,&data,RTC_FORMAT_BIN);wakeup_data = HAL_RTCEx_GetWakeUpTimer(&hrtc);printf("%d h %d min %d s\r\n", time.Hours,time.Minutes,time.Seconds);HAL_GPIO_TogglePin(LEDB_GPIO_Port,LEDB_Pin);HAL_Delay(1000);}
//重写中断处理函数
void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
{printf("%s\r\n",__FUNCTION__);
}
void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef * hrtc)
{printf("%s\r\n",__FUNCTION__);
}
现象
补充
什么是亚秒?
RTC clock要想分频到1HZ,要经过第一个异步分频器和第二个同步分频器,之后时钟周期才是1秒钟。第二个分配器计数值从0计满为1秒,其中的数值就是亚秒。一般来说第一个分频器分频值为128,第二个为256,两者相乘为32768。所以1亚秒等于1/256秒。
这篇关于STM32H7-RTC介绍与测试,Wakeup Timer测试,alarm测试的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!