STM32基于官方库函数的时钟配置

发布者:MysticalGarden最新更新时间:2017-11-07 来源: eefocus关键字:STM32  官方库函数  时钟配置 手机看文章 扫描二维码
随时随地手机看文章

stm32可选的时钟源

在STM32中,可以用内部时钟,也可以用外部时钟,在要求进度高的应用场合最好用外部晶体震荡器,内部时钟存在一定的精度误差。

准确的来说有4个时钟源可以选分别是HSI、LSI、HSE、LSE(即内部高速,内部低速,外部高速,外部低速),高速时钟主要用于系统内核和总线上的外设时钟。低速时钟主要用于独立看门狗IWDG、实时时钟RTC。

①、HSI是高速内部时钟,RC振荡器,频率为8MHz,上电后默认的系统时时钟 SYSCLK = 8MHz,Flash编程时钟。

①、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。

③、LSI是低速内部时钟,RC振荡器,频率为40kHz,可用于独立看门狗IWDG、实时时钟RTC。

④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。

 

系统时钟SYSCLK输入

这里重点在高速时钟,因为大部分外设时钟都是用的高速时钟。系统内核和外设时钟的时钟只有一个源,那就是SYSCLK,即常说的系统时钟,他是有一个选择器SW来做选择的,有3种选择HSI、HSE和PLL,上电后默认选择内部HSI, HSI虽然存在精度误差,但是能保证不会挂。这点比AVR单片机做的好一些,AVR单片机时钟一旦配置成外部的,如果外部时钟正常那时无法下载程序的。PLL为锁相环倍频输出,PLL时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,其输出频率最大不得超过72MHz, 也有网有超频工作的,但不提倡。

也就是说系统时钟SYSCLK最终有以下几种选择:

①、SYSCLK = HSI

①、SYSCLK = HSE

③、SYSCLK = PLL

 

STM32基于官方库函数的时钟配置(整理总结)



关于PLL锁相环倍频(输入和输出):

将输入时钟乘以一个系数后输出时钟,可以百度PLL原理。

PLL的输入3种选择:

①、PLLi =  HSI /2

①、PLLi =  HSE /2

③、PLLi =  HSE

PLL的输出有15种选择: PLLout = PLLi Xn (n = 2…16)

STM32基于官方库函数的时钟配置(整理总结)



关于USB时钟

STM32中有一个全速功能的USB模块,其串行接口引擎需要一个频率为48MHz的时钟源。该时钟源只能从PLL输出端获取(唯一的),,可以选择为1.5分频或者1分频,也就是,当需要使用USB模块时,PLL必须使能,并且时钟频率配置为48MHz或72MHz。

 

STM32基于官方库函数的时钟配置(整理总结)



关于把时钟信号输出到外部

另外,STM32还可以选择一个时钟信号输出到MCO脚(PA8)上,可以选择为PLL输出的2分频、HSI、HSE、或者系统时钟。

STM32基于官方库函数的时钟配置(整理总结)



关于系统时钟SYSCLK分配

系统时钟SYSCLK,它是供STM32中绝大部分部件工作的时钟源。系统时钟可选择为PLL输出、HSI(8MHz)或者HSE(外部晶振)。系统时钟最大频率为72MHz,供给I2S音频总线和AHB总线时钟。

STM32基于官方库函数的时钟配置(整理总结)



它通过AHB分频器分频后送给各模块使用,AHB分频器可选择1、2、4、8、16、64、128、256、512分频。其中AHB分频器输出的时钟送给5大模块使用:

①、内核总线:送给AHB总线、内核、内存和DMA使用的HCLK时钟。

②、Tick定时器:通过8分频后送给Cortex的系统定时器时钟。

③、I2S总线:直接送给Cortex的空闲运行时钟FCLK。

④、APB1外设:送给APB1分频器。APB1分频器可选择1、2、4、8、16分频,其输出一路供APB1外设使用(PCLK1,最大频率36MHz),另一路送给定时器(Timer)2、3、4倍频器使用。该倍频器可选择1或者2倍频,时钟输出供定时器2、3、4使用。

⑤、APB2外设:送给APB2分频器。APB2分频器可选择1、2、4、8、16分频,其输出一路供APB2外设使用(PCLK2,最大频率72MHz),另一路送给定时器(Timer)1倍频器使用。该倍频器可选择1或者2倍频,时钟输出供定时器1使用。另外,APB2分频器还有一路输出供ADC分频器使用,分频后送给ADC模块使用。ADC分频器可选择为2、4、6、8分频。

在以上的时钟输出中,有很多是带使能控制的,例如AHB总线时钟、内核时钟、各种APB1外设、APB2外设等等。当需要使用某模块时,记得一定要先使能对应的时钟。

需要注意的是定时器的倍频器,当APB的分频为1时,它的倍频值为1,否则它的倍频值就为2。

连接在APB1(低速外设)上的设备有:电源接口、备份接口、CAN、USB、I2C1、I2C2、UART2、UART3、SPI2、窗口看门狗、Timer2、Timer3、Timer4。注意USB模块虽然需要一个单独的48MHz时钟信号,但它应该不是供USB模块工作的时钟,而只是提供给串行接口引擎(SIE)使用的时钟。USB模块工作的时钟应该是由APB1提供的。

连接在APB2(高速外设)上的设备有:UART1、SPI1、Timer1、ADC1、ADC2、所有普通IO口(PA~PE)、第二功能IO口。

对于单片机系统来说,CPU和总线以及外设的时钟设置是非常重要的,因为没有时钟就没有时序。

由于时钟是一个由内而外的东西,具体设置要从寄存器开始。
RCC 寄存器结构,RCC_TypeDeff,在文件“stm32f10x.h”中定义如下: (v3.4库)

1059行->1081行。

  1. typedef struct

  2. {

  3.   __IO uint32_t CR;

  4.   __IO uint32_t CFGR;

  5.   __IO uint32_t CIR;

  6.   __IO uint32_t APB2RSTR;

  7.   __IO uint32_t APB1RSTR;

  8.   __IO uint32_t AHBENR;

  9.   __IO uint32_t APB2ENR;

  10.   __IO uint32_t APB1ENR;

  11.   __IO uint32_t BDCR;

  12.   __IO uint32_t CSR;

  13.  

  14. #ifdef STM32F10X_CL

  15.   __IO uint32_t AHBRSTR;

  16.   __IO uint32_t CFGR2;

  17. #endif

  18.  

  19. #if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL)

  20.   uint32_t RESERVED0;

  21.   __IO uint32_t CFGR2;

  22. #endif

  23. } RCC_TypeDef;

一般板子上只有8Mhz的晶振,而增强型最高工作频率为72Mhz,显然需要用PLL倍频9倍,这些设置都需要在初始化阶段完成。

 

 

 

使用外部高速HSE时钟,程序设置时钟参数流程: 
     1、将RCC寄存器重新设置为默认值      RCC_DeInit;
     2、打开外部高速时钟晶振HSE           RCC_HSEConfig(RCC_HSE_ON);
     3、等待外部高速时钟晶振工作           HSEStartUpStatus = RCC_WaitForHSEStartUp();
     4、设置AHB时钟                          RCC_HCLKConfig;
     5、设置高速AHB时钟                      RCC_PCLK2Config;
     6、设置低速速AHB时钟                   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()

为了方便说明,借用一下例程的RCC设置函数,并用中文注释的形式加以说明:

static void RCC_Config(void)

{

   RCC_DeInit();

   RCC_HSEConfig(RCC_HSE_ON);

   HSEStartUpStatus = RCC_WaitForHSEStartUp();

   if (HSEStartUpStatus == SUCCESS)

   {

       FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

       FLASH_SetLatency(FLASH_Latency_2);

       RCC_HCLKConfig(RCC_SYSCLK_Div1);

       RCC_PCLK2Config(RCC_HCLK_Div1);

       RCC_PCLK1Config(RCC_HCLK_Div2);

       RCC_ADCCLKConfig(RCC_PCLK2_Div6);

       //这句很关键

       RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

       RCC_PLLCmd(ENABLE);

       while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) ;

       RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

       while (RCC_GetSYSCLKSource() != 0x08);

   }

      //使能外围接口总线时钟,注意各外设的隶属情况,不同芯片的分配不同,到时候查手册就可以

      RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);

      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE |

      RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG |

      RCC_APB2Periph_AFIO, ENABLE);

}




 

使用内部高速HSI时钟,程序设置时钟参数流程: 
     1、将RCC寄存器重新设置为默认值      RCC_DeInit;
     2、设置AHB时钟                                 RCC_HCLKConfig;
     3、设置高速AHB时钟                          RCC_PCLK2Config;
     4、设置低速速AHB时钟                       RCC_PCLK1Config;
     5、设置PLL选择时钟源和倍频数           RCC_PLLConfig(RCC_PLLSource_HSI_Div2, 倍频数); 

     6、打开PLL                                           RCC_PLLCmd(ENABLE);
     7、等待PLL工作                                    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
     8、设置系统时钟                                   RCC_SYSCLKConfig;
     9、判断是否PLL是系统时钟                   while(RCC_GetSYSCLKSource() != 0x08)
   10、打开要使用的外设时钟                     RCC_APB2PeriphClockCmd()/RCC_APB1PeriphClockCmd()

 

PLL的设定需要在使能之前,一旦PLL使能后参数不可更改。

在STM32中,连接在APB1(低速外设)上的设备有:电源接口、备份接口、CAN、USB、I2C1、I2C2、UART2、UART3、SPI2、窗口看门狗、Timer2、Timer3、Timer4 。

连接在APB2(高速外设)上的设备有:GPIO_A-E、USART1、ADC1、ADC2、ADC3、TIM1、TIM8、SPI1、ALL。

程序举例:

APB1(低速外设)

RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE);

APB2(高速外设)

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA  , ENABLE);
STM32和其它单片机相比时钟更为复杂,就是为了灵活配置,降低功耗,不用的外设可以关闭时钟,看似复杂但是,打开时钟树一看,就是几个根的选择,和几个枝叶的选择。

 

STM32基于官方库函数的时钟配置(整理总结)

STM32基于官方库函数的时钟配置(整理总结)


关键字:STM32  官方库函数  时钟配置 引用地址:STM32基于官方库函数的时钟配置

上一篇:STM32中VDDA为什么也要接电源才能烧录程序?
下一篇:STM32学习之Flash(主存储块、系统存储器和选项字节)详解

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

STM32上的外部中断
今天记录一下关于外部中断的知识点以及在32上外部中断的相关寄存器以及配置的流程。 一、原理介绍 首先,什么是中断 中断就是将正在做的事情停下来,先去完成另外一件事情,完成后继续回来做这件事。 比如:在吃饭的时候有电话打来,去接电话,打完电话后继续吃法。 在计算机科学中,中断(英语:Interrupt)是指处理器接收到来自硬件或软件的信号,提示发生了某个事件,应该被注意,这种情况就称为中断。 通常,在接收到来自外围硬件(相对于中央处理器和内存)的异步信号,或来自软件的同步信号之后,处理器将会进行相应的硬件/软件处理。发出这样的信号称为进行中断请求(interru
[单片机]
<font color='red'>STM32</font>上的外部中断
STM32学习日志——ADC实验
一、ADC简介: STM32有1~3个ADC,我使用的STM32F103ZET6有3个ADC,是12位逼近的数字模拟转换器,它有18个通道,包括16个外部通道和2个内部信号源。每个ADC有4种模式:单次、连续、扫描、间断。存储方式分为左对齐或右对齐,一般选择右对齐。ADC将转换分为两个通道组:规则通道与注入通道,规则通道相当于正常执行的程序,注入通道相当于中断。规则通道最多包含16个,注入通道最多位4个。 本次介绍仅介绍规则通道的单次转换, 二、软件配置: 1)开启PA口的时钟和ADC1的时钟,设置PA1为模拟输入; 2)复位ADC1,同时设置分频因子;要保证ADC的时钟不超过14MHZ,否则可能不准,而APB2的时钟为7
[单片机]
<font color='red'>STM32</font>学习日志——ADC实验
STM32驱动FLASH(W25Q128)
1、W25Q128 是华邦公司推出的一款 SPI 接口的 NOR Flash 芯片,其存储空间为 128Mbit,相当于 16M 字节。 W25Q128 可以支持 SPI 的模式 0 和模式 3,也就是 CPOL=0/CPHA=0 和CPOL=1/CPHA=1 这两种模式。 2、写入数据时,需要注意以下两个重要问题: ①、Flash 写入数据时和 EEPROM 类似,不能跨页写入,一次最多写入一页,W25Q128的一页是 256 字节。 写入数据一旦跨页,必须在写满上一页的时候,等待 Flash 将数据从缓存搬移到非易失区,重新再次往里写。 ②、Flash 有一个特点,就是可以将 1 写成 0,但是不能将 0 写成 1,要想将 0
[单片机]
<font color='red'>STM32</font>驱动FLASH(W25Q128)
stm32蜂鸣器实验
硬件连接: 提示:不能通过IO口直接驱动大功率器件 实验步骤: 使能IO口时钟。调用RCC_APB2PeriphColckCmd(); 初始化IO口模式。调用函数BEEP_Init(); 操作IO口,输出高低电平。 代码: beep.h: #ifndef __BEEP_H #define __BEEP_H #include sys.h //蜂鸣器端口定义 #define BEEP PBout(8) // BEEP映射到PB8,蜂鸣器接口 void BEEP_Init(void); //初始化 #endif beep.c: include beep.h //初始化PB8为输出口.
[单片机]
<font color='red'>stm32</font>蜂鸣器实验
基于STM32设计的数显热水器
一、项目介绍 当前介绍的项目是基于 STM32F103ZET6 系列 MCU 设计的数显热水器,通过显示屏来显示热水器的温度及其工作状态,通过 PT100 传感器来检测热水器的温度变化,并通过电加热片实现加热过程,以达到控制热水器温度的目的。 二、设计流程 2.1 硬件选型 STM32F103ZET6 系列 MCU OLED 显示屏 PT100 温度传感器 电加热片 继电器 2.2 软件设计 (1)显示屏 使用 OLED 显示屏来显示热水器的温度及其工作状态,通过 SPI 接口与 STM32 芯片进行通讯。设计温度值及其单位、热水器工作状态等。 (2)温度传感器 使用 PT100 温度传感器来检测热水器内部温度
[单片机]
STM32】19,TCP/IP W5500作为服务器
1,PC配置如下,防火墙已经关闭。W5500作为server,上位机作为client TCP/IP 2,UDP 本地端口号不能写成5000,不然UDP连接不成功;5000之外的任意数字都可以; 目标主机必须是 192.168.1.88,端口号必须是5000,不然通信会没有接收显示 用串口调试助手联合调试 3,DHCP获取IP失败解决方法 失败的原因是我把网线连接到电脑上, 电脑没有DHCP服务,没办法用直连方法动态获取IP的,只能用静态IP 连接到路由器之后,瞬间成功 4,DNS解析失败解决方法,W5500无法连接外部互联网 这个问题困扰我几个小时了,总算解决了 首先,在野火
[单片机]
【<font color='red'>STM32</font>】19,TCP/IP W5500作为服务器
STM32 UART DMA实现未知数据长度接收
串口通信是经常使用到的功能,在STM32中UART具有DMA功能,并且收发都可以使用DMA,使用DMA发送基本上大家不会遇到什么问题,因为发送的时候会告知DMA发送的数据长度,DMA按照发送的长度直接发送就OK了,但是使用DMA接收时候就不同了,因为有时候数据接收并不是每一次都是定长的,但是DMA只在接收数据长度和设定数据长度相同的时候才可以触发中断,告诉MCU数据接收完毕,针对这个问题,解决方法如下,有一点复杂,但是很管用。 UART在传输一个字节的时候,首先拉低,传输起始位,然后在是LSB MSB,最后是停止位,停止位是高电平 超时时间 搞过串口通信的都知道,如果串口有协议,一般都是有个超时时间的,超时时间是定义两个帧之间的间
[单片机]
大神教你如何快速使用DMA处理ADC
ADC: 1.STM32内部的ADC模块有三个ADC1,ADC2,ADC3,他们彼此独立,所以可以进行同步采样。 2ADC的输入时钟不得超过14MHz,它是由PCLK2经分频产生,要在RCC_CFGR配置,再ADC自己的寄存器中在没有时钟分频的配置位。 3.ADC转换时间: STM32F103xx增强型产,时钟为56MHz时为1μ s( 时钟为72MHz为1.17 μ s) 4.ADC的转换精度默认设置为12位,输入范围:ADC输入范围:V REF-≤ VIN≤ VREF+ 5.共有18个通道,其中外部16个通道,内部两个通道,内部温度传感器连接在ADC1_IN16,内部参考电压V REFINT连接在ADC1_IN17 6
[单片机]
大神教你如何快速使用DMA处理ADC
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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