- STM32F7时钟树概述
- 系统框图
- 简述:STM32系列有5个时钟源,分别为HSI、HSE、LSI、LSE、PLL。
- 高速时钟:HSI、HSE、PLL; 低速时钟:LSE、LSI
- 时钟源用途:
- LSI是低速内部时钟,RC振荡器,频率为32Khz左右,用于IWDG独立看门狗、LPTime低功耗定时器时钟、RTC时钟;
- LSE低速外部时钟,32.768KHz的石英晶体,用于RTC时钟
- HSE高速外部时钟,石英晶体/陶瓷谐振器/外部时钟源,频率范围为4MHz~26MHz,开发板接的是25MHz,软件里面把默认的8Mhz改为25Mhz;
- HSI高速内部时钟,RC振荡器,频率固定为16MHz。可做系统时钟或用作PLL输入;
- PLL锁相环倍频输出 ; 有三个PLL输出
- 主PLL由HSE或者HSI提供两个时钟信号,并具有两个不同的输出时钟;
- 第1个用于系统主时钟,最高频率为216Mhz;
- 第2个用于USB时钟,48MHz;
- 专用PLL(PLLI2S)用于生成精确时钟,在I2S、SAI、SPDIFRX上实现高品质音频性能
- 专用PLL(PLLSAI)用于为SAI接口生成时钟,用于LCD_TFT和可供USB、SDMMC、RNG选择的48Mhz时钟
- 主PLL由HSE或者HSI提供两个时钟信号,并具有两个不同的输出时钟;
- 系统时钟设置:
- 例如:选用外部晶振25Mhz,设置系统频率为216Mhz;分频器M=25; 倍频器倍频系数N=432; 分频器分频系数P=2;公式如下:PLL = 25MHz *N/(M*P) = 216MHz;
- STM32F7时钟初始化配置
- 参阅正点原子:4.8手把手教你入门STM32CubeMX图形配置工具-P143
- 野火STM32:第15章 RCC—使用 HSE/HSI 配置时钟 - P135
- 时钟树解剖
- 系统配置函数SystemClock_Config();
- 外部晶振频率25MHz
- HCLK = SYSCLK=PLLCLK = 216 MHz, PCLK2=HCLK/2 =108 MHz, PCLK1=HCLK/4 = 54
MHz - HSE经过25M分频(VCO时钟必须在1~2MhZ),然后再经过432倍频,再经过2分频得到216MHz系统频率;
- 例程:
-
//时钟设置函数 //Fvco=Fs*(plln/pllm); //Fsys=Fvco/pllp=Fs*(plln/(pllm*pllp)); //Fusb=Fvco/pllq=Fs*(plln/(pllm*pllq)); //Fvco:VCO频率 //Fsys:系统时钟频率 //Fusb:USB,SDIO,RNG等的时钟频率 //Fs:PLL输入时钟频率,可以是HSI,HSE等. //plln:主PLL倍频系数(PLL倍频),取值范围:64~432. //pllm:主PLL和音频PLL分频系数(PLL之前的分频),取值范围:2~63. //pllp:系统时钟的主PLL分频系数(PLL之后的分频),取值范围:2,4,6,8.(仅限这4个值!) //pllq:USB/SDIO/随机数产生器等的主PLL分频系数(PLL之后的分频),取值范围:2~15. //外部晶振为25M的时候,推荐值:plln=432,pllm=25,pllp=2,pllq=9. //得到:Fvco=25*(432/25)=432Mhz // Fsys=432/2=216Mhz // Fusb=432/9=48Mhz //返回值:0,成功;1,失败 void Stm32_Clock_Init(u32 plln,u32 pllm,u32 pllp,u32 pllq) { HAL_StatusTypeDef ret = HAL_OK; RCC_OscInitTypeDef RCC_OscInitStructure; RCC_ClkInitTypeDef RCC_ClkInitStructure; __HAL_RCC_PWR_CLK_ENABLE(); //使能PWR时钟 __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);//设置调压器输出电压级别,以便在器件未以最大频率工作 RCC_OscInitStructure.OscillatorType=RCC_OSCILLATORTYPE_HSE; //时钟源为HSE RCC_OscInitStructure.HSEState=RCC_HSE_ON; //打开HSE RCC_OscInitStructure.PLL.PLLState=RCC_PLL_ON; //打开PLL RCC_OscInitStructure.PLL.PLLSource=RCC_PLLSOURCE_HSE; //PLL时钟源选择HSE RCC_OscInitStructure.PLL.PLLM=pllm; //主PLL和音频PLL分频系数(PLL之前的分频) RCC_OscInitStructure.PLL.PLLN=plln; //主PLL倍频系数(PLL倍频) RCC_OscInitStructure.PLL.PLLP=pllp; //系统时钟的主PLL分频系数(PLL之后的分频) RCC_OscInitStructure.PLL.PLLQ=pllq; //USB/SDIO/随机数产生器等的主PLL分频系数(PLL之后的分频) ret=HAL_RCC_OscConfig(&RCC_OscInitStructure);//初始化 if(ret!=HAL_OK) while(1); ret=HAL_PWREx_EnableOverDrive(); //开启Over-Driver功能 if(ret!=HAL_OK) while(1); //选中PLL作为系统时钟源并且配置HCLK,PCLK1和PCLK2 RCC_ClkInitStructure.ClockType=(RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2); RCC_ClkInitStructure.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK;//设置系统时钟时钟源为PLL RCC_ClkInitStructure.AHBCLKDivider=RCC_SYSCLK_DIV1;//AHB分频系数为1 RCC_ClkInitStructure.APB1CLKDivider=RCC_HCLK_DIV4;//APB1分频系数为4 RCC_ClkInitStructure.APB2CLKDivider=RCC_HCLK_DIV2;//APB2分频系数为2 ret=HAL_RCC_ClockConfig(&RCC_ClkInitStructure,FLASH_LATENCY_7);//同时设置FLASH延时周期为7WS,也就是8个CPU周期。 if(ret!=HAL_OK) while(1); }
-
- 总结:核心系统时钟的设置,如上述所示; 至少其它相应外设的时钟,用到哪个再详细分析;
参考资料:《正点原子STM32F7开发指南-HAL库版本_V1.1 P118》