我有一个关于 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) 上运行良好。