ST意法半导体
直播中

张超

7年用户 1279经验值
私信 关注
[问答]

STM32F405RG/407VG的RTC无法启动咋办?

我有一个关于 RTC 的 STM32F405RG/407VG 的非常奇怪的问题:它只工作,当我处于调试模式并将“hrtc”结构添加到实时表达式中并且实例句柄打开时!
我的代码非常简单:
我有 2 个全局变量

  • RTC_timeTypeDef st = {0,};
  • uint32_t sysTime = 0;
这是用于调试目的的全局变量,
main() 中的硬件初始化:

  • /* Initialize all configured peripherals */
  •   MX_GPIO_Init();
  •   MX_CRC_Init();
  •   MX_I2C1_Init();
  •   MX_RNG_Init();
  •   MX_RTC_Init();
  •   MX_USB_DEVICE_Init();
  •   /* USER CODE BEGIN 2 */
  •   uint16_t led = 500;
  •   uint32_t sled = 0;
  •   /* USER CODE END 2 */
一个函数,它从 *USER CODE 4* 中的 RTC 获取时间:

  • void GetTime(void) {
  •         HAL_RTC_GetTime(&hrtc, &st, RTC_FORMAT_BIN);
  •         sysTime = (((((uint32_t)st.Hours) * 60) + ((uint32_t)st.Minutes)) * 60) + (uint32_t)st.Seconds;
  • }
还有一个简单的主循环

  • while(1) {
  •                   if(led) led--;
  •                   else {
  •                           led = 500;
  •                           HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
  •                   }
  •                   if(sysTime != sled) {
  •                           HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin);
  •                           sled = sysTime;
  •                   }
  •                   GetTime();
  •                   HAL_Delay(1);
  • }
预期行为是:
a) 切换 LED1 以指示程序正在运行
b) 当“sysTime”变量改变时切换 LED2。
但实际上发生的是:
当我处于调试模式时,并在“实时表达式窗口”中打开 hrtc->Instance,LED1 和 LED2 按预期切换。
hrtc->Instance closed => "sysTime" 未更新

hrtc->Instance open in Live Expressions => "sysTime" 已更新

当我关闭调试模式时,LED1 一直闪烁,但 LED2 停止闪烁,这意味着“sysTime”不再更新。
有谁知道,这是怎么回事?
我将 CubeID 1.9 与 F4 驱动程序“STM32Cube_FW_F4_V1.27.0”一起使用
一些附加信息:
这个问题出现在一个更大的 STM32F407VE 项目中。出于调试目的,我在 F405RE 上构建了这个简单的程序,我可以在其中重现该行为。
当我关闭 CubeIDE,断开测试板的电源,并在几秒钟后再次启动时,LED2 没有切换。这意味着 RTC 已死,除了我处于 Debuggin 模式并且在 hrtc->Instance 上设置了一个探测器
相同的代码在 Bluepill (F103C8) 上运行良好。

更多回帖

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