muyunqinggezero 2024-05-16 23:17 采纳率: 73.3%
浏览 6

关于#单片机#的问题:STM32F102C8T6核心板,在使用RTC功能的时候,只要初始化RTC

STM32F102C8T6核心板,在使用RTC功能的时候,只要初始化RTC,系统就卡死,不再进行下去了,有遇到过的朋友吗?

以下是我通过Cube初始化的代码

系统时钟初始化代码:

void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
    RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE|RCC_OSCILLATORTYPE_LSI;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
    RCC_OscInitStruct.LSIState = RCC_LSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
  
  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_ADC;
  PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSI;
  PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV6;
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  {
    Error_Handler();
  }
  
}

RTC初始化代码

static void MX_RTC_Init(void)
{

  /* USER CODE BEGIN RTC_Init 0 */

  /* USER CODE END RTC_Init 0 */

  RTC_TimeTypeDef sTime = {0};
  RTC_DateTypeDef DateToUpdate = {0};

  /* USER CODE BEGIN RTC_Init 1 */
    __HAL_RCC_PWR_CLK_ENABLE();
    __HAL_RCC_BKP_CLK_ENABLE();
    HAL_PWR_EnableBkUpAccess();
  /* USER CODE END RTC_Init 1 */

  /** Initialize RTC Only
  */
  hrtc.Instance = RTC;
  hrtc.Init.AsynchPrediv = RTC_AUTO_1_SECOND;
  hrtc.Init.OutPut = RTC_OUTPUTSOURCE_NONE;
  if (HAL_RTC_Init(&hrtc) != HAL_OK)
  {
    Error_Handler();
  }

  /* USER CODE BEGIN Check_RTC_BKUP */

  /* USER CODE END Check_RTC_BKUP */

  /** Initialize RTC and set the Time and Date
  */
  sTime.Hours = 0x0;
  sTime.Minutes = 0x0;
  sTime.Seconds = 0x0;

  if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
  {
    Error_Handler();
  }
  DateToUpdate.WeekDay = RTC_WEEKDAY_MONDAY;
  DateToUpdate.Month = RTC_MONTH_JANUARY;
  DateToUpdate.Date = 0x1;
  DateToUpdate.Year = 0x0;

  if (HAL_RTC_SetDate(&hrtc, &DateToUpdate, RTC_FORMAT_BCD) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN RTC_Init 2 */

  /* USER CODE END RTC_Init 2 */
}

void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc)
{
  if(hrtc->Instance==RTC)
  {
  /* USER CODE BEGIN RTC_MspInit 0 */

  /* USER CODE END RTC_MspInit 0 */
  HAL_PWR_EnableBkUpAccess();
  /* Enable BKP CLK enable for backup registers */
  __HAL_RCC_BKP_CLK_ENABLE();
  /* Peripheral clock enable */
  __HAL_RCC_RTC_ENABLE();
  /* USER CODE BEGIN RTC_MspInit 1 */

  /* USER CODE END RTC_MspInit 1 */
  }
}




  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2024-05-16 23:17
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    您想要解决的问题

    您提问的目的是解决在使用STM32F102C8T6核心板的RTC功能时遇到的系统卡死问题。

    问题出现原因

    出现这个问题可能的原因有:

    1. RTC初始化配置错误:可能是RTC的初始化配置不正确,比如时钟源、预分频器设置不当。
    2. 时钟树配置问题:STM32的时钟树配置错误可能导致RTC无法正常工作。
    3. 电源问题:RTC模块可能需要特定的电源配置,如果电源供应不稳定或配置不当,可能导致系统卡死。
    4. 寄存器访问冲突:在访问RTC寄存器时,如果存在冲突或不恰当的访问顺序,可能导致系统异常。
    5. 固件问题:固件中可能存在bug,导致在初始化RTC时系统无法正确响应。

    问题解决方案

    1. 检查初始化代码:确保RTC初始化代码正确无误,包括时钟源、预分频器等设置。
    2. 检查时钟树配置:确认STM32的时钟树配置正确,特别是与RTC相关的部分。
    3. 检查电源配置:确保RTC模块的电源供应稳定,并且电源配置正确。
    4. 检查寄存器访问:确保在访问RTC寄存器时遵循正确的访问顺序,避免冲突。
    5. 固件调试:使用调试工具检查固件在RTC初始化过程中的行为,查找可能的bug。

    提供代码

    由于没有具体的代码示例,这里提供一个基本的STM32 RTC初始化的伪代码框架:

    void RTC_Init(void) {
        // 1. 使能RTC时钟
        RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;
        HAL_RCCEx_GetPeriphCLKConfig(&PeriphClkInitStruct);
        PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSI; // 或者使用其他时钟源
        HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
        
        // 2. 初始化RTC
        RTC_HandleTypeDef hrtc;
        hrtc.Instance = RTC;
        HAL_RTC_Init(&hrtc);
        
        // 3. 设置RTC时间
        RTC_TimeTypeDef sTime = {0};
        sTime.RTC_Hours = 0;
        sTime.RTC_Minutes = 0;
        sTime.RTC_Seconds = 0;
        HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
        
        // 4. 设置RTC日期
        RTC_DateTypeDef sDate = {0};
        sDate.RTC_Date = 1;
        sDate.RTC_Month = RTC_MONTH_JANUARY;
        sDate.RTC_Year = 0;
        HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN);
    }
    
    int main(void) {
        HAL_Init();
        SystemClock_Config();
        RTC_Init();
        // ... 其他代码 ...
        while (1) {
            // 主循环
        }
    }
    

    代码运行方式

    • 确保您的开发环境支持STM32系列的编译和烧录。
    • 将上述代码集成到您的STM32项目中。
    • 使用STM32CubeMX工具配置时钟树,确保时钟源正确。
    • 使用STM32CubeIDE或其他IDE编译并烧录到STM32F102C8T6核心板上。

    代码预期运行结果

    如果代码正确无误,RTC将被成功初始化,并且系统不会卡死。您可以在主循环中添加代码来检查RTC的时间和日期是否正确设置。

    推荐相关链接

    评论 编辑记录

报告相同问题?

问题事件

  • 修改了问题 5月16日
  • 创建了问题 5月16日

悬赏问题

  • ¥15 气象网格数据与卫星轨道数据如何匹配
  • ¥100 java ee ssm项目 悬赏,感兴趣直接联系我
  • ¥15 微软账户问题不小心注销了好像
  • ¥15 x264库中预测模式字IPM、运动向量差MVD、量化后的DCT系数的位置
  • ¥15 curl 命令调用正常,程序调用报 java.net.ConnectException: connection refused
  • ¥20 关于web前端如何播放二次加密m3u8视频的问题
  • ¥15 使用百度地图api 位置函数报错?
  • ¥15 metamask如何添加TRON自定义网络
  • ¥66 关于川崎机器人调速问题
  • ¥15 winFrom界面无法打开