玩了STM32一段时间了,还没搞懂系统时钟怎么更改,平时经常借鉴别人的工程文件,导致系统时钟不对劲,比如串口波特率不准等等,今天要撤底搞明白。
最近看到了一篇技博,说除了可以调用官方提供的时钟设置函数接口外,如果想要自己自行设置相关的时钟操作,也是可以的。
假设外部晶振8MHz,系统时钟要配置为168MHz,则可以根据自己所选用的外部晶振大小和需要进行配置,相关代码如下:
/*案例 1...................*/
void RCC_Config(void)
{
RCC_DeInit(); //RCC寄存器初始化
RCC_HSEConfig(RCC_HSE_ON); //使用外部时钟
if(RCC_WaitForHSEStartUp() == SUCCESS) //等待外部时钟启动
{
RCC_PLLCmd(DISABLE); //配置PLL前应先关闭主PLL
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //选择PLL时钟为系统时钟
/*HCLK(AHB)时钟为系统时钟1分频*/
RCC_HCLKConfig(RCC_SYSCLK_Div1);
/*PCLK(APB1)时钟为HCLK时钟8分频 */
RCC_PCLK1Config(RCC_HCLK_Div4);
/*PCLK(APB2)时钟为HCLK时钟2分频*/
RCC_PCLK2Config(RCC_HCLK_Div2);
/*PLL时钟配置,外部晶振为25MHz,系统配置为168MHz,PLL_M,PLL_P*/
RCC_PLLConfig(RCC_PLLSource_HSE,8,168,4,2);
RCC_PLLCmd(ENABLE); //PLL时钟开启
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //等待PLL时钟准备好
}
}
/*案例 2...................*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
RCC_OscInitStruct.HSIState = RCC_HSI_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();
}
}
如有不对,请高手指点!!