- Date:2023-06-05

  • Time:14:21
  • Subject: none
  • Tags: #stm32 #时钟
    [[2023-06]]

什么是时钟

Pasted image 20230605142235|600

  1. 简单来说,时钟是具有周期性的脉冲信号,最常用的是占空比50%的方波
  2. 时钟是单片机的脉搏,搞懂时钟走向及关系,对单片机使用至关重要!

认识时钟树(F1)

Pasted image 20230605142506|600
Pasted image 20230605142425|600
L:low
S:speed
I:internal
E:external
Pasted image 20230605142543|600

时钟树简图

Pasted image 20230605142739|600

  1. PLL:锁相环,倍频系数:2~3(PLLCLK)
  2. HSE分频可以说/1或者/2,HSI分频/2,再来到PLL倍频
  3. HCLK前分频也用1,保持72mhz
  4. APB1则分频/2,
    Pasted image 20230605143203|600
  5. 低速晶振

HAL库内体现

  1. 时钟源、锁相环:HAL_RCC_OscConfig()
  2. 系统时钟、总线:HAL_RCC_ClockConfig()
  3. 使能外设时钟:_ _ HAL_RCC_PPP_CLK_ENABLE() 是一个宏定义,打开外设时使用时
  4. 扩展外设时钟(RTC/ADC/USB):HAL_RCCEx_PeriphCLKConfig()

STM32CubeMX时钟树(F103)

Pasted image 20230605143431|600

- Date:2023-06-05

  • Time:15:01
  • Subject: none
  • Tags: #stm32 #配置 #时钟
    [[2023-06]]

系统时钟配置步骤

  1. 配置HSE_VALUE
    1. 告诉HAL库外部晶振频率,stm32xxxx_hal_conf.h
  2. 调用SystemInit()函数(可选)
    1. 在启动文件中调用, 在system_stm32xxxx.c定义
  3. 选择时钟源,配置PLL
    1. 通过HAL_RCC_OscConfig()函数设置
  4. 选择系统时钟源,配置总线分频器
    1. 通过HAL_RCC_ClockConfig()函数设置
  5. 配置扩展外设时钟(可选)
    1. 通过HAL_RCCEx_PeriphCLKConfig()函数设置
      注:
      3 + 4 + 5 = sys_stm32_clock_init() //正点原子配置

外设时钟使能和失能

我们要使用某个外设,必需先使能该外设时钟!!!

1
2
3
4
HAL库使能某个外设时钟的方法,如:
__HAL_RCC_GPIOA_CLK_ENABLE();        /* 使能 GPIOA 时钟 */
HAL库禁止某个外设时钟的方法,如:
__HAL_RCC_GPIOA_CLK_DISABLE();        /* 禁止 GPIOA 时钟 */

sys_stm32_clock_init 函数(F1)

结合上一个md的图表来看,是对对应位的配置

HAL_RCC_OscConfig()函数

返回值:HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef  *RCC_OscInitStruct)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
typedef struct
{
  uint32_t  OscillatorType;   /* 选择需要配置的振荡器 */ 
  uint32_t  HSEState;   /* HSE 状态 */
  uint32_t  HSEPredivValue;   /* HSE 预分频值 */
  uint32_t  LSEState;   /* LSE 状态 */
  uint32_t  HSIState;   /* HSI状态 */
  uint32_t  HSICalibrationValue;   /* HSI 校准值 */
  uint32_t  LSIState;   /* LSI 状态 */
  RCC_PLLInitTypeDef  PLL;   /* PLL 结构体 */
}RCC_OscInitTypeDef;

typedef struct
{
  uint32_t  PLLState;   /* PLL 状态 */
  uint32_t  PLLSource;   /* PLL 时钟源 */
  uint32_t  PLLMUL;   /* PLL 倍频系数 */
}RCC_PLLInitTypeDef;

HAL_RCC_ClockConfig()函数

返回值:HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef  *RCC_ClkInitStruct, uint32_t FLatency)

1
2
3
4
5
6
7
8
9
10
11
12
13
typedef struct
{
  uint32_t  ClockType;   /* 要配置的时钟(SYSCLK/HCLK/PCLK1/PCLK2) */
  uint32_t  SYSCLKSource;   /* 系统时钟源 */
  uint32_t  AHBCLKDivider;   /* AHB  时钟预分频系数 */
  uint32_t  APB1CLKDivider;   /* APB1 时钟预分频系数 */
  uint32_t  APB2CLKDivider;   /* APB2 时钟预分频系数 */
}RCC_ClkInitTypeDef;

uint32_t FLatency
#define  FLASH_LATENCY_0   0x00000000U   /* FLASH 0个等待周期 */
#define  FLASH_LATENCY_1   FLASH_ACR_LATENCY_0   /* FLASH 1个等待周期 */
#define  FLASH_LATENCY_2   FLASH_ACR_LATENCY_1   /* FLASH 2个等待周期 */