首页 > 其他分享 >STM32F103系统时钟配置

STM32F103系统时钟配置

时间:2024-11-19 22:58:32浏览次数:1  
标签:STM32F103 分频 分频器 配置 寄存器 时钟 外设 RCC

时钟是单片机运行的基础,时钟信号推动单片机内各个部分执行相应的指令。时钟系统就是CPU的脉搏,决定CPU速率,像人的心跳一样 只有有了心跳,人才能做其他的事情,而单片机有了时钟,才能够运行执行指令,才能够做其他的处理 (点灯,串口,ADC),时钟的重要性不言而喻。

一、STM32F103时钟介绍

STM32F103本身十分复杂,外设非常多 但我们实际使用的时候只会用到有限的几个外设,使用任何外设都需要时钟才能启动,但并不是所有的外设都需要系统时钟那么高的频率,为了兼容不同速度的设备,有些高速,有些低速,如果都用高速时钟,势必造成浪费 并且,同一个电路,时钟越快功耗越快,同时抗电磁干扰能力也就越弱,所以较为复杂的MCU都是采用多时钟源的方法来解决这些问题。所以便有了STM32F103的时钟系统和时钟树。

1.1 系统时钟

系统时钟(SYSCLK)有多种选择,图中左边的部分就是设置系统时钟使用那个时钟源;

  • HSI振荡器时钟:HSI是高速内部时钟,RC振荡器,频率为8MHz,精度不高;
  • HSE振荡器时钟:HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz
  • PLL时钟;其时钟输入源可选择为HSI/2HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz

系统时钟的右边,则是系统时钟通过AHB预分频器,给相对应的外设设置相对应的时钟频率.

从左到右可以简单理解为 各个时钟源--->系统时钟来源的设置--->各个外设时钟的设置。

在我们使用的STM32F103F103开发板中:

  • OSC32_INOSC32_OUT连接了32.768kHz的晶振,用于给RTC提供时钟信号;
  • OSC_INOSC_OUT连接了8MHz的晶振,作为系统时钟的来源。

Keil编写程序是默认的时钟为72Mhz,其实是这么来的:

  • 外部晶振(HSE)提供的8MHz通过PLLXTPRE分频器后;
  • 进入PLLSRC选择开关;
  • 进而通过PLLMUL锁相环进行倍频(x9)后,为系统提供72MHz的系统时钟(SYSCLK);
  • 之后是AHB预分频器对时钟信号进行分频,然后为低速外设提供时钟。

1.2 USB时钟

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

1.3 时钟输出到外部

STM32F103可以选择一个时钟信号输出到MCO脚(PA8)上,可以选择为PLL输出的2分频、HSIHSE、或者系统时钟。可以把时钟信号输出供外部使用。

1.4 外设时钟

系统时钟通过AHB分频器给外设提供时钟,AHB分频器可选择12481664128256512分频。其中AHB分频器输出的时钟送给如下模块使用:

  • SDIO;
  • FSMC;
  • 内核总线:送给AHB总线、核心存、储器和DMA使用的HCLK时钟。;
  • Tick定时器:通过8分频后送给Cortex的系统定时器时钟;
  • 直接送给Cortex的空闲运行时钟FCLK
  • APB1外设:送给APB1分频器。APB1分频器可选择124816分频;
    • 其输出一路供APB1外设使用(PCLK1,最大频率36MHz);
    • 另一路送给通用定时器使用。该倍频器可选择1或者2倍频,时钟输出供定时器2-7使用;
  • APB2外设:送给APB2分频器。APB2分频器可选择124816分频:
    • 其输出一路供APB2外设使用(PCLK2,最大频率72MHz);
    • 另一路送给高级定时器。该倍频器可选择1或者2倍频,时钟输出供定时器1和定时器8使用;
    • 另外APB2分频器还有一路输出供ADC分频器使用,分频后送给ADC模块使用。ADC分频器可选择为2468分频。;
  • 经过2分频送至SDIOAHB

需要注意的是,如果APB预分频器分频系数是1,则定时器时钟频率 (TIMxCLK)PCLKx。否则,定时器时钟频率将为APB域的频率的两倍:TIMxCLK = 2xPCLKx

1.4.1 APB1APB2的对应外设

APB1上面连接的是低速外设,包括电源接口、备份接口、CANUSBI2C1I2C2USART2USART3UART4UART5SPI2SP3等;

APB2上面连接的是高速外设,包括UART1SPI1Timer1ADC1ADC2ADC3、所有的普通I/O口(PA-Pg)、第二功能I/OAFIO)口等。

二、时钟相关寄存器

2.1 时钟控制寄存器(RCC_CR

2.2 时钟配置寄存器(RCC_CR

2.3 时钟中断寄存器(RCC_CIR

2.4 APB2外设复位寄存器(RCC_APB2RSTR)

2.5 APB1外设复位寄存器(RCC_APB1RSTR)

2.6 AHB外设使能寄存器(RCC_AHBENR

2.7 APB2外设时钟使能寄存器(RCC_APB2ENR

2.8 APB1外设时钟使能寄存器(RCC_APB1ENR

三、时钟配置源码

3.1 RCC_TypeDeff

RCC寄存器结构RCC_TypeDeff,在文件stm32f10x_map.h中定义如下:

/*------------------------ Reset and Clock Control ---------------------------*/
typedef struct
{
  vu32 CR;	     // 时钟控制寄存器 ;
  vu32 CFGR;	 // 时钟配置寄存器 ;
  vu32 CIR;		 // 时钟中断寄存器 ;
  vu32 APB2RSTR; // APB2外设复位寄存器 ;
  vu32 APB1RSTR; // APB1外设复位寄存器 ;
  vu32 AHBENR;	 // AHB外设时钟使能寄存器 ;
  vu32 APB2ENR;	 // APB2外设时钟使能寄存器 ;
  vu32 APB1ENR;	 // APB1外设时钟使能寄存器 ;
  vu32 BDCR;	 // 备份域控制寄存器 ;
  vu32 CSR;		 // 控制/状态寄存器 ;
} RCC_TypeDef;

#define RCC_BASE              (AHBPERIPH_BASE + 0x1000)

#ifdef _RCC
  #define RCC                 ((RCC_TypeDef *) RCC_BASE)
#endif /*_RCC */

在第二节中我们已经对RCC_TypeDef结构体中定义的大部分结构体进行了详细的介绍,那么我们如何编码去初始化这些寄存器呢?

3.2 RCC初始化

这里我们采用HSE作为系统时钟输出,正常使用的时候也都是使用外部时钟。其初始化流程如下:

(1)

参考文章

[1] STM32F103时钟系统讲解

[2] Mini2440裸机开发之系统时钟配置

标签:STM32F103,分频,分频器,配置,寄存器,时钟,外设,RCC
From: https://www.cnblogs.com/zyly/p/18555798

相关文章

  • Windows系统在VSCode(Visual Studio Code)中使用.NET MAUI并且配置Android Emulator
    Windows系统在VSCode(VisualStudioCode)中使用.NETMAUI并且配置AndroidEmulatorVSCode优点极多,自主配置,界面舒适,如果不想使用VisualStudio来开发MAUI应用,并且不下载完整的AndroidStudio,仅使用其Emulator,以下是为VSCode配置环境的方法,同时解决了多种可能出现的问题。第......
  • Flask上传服务器,conda环境配置(都怪torch)
    Flask上传服务器,conda环境配置(都怪pytorch)问题:有个任务,将一个flask的服务换到另一个服务器上,之前的服务器一直用国内的镜像源可以直接下载镜像,当这个服务器设置相同的镜像源也下载不了,一直卡在solvingenvironment这一步。找到一个方法,可以直接复制整个虚拟环境到另一个服务器上......
  • Headscale + 自建DERP中继免域名配置(Debian)
    配置Headscale官方教程:https://headscale.net/setup/install/official/下载deb包并安装编辑配置文件首先下载官方最新的配置文件模板:https://headscale.net/ref/configuration/然后进行编辑:server_url:将ip更改为服务器的公网iplisten_addr:0.0.0.0:8080grpc_list......
  • electron 渲染进程无法接收到主进程发送的配置文件内容
    问题electron中,主进程启动的时候,会读取配置文件内容,并通过ipc发送给渲染进程。现在的问题是,preload.js中的contextBridge里面的ipcRenderer.on一直没有执行。解决其实原因很简单,软件开启的时候,通过contextBridge和ipc这一套还没有完全准备好。导致主进程使用web......
  • centos9stream 新系统配置IP 设置远程登录 修改国内源
    配置IP.网关.DNS连接互联网vim/etc/NetworkManager/system-connections/ens33.nmconnection###网络配置文件[connection]id=ens33uuid=3c17691d-cccc-xxxx-zzzz-xzxzxczxcczxtype=ethernetautoconnect-priority=-999interface-name=ens33timestamp=1732001143[et......
  • Git 忽略文件配置全解析
    Git忽略文件配置全解析在Git版本控制系统中,.gitignore文件扮演着至关重要的角色。它允许我们指定哪些文件或目录应该被Git忽略,即不被纳入版本控制之中。这对于避免提交敏感信息、构建产物或临时文件等非常有用。本文将详细介绍Git忽略文件的规则及设置方法。一、.gitignore文件......
  • Abp.VNext-统一配置UTC时区时间
    PreConfigureServices方法重载并添加如下代码[DependsOn(typeof(AbpAutofacModule),typeof(AbpAspNetCoreMvcModule),)]publicclassApiHostModule:AbpModule{publicoverridevoidPreConfigureServices(ServiceConfigurationContextcontext)......
  • vite4+vue2+vant2+less构建项目,按需加载定制主题配置说明
    步骤1:安装vant2、consola、less、vite-plugin-style-import说明:因为vant2需要consola,所以必装;安装加载vant组件样式,必装:vite-plugin-style-import,版本注意是2.0以上 步骤2:vite.config.js配置://vite.config.jsimportfsfrom'node:fs';importpathfrom'path';i......
  • slience博客园配置
    详细教程:https://esofar.github.io/cnblogs-theme-silence/#/guide?id=step1:获取文件代码如下@mediaonlyscreenand(max-width:1365px){.github-corner{display:none}}@mediaonlyscreenand(max-width:1259px){#home{width:100%!important}}@mediaonlyscreenand(max-w......
  • 【STM32】BKP备份寄存器&RTC实时时钟&PWR电源控制
    文章目录BKP备份寄存器BKP简介BKP的基本结构BKP库函数RTC实时时钟RTC简介RTC基本结构RTC操作注意事项RTC库函数PWR电源控制PWR简介STM32内部供电方案低功耗模式模式选择BKP备份寄存器对应STM32F10xxx参考手册中的第五章BKP简介BKP(BackupRegisters)备份寄存......