开发环境:keil MDK V5.10
操作系统:windows 7(32位)
目标硬件:STM32F103C8
问题描述:使用STM32的systick定时器实现RTC功能。具体方法为systick滴答计时器配置为1ms时间间隔的滴答中断,定义一个RTC结构体,包含年、月、日、时、分、秒。在每进一次systick中断服务程序中更新一次RTC的值。主程序通过不停地获取RTC的时钟,每一秒钟使用printf函数输出当前的时间。测试过程发现绝大多数时间系统正常工作,但依然存在部分情况系统无法进行正常的输出。相关代码和测试结果如下:
/**
* @brief 系统滴答定时器中断服务程序,主要功能为更新实时时钟
*
* @note 无
* @param 无
* @retval 无
*/
void systick_isr(void)
{
systick.tick_num++;
rtc.ms++;
rtc_update(&rtc);
}
/**
* @brief 获取系统实时时钟
*
* @note 无
* @param 用于存放当前系统实时时钟数据的结构体的指针
* @retval 无
*/
void get_rtc(time_t *ptime)
{
*ptime = rtc;
}
时钟测试程序片段
while(1)
{
get_rtc(&tprtc);
if(j != tprtc.sec)
{
printf("time:%02d-%02d-%02d %02d:%02d:%02d\r\n",tprtc.year,tprtc.mon,tprtc.date,tprtc.hour,tprtc.min,tprtc.sec);
j

在STM32F103C8开发中,使用systick定时器1ms中断更新RTC时间,遇到部分情况下时间输出异常。原因是get_rtc函数在中断服务程序中未对RTC变量进行保护,导致赋值错误。解决方案是操作RTC变量前关闭systick中断,操作完成后立即恢复,确保中断操作的原子性。总结了中断操作变量的注意事项和原子操作的重要性。
最低0.47元/天 解锁文章
2822

被折叠的 条评论
为什么被折叠?



