hal库怎么实现外部晶振有问题切换内部晶振
时间: 2024-01-12 18:04:10 浏览: 108
GD30F130 串口代码 主控使用GD30F130F8P6测试。 内部晶振的。使用GD自己的库,
HAL库中可以使用RCC_ClkInitTypeDef结构体来初始化系统时钟,同时可以使用RCC_OscInitTypeDef结构体来初始化外部晶振和内部振荡器。在初始化时,可以设置首选的时钟源和备用时钟源,以及在首选时钟源失效时自动切换到备用时钟源。
具体来说,可以先初始化外部晶振,然后在初始化时钟时设置外部晶振为首选时钟源,内部振荡器为备用时钟源。如果外部晶振失效,系统会自动切换到内部振荡器。
以下代码示例展示了如何使用HAL库来初始化系统时钟并设置外部晶振为首选时钟源:
```
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
// 初始化外部晶振
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 = 8;
RCC_OscInitStruct.PLL.PLLN = 336;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = 7;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
// 外部晶振初始化失败
while(1);
}
// 初始化时钟
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | 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)
{
// 时钟初始化失败
while(1);
}
```
在上述代码中,我们首先使用RCC_OscInitStruct结构体初始化外部晶振,然后将其设置为PLL时钟源,并在RCC_ClkInitStruct结构体中将其设置为首选时钟源。如果在初始化时外部晶振失效,系统会自动切换到内部振荡器。
阅读全文