1.时钟树
从图中可以看出一共有四个时钟来源,分别是内部高速时钟、内部低速时钟、外部高速时钟接口、外部低速时钟接口,这些时钟源经过内部的倍频分频后提供给各外设使用。其中HSE与LSE需要由外部提供,可以是外部时钟直接输入,也可以是无源晶振,一般HSE需要在4-16MHz之间,LSE只能是32.768KHz。还可以将PLLCLK、HSI、HSE、SYSCLK时钟通过单片机相关引脚输出。
2.配置系统时钟
系统时钟最大72MHz,有三种不同的时钟源:
HSI时钟,此时系统时钟只能是8MHz
HSE时钟,此时系统时钟只能是4-16MHz
PLL时钟,可以由HSI或者HSE倍频得到
PLL时钟有两种不同的来源:
HSI时种,进行二分频后提供给PLL
HSE时钟,直接或者经过二分频后提供给PLL
一般情况下,我们经常使用HSE作为时钟源通过倍频作为PLL时钟,再选用PLL时钟作为系统时钟。我们开发板上使用的晶振是8MHz(HSE),可以将8MHz作为PLL时钟源,通过9倍频后作为系统时钟,这样正好是72MHz(8MHz x 9)。AHB时钟与APBx时钟可以通过系统时钟分频得到,AHB与APB2时钟最大是72MHz,我们这里进行1分频(就是不分频),APB1时钟最大36MHz,我们这里进行2分频就可以。
我们在使用STM32CubeMX建立HAL库工程模板的时候是配置过系统时钟的。
在生成的代码中,SystemClock_Config函数就是配置系统时钟函数
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.
*/
/* 使用HSE时钟 */
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
/* 开启HSE时钟 */
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
/* HSE时钟不分频 */
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
/* 开启HSI时钟 */
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
/* 开启PLL */
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
/* 将HSE时钟作为PLL时钟源 */
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
/* 进行9倍频 */
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
*/
/* 配置SYSCLK、HCLK、PCLK1、PCLK2 */
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
/* 系统时钟源使用PLL时钟, PLL时钟前面已经配置成了72MHz, 所以系统时钟也是72MHz */
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
/* AHB时钟由系统时钟1分频提供, 就是72MHz */
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
/* APB1时钟由AHB时钟2分频提供, 就是36MHz */
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
/* APB2时钟由AHB时钟1分频提供, 就是72MHz */
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
/* 对时钟进行初始化 */
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
{
Error_Handler();
}
}
我们还可以调用HAL_RCC_MCOConfig函数将PLLCLK的二分频、HSI、HSE、SYSCLK时钟通过相关的引脚输出。通过查阅数据手册可以知道PA8引脚可以作为时钟输出引脚
在STM32CubeMX中使能时钟输出
在时钟配置界面(Clock Configuration)可以选择输出哪一路时钟,这里要注意,I/O口的最高速率是50MHz,所以输出的时钟频率是不能超过50MHz的。这里我们选择将HSE时钟输出到PA8引脚
生成代码后,发现在系统时钟配置函数中调用了时钟输出函数HAL_RCC_MCOConfig
将程序下载后,可以用示波器测量PA8引脚,查看是否有8MHz的时钟输出
本例程代码可以在HAL库工程模板这一章节的最后,百度网盘链接分享处获取