STM32学习笔记(六) —— 配置系统时钟

1.时钟树

STM32学习笔记(六) —— 配置系统时钟_第1张图片

从图中可以看出一共有四个时钟来源,分别是内部高速时钟、内部低速时钟、外部高速时钟接口、外部低速时钟接口,这些时钟源经过内部的倍频分频后提供给各外设使用。其中HSE与LSE需要由外部提供,可以是外部时钟直接输入,也可以是无源晶振,一般HSE需要在4-16MHz之间,LSE只能是32.768KHz。还可以将PLLCLK、HSI、HSE、SYSCLK时钟通过单片机相关引脚输出。

2.配置系统时钟

STM32学习笔记(六) —— 配置系统时钟_第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库工程模板的时候是配置过系统时钟的。

STM32学习笔记(六) —— 配置系统时钟_第3张图片

在生成的代码中,SystemClock_Config函数就是配置系统时钟函数

STM32学习笔记(六) —— 配置系统时钟_第4张图片

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引脚可以作为时钟输出引脚

STM32学习笔记(六) —— 配置系统时钟_第5张图片
在这里插入图片描述

在STM32CubeMX中使能时钟输出

STM32学习笔记(六) —— 配置系统时钟_第6张图片

在时钟配置界面(Clock Configuration)可以选择输出哪一路时钟,这里要注意,I/O口的最高速率是50MHz,所以输出的时钟频率是不能超过50MHz的。这里我们选择将HSE时钟输出到PA8引脚

STM32学习笔记(六) —— 配置系统时钟_第7张图片

生成代码后,发现在系统时钟配置函数中调用了时钟输出函数HAL_RCC_MCOConfig

STM32学习笔记(六) —— 配置系统时钟_第8张图片

将程序下载后,可以用示波器测量PA8引脚,查看是否有8MHz的时钟输出

本例程代码可以在HAL库工程模板这一章节的最后,百度网盘链接分享处获取

你可能感兴趣的:(STM32学习笔记,stm32)