对STM32系统时钟和分频的一点理解

发布者:Turquoise最新更新时间:2017-09-09 来源: eefocus关键字:STM32  系统时钟  分频 手机看文章 扫描二维码
随时随地手机看文章

系统时钟和分频

首先来手册里的一段话。

三种不同的时钟源可被用来驱动系统时钟 (SYSCLK)

  • HSI振荡器时钟

  • HSE振荡器时钟

  • PLL时钟

一般用的是PLL时钟,后面有证据。

我们可以通过库函数获取各时钟值

void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks)

在我的系统里,把时钟值打印信息如下:

SYSCLK:0x44aa200          //72000000, 72MHz
HCLK:0x44aa200               //72000000, 72MHz

PCLK1:0x2255100            //36000000, 36MHz
PCLK2:0x44aa200            //72000000, 72MHz
ADCCLK:0x2255100        //36000000,36MHz
RCC->CFGR:0x001D040A            //PLL输出作为系统时钟

可推测几个预分频值为

AHB prescaler = 1

APB1 prescaler = 2

APB2 prescaler = 1

ADC prescaler = 2

根据读取RCC->CFGR寄存器值为:0x001D040A,上面推测完全正确。

CFGR寄存器的SWS段也说明:PLL输出作为系统时钟。

TIM2使用PCLK1,但注意时钟树里有这一段

见附图

已知APB1 prescaler=2,故TIM2CLK = PCLK1*2 = 72MHz.

所以被TIM2分频的时钟大小是72MHz。

我的程序也证明了这点

TIM_TimeBaseInitTypeDef tim2_InitStruct;

TIM_DeInit(TIM2);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//Enable Timer2 clock.
NVIC_ConfigurationForTimer2();

// PCLK1=36MHz, PSC=36000-1, CK_CNT=36MHz/(PSC+1)=1000
// ARR=2000,  1s/1000 * 2000 = 2s.
tim2_InitStruct.TIM_Prescaler = 36000-1;
tim2_InitStruct.TIM_Period = 2000-1;
tim2_InitStruct.TIM_CounterMode = TIM_CounterMode_Up;
tim2_InitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
tim2_InitStruct.TIM_RepetitionCounter = 0;

TIM_TimeBaseInit(TIM2, &tim2_InitStruct);

TIM_ClearFlag(TIM2, TIM_FLAG_Update);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);//Enables the specified TIM interrupts.

这段配置原本以为定时时间是2s,实际只有1s。看了手册才理解原因。

摘自:http://blog.csdn.net/marike1314/article/details/5673522


STM32 RCC复位与时钟配置,我首先忽略掉复位,首先学习时钟配置,复位以后用到再学习

 

STM32有多个时钟源,分别是

 

HSI:上电默认启动,因精度不高所以先不采用,以后如果需要再使用

HSE:外部高速时钟,系统时钟一般采用它,经过PLL倍频作为系统同时钟

LSE:外部低速时钟,一般专门用于RTC,等到RTC模块时再使用

LSI:内部低速时钟,精度不高,一般用于IWDGCLK

 

时钟系统框图如下:

 

 

STM32中各个模块都有自己的时钟,当使用相应的模块时首先记得把此模块时钟开启

 

本次学习使用标准固件库3.3.0

 

好了,看明白上图咱就开始吧:

 

void RCC_Configuration(void)
{
         ErrorStatus HSEStartUpStatus;
         //SystemInit();                                                    //完全可以使用此函数配置,但是为了学习咱先不用
         RCC_DeInit();                                                      //复位RCC模块的寄存器,复位成缺省值
         RCC_HSEConfig(RCC_HSE_ON);                           //开启HSE时钟,咱是用HSE的时钟作为PLL的时钟源
         HSEStartUpStatus = RCC_WaitForHSEStartUp(); //获取HSE启动状态

         if(HSEStartUpStatus == SUCCESS)                      //如果HSE启动成功
        {
                  FLASH_PrefetchBufferCmd(ENABLE);          //开启FLASH的预取功能
                  FLASH_SetLatency(FLASH_Latency_2);      //FLASH延迟2个周期(这里我也不明白,先用吧)
   
                 RCC_HCLKConfig(RCC_SYSCLK_Div1);        //配置HCLK,PCLK2,PCLK1,PLL
                 RCC_PCLK2Config(RCC_HCLK_Div1);
                 RCC_PCLK1Config(RCC_HCLK_Div2);

                 RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
                 RCC_PLLCmd(ENABLE);                              //启动PLL
                 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET)

                 {}                                                              //等待PLL启动完成
                 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);  //配置系统时钟
                 while(RCC_GetSYSCLKSource() !=0x80)          //检查是否将HSE 9倍频后作为系统时钟

                 {} 
         }

}

 设置时钟流程:

1.将RCC寄存器重新设置为默认值        RCC_DeInit

2.打开外部高速时钟晶振HSE              RCC_HSEConfig(RCC_HSE_ON);

3.等待外部高速时钟晶振工作              HSEStartUpStatus = RCC_WaitForHSEStartUp();

4.设置AHB时钟                                RCC_HCLKConfig;

5.设置高速APB2时钟                         RCC_PCLK2Config;

6.设置低速速APB1时钟                      RCC_PCLK1Config

7.设置PLL                                       RCC_PLLConfig

8.打开PLL                                       RCC_PLLCmd(ENABLE);

9.等待PLL工作                      while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) 

10.设置系统时钟                              RCC_SYSCLKConfig

11.判断是否PLL是系统时钟               while(RCC_GetSYSCLKSource() != 0x08)

12.打开要使用的外设时钟                  RCC_APB2PeriphClockCmd()/RCC_APB1PeriphClockCmd()

 

至此我们就将STM32的系统时钟配置好了,系统时钟72MHz,APH 72MHz,APB2 72MHz,APB1 32MHz,USB 48MHz

其他至于ADC什么的先用不管,用到时再设置,本次只是大体先熟悉下STM32的时钟配置流程,便于以后程序的编写


关键字:STM32  系统时钟  分频 引用地址:对STM32系统时钟和分频的一点理解

上一篇:STM32中断优先级分组概念
下一篇:STM32驱动FM24CL16

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

采用STM32 单片机的太阳能LED街灯解决方案
  随着化石类能源的日益减少,以及温室气体的过度排放导致全球变暖问题越来越受到重视,人们一方面在积极开发各类可再生新能源,另一方面也在倡导节能减排的绿色环保技术。太阳能作为取之不尽、用之不竭的清洁能源,成为众多可再生能源的重要代表;而在照明领域,寿命长、节能、安全、绿色环保、色彩丰富、微型化的LED固态照明也已被公认为世界一种节能环保的重要途径。太阳能-LED街灯同时整合了这两者的优势,利用清洁能源以及高效率的LED实现绿色照明。   本文介绍的太阳能-LED街灯方案,能自动检测环境光以控制路灯的工作状态,最大功率点追踪(MPPT)保证最大太阳能电池板效率,恒电流控制LED,并带有蓄电池状态输出以及用户
[电源管理]
采用<font color='red'>STM32</font> 单片机的太阳能LED街灯解决方案
意法半导体的PC版MCU Finder选型工具能在电脑上使用STM32/STM8
横跨多重电子应用领域、全球领先的半导体供应商意法半导体(STMicroelectronics,简称ST;纽约证券交易所代码:STM)发布了其PC版MCU Finder选型工具,方便嵌入式开发人员在ST MCU应用开发所用桌面环境中直接查看STM32和STM8微控制器的关键信息。   沿袭深受欢迎的基于手机端的意法半导体MCU Finder选型工具ST-MCU-FINDER的功能,PC版ST-MCU-FINDER-PC为用户提供便捷的选型工具、自维护文档和ST MCU开发者社区链接通道。新的PC版ST MCU Finder选型工具支持Windows® 、macOS™和Linux® 三大操作系统,让嵌入式开发人员能够在电脑上整合所有的
[半导体设计/制造]
STM32 SPI难点浅析
我用的是战舰STM32开发板,两个知识点,一:是STM32 SPI的原理;二:用STM32自带的SPI对外部flash(W25Q64)的读写。 一:STM32 SPI的原理 先上图: 主模式和从模式:主模式:主设备在SCK脚产生时钟;从模式:SCK引脚用来接收从主设备传来的时钟。 通常SPI通过4个引脚与外部器件相连: 1、MISO:主设备数据输入,从设备数据输出引脚。 2、MOSI:主设备数据输出,从设备数据输入引脚。 3、SCLK:串口时钟,由主设备输出,从设备输入。 4、NSS:从设备选择 这里必须牢记一点:从上图中可以看出,SPI通信是双向的,主机往从机里面写一个数据,他自己同时也能读到
[单片机]
<font color='red'>STM32</font> SPI难点浅析
如何解决STM32芯片Flash写保护的问题
本文介绍了如何解决STM32芯片Flash写保护导致无法下载程序,无法在线调试的问题;如果您遇到相同的问题,希望本文可以带来一些帮助。 1 FLASH的写保护 如果对Flash设置了写保护,那就无法对Flash进行编程和擦除。 在开发STM32的时候,如果出现这种情况,通常仿真器都支持对Flash进行解锁,像jlink,stlink等仿真器都支持这个功能。 2 错误提示 在使用MDK进行调试的时候,出现报错 ==Flash Timeout.Reset Target and try it again==,具体如下图所示; 折腾了一番之后,并没有解决问题,因为使用的仿真器是stlink,因此下载了stlink utilit
[单片机]
如何解决<font color='red'>STM32</font>芯片Flash写保护的问题
STM32 GPIO详解
下文将根据STM32F207参考手的中GPIO框图讲解GPIO功能。 01、I/O接口电路 带FT的是说明可以容忍5V电压的,I/O电路框图 1.1、普通输入 普通输入模式下,上拉和下拉电阻(微弱)的存在,共分3种模式 浮空输入,不使能上拉电阻,不使能下拉电阻 上拉输入,使能上拉电阻 下拉输入,使能下拉电阻 从上面框图得知,输出缓存是被禁止的 1.2、普通输出 普通输入模式下,上拉和下拉电阻(微弱)的存在。主要是由于P-MOS和N-MOS的存在分为下列两种模式 开漏模式:输出寄存器是 0 时,激活 N-MOS, 而输出寄存器是 1 时,端口保持高阻态(P-MOS 不会被使能) 推挽输出: 输出寄存器
[单片机]
<font color='red'>STM32</font> GPIO详解
[STM32/8经验] 经验分享——EEPROM读写及数据管理
经常有人在QQ群讨论有关E2PROM操作、保护、失效等一些问题,今天闲来没事,简单概括总结一下咯。(才疏学浅,路过的英雄记得补刀) 1)有关 芯片 内部自带的E2PROM 有的资深的工程师可能不是很愿意用MCU自带的E2PROM,大概是这些家伙上过什么当、受过骗还是什么的。简单说一下优缺点吧: (1)片内集成的感觉挺便宜的,和MCU一起卖的,对成本要求严格的,写次数很少的场合一般会考虑,至少能省个2、3毛钱吧; (2)缺点的话,可能擦写次数、稳定性没有外挂的专用芯片厉害; 2)有关常用的外挂E2PROM 如果是学生或者刚从学生时代走来的人们,大概也就知道ATMEL 24C0X系列吧,就好像我毕业的时候以为世界
[单片机]
配置STM32的PWM输出时没有波形输出的问题
以前在组织代码的时侯都是在初始化系统时钟时就一并初始化了各个外设,如 端口、定时器、串口等, 今天突发奇想,将各外设的初始化放到各外设的模块中去,这样的话没用到的外设就可以不用给时钟,降低能耗。 就这样问题出现了,PWM输出时没有波形输出。 反复检查对比了定时器的功能模块配置、输出IO的设置、RCC配置等,一直没有找到原因。 在准备放弃的时侯,有一搭没一搭的扫代码,突然一看,在设置输出IO代码之前没有给输出IO配置时钟,是在后配置的。 是不是这里的问题呢, 马上试试,果然。 这一记当头棒喝!! :) 所以, 在配置输出IO之前就要先配置IO时钟,谨记之!
[单片机]
STM32在Keil MDK环境下RAM上代码调试
自从51后就没碰过了Keil了~从昨天下午又开始再次使用Keil MDK~不过这次是for ARM的~前几天的STM32W108调试统统是在IAR上进行的~ 刚在STM32F103ZE-EK上进行了一个例程的调试~就发现原来更有方法在RAM中进行代码调试的配置~以前在IAR中知道有个iar- cfg.icf文件是关于存储分配的~貌似也可以如此~不过没实际操作过不敢下结论~索性就在Keil下来了个尝试~比较坎坷~也学到不少东西~ 废话少说,进入正题~(Keil4下的画面~这个配置的方法跟是3一样~) 步骤与图示: 1.先给个CPU的数据,需要注意的是三个红圈的地方,架构,型号,Flash和SRAM大小~如图1
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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