stm32时钟选择与配置HSL HSE PLL

发布者:科技革新者最新更新时间:2019-08-24 来源: eefocus关键字:stm32  时钟选择  配置  HSL  HSE  PLL 手机看文章 扫描二维码
随时随地手机看文章

1. stm32时钟源分析

stm32f4有四个时钟源可供选择,分别是:

HSE(外部高速),HSI(内部高速), LSE(外部低速), LSL(内部低速)。


1.1 外部时钟源一般由外挂晶振产生

LSE为32.767KHz晶振输入。

HSE为8MHz或16MHz,实验用的是16MHz


1.2 内部时钟源一般为内部RC震荡电路

LSI 为内部32.767KHz的RC电路

HSI 为内部16MHz的RC电路


2. stm32时钟源配置

 四个时钟源中,只有HSI和HSE能作为整个系统的时钟源,LSI和LSE只作为看门狗,RTC及外部输出的时钟源。

 HSI和HSE频率都不高,所以ARM设计了PLL(锁相环)来进行倍频,把HSI和HSE频率拉高到百兆以上。所以能为整个系统提供时钟源的就多了个PLL的高速时钟源。

 下面来分别讨论这三个时钟源的配置过程。


2.1 stm32高速内部时钟源HSI配置

 HSI时钟是内部时钟源,系统复位后会自动选择这个时钟源,所以复位后,根据时钟图可以看到,system clock和PLL输入时钟都为16MHz。具体代码如下:


void SystemInit(void)

{  

 /* Reset the RCC clock configuration to the default reset state ------------*/

  /* Set HSION bit */

  RCC->CR |= (uint32_t)0x00000001;

  

  /* Reset CFGR register */

  RCC->CFGR = 0x00000000;

  

  /* Reset HSEON, CSSON and PLLON bits */

  RCC->CR &= (uint32_t)0xFEF6FFFF;

  

  /* Reset PLLCFGR register */

  RCC->PLLCFGR = 0x24003010;

  

  /* Reset HSEBYP bit */

  RCC->CR &= (uint32_t)0xFFFBFFFF;

  

  /* Disable all interrupts */

  RCC->CIR = 0x00000000;


/* Configure the Vector Table location add offset address ------------------*/

 SCB->VTOR = FLASH_BASE | 0x00 ; /* Vector Table Relocation in Internal FLASH */


2.2 stm32高速外部时钟源HSE配置

 HSE为外部晶振,需要手动进行配置,系统复位后HSI首先工作,如需使用外部HSE时,要通过寄存器选择,进行切换即可,外部晶振产生的时钟要比内部电路产生的时钟精度高很多,所以一般都会选外部时钟。配置过程如下:


void SystemInit(void)

 {

 /* Reset the RCC clock configuration to the default reset state ------------*/

  RCC->CR  = (uint32_t)0x00000001;  //reset 

  

 RCC->CR  |= (uint32_t)(1<<16);  //open HSE 

 while((RCC->CR & (uint32_t)(1<<17))==0) ;   //wait for HSE work 

 

  SCB->VTOR = FLASH_BASE | (0x00); /* Vector Table Relocation in Internal FLASH */

 }


2.3 stm32高速PLL时钟配置

 高速PLL时钟的设置稍微复杂一点,根据PLL倍频计算公式,首先设置好PLLM,PLLN,PLLQ,经过倍频公式:

PLL_output_clk = PLL_input_clk × (PLLN ÷ PLLM) ÷ PLLQ

就可以获得输出的频率,当然这些参数需在使能PLL前进行设置。


 这里必须要注意一个点:那就是在切换system clock之前,必须配置I-Cache D-Cache以及Latency,否则PLL是设置不成功的。因为system clock由16MHz这样的低速切换到60MHz以上的高速时钟时候,会影响到指令和数据读取总线时序,所以在切换时钟之前必须设置好Latency。具体Latency数值参考下图:


在这里插入图片描述

void SystemInit(void)

 {

 /* Reset the RCC clock configuration to the default reset state ------------*/

 RCC->CR  = (uint32_t)0x00000001;  //reset 

 RCC->CR  |= (uint32_t)(1<<16);  //open HSE 

 while((RCC->CR & (uint32_t)(1<<17))==0) ;   //wait for HSE work 

 

 RCC->PLLCFGR |= (uint32_t)(1<<22); //select HSE as PLL source clock   HSECLK is 16MHz

 

 RCC->PLLCFGR |= (uint32_t)(16<<0);  //select PLLM==16 

 RCC->PLLCFGR |= (uint32_t)(192<<6);  //select PLLN==192   VCOCLK= HSECLK*(PLLN/PLLM)=16*(192/16)=192 

 

 RCC->PLLCFGR |= (uint32_t)(3<<24);  //set PLLQ==3   PLLVOUTCLK = VCOCLK/PLLQ= 192/3 = 64MHz 

 RCC->CR |= (uint32_t)(1<<24);  //open PLL

 while((RCC->CR & (uint32_t)(1<<25))==0) ; //wait for PLL work 

   

 FLASH->ACR |=(9<<1)|(10<<1)|(0<<2); //enable I-Cache  D-Cache and 2 Latency

 

 RCC->CFGR |= (uint32_t)(2<<0);  //select PLL as the system clock

 

 while((RCC->CFGR & (2<<2))==0); //wait the PLL clock

 

 RCC->CFGR |= (uint32_t)(0<<4); //AHB presc is 1  AHBCLK=64MHz

 RCC->CFGR |= (uint32_t)(4<<10); //APB1 presc is 2 APB1CLK=32MHz

 RCC->CFGR |= (uint32_t)(4<<13); //APB2 presc is 2  APB2CLK=32MHz

 

 SCB->VTOR = FLASH_BASE | (0x00); /* Vector Table Relocation in Internal FLASH */

 }


SCB->VTOR表示中断向量表位于flash起始地址出,说明我们boot选择的是从flash启动,如需从ram启动这里需要修改地址,这个内容后续再讨论。


3. 结论

一般情况下,设置HSE为时钟源,并配置启动PLL进行倍频,并将PLL选为system clock的时钟源。这样能达到系统最大性能。


关键字:stm32  时钟选择  配置  HSL  HSE  PLL 引用地址:stm32时钟选择与配置HSL HSE PLL

上一篇:【STM32F103攻城笔记】内部晶振HSI倍频设置系统时钟
下一篇:RCC—使用 HSE HSI 配置时钟树梳理(在STM32平台下)

推荐阅读最新更新时间:2024-11-10 16:00

STM32学习003_STM32F10X的时钟配置
一、在STM32中,有5个时钟源,为HSI,HSE,LSI,LSE,PLL. ①HSI是高速内部时钟,RC振荡器,频率为8MHz; ②HSE--高速外部时钟,可接石英或者陶瓷谐振器,或者外部时钟源,频率范围4MHz--15MHz. ③LSI--低速内部时钟,RC 振荡器,频率为40kHz. ④LSE--低速外部时钟,接频率为32.768KHz的石英晶体。 ⑤PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2,HSE或者HSE/2,倍频可选择为2--16倍,但是其输出频率最大不得超过72MHz. 下图为STM32的时钟树。(图1) 图1 AHB
[单片机]
<font color='red'>STM32</font>学习003_STM32F10X的<font color='red'>时钟</font><font color='red'>配置</font>
基于STM32单片机的RFID和云平台仓库管理系统设计
一.系统设计 通过STM32单片机进行主控,通过RFID检测刷卡状态 ,光电检测模块检测存货区域,检测到的数据通过ESP01S上传到上位机端进行显示。 图1 系统框图 二.硬件设计 本设计所采用的STM32F103C8T6是以Cortex-3为核心的单片机,使用光电模块进行光电检测,用RFID识别感应并解读信息,检测到的数据会通过串口发送到ESP01S,再发送到上位机端进行显示和监控。 图2 硬件电路 三.软件设计 系统在完成系统初始化后就开始通过IC卡感应模块检测存货与取货状态,检测到的信息通过ESP01S通信模块上传,通过光电识别模块检测判断存货区域。其中若检测到取货刷卡且在区域一,则显示区域1货物减1,否则显示区域2
[单片机]
基于<font color='red'>STM32</font>单片机的RFID和云平台仓库管理系统设计
STM32 通用定时器与滴答定时器
STM32 通用定时器与滴答定时器 前言:STM32包括TIM1/TIM8两个高级定时器,TIM2~TIM5四个通用定时器,TIM6/TIM7两个基本定时器,还有使用非常方便的系统滴答定时器(systick),基本操作为:配置(使能时钟/设置工作方式及初值/配置中断/开启中断和时钟/使能定时器) 计数 产生中断。 一、通用定时器使用 void TimerConfig(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; // 使能时钟/复位/自动重装载设置/时钟预分频设置/采样分频/up/清除中断/开启时钟 RCC_APB1PeriphClock
[单片机]
STM32学习笔记-FLASH读写
STM32的FLASH除了可以烧写如程序外,还可以供给用户做存储器,存储参数用,但是要注意的是,FLSAH的擦写次数是有限制的,10万次。 STM32F1系列单片机内核是Cortext-M3系列的,其存储器的映射是按照Cortext-M3的标准设计的,如下图。 从上图可看出最下main的512M是分配给Code 即程序存储区. 其内部分配如下图。 从上图可以看到FLASH的起始地址是:0x0800 0000 到 0x0807 FFFF ,126M的FLASH空间。STM32按页来编程擦写FLASH,如我的 STM32F103RCT6 SRAM为48KB,FLASH有256K. 分页是2Kb一页来设计的,而又的小容量的单
[单片机]
<font color='red'>STM32</font>学习笔记-FLASH读写
STM32开发 -- patch生成和使用
领导给我一个.patch文件,“去打一下patch!” emmmm,有点懵。不是说不知道,其实在linux下有用到过的。 参看:如何制作LINUX的patch文件及如何打patch But,那么该如何通过git命令生成Patch和打Patch?? 开始讲解! 一、啥是patch? 首先你的了解一下什么时候patch? 参看:维基百科 – patch 计算机工具补丁(patch)是一个Unix 程序,它根据单独文件(称为补丁文件)中包含的指令更新文本文件。补丁文件(也称为补丁)是一个由差异列表组成的文本文件,通过运行相关的diff程序并将原始和更新的文件作为参数来生成。使用补丁更新文件通常被称为应用补丁或只是修补文件。
[单片机]
STM32定时器不准确启动时钟的问题
用STM32 F407IG 开发一硬件控制器,需要精准的定时器。我使用了IIM2,可上电启动。有时候准确,有时候开机 定时器,很慢,比如定时500MS 闪烁一次,可能3秒才闪烁一次。源代码如下。 int main(void) { GPIO_Configuration(); TIM_Config(); NVIC_TIM_Config(); while(1) { } } void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(LED1_RCC_AHBPeriph|LED2_RC
[单片机]
STM32 影子寄存器
01、概述 在定时器框图中,有个小细节,有些寄存器下有个阴影 有这些阴影的表示这些寄存器存在影子寄存器。 在图例中也有对影子寄存器的说明: 根据控制位,在发生U事件后,预装载寄存器内容转移到有效寄存器。这也就是对影子寄存器的说明。 有阴影的寄存器(AutoReloadRegister),表示在物理上这个寄存器对应2个寄存器,一个是程序员可以写入或读出的寄存器,称为preloadregister(预装载寄存器),另一个是程序员看不见的、但在操作中真正起作用的寄存器,称为shadowregister(影子寄存器)。 这里有3个寄存器名称 AutoReloadRegister。 preloadregister。 shadowre
[单片机]
<font color='red'>STM32</font> 影子寄存器
GD32如何配置中断优先级分组以及中断优先级
使用GD32 MCU的过程中,大家可能会有以下疑问:中断优先级如何配置和使用? 本文将会为大家解析中断优先级分组以及中断优先级的配置使用: 中断优先级分组配置 一个GD32 MCU系统需要大家明确系统中使用的中断优先级分组,避免中断优先级配置越界导致一些不符合预期的中断现象。 中断优先级分组可采用以下函数接口,其中有4个bit可用于中断优先级分组,如果全用于抢占优先级,则可以配置0-15的优先级,如果2位用于抢占,2位用于次优先级,则抢占优先级可以配置0-3,此优先级可以配置0-3。 注意:如果中断优先级配置为2位抢占和2位此优先级的话,抢占优先级配置为4(二进制为100b),优先级配置越界,实际配置进去的优先级为0,最高
[单片机]
GD32如何<font color='red'>配置</font>中断优先级分组以及中断优先级
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved