stm32f407 RTC不更新问题排查

2023-05-16

1、问题

在做stm32f407rtc实验时,代码是用cubemx生成的,通过串口打印出时间值,1s打印一次。但是结果与料想中的不一致。

发现打印出来的值一直不更新。按下复位键,后时间会更新一次。
在这里插入图片描述
一开始一直是51s,按下复位键,发现时间更新了,再按下复位键,时间再次更新。

后来直接在线debug,运行后,一开始时间也是不会更新的,但是后来将hrtc结构体放到观察窗口,并点击了instance成员后,奇迹出现了,发现时间能够正常更新了。
在这里插入图片描述
这就非常奇怪了,甚至怀疑了单片机出问题了,结果换了一块板子,还是同样的现象基本可以排除是板子的问题。时间能更新说明晶振都没有啥问题。主函数代码如下;

  while (1)
  {
	HAL_RTC_GetTime(&hrtc,&RTC_TimeStruct,RTC_FORMAT_BIN);	printf("Time:%02d:%02d:%02d\r\n",RTC_TimeStruct.Hours,RTC_TimeStruct.Minutes,RTC_TimeStruct.Seconds);
		HAL_Delay(1000);
	HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_10);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

2、问题排查

发现了这个奇怪的现象后,感觉很苦恼,先后怀疑了这些情况

  • keil mdk配置错误,代码编译优化的问题
  • rtc代码配置的问题

后面经过逐一排查,发现没有问题。并且与正点原子的407代码对比了,也没找出问题所在。后来找百度了一下,找到了https://blog.csdn.net/ZLK1214/article/details/103743152这个博客,发现问题现象一致,按照其操作,解决。

3、问题解决

问题的表面原因是,我主要函数里面只读取了time信息,没有读取date信息。当把主函数代码改为如下:

  while (1)
  {
	HAL_RTC_GetTime(&hrtc,&RTC_TimeStruct,RTC_FORMAT_BIN);
	HAL_RTC_GetDate(&hrtc,&RTC_DateStruct,RTC_FORMAT_BIN);
	  printf("Time:%02d:%02d:%02d   %02d-%02d-%02d %d \r\n",RTC_TimeStruct.Hours,RTC_TimeStruct.Minutes,RTC_TimeStruct.Seconds,\
								RTC_DateStruct.Year,RTC_DateStruct.Month,RTC_DateStruct.Date,RTC_DateStruct.WeekDay); 
	HAL_Delay(1000);
	HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_10);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

串口输出正常了
在这里插入图片描述
更改后,时间可以正常显示。

4、原因分析

出现需要读取time 和date后,时间才会更新问题的原因是。为了保证数据读取的准确性,rtc设置了一个影子寄存器,每次读取时间和日期的时候,都是读取的这个影子寄存器,只有当读取了日期后,影子寄存器才会更新数据。具体的在sstm32f4xx中文参考手册的23.3.6中有入下描述。

在这里插入图片描述

5、只读取rtc时间的方法

那么有没有办法,我只想读取时间值,而不想读取日期值呢。有两种方法:

5.1方法一,参考手册中说明

配置rtc的时候,需要将RTC_CR寄存器的BYPSHAD位设置为1,这样可以直接读取time值。
在这里插入图片描述
配置方法如下:
添加HAL_RTCEx_EnableBypassShadow(&hrtc);将BYPSHAD置1
初始化rtc;

void HAL_RTC_MspInit(RTC_HandleTypeDef* rtcHandle)
{

  RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
  if(rtcHandle->Instance==RTC)
  {
  /* USER CODE BEGIN RTC_MspInit 0 */
	__HAL_RCC_PWR_CLK_ENABLE();//使能电源时钟PWR
	HAL_PWR_EnableBkUpAccess();//取消备份区域写保护
  /* USER CODE END RTC_MspInit 0 */

  /** Initializes the peripherals clock
  */
    PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
    PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
    {
      Error_Handler();
    }
	HAL_RTCEx_EnableBypassShadow(&hrtc);
    /* RTC clock enable */
    __HAL_RCC_RTC_ENABLE();
  /* USER CODE BEGIN RTC_MspInit 1 */
  /* USER CODE END RTC_MspInit 1 */
  }
}

主函数值读取time值

  while (1)
  {
	HAL_RTC_GetTime(&hrtc,&RTC_TimeStruct,RTC_FORMAT_BIN);
//	HAL_RTC_GetDate(&hrtc,&RTC_DateStruct,RTC_FORMAT_BIN);
	  printf("Time:%02d:%02d:%02d   %02d-%02d-%02d %d \r\n",RTC_TimeStruct.Hours,RTC_TimeStruct.Minutes,RTC_TimeStruct.Seconds,\
								RTC_DateStruct.Year,RTC_DateStruct.Month,RTC_DateStruct.Date,RTC_DateStruct.WeekDay); 
// printf("%02x:%02x:%02x\r\n", (RTC->TR >> 16) & 0xff, (RTC->TR >> 8) & 0xff, RTC->TR & 0xff);
	HAL_Delay(1000);
	HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_10);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

运行结果
在这里插入图片描述
可以正常显示。

5.1方法二,直接读取RTC寄存器

按照上面的博客中,可以直接读取RTC值。也可以正常显示。

printf("%02x:%02x:%02x\r\n", (RTC->TR >> 16) & 0xff, (RTC->TR >> 8) & 0xff, RTC->TR & 0xff);

花了将近一天半的时间解决了这个问题。虽然找到了直接读取time值的方法,不过最好还是按照stm要求的,将time和date同时读取。这样准确性会高很多,毕竟影子寄存器里的时间和日期值是同一时刻的。保证了数据的准确性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

stm32f407 RTC不更新问题排查 的相关文章

  • f103 hal RTC_alarm使用方法

    1 初始化RTC RTC handle span class token punctuation span Instance span class token operator 61 span span class token consta
  • 最简单DIY基于STM32F407探索者开发板的MPU6050陀螺仪姿态控制舵机程序

    STM32库函数开发系列文章目录 第一篇 xff1a STM32F103ZET6单片机双串口互发程序设计与实现 第二篇 xff1a 最简单DIY基于STM32单片机的蓝牙智能小车设计方案 第三篇 xff1a 最简单DIY基于STM32F40
  • STM32F407-串口数据传送

    一 串口基础 1 常用的串口相关寄存器 USART SR状态寄存器USART DR数据寄存器USART BRR波特率寄存器 2 串口操作相关库函数 xff08 省略入口参数 xff09 void USART Init 串口初始化 xff1a
  • 树莓派RTC

    文章目录 一 RTC准备二 RTC芯片三 为什么使用hwclock显示找不到硬件总结 一 RTC准备 在使能树莓派RTC之前 xff0c 需要先为树莓派RTC模块安装电池 xff08 一般为纽扣电池 xff09 二 RTC芯片 树莓派4B使
  • 基于STM32F407时钟配置学习

    STM32F4x系列时钟树如下 xff1a 1 系统时钟SYSCLK 在STM32F407中 xff0c 除了一些特定的时钟 xff08 例如 xff0c USB OTG FS时钟 xff0c I2S时钟 xff09 外 xff0c 系统所
  • stm32 RTC_WaitForSynchro()死循环

    1 RTC WaitForSynchro 死循环 xff0c 发现是没有执行RTC Configuration 增加函数 xff0c 但不知道对之后的时钟准确性有什么影响 Function Name RTC Configuration De
  • STM32F407 串口编程USART1,USART2,USART3,UART4

    串口设置的一般步骤可以总结为如下几个步骤 xff1a 1 串口时钟使能 xff0c GPIO时钟使能 2 设置引脚复用器映射 xff1a 调用GPIO PinAFConfig函数 3 GPIO初始化设置 xff1a 要设置模式为复用功能 4
  • 从STM32F407到AT32F407(一)

    雅特力公司的MCU有着性能超群 xff0c 价格优越的巨大优势 xff0c 缺点是相关资料少一些 xff0c 我们可以充分利用ST的现有资源来开发它 我用雅特力的STM32F437开发板 xff0c 使用原子 stm32f407的开发板自带
  • 成功解决keil识别不到单片机芯片,下载不了程序

    成功解决keil识别不到单片机芯片 下载不了程序 我的芯片是STM32F429 正点原子的阿波罗 今天使用开发板做实验 突然找不到芯片了 以前下载的PWM波也运行不了 查找了好久 原来是芯片锁了 终于解决了 我是第二种办法实现给芯片解锁的
  • STM32F407IG单片机读写SD2405ALPI实时时钟程序(包括:读时钟时间、写时间到时钟、时间报警中断、倒计时中断)

    具体的IIC时序图和分析过程请参见下面网友的文章 https blog csdn net ybhuangfugui article details 52151835 本人在STM32F407单片机上亲测读时钟 写时钟 时间中断以及倒计时 秒
  • 基于线性预测的语音编码原理解析

    早期的音频系统都是基于声音的模拟信号实现的 在声音的录制 编辑和播放过程中很容易引入各种噪声 从而导致信号的失真 随着信息技术的发展 数字信号处理技术在越来越多领域得到了应用 数字信号更是具备了易于存储和远距离传输 没有累积失真 抗干扰能力
  • 深入理解 TCP 拥塞控制

    随着网络技术的飞速发展 越来越多的工作依赖网络完成 基于互联网的实时通信系统的质量和实时性也很大程度也依赖于网络质量 然而 在Internet的TCP IP体系结构中 拥塞的发生是其固有的属性 网络拥塞是指用户对网络资源 包括链路带宽 存储
  • WebRTC带宽估计

    整体架构 上面这张图是一个比较老的架构图 但是也基本能说明整体架构 早期webrtc版本带宽估计是放到接收端处理 目前最新版本带宽估计放到了发送端 但是接收端计算得到的带宽并没有废弃 而是通过rtcp remb反馈给发送端 在发送端带宽估计
  • USR-WIFI232-B2(WIFI)模块没有和服务器TCP连接成功时,单片机读取USR-WIFI232-B2(WIFI)模块的MAC地址

    您想要实现什么功能 1 单片机上电后先读取WIFI模块的MAC地址 2 读取完WIFI模块的MAC地址的后 WIFI模块和上位机进行TCP通信 WIFI模块作为服务器 需要发送 a 进入AT指令配置状态 读取MAC 读取之后 发送AT EN
  • STM32F407单片机通用24CXXX读写程序(KEIL),兼容24C系列存储器(24C01到24C512),支持存储器任意地址跨页连续读写多个页

    一 AT24CXXX容量 AT24C01 AT24C02 AT24C04 AT24C08 AT24C16 AT24C32 AT24C64 AT24C128 AT24C256 不同的xxx代表不同的容量 AT24CXXX bit容量 Byte
  • 单片机串口实现字符串命令解析---使用函数指针(类似哈希表)

    通常情况下串口通信用的大多数都是用十六进制数据来传输指令 比如最常见的modbus的通信 如读保持寄存器指令 01 03 00 00 00 01 84 0A 这种十六进制的指令在这里就不讨论了 想要详细了解可以看往期的文章 串口相关文章链接
  • STM32F407 USART3串口使用DMA接收不定长数据和DMA中断发送

    一 前言 使用DMA通信的好处是 不占用单片机资源 不像普通串口中断 发送一个字节触发一次中断 发送100个字节触发100次中断 接收一个字节触发一次中断 接收200个字节触发200次中断 数据接收完毕触发一次DMA中断 发送数据完毕触发一
  • 高质量、高并发的实时通信架构设计与探索

    中国互联网络信息中心 CNNIC 近日发布的第 47 次 中国互联网络发展状况统计报告 显示 截至 2020 年 12 月 我国网民规模达 9 89 亿 随着社会信息化水平持续提升及电子设备加速普及 手机网民规模持续增长 基本实现对全体网民
  • 何时在 RTC 源控制中的流中使用多个组件

    在我看来 RTC 源代码控制组件是文件和文件夹的逻辑分组 我什么时候应该在 RTC 源控制中的流中使用多个组件 方法一 我有多个 java Eclipse 项目 但我将这些项目添加到单个流中的一个组件中 这些项目被打包到一个部署文件中 方法
  • Eclipse 将编译器合规性更新到 1.7

    我在更新 Eclipse 工作区的编译器合规性时遇到一些问题 我实际上使用的是 RTC 但它本质上是 Eclipse 目前 它使用 1 6 的 jdk 因此我可以将 JDK 合规性更改为 1 6 的限制 但是 我在我的项目中使用 jdk 1

随机推荐