在货物监控设备研发中,如何对单片机进行实时时钟配置?
Posted 瑞奇Ricky
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在货物监控设备研发中,如何对单片机进行实时时钟配置?相关的知识,希望对你有一定的参考价值。
近期,笔者在进行货物监控设备的研发。货物监控设备是基于无线传感技术以及最新的定位技术等研发的。可以对运输中的货物进行实时监控,管理者可以在云端后台实时可视化的观看到货物运输的轨迹。
货物监控设备中的无线传感设备可以监测到货物箱内的温湿度情况,以及光感度。一旦货物在没有被允许的情况下打开货箱,传感器监测到光感的异常变化会立即启动报警系统,保证货物的安全。
在货物监控设备的研发过程中,笔者会根据产品性能的需要对STM32的RTC进行相应配置。RTC是独立的定时器。
RTC在相应软件配置下,可提供时钟日历的功能。对RTC计数器进行修改,可以重新设置产品的系统时间。相信很多产品研发的小伙伴都会用到RCT的设置,那么具体如何操作呢?
STM32 RTC原理
RTC的核心部分是由一组可以编程的计数器组成的。这个计数器分为两个模块。第一个模块是实时时钟的预分频模块,它可以编程产生出最长时间为1秒的实时时钟时间基TR_CLK。实时时钟的预分频模块中包括一个20位的RTC预分频器。
如果用户在RTC_CR寄存器中设置了相对应的允许位。那么每一个TR_CLK周期中实时时钟都会产生一个秒中断;RTC的第二个模块是一个32位的可编程计数器,这个计数器可以被初始化为当前的系统时间。这个系统时间会按照TR_CLK周期进行累加,并与存储在RTC_ALR寄存器的可编程时间进行比较。
如果RTC_CR控制寄存器中已经设置了相对应的允许位,在比较匹配时,将会产生的一个闹钟的中断。
STM32 RTC原理和配置
RTC的配置过程如下:
(1)查询RTOFF位,直到RTOFF的值变为’1’
(2)置CNF值为1,进入配置模式
(3)对一个或多个RTC寄存器进行写操作
(4)清除CNF标志位,退出配置模式
(5)查询RTOFF,直至RTOFF位变为’1’以确认写操作已经完成。
仅当CNF标志位被清除时,写操作才能进行,这个过程至少需要3个RTCCLK周期
实例配置过程:
配置:RTC使用内部LSI时钟,使能闹钟中断,设置本地时间为2021-03-30 01:34:30
void RTCInit(void)
{
NVIC_InitTypeDef NVIC_InitStruct;
EXTI_InitTypeDef EXTI_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE);
PWR_BackupAccessCmd(ENABLE);
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
RCC_RTCCLKCmd(ENABLE);
//RCT Config
RTC_WaitForLastTask();
RTC_WaitForSynchro();
RTC_ITConfig(RTC_IT_ALR,ENABLE);
RTC_WaitForLastTask();
RTC_WaitForSynchro();
RTC_ClearITPendingBit(RTC_IT_ALR);
RTC_WaitForLastTask();
RTC_EnterConfigMode();
RTC_SetPrescaler(40*1000-1);
RTC_WaitForLastTask();
RTC_Set(2021,3,30,1,34,40); //设置时间
RTC_WaitForLastTask();
RTC_SetAlarm(RTC_GetCounter()+1);
RTC_WaitForLastTask();
RTC_ExitConfigMode();
EXTI_InitStructure.EXTI_Line = EXTI_Line17;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStruct.NVIC_IRQChannel = RTCAlarm_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 6;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
NVIC_Init(&NVIC_InitStruct);
RTC_ClearITPendingBit(RTC_IT_ALR|RTC_IT_SEC);
EXTI_ClearITPendingBit(EXTI_Line17);
}
以上是关于在货物监控设备研发中,如何对单片机进行实时时钟配置?的主要内容,如果未能解决你的问题,请参考以下文章