嵌入式技术论坛
直播中

向日葵的花季

8年用户 1234经验值
擅长:电源/新能源
私信 关注
[问答]

RT-Thread Studio使用HSE跑不起来如何解决

1.jpg

按照官网文档使用Studio时,使用HSE作为系统时钟发现系统跑不起来,对于HSE的文档应该写的不是很完整,个人感觉board.h下应该也是要修改的,我按照自己的思路修改以后,在线调试能够跑起来系统,关闭调试器以后就不行,有点奇怪,希望官网文档也能完善下这块内容。谢谢啦

回帖(2)

张虎豹

2022-9-1 14:28:57
检查一下 stm32f4xx_hal_conf.h 中的 HSE_VALUE 的宏定义,是否跟板载晶振频率一致
举报

向日葵的花季

2022-9-1 14:29:46
已经解决了,原来是使用STM32CubeMX的时候,晶振的类型选错了,我说怎么上网一搜索好像都没有人遇到过类似的问题呢?
以下是我排查问题的过程,帮助以后遇到同样问题的小伙伴吧。

(1)一开始反复对照官网的文档,确认该改的都已经改了,例如stm32xxxx_hal_conf.h文件中的

#define HSE_VALUE    ((uint32_t)8000000U) /*!< Value of the External oscillator in Hz */
我这里板子上是8M的,就改为8M了。
(2)然后检查时钟配置函数,这段代码是直接用STM32CUBEMX生成的,裸机上也可以跑通。

void system_clock_config(int target_freq_mhz)
{
    RCC_OscInitTypeDef RCC_OscInitStruct = {0};
    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
    /** Configure the main internal regulator output voltage
    */
    __HAL_RCC_PWR_CLK_ENABLE();
    __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
    /** Initializes the CPU, AHB and APB busses clocks
    */
    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
    RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS;
    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
    RCC_OscInitStruct.PLL.PLLM = 4;
    RCC_OscInitStruct.PLL.PLLN = 168;
    RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
    RCC_OscInitStruct.PLL.PLLQ = 4;
    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
    {
      Error_Handler();
    }
    /** Initializes the CPU, AHB and APB busses 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_DIV4;
    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
    {
      Error_Handler();
    }
}
(3)当我发现RTOS没有跑起来的时候,就在线调试,发现程序是卡死在HAL_RCC_OscConfig->

while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET)
{
  if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE)
  {
      return HAL_TIMEOUT;
  }
}
也就是说HSE一直都没有就绪,一开始怀疑是嘀嗒定时器没有启动的问题,但是想想,如果HSE一直没有就绪也是有问题的。于是我就在裸机下在线调试,发现原来裸机也是超时了,后来网上一搜STM32CubeMx时钟配置,原来晶振的类型选错了。尴尬啊!!!经过纠正以后,配置如下
1.jpg
代码如下:

void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  /** Configure the main internal regulator output voltage
  */
  __HAL_RCC_PWR_CLK_ENABLE();
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
  /** Initializes the CPU, AHB and APB busses clocks
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = 4;
  RCC_OscInitStruct.PLL.PLLN = 168;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 4;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  /** Initializes the CPU, AHB and APB busses 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_DIV4;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
  {
    Error_Handler();
  }
}
然后就顺利跑起来了。
2.jpg
举报

更多回帖

发帖
×
20
完善资料,
赚取积分