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
  • STM32 RTC晶振不起振原因

    今天下载程序后发现程序像死机一样 xff0c 然后仿真发现 xff0c 程序一直在等待RTC晶振就绪 xff0c 最终超时死机 然后检查的电路看都没问题 xff0c 最后通过查阅资料和咨询厂家了解到可能是晶振匹配电容的原因 如下为记录 xf
  • STM32F407之基于FreeRTOS的串口数据处理

    串口数据处理比较频繁时 xff0c 不用RTOS处理数据容易丢包 串口数据处理可以用FreeRTOS进行管理 xff0c 用于支持串口的CMD指令收发 除了串口任务的创建 xff0c 定时器创建外 xff0c 单纯串口数据处理需要进行下面几
  • stm32F407中arr与psc以及pwm之间的关系

    stm32F407pwm控制 A Stm32F407主频 xff08 即CPU的时钟频率 xff09 xff1a 168MHZ B arr是计数 xff0c 从0到设定值 xff0c 然后返回至0重新开始计数 xff08 也可以看成pwm的
  • 基于stm32f407通过USB配置CH340

    1 在设备枚举的case ENUM SET CONFIGURATION 设置配置 状态后 xff0c 配置CH340的波特率 xff0c 然后跳过CBW和CSW协议 xff1b 直接采用批量传输的方式进行数据传输
  • STM32F407以太网DMA描述符和数据链路层收发数据

    本文主要介绍STM32F407单片机MAC内核的DMA描述符 xff0c 以及如何实现以太网二层的数据收发 这一篇先实现数据链路层的正常收发 xff0c 下一篇再去介绍如何把LWIP移植到单片机上 大部分资料都是把LWIP移植和以太网卡驱动
  • 最简单DIY基于STM32F407探索者开发板的MPU6050陀螺仪姿态控制舵机程序

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

    一 硬件 1 硬件准备 xff1a 57步进电机 xff08 型号57CM18 xff09 xff0c 42步进电机 xff0c 驱动器TB6600 xff0c 开发板STM32F407ZGT6 xff0c SN 4NDO限位金属传感器 x
  • STM32F407控制42,57两个步进电机用传感器限制位置

    功夫不负有心人 xff0c 终于把这个做出来了 xff0c 本项目为控制42 57两个步进电机 xff0c 带动齿轮 xff0c 进行上下左右转动 xff0c 四个限位金属传感器限制位置 传感器配置过程 步进电机配置过程 记录一下一个问题
  • STM32F407-基于AD7606进行多路数据采集

    1 原理图 2 管脚定义 2 1 OS2 OS1 OS0 查阅数据手册 这三个管脚组合控制过采样模式 000 表示无过采样 xff0c 最大 200Ksps 采样速率 001 表示 2 倍过采样 xff0c 也就是硬件内部采集 2 个样本求
  • rtc使用

    首先我们要知道 xff0c rtc并非片上外设 xff0c 所以要通过连接总线以读取数据 什么是RTC RTC Real Time Clock xff1a 实时时钟 RTC是个独立的定时器 RTC模块拥有一个连续计数的计数器 xff0c 在
  • 基于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的UART4配置

    复用PC10 PC11作为串口四的TX RX void uart4 init u32 bound GPIO InitTypeDef GPIO InitStructure USART InitTypeDef USART InitStructu
  • STM32F103C8T6单片机IAP升级

    关于IAP升级的方法和原理 网上已经有很多资料了 这块就不再说了 现在就将bootloader和app配置方法整理如下 APP程序就是一个简单的LED闪烁 APP设置为从FLASH中启动 STM32F103C8T6单片机flash有64K
  • STM32F103 UART4串口使用DMA接收不定长数据和DMA中断发送

    一 前言 使用DMA通信的好处是 不占用单片机资源 不像普通串口中断 发送一个字节触发一次中断 发送100个字节触发100次中断 接收一个字节触发一次中断 接收200个字节触发200次中断 数据接收完毕触发一次DMA中断 发送数据完毕触发一
  • 拥抱国产化,推动产业互联网,拍乐云做了什么?

    新一轮科学技术进步法的修订中提出要健全科技创新保障措施 完善创新体系 为促进实现高水平科技自立自强提供法治保障 随着国家对信息安全 科学自主的要求越来越高 音视频技术作为视频会议 应急指挥 办公协同 远程银行等行业场景的基础技术支撑 其独立
  • STM32 之八 在线升级(IAP)超详细图解 及 需要注意的问题解决

    IAP 是啥 IAP In Application Programming 即在应用编程 也就是用户可以使用自己的程序对MCU的中的运行程序进行更新 而无需借助于外部烧写器 其实ST官网也给出了IAP的示例程序 感兴趣的可以直接去官网搜索
  • ClearCase 中是否有 RTC 等效的“挂起模式”?

    我发现 RTC 中的 暂停更改设置 非常有用 而且由于我们也在使用 ClearCase 数十个用户 我想知道 ClearCase 中是否也提供该功能 如果不是 它可以由 script trigger hook 生成吗 我们使用UCM 我想解
  • Eclipse 将编译器合规性更新到 1.7

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

随机推荐