ST意法半导体
直播中

张涛

8年用户 1407经验值
私信 关注
[问答]

为什么无法让RTC在STM32F103C6上工作?

大家好,你们好吗?昨天我无法让 RTC 在我的 STM32F103C6 上工作,奇迹般地我注意到程序给出了一个错误条件(直到那一刻我没有使用错误处理函数,现在我正在使用它)然后我发现错误是HAL_RTC_Init()使用的函数HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk)返回零,因为 RTC 的频率随后产生结果或初始化 RTC 时出错。
返回频率的 HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) 行是 584 ant 代码如下
  • return (frequency);
发生分配的 HAL_RTC_Init() 行是 364,代码如下
  • prescaler = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_RTC);
为了解决这个问题,我不得不将 HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) 的第 584 行更改为以下内容
  • return (uint32_t) frequency;
现在定义:
stm32f1xx_hal_rcc_ex.c 387行获取频率的函数定义为
  • uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk)
同一个文件的第403行中“frequency”变量的定义是
  • uint32_t temp_reg = 0U, frequency = 0U;
而stm32f1xx_hal_rtc.c的第277行中“prescaler”变量的定义是
  • uint32_t prescaler = 0U;
如您所见,所有都定义为 uint32_t 所以我最初假设截断数据一定没有问题,然后发生了什么?最初代码试图通过返回(频率)或是不是发生了另一件我不明白的事情?请有人可以向我澄清这一点。
我的代码中存在另一个错误,如下所示:
  • 每次我初始化 I2C 外设(mi 代码中需要的功能)时,如果在我的程序的任何部分有 HAL_Delay() 调用,那么程序似乎会在代码到达任何外设初始化调用时立即重置(就像疯狂一样听起来它正在发生),我还没有找到原因。
  • 每次启用警报中断(我的代码中需要的另一个功能)或 RTC 的第二个中断时,RTC 就不算数,它只是永远保持相同的小时、分钟和秒。
所有这一切都发生在 HAL 库中,因此,ST 人员是否对这些库提供任何形式的支持,我们可以在哪里向 ST 报告错误?
先谢谢您的帮助。









回帖(1)

施敏

2023-1-31 13:44:34
在该函数中,返回的值变量称为frequency,至少对于 USB、RTC 和 I2S,实际上,在 HAL_RTC_Init() 内部,他们从 stm32f1xx_hal_rtc.c 的第 366 行开始为这种情况编写了一个条件,如下所示:


  •      /* Check that RTC clock is enabled*/
  •      if (prescaler == 0U)
  •       {
  •         /* Should not happen. Frequency is not available*/
  •         hrtc->State = HAL_RTC_STATE_ERROR;
  •         return HAL_ERROR;
  •       }

那是在线之后


  • prescaler = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_RTC);

那是返回错误的条件所以,如果那不应该发生那么他们为什么要放那个条件?我认为他们可能知道这可能发生。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分