你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32学习笔记02—时钟树架构

[复制链接]
STMCU 发布时间:2020-10-27 13:51
STM32学习笔记02—时钟树架构

2.1 时钟树结构图
       STM32属于Cortex-M3内核的单片机,时钟结构比之前的51单片机较复杂的多,根据数据手册,STM32F103的时钟结构如下图所示。
1.png
    根据上图可以看到,STM32F103系列单片机具有4个时钟源,内部的8MHz时钟发生器,外部的晶体振荡器接口,最高支持16MHz,外部的32.768kHz晶体振荡器接口和内部的40kHz时钟发生器,其中32.768kHz和40kHz主要用于内部RTC时钟脉冲,8MHz的晶振通过PLL时钟倍乘器,将系统总线时钟提高为72MHz。


       STM32F103系列内部具有2条外设时钟总线,APB1和APB2,其中APB2的时钟最高可达72MHz,APB1的时钟最高可达36MHz,通过配置对应的寄存器,就可以将CPU内核时钟提高到最大速度。


       通过最小系统可以看到,我们使用外部高速晶体振荡器接口,外接8MHz晶振,RTC则是使用32.768kHz晶振,现在我们来通过数据手册来配置对应的寄存器位来配置APB2时钟达到72MHz,APB1时钟达到36MHz。


2.2 时钟配置
2.png
       上图是ST公司推出的一款软件,这款软件可以自动生成寄存器代码,但是我们在这里只用到其中提供的时钟配置功能,通过上面的时钟结构,我们可以得到配置时钟的大概流程。


2.2.1 时钟配置流程
(1)开启HSE时钟接口,这个接口用于使能晶体振荡器输入端;


(2)设置PLL倍频系数为9,因为外接8MHz时钟,所以设置系数为9就可以轻松达到8×9=72MHz的时钟频率;


(3)设置时钟源为PLLCLK,因为HSE使用的时候可以发现最终的输出就是PLL时钟脉冲;


(4)设置APB1时钟总线的分频系数为2,因为APB1时钟总线最高频率只有36MHz;


(5)设置APB2时钟总线的分频系数为1。


2.2.2 相关寄存器
(1)时钟控制寄存器:RCC_CR
3.png
Bit 25:PLL准备状态


              0:PLL解锁


              1:PLL锁定


Bit 24:PLL使能


              0:PLL关闭
              1:PLL打开


Bit 19:时钟安全系统开关


              0:时钟保护关闭
              1:时钟保护打开


Bit 18:HSE旁路(禁用HSE振荡器时才能写入)


              0:HSE禁止旁路
              1:HSE打开旁路


Bit 17:HSE准备状态


              0:HSE未准备好
              1:HSE准备完毕


Bit 16:HSE时钟使能


              0:HSE时钟关闭
              1:HSE时钟打开


Bit 15~ Bit 8:HSI校准值(这个值在启动的时候自动初始化)


Bit 7~ Bit 3:HSI微调(对其进行编程以适应电压和温度的变化影响内部HSI的频率。初始值16,步长约为40kHz)


Bit 1:HSI准备状态


              0:HIS未准备好
              1:HSI准备完毕


Bit 0:HSI时钟使能


              0:HIS时钟关闭
              1:HSI时钟开启



(2)时钟配置寄存器:RCC_CFGR
4.png
Bit 26~Bit 24:芯片时钟输出


              0xx:禁止输出
              100:选择系统时钟SYSCLK
              101:选择HSI时钟
              110:选择HSE时钟
              111:选择PLL分频输出(2分频)


Bit 22:USB时钟分频系数


              0:PLL时钟1.5分频作为USB时钟
              1:PLL时钟不分频作为USB时钟


Bit 21~Bit 18:PLL倍频系数


              0000:2倍频
              0001:3倍频
              0010:4倍频
              0011:5倍频
              0100:6倍频
              0101:7倍频
              0110:8倍频
              0111:9倍频
              1000:10倍频
              1001:11倍频
              1010:12倍频
              1011:13倍频
              1100:14倍频
              1101:15倍频
              1110:16倍频
              1111:16倍频


Bit 17:HSE输入分频器


              0:HSE输入不分频
              1:HSE输入2分频


Bit 16:PLL时钟选择(PLL处于禁止模式才能写入)


              0:HSI时钟2分频作为PLL时钟输入
              1:HSE作为PLL时钟输入


Bit 15~Bit 14:ADC分频系数


              00:PCLK2分频系数为2
              01:PCLK2分频系数为4
              10:PCLK2分频系数为6
              11:PCLK2分频系数为8


Bit 13~Bit 11:APB2分频系数(最高可达72MHz)


              0xx:HCLK不分频
              100:HCLK分频系数为2
              101:HCLK分频系数为4
              110:HCLK分频系数为8
              111:HCLK分频系数为16


Bit 10~Bit 8:APB1分频系数(最高只能达到36MHz)


              0xx:HCLK不分频
              100:HCLK分频系数为2
              101:HCLK分频系数为4
              110:HCLK分频系数为8
              111:HCLK分频系数为16


Bit 7~Bit 4:AHB总线预分频系数


              0xxx:SYSCLK不分频
              1000:SYSCLK分频系数为2
              1001:SYSCLK分频系数为4
              1010:SYSCLK分频系数为8
              1011:SYSCLK分频系数为16
              1100:SYSCLK分频系数为64
              1101:SYSCLK分频系数为128
              1110:SYSCLK分频系数为256
              1111:SYSCLK分频系数为512


Bit 3~Bit 2:系统时钟选择状态


              00:HSI作为系统时钟
              01:HSE作为系统时钟
              10:PLL作为系统时钟
              11:保留


Bit 1~Bit 0:系统时钟选择


              00:选择HSI作为系统时钟
              01:选择HSE作为系统时钟
              10:选择PLL作为系统时钟
              11:保留


2.3 设置例程

配置STM32的时钟需要创建几个文件,这几个文件如下表所示。
5.png
(1)创建上述三个文件,其中c文件添加进工程中,h文件包含进程序中,如下图所示。
6.png
7.png
(2)stm32f103x.h文件输入以下内容:
8.png
    这个文件用于定义程序用到的所有寄存器的地址和结构体,是整个STM32程序的最基础的文件。


(3)sys.h输入以下内容
9.png
    sys.h文件用于定义STM32的时钟配置和中断配置,以及后面的端口位操作模式。



(3)sys.c文件输入以下内容
  1. void STM32_Clock_Init( u8 PLL )
  2. {
  3.    RCC->CR |= 0x00010000 ;              //外部高速时钟使能HSEON
  4.   while( !( RCC->CR>>17 ) ) ;              //等待外部时钟就绪
  5.   RCC->CFGR = 0x00000400 ;            //APB1=DIV2;APB2=DIV1;AHB=DIV1;
  6.   PLL -= 2 ;                    //抵消2个单位(因为是从2开始的,设置0就是2)
  7.   RCC->CFGR |= ( u32 )PLL<<18 ;            //设置PLL值 2~16
  8.   RCC->CFGR |= 1<<16 ;              //PLLSRC ON
  9.   FLASH->ACR |= 0x32 ;                //FLASH 2个延时周期
  10.   RCC->CR |= 1<<24 ;                //PLLON
  11.   while( ( RCC->CR&0x02000000 )!=0x02000000 ) ;    //等待PLL锁定
  12.   RCC->CFGR |= 0x00000002 ;            //PLL作为系统时钟
  13.   while( ( RCC->CFGR&0x0000000C )!=0x00000008 ) ;  //等待PLL作为系统时钟设置成功
  14. }
复制代码

   这个文件的函数就是真正配置时钟的过程,可以对照之前描述的配置时钟的过程来看这段代码。
上一篇:
STM32学习笔记01—STM32F103环境搭建>>





收藏 评论1 发布时间:2020-10-27 13:51

举报

1个回答
开发者 回答时间:2020-10-28 16:58:11

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版