我用 STM32F103C8T6 开发项目,使用的IDE是 STM32CubeIDE 1.13.2 版本,HAL 库为 STM32Cube FW 1.8.5 版本。我将闹钟设置为 00:00:00 触发,且闹钟中断触发后,会重新配置闹钟使其在 20 秒后再次触发。
在这个项目中我用到了 RTC 提供的两个中断:每秒触发一次的秒中断,以及闹钟中断。
中断优先级的设置顺序(从高到低)为:
SysTick 中断
闹钟中断
RTC 全局中断
定时器 3 中断
SysTick 中断的优先级必须高于所有 RTC 中断 , 因为它是 RTC 模块各类函数中超时计算的时间基准。
当我在秒中断的回调函数中执行 HAL_RTC_GetTime() 函数时,闹钟能在正确时间触发,但在中断处理过程中丢了一秒。我想找出该异常的原因,推测是在这个场景下执行 HAL_RTC_GetTime 函数内的某些操作并不完全合适。
void HAL_RTCEx_RTCEventCallback(RTC_HandleTypeDef *hrtc){
if(hrtc->Instance == RTC){
HAL_RTC_GetTime(hrtc, &now_Time, RTC_FORMAT_BIN);
(void)snprintf (message_buffer, (size_t)sizeof(message_buffer), "Current Hour %d:%d:%d\r\n", now_Time.Hours, now_Time.Minutes, now_Time.Seconds);
HAL_UART_Transmit(&huart1, (uint8_t *)message_buffer, strlen (message_buffer), HAL_MAX_DELAY);
secondsUpdate++;
seconds_flag = 1;
}
}
while (1)
{
if(seconds_flag ==1){
// HAL_RTC_GetTime(&hrtc, &now_Time, RTC_FORMAT_BIN);
// (void)snprintf (message_buffer, (size_t)sizeof(message_buffer), "Current Hour %d:%d:%d\r\n", now_Time.Hours, now_Time.Minutes, now_Time.Seconds);
// HAL_UART_Transmit(&huart1, (uint8_t *)message_buffer, strlen (message_buffer), HAL_MAX_DELAY);
seconds_flag =0;
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
由于不建议在中断中运行过多代码,因此我修改为:秒中断触发时将一个标志位设为 1,在 while 主循环中读取时间并将该标志位重置为 0。但这种情况下,闹钟中断完全无法触发。
void HAL_RTCEx_RTCEventCallback(RTC_HandleTypeDef *hrtc){
if(hrtc->Instance == RTC){
// HAL_RTC_GetTime(hrtc, &now_Time, RTC_FORMAT_BIN);
// (void)snprintf (message_buffer, (size_t)sizeof(message_buffer), "Current Hour %d:%d:%d\r\n", now_Time.Hours, now_Time.Minutes, now_Time.Seconds);
// HAL_UART_Transmit(&huart1, (uint8_t *)message_buffer, strlen (message_buffer), HAL_MAX_DELAY);
secondsUpdate++;
seconds_flag = 1;
}
}
while (1)
{
if(seconds_flag ==1){
HAL_RTC_GetTime(&hrtc, &now_Time, RTC_FORMAT_BIN);
(void)snprintf (message_buffer, (size_t)sizeof(message_buffer), "Current Hour %d:%d:%d\r\n", now_Time.Hours, now_Time.Minutes, now_Time.Seconds);
HAL_UART_Transmit(&huart1, (uint8_t *)message_buffer, strlen (message_buffer), HAL_MAX_DELAY);
seconds_flag =0;
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
如果我既不在回调函数中、也不在 while 循环中调用 HAL_RTC_GetTime() 函数,闹钟能正常触发,但此时我无法判断是否仍存在 “丢失一秒钟” 的问题。
我想知道以上的操作是否存在错误?
有人知道问题可能出在哪里吗?会不会是 HAL 层的 bug?
|
|