STM32F103ZET6 时钟(2)—— 代码篇

发布者:lambda21最新更新时间:2021-11-04 来源: eefocus关键字:STM32F103ZET6  时钟  PLL 手机看文章 扫描二维码
随时随地手机看文章

基于特定的开发板上的时钟策略:

倍频/分频系数需要在使能 PLL 之前进行配置,所以需要在 Open PLL 之前将所有系统的时钟分频器系数以及PLL的倍频系数配置好。整个时钟的配置流程如下所示:


(1) 开启HSE,等待HSE稳定 

(2) 设置APB2、APB1、AHB分频系数 

(3) 设置PLL的时钟来源和PLL的倍频系数 

(4) 开启PLL,等待PLL稳定 


(5) 设置SYSCLK源为 PLL 的输出,读取时钟切换状态,确保PLLCLK被选为系统时钟


(1)  OSC_IN/OSC_OUT 上外接 8M 晶振。要使用外接晶振,上电后(默认使用 8M 的HSI),首先需要使能 HSE,位于RCC_CR寄存器的 bit16,即:


  /* Enable HSE */    

  RCC->CR |= ((uint32_t)RCC_CR_HSEON);

接着需要等待外部时钟 HSE 稳定(轮询 RCC_CR寄存器的 bit17):


  /* Wait till HSE is ready and if Time out is reached exit */

  do

  {

    HSEStatus = RCC->CR & RCC_CR_HSERDY;

    StartUpCounter++;  

  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));

(2)  接着配置 AHB 时钟为 SYSCLK ,即 AHB 分频系数为1,不分频,SYSCLK直接供给SDIO, FSMC, AHB BUS, FCLK并直接作用于APB1/APB2的输入端:


    /* HCLK = SYSCLK */

    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;

配置高速APB2 分频系数为1,即 SYSCLK ->AHB->APB2:


    /* PCLK2 = HCLK */

    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;

由于APB1的时钟最大频率为 36MHz,当前希望输入的SYSCLK为72MHz(最大频率),故需要配置低速 APB1 分频系数为2,即两分频:


    /* PCLK1 = HCLK */

    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;

(3) 继续,配置 PLL 时钟源,以及 PLL 的倍频系数:


首先将需要配置的 bit 先清零:


    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));

接着


A. 选择HSE 时钟为 PLL 的输入 ,RCC_CFGR 的 bit16. 


B. 对HSE输入晶振频率不分频,直接供给 PLL 作为输入


C. 由于外部晶振时钟为 8M,得到 72MHz 最大时钟频率,故设置 PLL 倍频系数为 9:


   RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);

至此,分频/倍频系数基本设置完毕(未设置的部分采取系统 Reset 后的默认值)


(4)  开启 PLL 并等待稳定


    /* Enable PLL */

    RCC->CR |= RCC_CR_PLLON;

 

    /* Wait till PLL is ready */

    while((RCC->CR & RCC_CR_PLLRDY) == 0)

    {

    }

(5) 切换系统时钟源为 PLL 的输出:


    /* Select PLL as system clock source */

    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));

    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;    

轮询等待生效:


    /* Wait till PLL is used as system clock source */

    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)

    {

    }


至此时钟配置完毕,本次配置是基于板载外接 8MHz 晶振进行的配置,若是板载其他的频率的晶振,只需改变 PLL 的倍频系数即可,此刻,系统运行在最大支持频率 72MHz 下。


完整的代码如下:


static void SetSysClockTo72(void)

{

  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;

  

  /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/    

  /* Enable HSE */    

  RCC->CR |= ((uint32_t)RCC_CR_HSEON);

 

  /* Wait till HSE is ready and if Time out is reached exit */

  do

  {

    HSEStatus = RCC->CR & RCC_CR_HSERDY;

    StartUpCounter++;  

  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));

 

  if ((RCC->CR & RCC_CR_HSERDY) != RESET)

  {

    HSEStatus = (uint32_t)0x01;

  }

  else

  {

    HSEStatus = (uint32_t)0x00;

  }  

 

  if (HSEStatus == (uint32_t)0x01)

  {

    /* Enable Prefetch Buffer */

    FLASH->ACR |= FLASH_ACR_PRFTBE;

 

    /* Flash 2 wait state */

    FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);

    FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;    

 

 

    /* HCLK = SYSCLK */

    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;

      

    /* PCLK2 = HCLK */

    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;

    

    /* PCLK1 = HCLK */

    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;

 

 

    /*  PLL configuration: PLLCLK = HSE * 9 = 72 MHz */

    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |

                                        RCC_CFGR_PLLMULL));

    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);

 

    /* Enable PLL */

    RCC->CR |= RCC_CR_PLLON;

 

    /* Wait till PLL is ready */

    while((RCC->CR & RCC_CR_PLLRDY) == 0)

    {

    }

    

    /* Select PLL as system clock source */

    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));

    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;    

 

    /* Wait till PLL is used as system clock source */

    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)

    {

    }

  }

  else

  { /* If HSE fails to start-up, the application will have wrong clock 

         configuration. User can add here some code to deal with this error */

  }

}

关键字:STM32F103ZET6  时钟  PLL 引用地址:STM32F103ZET6 时钟(2)—— 代码篇

上一篇:STM32F103ZET6 —— GPIO
下一篇:STM32F103ZET6 启动模式

推荐阅读最新更新时间:2024-11-16 22:27

Part7-时钟初始化_lesson1
1、概念解析 1.1时钟脉冲信号 1.2时钟脉冲频率 1.3时钟源(提供时钟脉冲信号) a、晶振 b、锁相环PLL 2、时钟体系 2440: 晶振的频率、时钟体系有多少个PLL、这些PLL分别产生了哪些时钟、产生的时钟用来做什么的。 采用的是12MHZ,总共有2个PLL分别是MPLL、UPLL,MPLL产生了FCLK、HCLK、PCLK,UPLL产生了UCLK。 6410: 12MHZ晶振,有三个PLL:APLL(产生ARMCLK)、MPLL(产生HCLK、PCLK)、EPLL(产生SCLK); 3、思维导图设计 1)、时钟初始化流程图 2440与6410: 一上电cpu以晶振频率运行,所
[单片机]
Part7-<font color='red'>时钟</font>初始化_lesson1
MSP430F5438A的时钟系统
现在在做的温控部分算法,需要每隔0.25s采集一次温度数据,然后计算出相应的控制量,并以PWM的形式输出。为了实现这个功能,时钟系统是不可或缺的,现就MSP430F5438A的时钟系统进行研究。 MSP430F5438A 里面有三个计时器,如下图所示 这三个计时器为TA0,TA1,TB0。TA0有5个capture/compare 寄存器, TA1有3个, TB0 有7个。 TA0 is a 16-bit timer/counter (Timer_A type) with five capture/compare registers. It can support multiple capture/compares, PW
[单片机]
2440test的时钟调整
代码: key = 14; mpll_val = (92 12)|(1 4)|(1); ChangeMPllValue((mpll_val 12)&0xff, (mpll_val 4)&0x3f, mpll_val&3); ChangeClockDivider(key, 12); cal_cpu_bus_clk(); void ChangeMPllValue(int mdiv,int pdiv,int sdiv) { rMPLLCON = (mdiv 12) | (pdiv 4) | sdiv; } void ChangeClockDivider(int hdivn_val,int pdivn
[单片机]
STM8S使用外部时钟引起串口数据传输错误
最近有个小东西用到STM8S来驱动,之前用STM8S使用的是内部自带的16MHz RC时钟,尚未尝试过使用外部晶振作为主时钟。今天记录一下使用外部晶振时遇到的一个问题。 老规矩,在进行程序设计时,首先初始化时钟,本次使用的是STM8S103F3P6芯片,8MHz的外部晶振,为了方便内外部时钟切换,结合资料写了两个切换函数 /*********************************************** *描述:采用内部16MHz的RC时钟为主时钟 * 初始化时钟为1分频 16M,无外部晶振 *版本:V1.0 *作者: *********************************************
[单片机]
单片机时钟的解析
时钟周期 时钟周期也称为振荡周期,定义为时钟脉冲的倒数(时钟周期就是单片机外接晶振的倒数,例如12M的晶振,它的时钟周期就是1/12us),是计算机中的最基本的、最小的时间单位。 在一个时钟周期内,CPU仅完成一个最基本的动作。时钟脉冲是计算机的基本工作脉冲,控制着计算机的工作节奏。时钟频率越高,工作速度就越快。 8051单片机把一个时钟周期定义为一个节拍(用P表示),二个节拍定义为一个状态周期(用S表示)。 机器周期 计算机中,常把一条指令的执行过程划分为若干个阶段,每一个阶段完成一项工作。每一项工作称为一个基本操作,完成一个基本操作所需要的时间称为机器周期。8051系列单片机的一个机器周
[单片机]
单片机<font color='red'>时钟</font>的解析
STM32-(16):Systick 系统时钟
Systick的两大作用: 1、可以产生精确延时(原先的Delay只是盲等) 2、可以提供给操作系统一个单独的心跳(时钟)节拍 通常实现Delay(N)函数的方法为: for(i = 0; i = x; i ++); x…对应于对应于N毫秒的循环值 对于STM32系列微处理器来说,执行一条指令只有几十个 ns,进行for循环时,要实现N毫秒的x值非常大,而且由于系 统频率的宽广,很难计算出延时N毫秒的精确值。针对STM32 微处理器,需要重新设计一个新的方法去实现该功能,以实现在 程序中使用Delay(N)。 Cortex-M3的内核中包含一个SysTick时钟。SysTick为一个24 位递减计数器,SysTick设定初值并使能
[单片机]
STM32-(16):Systick 系统<font color='red'>时钟</font>
电脑主机板上时钟电路设计
所有的数字电路都需要依靠时钟信号来使组件的运作同步,每单位时间内电路可运作的次数取决于时钟的频率,因此时钟运作的频率即被大家视为系统运作的性能指针。 主机板时钟电路的需求 --- 熟悉硬件的读者应该都知道,主机板上处理器、芯片组和主存储器等几个主要的组件各有其工作时钟,中央处理器CPU的外部频率依照摩尔定律不断提高,随着英特尔与AMD在近期推出多款新的处理器,200MHz外频的时代也正式来临(CPU上标示的工作速度为处理器内频,是以外频乘以倍频产生,并不由主机板时钟电路直接提供)。处理器和北桥芯片之间以前端总线(FSB)相连接,以CPU的外频为基准,每周期传送两次或四次数据,所以200MHz外频乘上四倍频就可以得到800MHz的
[工业控制]
51单片机入门——(新)简易数字时钟
设计要求 实现正确稳定地显示小时(两位数)、分钟(两位数)、秒钟(两位数),同时数码管应无闪烁问题。 通过按键分别实现时、分信息的调整,方便用户对时间的校准。 加入闹铃功能在(本设计中用LED代替)。 原理图 按键部分介绍 key1用于切换时分秒的加减。例:第一次按下后,按key2key3时“秒”加减,第二次按下后,按key2key3时“分”加减,第三次按下后,按key2key3时“时”加减,第四次按下后,按key2key3不起作用,依次循环。 key2用于加。 key3用于减。 key4用于切换时间显示和闹钟显示切换。 代码解析 mian.c #include reg52.h #includ
[单片机]
51单片机入门——(新)简易数字<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