使用STM32的systick定时器中断实现RTC工作过程出错

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

开发环境: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 != tprt
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值