硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3270|回复: 4
收起左侧

[STM32H7] h7的HAL 1.8.0版本库的RTC时钟没起振 死循环 无法退出

[复制链接]

1

主题

29

回帖

32

积分

新手上路

积分
32
发表于 2020-7-29 00:22:50 | 显示全部楼层 |阅读模式
h7的HAL 1.8.0版本库  和1.7.0的版本都存在RTC 退出去的情况 当外部晶振不起振会出现在RTC函数出不来的情况

H7的RTC有bug的地方
没改动之前的代码
这个只有H7的1.8.0的版本会有问题  H7的1.7.0的版本没有问题  
当晶振不起振的时候 就会死这里不动
  1. HAL_StatusTypeDef RTC_EnterInitMode(RTC_HandleTypeDef *hrtc)
  2. {
  3.   uint32_t tickstart;
  4.   HAL_StatusTypeDef status = HAL_OK;
  5.   /* Check if the Initialization mode is set */
  6. #if defined(RTC_ICSR_INITF)
  7.   if((hrtc->Instance->ICSR & RTC_ICSR_INITF) == 0U)
  8.   {
  9.     /* Set the Initialization mode */
  10.     SET_BIT(hrtc->Instance->ICSR, RTC_ICSR_INIT);

  11.     tickstart = HAL_GetTick();
  12.     /* Wait till RTC is in INIT state and if Time out is reached exit */
  13.     while ((hrtc->Instance->ICSR & RTC_ICSR_INITF) == 0U)
  14.     {
  15.       if((HAL_GetTick()  - tickstart) > RTC_TIMEOUT_VALUE)
  16.       {
  17.         status = HAL_TIMEOUT;
  18.         hrtc->State = HAL_RTC_STATE_TIMEOUT;
  19.       }
  20.     }
  21.   }
  22. #endif /* RTC_ICSR_INITF */
  23. #if defined(RTC_ISR_INITF)
  24.   if((hrtc->Instance->ISR & RTC_ISR_INITF) == 0U)
  25.   {
  26.     /* Set the Initialization mode */
  27.     hrtc->Instance->ISR = (uint32_t)RTC_INIT_MASK;

  28.     tickstart = HAL_GetTick();
  29.     /* Wait till RTC is in INIT state and if Time out is reached exit */
  30.     while ((hrtc->Instance->ISR & RTC_ISR_INITF) == 0U)
  31.     {
  32.       if((HAL_GetTick()  - tickstart) > RTC_TIMEOUT_VALUE)
  33.       {
  34.         status = HAL_TIMEOUT;
  35.         hrtc->State = HAL_RTC_STATE_TIMEOUT;
  36.       }
  37.     }
  38.   }
  39. #endif /* RTC_ISR_INITF */

  40.   return status;
  41. }
复制代码
这段代码是 H7的1.8.0和1.7.0的版本  都是有问题  会出现意外退不出去的情况
  1. HAL_StatusTypeDef HAL_RTC_DeInit(RTC_HandleTypeDef *hrtc)
  2. {
  3.   HAL_StatusTypeDef status = HAL_ERROR;
  4.   uint32_t          tickstart;

  5.   /* Check RTC handler */
  6.   if(hrtc != NULL)
  7.   {
  8.     /* Check the parameters */
  9.     assert_param(IS_RTC_ALL_INSTANCE(hrtc->Instance));

  10.     /* Set RTC state */
  11.     hrtc->State = HAL_RTC_STATE_BUSY;

  12.     /* Disable the write protection for RTC registers */
  13.     __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc);
  14.     /* Enter Initialization mode */
  15.     status = RTC_EnterInitMode(hrtc);
  16.     if (status == HAL_OK)
  17.     {
  18.       /* Reset TR, DR and CR registers */
  19.       hrtc->Instance->TR = 0x00000000U;
  20.       hrtc->Instance->DR = ((uint32_t)(RTC_DR_WDU_0 | RTC_DR_MU_0 | RTC_DR_DU_0));
  21.       /* Reset All CR bits except CR[2:0] */
  22.       hrtc->Instance->CR &= RTC_CR_WUCKSEL;

  23.       tickstart = HAL_GetTick();

  24.       /* Wait till WUTWF flag is set and if Time out is reached exit */
  25. #if defined(RTC_ICSR_WUTWF)
  26.       while (((hrtc->Instance->ICSR) & RTC_ICSR_WUTWF) == 0U)
  27. #endif /* RTC_ICSR_WUTWF */
  28. #if defined(RTC_ISR_WUTWF)
  29.         while (((hrtc->Instance->ISR)  & RTC_ISR_WUTWF)  == 0U)
  30. #endif /* RTC_ISR_WUTWF */
  31.         {
  32.           if((HAL_GetTick() - tickstart) > RTC_TIMEOUT_VALUE)//固件库这个位置 有bug 退不出来
  33.           {
  34.             /* Enable the write protection for RTC registers */
  35.             __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);

  36.             /* Set RTC state */
  37.             hrtc->State = HAL_RTC_STATE_TIMEOUT;

  38.             status = HAL_TIMEOUT;
  39.                         //
  40.                         break;
  41.           }
  42.         }

  43.       /* Exit initialization mode */
  44.       status = RTC_ExitInitMode(hrtc);
  45.       if (status == HAL_OK)
  46.       {
  47.         /* Reset all RTC CR register bits */
  48.         hrtc->Instance->CR &= 0x00000000U;

  49.         /* Reset other RTC registers */
  50.         hrtc->Instance->WUTR = RTC_WUTR_WUT;
  51.         hrtc->Instance->PRER = ((uint32_t)(RTC_PRER_PREDIV_A | 0x000000FFU));
  52.         hrtc->Instance->ALRMAR = 0x00000000U;
  53.         hrtc->Instance->ALRMBR = 0x00000000U;
  54.         hrtc->Instance->SHIFTR = 0x00000000U;
  55.         hrtc->Instance->CALR = 0x00000000U;
  56.         hrtc->Instance->ALRMASSR = 0x00000000U;
  57.         hrtc->Instance->ALRMBSSR = 0x00000000U;

  58. #if defined(RTC_ISR_INIT)
  59.         /* Reset Tamper configuration register */
  60.         hrtc->Instance->TAMPCR = 0x00000000U;

  61.         /* Reset Option register */
  62.         hrtc->Instance->OR = 0x00000000U;
  63. #endif /* RTC_ISR_INIT */
  64.       }
  65.     }

  66.     if(status == HAL_OK)
  67.     {
  68. #if defined(TAMP_CR1_TAMP1E)
  69.       /* Reset TAMP registers */
  70.       ((TAMP_TypeDef *)((uint32_t)hrtc->Instance + TAMP_OFFSET))->CR1 = 0xFFFF0000U;
  71.       ((TAMP_TypeDef *)((uint32_t)hrtc->Instance + TAMP_OFFSET))->CR2 = 0x00000000U;
  72. #endif /* TAMP_CR1_TAMP1E */

  73.       /* Enable the write protection for RTC registers */
  74.       __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);

  75. #if (USE_HAL_RTC_REGISTER_CALLBACKS == 1)
  76.       if(hrtc->MspDeInitCallback == NULL)
  77.       {
  78.         hrtc->MspDeInitCallback = HAL_RTC_MspDeInit;
  79.       }

  80.       /* DeInit the low level hardware: CLOCK, NVIC.*/
  81.       hrtc->MspDeInitCallback(hrtc);
  82. #else
  83.       /* De-Initialize RTC MSP */
  84.       HAL_RTC_MspDeInit(hrtc);
  85. #endif /* (USE_HAL_RTC_REGISTER_CALLBACKS) */

  86.       hrtc->State = HAL_RTC_STATE_RESET;

  87.       /* Release Lock */
  88.       __HAL_UNLOCK(hrtc);
  89.     }
  90.   }

  91.   /* return status */
  92.   return status;
  93. }
复制代码



修复之后的代码  这个H7的1.8.0的版本库改动代码参考  H7的1.7.0的版本 自行修改
  1. HAL_StatusTypeDef RTC_EnterInitMode(RTC_HandleTypeDef *hrtc)
  2. {
  3.   uint32_t tickstart;
  4.   HAL_StatusTypeDef status = HAL_OK;
  5.   /* Check if the Initialization mode is set */
  6. #if defined(RTC_ICSR_INITF)
  7.   if((hrtc->Instance->ICSR & RTC_ICSR_INITF) == 0U)
  8.   {
  9.     /* Set the Initialization mode */
  10.     SET_BIT(hrtc->Instance->ICSR, RTC_ICSR_INIT);

  11.     tickstart = HAL_GetTick();
  12.     /* Wait till RTC is in INIT state and if Time out is reached exit */
  13.     while ((hrtc->Instance->ICSR & RTC_ICSR_INITF) == 0U)
  14.     {
  15.       if((HAL_GetTick()  - tickstart) > RTC_TIMEOUT_VALUE)//固件库这个位置 有bug 退不出来
  16.       {
  17.         status = HAL_TIMEOUT;
  18.         hrtc->State = HAL_RTC_STATE_TIMEOUT;
  19.         break;
  20.       }
  21.     }
  22.   }
  23. #endif /* RTC_ICSR_INITF */
  24. #if defined(RTC_ISR_INITF)
  25.   if((hrtc->Instance->ISR & RTC_ISR_INITF) == 0U)
  26.   {
  27.     /* Set the Initialization mode */
  28.     hrtc->Instance->ISR = (uint32_t)RTC_INIT_MASK;

  29.     tickstart = HAL_GetTick();
  30.     /* Wait till RTC is in INIT state and if Time out is reached exit */
  31.     while ((hrtc->Instance->ISR & RTC_ISR_INITF) == 0U)//固件库这个位置 有bug 退不出来
  32.     {
  33.       if((HAL_GetTick()  - tickstart) > RTC_TIMEOUT_VALUE)
  34.       {
  35.         status = HAL_TIMEOUT;
  36.         hrtc->State = HAL_RTC_STATE_TIMEOUT;
  37.         break;
  38.       }
  39.     }
  40.   }
  41. #endif /* RTC_ISR_INITF */

  42.   return status;
  43. }
复制代码
  1. HAL_StatusTypeDef HAL_RTC_DeInit(RTC_HandleTypeDef *hrtc)
  2. {
  3.   HAL_StatusTypeDef status = HAL_ERROR;
  4.   uint32_t          tickstart;

  5.   /* Check RTC handler */
  6.   if(hrtc != NULL)
  7.   {
  8.     /* Check the parameters */
  9.     assert_param(IS_RTC_ALL_INSTANCE(hrtc->Instance));

  10.     /* Set RTC state */
  11.     hrtc->State = HAL_RTC_STATE_BUSY;

  12.     /* Disable the write protection for RTC registers */
  13.     __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc);
  14.     /* Enter Initialization mode */
  15.     status = RTC_EnterInitMode(hrtc);
  16.     if (status == HAL_OK)
  17.     {
  18.       /* Reset TR, DR and CR registers */
  19.       hrtc->Instance->TR = 0x00000000U;
  20.       hrtc->Instance->DR = ((uint32_t)(RTC_DR_WDU_0 | RTC_DR_MU_0 | RTC_DR_DU_0));
  21.       /* Reset All CR bits except CR[2:0] */
  22.       hrtc->Instance->CR &= RTC_CR_WUCKSEL;

  23.       tickstart = HAL_GetTick();

  24.       /* Wait till WUTWF flag is set and if Time out is reached exit */
  25. #if defined(RTC_ICSR_WUTWF)
  26.       while (((hrtc->Instance->ICSR) & RTC_ICSR_WUTWF) == 0U)
  27. #endif /* RTC_ICSR_WUTWF */
  28. #if defined(RTC_ISR_WUTWF)
  29.         while (((hrtc->Instance->ISR)  & RTC_ISR_WUTWF)  == 0U)
  30. #endif /* RTC_ISR_WUTWF */
  31.         {
  32.           if((HAL_GetTick() - tickstart) > RTC_TIMEOUT_VALUE)//固件库这个位置 有bug 退不出来
  33.           {
  34.             /* Enable the write protection for RTC registers */
  35.             __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);

  36.             /* Set RTC state */
  37.             hrtc->State = HAL_RTC_STATE_TIMEOUT;

  38.             status = HAL_TIMEOUT;
  39.                         //
  40.                         break;
  41.           }
  42.         }

  43.       /* Exit initialization mode */
  44.       status = RTC_ExitInitMode(hrtc);
  45.       if (status == HAL_OK)
  46.       {
  47.         /* Reset all RTC CR register bits */
  48.         hrtc->Instance->CR &= 0x00000000U;

  49.         /* Reset other RTC registers */
  50.         hrtc->Instance->WUTR = RTC_WUTR_WUT;
  51.         hrtc->Instance->PRER = ((uint32_t)(RTC_PRER_PREDIV_A | 0x000000FFU));
  52.         hrtc->Instance->ALRMAR = 0x00000000U;
  53.         hrtc->Instance->ALRMBR = 0x00000000U;
  54.         hrtc->Instance->SHIFTR = 0x00000000U;
  55.         hrtc->Instance->CALR = 0x00000000U;
  56.         hrtc->Instance->ALRMASSR = 0x00000000U;
  57.         hrtc->Instance->ALRMBSSR = 0x00000000U;

  58. #if defined(RTC_ISR_INIT)
  59.         /* Reset Tamper configuration register */
  60.         hrtc->Instance->TAMPCR = 0x00000000U;

  61.         /* Reset Option register */
  62.         hrtc->Instance->OR = 0x00000000U;
  63. #endif /* RTC_ISR_INIT */
  64.       }
  65.     }

  66.     if(status == HAL_OK)
  67.     {
  68. #if defined(TAMP_CR1_TAMP1E)
  69.       /* Reset TAMP registers */
  70.       ((TAMP_TypeDef *)((uint32_t)hrtc->Instance + TAMP_OFFSET))->CR1 = 0xFFFF0000U;
  71.       ((TAMP_TypeDef *)((uint32_t)hrtc->Instance + TAMP_OFFSET))->CR2 = 0x00000000U;
  72. #endif /* TAMP_CR1_TAMP1E */

  73.       /* Enable the write protection for RTC registers */
  74.       __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);

  75. #if (USE_HAL_RTC_REGISTER_CALLBACKS == 1)
  76.       if(hrtc->MspDeInitCallback == NULL)
  77.       {
  78.         hrtc->MspDeInitCallback = HAL_RTC_MspDeInit;
  79.       }

  80.       /* DeInit the low level hardware: CLOCK, NVIC.*/
  81.       hrtc->MspDeInitCallback(hrtc);
  82. #else
  83.       /* De-Initialize RTC MSP */
  84.       HAL_RTC_MspDeInit(hrtc);
  85. #endif /* (USE_HAL_RTC_REGISTER_CALLBACKS) */

  86.       hrtc->State = HAL_RTC_STATE_RESET;

  87.       /* Release Lock */
  88.       __HAL_UNLOCK(hrtc);
  89.     }
  90.   }

  91.   /* return status */
  92.   return status;
  93. }
复制代码



回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107776
QQ
发表于 2020-7-29 07:40:00 | 显示全部楼层
谢谢楼主分享。

另外那个是1.7,那个是1.8,那个是修改后的。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107776
QQ
发表于 2020-7-29 07:47:14 | 显示全部楼层
两个版本变化太大了。

从对比上来看,1.8.0设计更合理,启动失败后,新作了一个函数RTC_ExitInitMode,而1.7.0是没有这个函数的


1.png
2.png


5.png


回复

使用道具 举报

1

主题

29

回帖

32

积分

新手上路

积分
32
 楼主| 发表于 2020-7-29 08:33:43 | 显示全部楼层
eric2013 发表于 2020-7-29 07:47
两个版本变化太大了。

从对比上来看,1.8.0设计更合理,启动失败后,新作了一个函数RTC_ExitInitMode, ...

是的  一直用到了RTC  换成1.8.0的版本 出现偶发性程序无法正常启动  1.7.0的版本的时候没有问题  我就对比看了一下  1.8.0的版本有点问题  晶振起振不正常超时了之后 竟然不退出  stm32的rtc晶振不起振的问题 会比较频繁一点 晶振起振超时之后  会要好很多 不会导致程序死机
回复

使用道具 举报

1

主题

29

回帖

32

积分

新手上路

积分
32
 楼主| 发表于 2020-7-29 08:34:41 | 显示全部楼层
eric2013 发表于 2020-7-29 07:47
两个版本变化太大了。

从对比上来看,1.8.0设计更合理,启动失败后,新作了一个函数RTC_ExitInitMode, ...

谢谢楼主补充 大佬厉害
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-6-13 12:57 , Processed in 0.174892 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表