OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 738|回复: 0

STM32F429 RTC掉电重启后卡死

[复制链接]

0

主题

0

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2024-3-25
在线时间
1 小时
发表于 2024-3-25 00:31:14 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 hainingcc 于 2024-3-25 00:36 编辑

各位老师:
近日在根据正点原子F429的开发指南做RTC的相关实验。我自己用CubeMX初始化了代码,然后想根据自己的想法结合正点原子的实验来重写一遍。具体想法如下:
首先学着正点原子的方法定义一个检测备份寄存器DR0写入值的bkp_flag,然后在初始化的时候读取它。假设bkp_flag的值为0x5050时是表示RTC已经初始化过一次,再次上电时不用初始化,因为MSPInit里已经写了对BKP_DR0写入0x5050,只要HAL_RTC_Init执行过一次,那么BKP_DR0的值就是0x5050。然后检测bkp_flag的值,是0x5050的话就跳过设置时间的代码,不是0x5050的话就重新设置一遍最初始的时间和日期。
我在CubeMX中启用了32.768KHz的LSE。


重写过的初始化代码如下:

  1. uint8_t rtc_reboot_init(void)
  2. {
  3.   static uint32_t bkp_flag = 0x0000;

  4.   //HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR0,0x0000);
  5.    
  6.   //return 2;
  7.    
  8.   hrtc.Instance = RTC;
  9.   hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
  10.   hrtc.Init.AsynchPrediv = 127;
  11.   hrtc.Init.SynchPrediv = 255;
  12.   hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
  13.   hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
  14.   hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;

  15.   HAL_PWR_EnableBkUpAccess();

  16.   bkp_flag = HAL_RTCEx_BKUPRead(&hrtc,RTC_BKP_DR0);

  17.   if (HAL_RTC_Init(&hrtc) != HAL_OK)
  18.   {
  19.     return 1;
  20.   }
  21.   
  22.   if (bkp_flag != 0x5050)
  23.   {
  24.   RTC_TimeTypeDef sTime = {0};
  25.   RTC_DateTypeDef sDate = {0};

  26.   sTime.Hours = 21;
  27.   sTime.Minutes = 0;
  28.   sTime.Seconds = 0;
  29.   sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
  30.   sTime.StoreOperation = RTC_STOREOPERATION_RESET;
  31.   if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)
  32.   {
  33.     Error_Handler();
  34.   }
  35.   sDate.WeekDay = RTC_WEEKDAY_SUNDAY;
  36.   sDate.Month = RTC_MONTH_MARCH;
  37.   sDate.Date = 24;
  38.   sDate.Year = 24;

  39.   if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)
  40.   {
  41.     Error_Handler();
  42.   }

  43.   /** Enable the WakeUp
  44.   */
  45.   __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(&hrtc, RTC_FLAG_WUTF);
  46.   if (HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 0, RTC_WAKEUPCLOCK_CK_SPRE_16BITS) != HAL_OK)
  47.   {
  48.     Error_Handler();
  49.   }

  50.   }
  51.   
  52.   return 0;
复制代码
MSPInit:
  1. void HAL_RTC_MspInit(RTC_HandleTypeDef* rtcHandle)
  2. {

  3.   RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
  4.   if(rtcHandle->Instance==RTC)
  5.   {
  6.   /* USER CODE BEGIN RTC_MspInit 0 */

  7.   /* USER CODE END RTC_MspInit 0 */

  8.   /** Initializes the peripherals clock
  9.   */
  10.     PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
  11.     PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
  12.     if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
  13.     {
  14.       Error_Handler();
  15.     }

  16.     /* RTC clock enable */
  17.     __HAL_RCC_RTC_ENABLE();
  18.     HAL_PWR_EnableBkUpAccess();
  19.     __HAL_RCC_PWR_CLK_ENABLE();
  20.     __HAL_RCC_RTC_ENABLE();

  21.     /* RTC interrupt Init */
  22.     HAL_NVIC_SetPriority(RTC_WKUP_IRQn, 1, 0);
  23.     HAL_NVIC_EnableIRQ(RTC_WKUP_IRQn);
  24.   /* USER CODE BEGIN RTC_MspInit 1 */

  25.     HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR0,0x5050);

  26.   /* USER CODE END RTC_MspInit 1 */
  27.   }
  28. }
复制代码


Wakeup回调函数:
  1. void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc)
  2. {
  3.   RTC_TimeTypeDef CurrentTime;
  4.   RTC_DateTypeDef CurrentDate;

  5.   HAL_PWR_EnableBkUpAccess();

  6.   HAL_RTC_GetTime(hrtc,&CurrentTime,RTC_FORMAT_BIN);
  7.   HAL_RTC_GetDate(hrtc,&CurrentDate,RTC_FORMAT_BIN);
  8.   
  9.   printf("%02d:%02d:%02d\r\n",CurrentTime.Hours,CurrentTime.Minutes,CurrentTime.Seconds);
  10.   printf("%04d-%02d-%02d-%d\r\n",2000 + CurrentDate.Year,CurrentDate.Month,CurrentDate.Date,CurrentDate.WeekDay);
  11.   printf("\r\n");

  12.   HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);
  13. }
复制代码




上电后第一次启动,RTC能够正确输出时间日期。但是当掉电然后再次启动之后,程序直接卡死。我debug了很久也没有找到原因。我的主要问题如下:
1. 判断RTC是否为第一次初始化的逻辑是否有问题?
2. 我的串口打印时间日期的代码是在唤醒中断的回调函数里写的,这会有影响吗?
3. 正点原子实验教程里,判断是否启用LSE和LSI以及是否为第一次初始化时,写入BKP_DR0的值是0x5050和0x5051,这两个数有什么特殊意义吗?

期待大佬们的解惑


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 19:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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