单片机硬件时钟怎么用(在货物监控设备研发中)

近期,笔者在进行货物监控设备的研发。货物监控设备是基于无线传感技术以及最新的定位技术等研发的。可以对运输中的货物进行实时监控,管理者可以在云端后台实时可视化的观看到货物运输的轨迹。

单片机硬件时钟怎么用(在货物监控设备研发中)(1)

货物监控设备中的无线传感设备可以监测到货物箱内的温湿度情况,以及光感度。一旦货物在没有被允许的情况下打开货箱,传感器监测到光感的异常变化会立即启动报警系统,保证货物的安全。

在货物监控设备的研发过程中,笔者会根据产品性能的需要对STM32的RTC进行相应配置。RTC是独立的定时器。

单片机硬件时钟怎么用(在货物监控设备研发中)(2)

RTC在相应软件配置下,可提供时钟日历的功能。对RTC计数器进行修改,可以重新设置产品的系统时间。相信很多产品研发的小伙伴都会用到RCT的设置,那么具体如何操作呢?

STM32 RTC原理‍

RTC的核心部分是由一组可以编程的计数器组成的。这个计数器分为两个模块。第一个模块是实时时钟的预分频模块,它可以编程产生出最长时间为1秒的实时时钟时间基TR_CLK。实时时钟的预分频模块中包括一个20位的RTC预分频器。

单片机硬件时钟怎么用(在货物监控设备研发中)(3)

如果用户在RTC_CR寄存器中设置了相对应的允许位。那么每一个TR_CLK周期中实时时钟都会产生一个秒中断;RTC的第二个模块是一个32位的可编程计数器,这个计数器可以被初始化为当前的系统时间。这个系统时间会按照TR_CLK周期进行累加,并与存储在RTC_ALR寄存器的可编程时间进行比较。

单片机硬件时钟怎么用(在货物监控设备研发中)(4)

如果RTC_CR控制寄存器中已经设置了相对应的允许位,在比较匹配时,将会产生的一个闹钟的中断。

STM32 RTC原理和配置

单片机硬件时钟怎么用(在货物监控设备研发中)(5)

RTC的配置过程如下:(1)查询RTOFF位,直到RTOFF的值变为’1’(2)置CNF值为1,进入配置模式(3)对一个或多个RTC寄存器进行写操作(4)清除CNF标志位,退出配置模式(5)查询RTOFF,直至RTOFF位变为’1’以确认写操作已经完成。仅当CNF标志位被清除时,写操作才能进行,这个过程至少需要3个RTCCLK周期

单片机硬件时钟怎么用(在货物监控设备研发中)(6)

实例配置过程:配置:RTC使用内部LSI时钟,使能闹钟中断,设置本地时间为2021-03-30 01:34:30void 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);

}

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页