STM32F103ZET6 时钟(2)—— 代码篇

发布者:心灵捕手最新更新时间:2018-08-17 来源: eefocus关键字:STM32F103ZET6  时钟 手机看文章 扫描二维码
随时随地手机看文章

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


倍频/分频系数需要在使能 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  时钟 引用地址:STM32F103ZET6 时钟(2)—— 代码篇

上一篇:KEIL 5下载程序到STM32F103ZET6芯片时的相关设置
下一篇:STM32F103 Flash操作代码解析

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

DDR测试系列之三—— 某SDRAM时钟分析案例
前个周末接到了一个朋友的电话,询问我如果内存有问题,需要测试哪些项目?对于这个很常见的问题,我习惯性的回答他先测量内存时钟和读写时序看看,然后结束了通话。没过一会,我那朋友又打过来,告诉我他遇到一个怪事,他用探头点测内存时钟时,系统的程序不卡了,可以顺利启动并运行。听到这个描述,我顿时感兴趣了,开始仔细询问待测试的电路和测试仪器。 待测试的电路板的内存控制器为A公司的ARM架构的MCU,内存为Micron的SDRAM,内存时钟频率为100MHz,测试仪器为某200M带宽示波器,探头为示波器标配的无源探头。在以往的探头培训中,我曾多次给客户讲探头的重要性,在我的幻灯片中有以下几句话: 在把探头连接到电路上时,可能会发生下面三种情况
[测试测量]
DDR测试系列之三—— 某SDRAM<font color='red'>时钟</font>分析案例
msp430如何设置时钟及ad模块学习
  时钟就像是单片机的脉搏,没有时钟单片机是无法工作的,还有其他一些模块也是需要      三个时钟输出:   辅助时钟ACLK(AuxillaryClock):由软件选择来自VLOCK、LFXT1CLK之一经过   1,2,4,8分频之后得到,为外围模块提供时钟源。   主系统时钟MCLK(MainSystemClock):由软件选择来自VLOCK、LFXT1CLK和   DCOCLK之一经过1,2,4,8分频之后得到,为CPU和系统提供时钟。   子系统时钟SMCLK(SubSystemClock):和MCLK一样由软件选择来自VLOCK、   LFXT1CLK和DCOCLK之一经过1,2,4,8分频之后得到,为外围各
[单片机]
msp430如何设置<font color='red'>时钟</font>及ad模块学习
STM32F103单片机系统时钟部分归纳
STM32F103系列增强型微控制器 ——时钟控制(RCC) 三种不同的时钟源可用作系统时钟(SYSCLOCK): HIS振荡器时钟(由芯片内部RC振荡器提供) HSE振荡器时钟(由芯片外部晶体振荡器提供) PLL时钟(通过倍频HIS或HSE振荡器倍频得到) 另外还有两个时钟源: LSI内部40kHz低速RC振荡器时钟,用于驱动独立看门狗或选择驱动RTC LSE外部32.768kHz低速外部输入时钟,用于驱动RTC 时钟模块框图如下: 图1 时钟树框图 1.当HSI被用于作为PLL时钟的输入时,系统时钟能得到的最大频率是64MHz。 2.用户可通过多个 预分频器 配置
[单片机]
STM32F103单片机系统<font color='red'>时钟</font>部分归纳
如何改善高速ADC时钟信号
您在使用一个高速模数转换器(ADC)时,总是期望性能能够达到产品说明书载明的信噪比(SNR)值,这是很正常的事情。您在测试ADC的SNR时,您可能会连接一个低抖动时钟器件到转换器的时钟输入引脚,并施加一个适度低噪的输入信号。如果您并未从您的转换器获得SNR产品说明书标称性能,则说明存在一些噪声误差源。如果您确信您拥有低噪声输入信号和一种较好的布局,则您的输入信号频率以及来自您时钟器件抖动的组合可能就是问题所在。您会发现“低抖动”时钟器件适合于大多数ADC应用。但是,如果ADC的输入频率信号和转换器的SNR较高,则您可能就需要改善您的时钟电路。 低抖动时钟器件充其量有宣称的1微微秒抖动规范,或者您也可以从一个FPGA生成同样较差的
[电源管理]
如何改善高速ADC<font color='red'>时钟</font>信号
STM32学习笔记--------时钟体系
stm32的时钟体系参考(转自正点原子,仅用于学习交流): 一、时钟是什么? 时钟:给单片机提供一个时钟信号(某个频率),协调单片机内部组件同步工作,实现与外部设备通信的同步。(串口的波特率同步)相当于我们的心脏,是核心的部分。 二、时钟源 STM32103的5个时钟源 HSE 高速外部时钟 RC振荡器 频率为8MHz HSI 高速内部时钟 外接时钟4MHz~16MHz LSI 低速内部时钟 RC振荡器频率为40KHz 供WDG看门狗 LSE 低速外部时钟 32.768MHz 供给RTC PLL 锁相环倍频输出(范围2~16倍)最大不超过72MHz 系统时钟来源SYSCLK HSI HSE PLL 时钟
[单片机]
STM32学习笔记--------<font color='red'>时钟</font>体系
μC/OS-II在LPC213X上的多种移植方案
μC/OS-II是可移植、适用于对安全性要求苛刻的剥夺型实时多任务嵌入式系统,简单易学,在工程应用和嵌入式系统教学中很受欢迎。LPC213X是Philips公司推出的基于ARM7TDMI-S核的32位RISC微处理器,也适合于ARM学习开发平台和工程应用。 1 与μC/OS-II移植工作相关的主要特性 ARM体系结构分为7种运行模式,ARM和Thumb两种工作状态。LPC213X的编程模型就是标准的ARM7体系结构;同时LPC213X也具备ARM的标准异常模式IRQ和FIQ。稍具特色的是其VIC向量中断控制器。分别对IRQ、FIQ、非向量中断和软件中断进行了分类,具有对32个中断输入的可编程分配机制。这对于μC/OS-II的移植
[嵌入式]
STM32F107的时钟设置由25M修改成8M
1.首先找到stm32f10x.h, system_stm32f10x.c这两个文件; 2. system_stm32f10x.c修改 #if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) #define SYSCLK_FREQ_HSE HSE_Value /*#define SYSCLK_FREQ_24MHz 24000000 */ #else /* #define SYSCLK_FREQ_HSE HSE_Value */ /* #define SYSCLK_FREQ_24MHz 24000000 */ /* #define SYSCLK_FREQ_36MHz
[单片机]
STM32 HAL 库学习笔记之-------(系统时钟配置)
使用CubeMX工具,让开发者不用理会底层的实现,是整个配置变简单 一、准备工具STM32_CubeMX ST官网可下载 http://www.st.com/content/st_com/en/search.html#q=cubemx-t=tools-page=1 二、打开STM32_CubeMX开始配置,使用内部RC,最大倍频至64MHZ,芯片大于64MHZ,应该选择HSE 已STM32F103为例子 HSI配置 HSE配置 三、以下是STM32F103 HES 72MHZ配置例子: 工具生成基本直接可以使用,需要注意是,外部晶振源,有8khz(默认),12khz,可以在System_stm32f1xx.h修改
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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