你应该知道的STM32F04x单片机时钟切换教程

发布者:和谐共存最新更新时间:2024-09-12 来源: elecfans关键字:单片机  时钟切换 手机看文章 扫描二维码
随时随地手机看文章

本次编写的教程主要是针对STM32F04x系列的单片机,对于STM32单片机的时钟,想必使用过STM32的人都比较清楚,STM32它是基于 Cortex®-Mx系列内核的微处理器,芯片内部集成了丰富的外设。同时也集成了内部的时钟源。也就是说芯片不需要外接晶振就可以运行。但是大多数的使用情况都是使用了芯片外部的晶振,包括官方的标准固件库也都是默认使用外部晶振,但是有些特殊情况下,不需要使用外部晶振,这样可以节省一个晶振和两个谐振电容,最主要的是可以节省PCB板子的面积。但如果使用内部晶振,就得要编写程序,更改相关寄存器的值,切换至内部晶振才可以。对于芯片时钟源切换这样的事情,对高手来说是很简单,对于新手来说就有些搞不清了,因此本教程叙述一下STM32F04x系列单片机时钟源切换的流程。


既然是切换单片机的时钟源,就不能不了解下芯片内部的时钟结构,几乎所有的STM32芯片,官方在手册中都会描述一下芯片内部的时钟结构。STM32F04x也不列外,下面是STM32F04x系列单片机的时钟树:(摘自官方手册)

图中序号说明:

①:外部时钟源的输入端。这个时钟源是系统时钟,可用的时钟源频率范围是(4~32)MHz。

②:外部实时时钟的时钟源输入端。这个时钟源是计时使用,所以它的频率是固定在32.768KHz。

③:芯片内部时钟输出端。可以控制相关的寄存器,选择内部的时钟信号从这个端口对外输出。

④:内部高速48MHz的时钟源。该频率不需要倍频就可以直接给芯片的提供48MHz的系统时钟信号。

⑤:内部低速8MHz的时钟源。该频率可以倍频或不倍频给系统提供时钟信号。(但是STM32F04x芯片最高频率是48MHz)

⑥:PLL倍频模块。该模块可以选择内部8M或外部时钟为输入,经倍频后给芯片系统提供时钟信号。

⑦:SW系统时钟源选择器。通过控制寄存器来选择相关的时钟源为芯片系统使用。

本次要切换的时钟源是①HSE外部时钟源和⑤内部8M时钟源。不知大家是否留意过,市面上出售的各种STM32的开发板其外部的时钟基本都是8MHz的,这是为什么呢?主要原因是让初学者更快的上手。大家可以结合上图的时钟树和官方的固件库就可以得知,芯片内部的时钟源频率是8MHz,而官方的固件库中配置系统时钟源的时候,定义的相关变量和函数等,也都是用8MHz为基础进行定义的。这样一来,初学者就可以暂时不需要很清楚的了解时钟结构的情况下,快速进行开发。节省了很多的时间,同时也降低了上手的难度。如果一开始就让初学者要清楚的去了解芯片的时钟结构,这样对于能力强的人是无所谓的。但是对新手来说不是一个好的开始,也有可能会打击学习的信心。

看完芯片的时钟树后,在看看官方的固件库是怎么实现系统时钟信号的配置:

STM32的芯片在启动的时候,都是先从启动文件开始执行的,而上图中的程序就是在启动文件中调用的,从上面的程序中可以看出,芯片在启动的时候使用了(默认)内部的8MHz时钟。之后是清除与时钟相关的一切设置,最后调用了一个系统时钟设置函数,该函数的源代码如下:

上图的函数就是在芯片复位完与时钟相关寄存器后,进行配置系统时钟源时调用的函数,该函数主要是进行了五个操作,分别是①启用外部时钟源,②设置PLL的输入时钟源于PLL的倍频系数,③设置FLASH预取指与延迟周期,④设置系统时钟分频系数和外设总线时钟分频系数,⑤设置PLL模块输出频率为系统时钟源。这是官方默认的设置,从这里就可以看出,如果外部使用了8MHz的晶振时,PLL模块倍频6倍。则系统的时钟频率是8*6=48MHz。如果我们不想使用外部的晶振,则只能在这里进行编程设置相关寄存器的数值,达到我们的目的。具体的程序如下:

上图是程序的设置过程是:

①开启内部8MHz时钟(这一步也可以不写,因为芯片上电后默认开启了内部8MHz时钟)。

②等待内部时钟稳定。

③配置FLASH预取指与等待周期。

④设置HPRE与PPRE的分频系数。(一般情况下这两个总线是不分频的,除非对功耗有要求则需要分频)

⑤设置PLL的输入源和PLL模块的倍频系数。

(在设置PLL模块时,必须先清除对该模块的相关设置位,因为只有在PLL模块关闭的情况下才能写入相关的控制信息)

⑥等待PLL模块输出稳定。

⑦设置PLL模块为系统时钟。

⑧等待设置PLL模块为系统时钟完成。

按照上述过程配置完相关寄存器后,芯片的系统时钟就设置为内部的8MHz。经过PLL模块倍频*6后,系统的最高频率是8*6=48MHz。

在配置芯片的内部时钟时,要注意的是:官方的固件库中默认是使用外部晶振,并在时钟配置函数SetSysClock中进行了外部时钟稳定等待,假如外部时钟启动失败的时候,默认是没有相关函数去处理。所以,如果你的PCB板子上并没有焊接外部的晶振时,切换时钟的函数就写在官方固件库system_stm32f0xx文件中的SetSysClock函数中,这样一来启动过程中就直接将内部时钟初始化为芯片的系统时钟。


关键字:单片机  时钟切换 引用地址:你应该知道的STM32F04x单片机时钟切换教程

上一篇:STM32的IO口灌入电流和输出驱动电流最大是多少?
下一篇:实战经验 | 移植 SBSFU 到 STM32G070 的过程

推荐阅读最新更新时间:2024-11-05 06:08

平凡单片机教学 第五讲 单片机的内外部结构分析(四)
1.第三个实验 上两次我们做过两个实验,都是让P1.0这个引脚使灯亮,我们可以设想:既然P1.0可以让灯亮,那么其它的引脚可不可以呢?看一下图1,它是8031单片机引脚的说明,在P1.0旁边有P1.1,P1.2 .P1.7,它们是否都可以让灯亮呢?除了以P1开头的外,还有以P0,P2,P3开头的,数一下,一共是32个引脚,前面我们以学过7个引脚,加上这32个这39个了。它们都以P字开头,只是后面的数字不一样,它们是否有什么联系呢?它们能不能都让灯亮呢?在我们的实验板上,除了P10之外,还有P11��P17都与LED相连,下面让我们来做一个实验,程序如下: MAIN: MOV P1,#0FFH LCALL DELAY
[单片机]
基于TMP04的PIC单片机测温实现
摘要:数字化温度传感器可以直接将温度量以数字脉冲信号形式输出,具有测量精度高、抗干扰能力强、传输距离远、外围接口电路简单等诸多优点。同时数字温度传感器还可直接与微处理器进行接口,大大方便了传感器输出信号的处理。本文以PWM模式输出的TMP04型数字式温度传感器为例,介绍由PCI单片机实现的几种测温方案,并给出软件设计流程。 关键词:数字式温度传感器 PCI单片机 TMP04 PWM 1 引言 在大多数测控系统中,温度都是必不可少的检测量,温度传感器也是测控系统中十分重要的传感器件。随着数字 化传感器技术的不断发展, 出现了各种类型的数字温度传感器。数字温度传感器可以直接将被检测的温度信息以数字化形式输出,与传统的模拟式
[单片机]
51单片机加HC—SR04超声波测距仪用LCD1602显示
#include reg51.H #include intrins.h #define uchar unsigned char #define uint unsigned int sbit lcden=P1^2; sbit lcdrs=P1^0; sbit lcdrw=P1^1; sbit RX=P2^1; sbit TX=P2^0; uint time=0; unsigned long S=0; bit flag =0; uchar disdat ={ 0,0,0,0,}; void delay(uint z) //延时子程序 { uint x,y; for(x=z;x 0;x--) for(y=110;
[单片机]
51单片机I/O端口的读写操作
MCS-51单片机通常有4个8位I/O端口, 向各端口的写数据均写入到对应端口的锁存器中, 但对各端口的读操作却有两个方式:读锁存器和读引脚 1 读-修改-写操作 Pn(指P0,P1,P2,P3)在51汇编语言中是特殊的标识符,既代表Pn端口引脚,又代表Pn锁存器(Pn SFR)。在MCS-51指令系统中有些指令读锁存器的值, 有些指令则读引脚上的值。读锁存器指令是从锁存器中读取一个值并进行处理, 把处理后的值(原值或已修改后的值)重新写入锁存器中。这类指令称为读-修改-写指令, 表1列举了有该功能的指令 当目的操作数是Pn端口或Pn端口的某一位时. 该指令读取锁存器的值. 这些指令的一个共同特点, 就是要先并行读
[单片机]
51<font color='red'>单片机</font>I/O端口的读写操作
AVR单片机生成负压的原理解析
红外测温传感器的输出是一个mV级的电压信号,大约在室温下(26℃左右)输出0电压,温度再低就是负电压了。要用单片机检测这样一个小信号,必须进行放大,可一般的单电压运放都不能放大小信号(我曾经折腾过LM324的单电压小信号放大,发现大约在100mV以下,LM324就没有反应了),最常规的解决方案就是使用双电压供电。 双电压是个头疼的事情,弄两路电压一般来说要使用变压器,还得是双绕组的,全桥整流,78 79系列IC伺候着。。。看着就不爽! 如果要改用电池供电。。。麻烦啊! 于是打算用负压生成电路。 负压生成都是一个套路,用振荡器产生交流电,然后用电感产生感应电动势,或者用二极管和电容组成的倍压电路。。。既然用了单片机,那么产生
[单片机]
AVR<font color='red'>单片机</font>生成负压的原理解析
MCS-51单片机外中断软件编程简介
简介:MCS-51单片机有多个中断源,以8051为例,有5个中断源,两个外中断、两个定时中断和一个串行中断,这一节我们讨论外中断软件编程。 外中断是由外部原因引起的中断,有两个中断源。即外中断0(INT0)和外中断1(INT1),中断请求信号由引脚P3.2(INT0)和P3.3(INT1)输入。 外中断请求信号有两种方式,一是电平方式,二是脉冲方式。可通过有关控制位的定义进行规定。 电平方式为低电平有效,只需在单片机的(INT0)和(INT1)中断请求输入端采样到有效的低电平时,就会激活外部中断。 脉冲方式则在脉冲的后负跳沿有效,即在相邻两个机器周期对中断请求引入端进行采样中,如前一次为高,后一次为低即为有效中断请求。
[单片机]
MCS-51<font color='red'>单片机</font>外中断软件编程简介
51单片机学习笔记1 -- 单片机最小系统仿真电路绘制
1.Protues新建工程 打开Protues,首页打开ISIS图标,绘制电路图 进入到以下绘制界面 像电路中的芯片、电阻电容等,都可以在器件区找到,直接点击器件区的Pick Device,会弹出来一个器件选择框 可以看到器件选择框中有很多类别的元器件,对于行业单词不熟悉的我们可以在搜索框键入我们想找的元器件,比如51芯片,在搜索框键入89C52,可以看到器件明细区出来两个AT89C52芯片待选 选中需要的芯片,右侧会出现选中的元器件对应预览图和PCB封装图,可以从预览图中看到我们选中的芯片是不是我们想要的,引脚数是否一样等,右下角有个下拉菜单可以选择不同的PCB封装,但PCB不是我们电路图所需要考虑的,所以选中芯
[单片机]
51<font color='red'>单片机</font>学习笔记1 -- <font color='red'>单片机</font>最小系统仿真电路绘制
【GD32 MCU 入门教程】二、GD32 MCU 烧录说明(1)ISP 烧录
GD32 MCU提供了多种烧录方法,可在调试和生产等阶段进行便捷的烧录。GD32目前主要烧录方法有ISP烧录、SWD/JTAG在线下载、脱机烧录三种类型。 ISP烧录:使用串口或USB即可烧录,无需特殊工具支持。可根据协议自行定制下载方式,需要控制BOOT0引脚电平选择启动模式。 SWD/JTAG在线下载:无需切换MCU启动方式,使用仿真器等可进行下载。需使用仿真器和上位机进行操作。 脱机烧录:适用于大批量的产线生产,烧录过程无需PC和软件,可脱机进行烧录,批量烧录效率高。 本章对三种烧录方法有以下三个方面介绍。 1 烧录工具和硬件连接:介绍各烧录方法需使用的工具,以及硬件所需接口。 2 软件操作和烧录流程:介绍烧录软件的
[单片机]
【GD32 <font color='red'>MCU</font> 入门教程】二、GD32 <font color='red'>MCU</font> 烧录说明(1)ISP 烧录
小广播
设计资源 培训 开发板 精华推荐

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

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

更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved