阿波罗HAL库获取RTC时间的问题?

2019-07-21 00:59发布

情况是这样的:
     我在调试模式下系统获取RTC时间然后显示在显示屏上是OK的,时间是走的,
但是我在非调试模式下给系统上电运行发现屏幕上的时间是停止不动的。
我已开始以为是程序跑飞了,但是测试下来ucos其它任务都是正常运行的,
经测试以下hal库函数:红 {MOD}部分是为了观察用的(没办法了,调试模式完全是正常的)
HAL_StatusTypeDef HAL_RTC_GetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)
{
  uint32_t tmpreg = 0;

  /* Check the parameters */
  assert_param(IS_RTC_FORMAT(Format));
  
  /* Get subseconds structure field from the corresponding register */
  sTime->SubSeconds = (uint32_t)(hrtc->Instance->SSR);
  
  /* Get SecondFraction structure field from the corresponding register field*/
  sTime->SecondFraction = (uint32_t)(hrtc->Instance->PRER & RTC_PRER_PREDIV_S);

  /* Get the TR register */
  tmpreg = (uint32_t)(hrtc->Instance->TR & RTC_TR_RESERVED_MASK);
  
  /* Fill the structure fields with the read parameters */
  sTime->Hours = (uint8_t)((tmpreg & (RTC_TR_HT | RTC_TR_HU)) >> 16);
  sTime->Minutes = (uint8_t)((tmpreg & (RTC_TR_MNT | RTC_TR_MNU)) >>8);
  sTime->Seconds = (uint8_t)(tmpreg & (RTC_TR_ST | RTC_TR_SU));
  sTime->TimeFormat = (uint8_t)((tmpreg & (RTC_TR_PM)) >> 16);
  
  /* Check the input parameters format */
  if(Format == RTC_FORMAT_BIN)
  {
    /* Convert the time structure parameters to Binary format */
       LED0=!LED0;
    sTime->Hours = (uint8_t)RTC_Bcd2ToByte(sTime->Hours);
    sTime->Minutes = (uint8_t)RTC_Bcd2ToByte(sTime->Minutes);
    sTime->Seconds = (uint8_t)RTC_Bcd2ToByte(sTime->Seconds);
        if((sTime->Seconds)%5==0){beep();}
  }
  
  return HAL_OK;
}

系统运行发现LED0亮灭交替,但是beep始终不响,故判定RTC获取的时间始终没变!
纠结的是只要调试,这个时间就是正常走的而且beep 5s会嘀一下。。。。。。

这个问题如何解决,有遇到这种情况的么?

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
战舰水手
1楼-- · 2019-07-21 04:53
/**
  * @brief  Gets RTC current time.
  * @param  hrtc: pointer to a RTC_HandleTypeDef structure that contains
  *                the configuration information for RTC.
  * @param  sTime: Pointer to Time structure
  * @param  Format: Specifies the format of the entered parameters.
  *          This parameter can be one of the following values:
  *            @arg RTC_FORMAT_BIN: Binary data format
  *            @arg RTC_FORMAT_BCD: BCD data format
  * @note  You can use SubSeconds and SecondFraction (sTime structure fields returned) to convert SubSeconds
  *        value in second fraction ratio with time unit following generic formula:
  *        Second fraction ratio * time_unit= [(SecondFraction-SubSeconds)/(SecondFraction+1)] * time_unit
  *        This conversion can be performed only if no shift operation is pending (ie. SHFP=0) when PREDIV_S >= SS
  * @note You must call HAL_RTC_GetDate() after HAL_RTC_GetTime() to unlock the values
  *        in the higher-order calendar shadow registers to ensure consistency between the time and date values.
  *        Reading RTC current time locks the values in calendar shadow registers until current date is read.
  * @retval HAL status
  */
电子&mcu爱好者
2楼-- · 2019-07-21 07:34
 精彩回答 2  元偷偷看……
电子&mcu爱好者
3楼-- · 2019-07-21 11:19
问题已经解决,hal库的时间获取函数有bug,会无法获取时间,现在采用寄存器方法获取时间正常
cao57508
4楼-- · 2019-07-21 15:21
@note You must call HAL_RTC_GetDate() after HAL_RTC_GetTime() to unlock the values
Fliger
5楼-- · 2019-07-21 16:15
 精彩回答 2  元偷偷看……
战舰水手
6楼-- · 2019-07-21 22:02
Fliger 发表于 2017-4-6 15:19
你是不是只调用了HAL_RTC_GetTime获取时间,没有调用HAL_RTC_GetDate获取日期,我F7之前也是无法更新时间, ...

是的,我后来也找到原因了,库函数的note还是要看看才可以少纠结

一周热门 更多>