(适合初学者)stm32f10x的时钟系统讲解

首先,时钟是单片机非常重要的一部分,要想学好stm32,时钟必须要懂,我在半年前刚学stm32的时候,没有任何基础,通过看网上的教学来写例程,但对那些时钟以及内部的一些寄存器的讲解我是一点也看不懂,索性就照搬复刻了,其实我还是建议一步一步走,不要急着写程序,弄懂原理再说,我作为初学者跟刚学stm32的分享一下。

时钟系统

时钟是整个单片机的心脏,发出的时钟信号就是单片机的脉搏,我们所用的外设都要用到时钟才能工作,就像人必须要有心跳一样,所以代码里在操作每一个外设前都要先打开对应的外设时钟。

 

 第一张是stm官方给出的时钟系统框图,第二份是正点原子的教学视频中给出的框图,两个其实大差不差,但是第一幅看起来会发复杂,就以第二幅为例。

  stm32共有五个时钟源,分别是图中的五个蓝色方块(HSI、HSE、LSE、LSI、PLL),PLL是一个特殊的时钟源(下边再讲为什么)。

HSI是内部的高速时钟,信号频率为8MHz,(LSI)是内部的低速时钟,信号频率为42KHz,内部时钟是由芯片内部的RC振荡器产生的,学过数电模电的应该知道RC振荡器产生的信号不稳定(还没上大二,没学过数电模电,听别人说的),但内部时钟的优点是不需要晶振、外部时钟源等一些外部器件就可以产生时钟信号。

HSE是外部的高速时钟,信号频率是4-16MHz,常用的是8MHz,LSE是外部的低速时钟,信号频率为32.768kHz。外部的时钟源都是由外部连接的晶振,振荡源产生的,但相比于内部时钟源,他产生的信号非常稳定。

那么(PLL)是怎么产生的呢,不要急,我们可以看到,时钟源信号出来以后走线连接到了不同区域,图中的绿色方块是分频器,时钟信号通过分频器之后,会被除以或乘以一定倍数。图中的灰褐色梯形块是选择器,当多个时钟信号通过他是,选择器会选择其中的一个时钟信号向后传递

 如图,HSI时钟信号出来以后,分为两支,一支直接连接到了SYSCLK系统时钟的选择器上,另一支经过÷2分频器,频率变为4MHz,后又连接到了PLL前的选择器上,PLL时钟源就特殊在了这里,他产生的时钟信号,是又别的时钟源提供的,PLL自己也可以进行倍频调节,在通过选择选择器前的一路时钟信号后,自己倍频后作为自己的时钟信号输出(挺缺德的),最高可输出72MHz。

时钟源产生的时钟信号通过很多的分频器选择器,可以产生很多不同频率大小的时钟信号供外设使用

而我们所使用的大部分外设所需要的时钟都来自于图中的SYSCLK系统时钟,由图可得,系统时钟可以由(HSI)直接提供,也可以由(PLL)或(HSE)直接提供,在SYSCLK系统时钟后边连接了APB1,APB2,和一些外设,APB1和APB2时钟上也挂有有TIM定时器,ADC,等等(图中只是一小部分,其他的外设连接的时钟需查看stm32中文参看手册中的所需外设部分的内容)。

还有一些外设是不在SYSCLK系统时钟里的,像RTC由(LSE)或其他提供时钟,USB等外设如图同理。

 这里有一个特别的外设(MCO),可以输出内部的时钟作为外接时钟源供其他单片机或设备使用,可以做输出的时钟分别是图中的四个(SYSCLK , HSI , HSE , PLL÷2),这个东西我没用过,所以不懂,感兴趣的网上查查吧。

在我们使用外设时,如果一步一步的通过寄存器配置时钟源,分频系数,是相当的麻烦,点一个灯就要花较长时间,就相当于你第一天去上学,你要规划路线和和设置配速,很麻烦。何不叫来校车直接把你送到学校。而我们使用库函数编写程序时就起到了坐校车的效果。

#include "stm32f10x.h"int main(void){	GPIO_InitTypeDef  GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能GPIOA时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;				 //PA8端口设置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //输出模式为推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO速度为50HZGPIO_Init(GPIOA, &GPIO_InitStructure);					 //初始化GPIO口GPIO_SetBits(GPIOA,GPIO_Pin_8);						 //PA8输出高电平while(1){;}}

通过库函数打开时钟时,我们只需要调用 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);这个函数就把时钟全部配置好,

查看函数定义并追踪RCC 

 找到右边的RCC结构体

 就是通过配置结构体内的这些寄存器来设施好外设时钟的。因为配置寄存器的方法麻烦而且没必要,基本都用不到,所以具体的配置方法查看中文手册或者找网上的教学资源。

可以看一下系统时钟SYSCLK的配置方法,如下图

 在system_stm32f10x.c文件中的void SystemInit (void)函数中。

另外,要学会多看手册,会看手册,对于初学者,手册上的东西讲过的很生硬难懂,建议在网上看一些教学视频学会后,在参照手册看一遍。有毅力,有时间的同学可以放下库函数,看着手册一步一步写寄存器程序,虽然耗精力,但作用很大,可以在以后学到库函数封装不是很好的单片机时,对照着芯片手册,也能够很快适应写底层程序。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部