STM32的HAL库下,main.c中的void SystemClock_Config(void)

一、stm32有多种时钟源,为HSE、HSI、LSE、LSI、PLL,对于L系统的,还有一个专门的MSI

①HSI:High Speed Internal,是高速内部时钟,RC振荡器,频率为8MHz。精度略差。
②HSE:High Speed External,一般8M的晶振,精度比较高,比较稳定。高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源;
③LSI:Low Speed Internal,低速内部时钟,RC振荡器,频率为37kHz;
④LSE:Low Speed External,是低速外部时钟,接频率为32.768kHz的石英晶体。一般为RTC使用。
⑤PLL:Phase Locked Loop,PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。

6、MSI是L系列独有的,它是一个产生于内部的可选择的时钟源,能提供12种不同频率:100 kHz, 200 kHz, 400 kHz, 800 kHz, 1 MHz, 2 MHz, 4 MHz (default value), 8 MHz, 16 MHz, 24 MHz, 32 MHz and 48 MHz。可以直接选择为系统主系统时钟,也可以作为PLL源,经倍频后选择作为系统的主系统时钟。为低功耗提供更多的选择。其相当于代替了HSI了。

stm32有多个总线,主要有AHB和APB总线

AHB是高速总线,是一种系统总线,它主要负责连接处理器、DMA等一些内部接口。AHB 系统由主模块、从模块和基础结构3部分组成,整个AHB总线上的传输都由主模块发出,由从模块负责回应。
APB是低速总线,它主要负责连接外围设备,它又分为APB1和APB2,它的总线架构不像 AHB支持多个主模块,在APB里面唯一的主模块就是APB 桥。APB桥就是连接AHB和APB中间的玩意。
APB1最大时钟频率为36MHz
APB2最大时钟频率为72MHz

二、其次了解二个结构体:

stm32的HAL库,在系统时钟设置的结构有,RCC_OscInitTypeDef和RCC_ClkInitTypeDef二个。

1、RCC_OscInitTypeDef为设置系统各时钟的来源

typedef struct
{
  uint32_t OscillatorType;           //选定将被配置的振荡器- HSE、HIS、LSE、LSI
  uint32_t HSEState;               //HSE状态- 是否开启(开启)       
  uint32_t LSEState;               //LSE状态            
  uint32_t HSIState;               //HSI状态             
  uint32_t HSICalibrationValue;      //HSI校准调整值  
  uint32_t LSIState;               //LSI状态              
  RCC_PLLInitTypeDef PLL;       //PLL结构体参数 -PLL相关设置  
  +HSEPredivValue:HSE是否分频(不分频)    
} RCC_OscInitTypeDef;

typedef struct
{
  uint32_t PLLState;  //PLL是否使能(使能)

  uint32_t PLLSource; //PLL时钟源,HIS、HSE、HIS/2(HSE)

  uint32_t PLLM;       /*!< PLLM: Division factor for PLL VCO input clock.
                            This parameter must be a number between Min_Data = 1 and Max_Data = 16 on STM32L4Rx/STM32L4Sx devices.
                            This parameter must be a number between Min_Data = 1 and Max_Data = 8 on the other devices */

  uint32_t PLLN;       /*!< PLLN: Multiplication factor for PLL VCO output clock.
                        This parameter must be a number between Min_Data = 8 and Max_Data = 86    */

#if defined(RCC_PLLP_SUPPORT)
  uint32_t PLLP;       /*!< PLLP: Division factor for SAI clock.
                            This parameter must be a value of @ref RCC_PLLP_Clock_Divider             */
#endif /* RCC_PLLP_SUPPORT */

  uint32_t PLLQ;       /*!< PLLQ: Division factor for SDMMC1, RNG and USB clocks.
                            This parameter must be a value of @ref RCC_PLLQ_Clock_Divider             */

  uint32_t PLLR;       /*!< PLLR: Division for the main system clock.
                            User have to set the PLLR parameter correctly to not exceed max frequency 120MHZ
                            on STM32L4Rx/STM32L4Sx devices else 80MHz on the other devices.
                            This parameter must be a value of @ref RCC_PLLR_Clock_Divider             */

}RCC_PLLInitTypeDef;

 

2、RCC_ClkInitTypeDef哦设置AHB和APB总线时钟配置

typedef struct
{
  uint32_t ClockType;       //选定将被配置的时钟             
  uint32_t SYSCLKSource;    //用作系统时钟的时钟源选择         
  uint32_t AHBCLKDivider;   //AHB时钟(HCLK)分频器,该时钟由SYSCLK而来      
  uint32_t APB1CLKDivider;  //APB1时钟(PCLK1)分频器,该时钟由HCLK而来      
  uint32_t APB2CLKDivider;  //APB2时钟(PCLK2)分频器,该时钟由HCLK而来      
} RCC_ClkInitTypeDef;

三、

  1. void SystemClock_Config(void)
  2. {
  3.   RCC_OscInitTypeDef   RCC_OscInitStruct;
  4.   RCC_ClkInitTypeDef    RCC_ClkInitStruct;
  5.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;  // 外部晶振,8MHz
  6.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;//HSE开启
  7.   RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREdiv_div1;//HSE是否分频(不分)
  8.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;PLL是否使能(使能)
  9.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  10.   RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL6;  // 6倍频,得到48MHz主时钟
  11.   HAL_RCC_OscConfig(&RCC_OscInitStruct);

  1.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  2.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  3.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;       // 系统时钟:48MHz
  4.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_div1;              // AHB时钟 :48MHz
  5.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_div2;               // APB1时钟:24MHz
  6.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_div1;               // APB2时钟:48MHz
  7.   HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);
  8.   // 使能MCO输出,输出为PLLCLK时钟2分频:24MHz
  9.   HAL_RCC_MCOConfig(RCC_MCO, RCC_MCO1SOURCE_PLLCLK, RCC_MCOdiv_1);
  10.   HAL_RCC_EnableCSS(); // 使能CSS功能,优先使用外部晶振,内部时钟源为备用
  11.   
  12.          // HAL_RCC_GetHCLKFreq()/1000    1ms中断一次
  13.         // HAL_RCC_GetHCLKFreq()/100000         10us中断一次
  14.         // HAL_RCC_GetHCLKFreq()/1000000 1us中断一次
  15.   HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);  // 配置并启动系统滴答定时器
  16.   /* 系统滴答定时器时钟源 */
  17.   HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
  18.   /* 系统滴答定时器中断优先级配置 */
  19.   HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
  20. }
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SystemClock_Config是一个函数,用于配置STM32微控制器的系统时钟。它是在STM32 HAL库提供的,用于设置时钟源、时钟分频和时钟倍频等参数。 该函数的具体实现会根据不同的STM32系列微控制器有所区别,但一般情况下,它会通过修改相关寄存器的值来配置系统时钟。 你可以使用该函数来设置系统时钟以满足你的应用需求,例如调整主频、选择外部晶振或内部时钟源等。在使用该函数之前,你需要先初始化相关的时钟源和时钟分频器。 以下是一个示例代码片段,展示了如何使用SystemClock_Config函数来配置系统时钟: ``` /* Includes */ #include "stm32xxxx.h" #include "stm32xxxx_hal_rcc.h" /* Function prototypes */ void SystemClock_Config(void); /* Main function */ int main(void) { /* Configure the system clock */ SystemClock_Config(); /* Rest of your code */ while (1) { /* Your code here */ } } /* System Clock Configuration */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct; RCC_ClkInitTypeDef RCC_ClkInitStruct; /* Configure the main PLL clock source, multiplication factor, and division factors */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL6; RCC_OscInitStruct.PLL.PLLDIV = RCC_PLL_DIV3; HAL_RCC_OscConfig(&RCC_OscInitStruct); /* Configure the clock prescalers, clock source, and clock division factors for each clock */ 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; HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1); } ``` 请注意,上述示例代码的"stm32xxxx"和"xxxx"应该替换为你使用的具体STM32系列型号。在实际使用,你需要根据你的需求和具体的硬件配置来调整SystemClock_Config函数的参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值