STM32时钟配置详解及步骤

文章目录

  • 前言
  • 一、Stm32F1时钟树
  • 二、STM32F407时钟树
  • 三、STM32时钟配置
  • 3.1系统时钟配置
  • 总结
  • 前言

    一、Stm32F1时钟树


    使用内部高速时钟时,工作频率最大为64Mhz,且不稳定,因此需要外接时钟源一般8MHZ。8MHZ经过PLL后SYSCLK为72Mhz;APB1预分频后为36MHZ,APB2预分频后为72MHZ,定时器1~8时钟频率为72MHZ,ADC经过6分频后为12MHZ

    二、STM32F407时钟树


    比F1系列多一个PLL;最大频率为168MHZ;APB1预分频为42MHZ;APB2预分频为84MHZ;挂载在APB1的定时器时钟为84MHZ(T2-T5、T12-T14),在APB2上时钟为168MHZ(T1、T8~T11)

    三、STM32时钟配置

    STM32系统时钟配置包括三个步骤:
    1.系统时钟配置
    2.外设时钟使能
    3.系统初始化函数(F1、F4/7、H7)sys_stm32_clock_init()

    3.1系统时钟配置

    1.配置HSE_VALUE(告诉系统外部晶振)

    2.调用SystemInit()函数
    可选择调用,在启动文件中调用

    3.配置时钟源,配置PLL——HAL_RCC_OscConfig()
    4.选择系统时钟源,配置总线分频数——HAL_RCC_ClockConfig()
    5.配置扩展外设时钟(H7)——HAL_RCCEx_PeriphCLKConfig()
    以上三个函数封装在sys_stm32_clock_init()中

    //简单介绍一下HAL_RCC_ClockConfig()函数
    HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef  *RCC_OscInitStruct)
    //返回值是一个结构体,返回的是错误状态
    //形参是一个结构体指针类型
    //RCC_OscInitTypeDef结构体如下
    typedef struct
    {
     uint32_t OscillatorType; 
     uint32_t HSEState; 
     uint32_t HSEPredivValue;
     uint32_t LSEState;  
     uint32_t HSIState;
     uint32_t HSICalibrationValue; 
     uint32_t LSIState; 
     RCC_PLLInitTypeDef PLL;
    }RCC_OscInitTypeDef;
    
    typedef struct
    {
      uint32_t PLLState;     
      uint32_t PLLSource;   
      uint32_t PLLMUL; 
      	RCCEx_PLL_Multiplication_Factor
    } RCC_PLLInitTypeDef;
    
    //在sys_stm32_clock_init()中比较重要的记录如下:
      //1.对结构体整体赋值0
      RCC_OscInitTypeDef rcc_osc_init ={0};
      //2.结构体成员为另一个结构体类型成员调用方法
      rcc_osc_init.PLL.PLLState=RCC_PLL_ON;//打开PLL
      //3.结构体指针做形参
      ret = HAL_RCC_OscConfig(&rcc_osc_init);
      //将该结构体变量的地址发送给函数,在函数中可以直接调用结构体指针对成员进行赋值
    RCC_OscInitStruct->OscillatorType
    //4.注意在配置的过程中,首先需要选择需要配置的东西,如果有很多,用连接
    rcc_clk_init.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
    

    Stm32配置函数如下

    void sys_stm32_clock_init(uint32_t plln)
    {
        HAL_StatusTypeDef ret = HAL_ERROR;
        RCC_OscInitTypeDef rcc_osc_init = {0};
        RCC_ClkInitTypeDef rcc_clk_init = {0};
    
        rcc_osc_init.OscillatorType = RCC_OSCILLATORTYPE_HSE;       /* 选择要配置HSE */
        rcc_osc_init.HSEState = RCC_HSE_ON;                         /* 打开HSE */
        rcc_osc_init.HSEPredivValue = RCC_HSE_PREDIV_DIV1;          /* HSE预分频系数 */
        rcc_osc_init.PLL.PLLState = RCC_PLL_ON;                     /* 打开PLL */
        rcc_osc_init.PLL.PLLSource = RCC_PLLSOURCE_HSE;             /* PLL时钟源选择HSE */
        rcc_osc_init.PLL.PLLMUL = plln;                             /* PLL倍频系数 */
        ret = HAL_RCC_OscConfig(&rcc_osc_init);                     /* 初始化 */
    
        if (ret != HAL_OK)
        {
            while (1);                                              /* 时钟初始化失败,之后的程序将可能无法正常执行,可以在这里加入自己的处理 */
        }
    
        /* 选中PLL作为系统时钟源并且配置HCLK,PCLK1和PCLK2*/
        rcc_clk_init.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
        rcc_clk_init.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;        /* 设置系统时钟来自PLL */
        rcc_clk_init.AHBCLKDivider = RCC_SYSCLK_DIV1;               /* AHB分频系数为1 */
        rcc_clk_init.APB1CLKDivider = RCC_HCLK_DIV2;                /* APB1分频系数为2 */
        rcc_clk_init.APB2CLKDivider = RCC_HCLK_DIV1;                /* APB2分频系数为1 */
        ret = HAL_RCC_ClockConfig(&rcc_clk_init, FLASH_LATENCY_2);  /* 同时设置FLASH延时周期为2WS,也就是3个CPU周期。 */
    
        if (ret != HAL_OK)
        {
            while (1);                                              /* 时钟初始化失败,之后的程序将可能无法正常执行,可以在这里加入自己的处理 */
        }
    }
    

    总结

    提示:这里对文章进行总结:

    例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32时钟配置详解及步骤

    发表评论