笔记--STM32时钟系统简单总结

发布者:鑫森淼焱最新更新时间:2022-06-02 来源: eefocus关键字:STM32  时钟系统  振荡器 手机看文章 扫描二维码
随时随地手机看文章

STM32时钟系统

这里写图片描述
五个蓝色的正方形都是时钟源
HSI(high speed internal)高速内部时钟 RC振荡器不够稳定

图中梯形代表选择器(几选一) PLLXCLK常作为系统时钟来源

HSE (high speed external)高速外部时钟

MCO 是内部时钟输出引脚 对应PA8

绿色矩形对应预分频器

使用每个设备之前 都要进行时钟使能 原因之一就是:设备的功耗问题 不需要的外设就不需要开启时钟了

PCLK1和PCLK2下面挂载了很多外设
这里写图片描述

这里写图片描述

备注:某一个外设的时钟被使能后 该时钟振荡器还不能马上稳定 所以还有一个标志位代表其是否稳定
这里写图片描述

1.对应的是五个时钟源的使能
2.对应的是时钟源的来源配置
3.对应的是由时钟源一层层分频得到的外设时钟的使能

这里写图片描述

这里写图片描述

SysTick定时器应用(延时函数
这里写图片描述
这里写图片描述

这里写图片描述

这里写图片描述

systic_config这个函数主要设置两个中断之间 有多少个systick时钟周期 即中断之间的时间间隔

这里写图片描述
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);这一句把SysTick的时钟选择外部时钟,这里需要注意的是: SysTick 的时钟源自 HCLK 的 8 分频,假设我们外部晶振为 8M,然后倍频到 72M,那么 SysTick 的时钟即为 9Mhz,也就是 SysTick 的计数器 VAL 每减 1,就代表时间过了 1/9us。所以 fac_us=SystemCoreClock/8000000;这句话就是计算在 SystemCoreClock时钟频率下延时 1us 需要多少个 SysTick 时钟周期。同理, fac_ms=(u16)fac_us*1000;就是计算延时 1ms 需要多少个 SysTick 时钟周期,它自然是 1us 的 1000 倍。初始化将计算出 fac_us 和fac_ms 的值(其实就是在算定时1us的定时器倒计时的计数值)
这里写图片描述

注意这个LOAD是有限制的 因为是24位的定时器 所以MAX值为2^24 -1

 

 时钟系统是处理器的核心,所以在学习STM32所有外设之前,认真学习时钟系统是必要的,有助于深入理解STM32。
    下面是从网上找的一个STM32时钟框图,比《STM32中文参考手册》里面的是中途看起来清晰一些:
  


   
重要的时钟:
  PLLCLK,SYSCLK,HCKL,PCLK1,PCLK2 之间的关系要弄清楚;


      1、HSI:高速内部时钟信号 stm32单片机内带的时钟 (8M频率)     精度较差
      2、HSE:高速外部时钟信号  精度高 来源(1)HSE外部晶体/陶瓷谐振器(晶振)  (2)HSE用户外部时钟        
      3、LSE:低速外部晶体 32.768kHz 主要提供一个精确的时钟源 一般作为RTC时钟使用


在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。

  ①、HSI是高速内部时钟,RC振荡器,频率为8MHz。

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

  ③、LSI是低速内部时钟,RC振荡器,频率为40kHz。

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

  ⑤、PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。

  其中40kHz的LSI供独立看门狗IWDG使用,另外它还可以被选择为实时时钟RTC的时钟源。另外,实时时钟RTC的时钟源还可以选择LSE,或者是HSE的128分频。RTC的时钟源通过RTCSEL[1:0]来选择。

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

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

  系统时钟SYSCLK,它是供STM32中绝大部分部件工作的时钟源。系统时钟可选择为PLL输出、HSI或者HSE。系统时钟最大频率为72MHz,它通过AHB分频器分频后送给各模块使用,AHB分频器可选择1、2、4、8、16、64、128、256、512分频。其中AHB分频器输出的时钟送给5大模块使用:

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

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

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

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

  ⑤、送给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口。


涉及的寄存器:
RCC 寄存器结构,RCC_TypeDeff,在文件“stm32f10x_map.h”中定义如下:
typedef struct
{
vu32 CR;                  //HSI,HSE,CSS,PLL等的使能
vu32 CFGR;              //PLL等的时钟源选择以及分频系数设定
vu32 CIR;                // 清除/使能 时钟就绪中断
vu32 APB2RSTR;      //APB2线上外设复位寄存器
vu32 APB1RSTR;      //APB1线上外设复位寄存器
vu32 AHBENR;         //DMA,SDIO等时钟使能
vu32 APB2ENR;       //APB2线上外设时钟使能
vu32 APB1ENR;      //APB1线上外设时钟使能
vu32 BDCR;           //备份域控制寄存器
vu32 CSR;           
} RCC_TypeDef;

可以对上上面的时钟框图和RCC寄存器来学习,对STM32的时钟系统有个大概的了解,然后对照我们的《STM32不完全手册》的系统时钟配置函数void Stm32_Clock_Init(u8 PLL)一同来学习。


关键字:STM32  时钟系统  振荡器 引用地址:笔记--STM32时钟系统简单总结

上一篇:STM32中的WFI和WFE指令的意思
下一篇:STM32 AD C单次转换模式 连续转换模式 扫描模式

推荐阅读最新更新时间:2024-11-12 18:26

STM32入门系列-STM32时钟系统STM32时钟
时钟对于单片机来说是非常重要的,它为单片机工作提供一个稳定的机器周期从而使系统能够正常运行。时钟系统犹如人的心脏,一旦有问题整个系统就崩溃。我们知道STM32属于高级单片机,其内部有很多的外设,但不是所有外设都使用同一时钟频率工作,比如内部看门狗和RTC,它只需30KHz的时钟频率即可工作,所以内部时钟源就有多种选择。在前面章节的介绍中,我们知道STM32系统复位后首先进入SystemInit函数进行时钟的设置,将STM32F1系统时钟设置为72MHz,然后进入主函数。那么这个系统时钟大小如何得来,其他外设的时钟又如何划分,可以通过一张时钟树图找到答案,只要理解好时钟树,STM32一切时钟的来龙去脉就会非常清楚。下面就来了解下时钟
[单片机]
关于STM32的引脚重映射
前段时间在用TIM3输出两路PWM波,把我坑惨了,就是因为不懂重映象。特此记录一下。 先简介一下重映象。 STM32的引脚可设置为可设置为:普通IO功能、复用功能、重映射功能。普通IO功能、复用功能用得比较多,这里就不叙述了。重映射功能,用的场合相对而言要少点。因为实在用定时器时在用到重映象,所以以F103的TIM3输出PWM波为例。 这是TIM3的复用功能映象表,可以看到没有重映象时TIM3的四个通道所对应的引脚为PA6、PA7、PB0、PB1;使用部分重映象时为PB4、PB5、PB0、PB1,因为只改变了部分引脚,所以叫部分重映象;使用完全重映象时为PC6、PC7、PC8、PC9,这全部的引脚都改了,所以叫完全重映象
[单片机]
关于<font color='red'>STM32</font>的引脚重映射
STM32学习日志——输入捕获实验
今天学习的是通用定时器的第三个功能——输入捕获,它的作用是检测到TIMx_CHx的边沿跳变(上升沿或下降沿),即可将当前定时器的存放在捕获/比较寄存器中。 输入捕获滤波器可以通过TIMx_CCMR1的ICF位去控制N个跳变捕获一次,以此达到滤波的作用。TIMx_CCER的CC1P位捕获输出极性,是捕获上升沿或者下降沿。TIMx_CCMR1的CC1S位控制输入还是输出,以及输入脚的选择。TIMx_CCMR1的ICPS位控制输入的分频。TIMx_CCER的CC1E位控制捕获使能。 本次要用输入捕获功能来测量信号的脉冲宽度,用按键作输入,即测量按下的时间。首先配置输入捕获,在第一次上升沿处触发中断,将定时器清零,将STA清零并将bi
[单片机]
基于STM32和CAN总线的湿度采集系统设计
1引言 现实生活中,湿度的测量和控制在纺织工业、林业、化工以及气象观测等领域中有着广泛的应用。传统的人工测试方法费时费力,因而有必要研制更智能方便的湿度测量采集系统,以便实时监测湿度,并根据所测量的数据来控制加湿器、空调器等设备的运行,确保得到合适的湿度环境。 这里提出的湿度测量采集系统是为民用设计的,可实时监测仓库,温室等对湿度有严格要求的场合下的湿度,根据检测结果对湿度加以控制,同时还具有在线修订湿度上下限,湿度显示和报警功能,并可向主控室传送数据。 2系统总体设计 湿度测量采集系统首先是一个实时性系统,需要传感器的各种测量数据能及时的显示,同时,监控系统又是一个多点检测系统,需要在不同的点布置传感器,这些传感器通过总线连
[单片机]
基于<font color='red'>STM32</font>和CAN总线的湿度采集<font color='red'>系统</font>设计
ucOS_II移植:Stm32启动代码分析
用的编译工具是keil,在用keil建立stm32工程时,一般会产生一个启动文件,STM32F10x.s,在st提供的库函数里,用cortexm3_macro.s和stm32f10x_vector.s来代替这个文件。不过内容都大同小异。 我在csdn上搜到了一个在stm32上移植好的ucos,打算在这个代码的基础上,添加注释,先学别人的,然后再自己移植。 我获得的这份例程,使用了startup_stm32f10x_md.s作为启动文件,其中,删去了部分采用扩展SRAM的代码。 其文件内容为 startup_stm32f10x_md.s ;******** (C) COPYRIGHT2010 STMicroelectronics
[单片机]
stm32+pca9685控制舵机机械臂
1.硬件 PCA9685是一款基于IIC总线通信的12位精度16通道PWM波输出的芯片,该芯片最初由NXP推出时主要面向LED开关调光,但就目前国内的形式来看,好像在被Arduino在舵机控制领域使用的更广泛。 该模块由于主要活跃在Aruino周边,所以在使用Arduino开发其底层驱动库是十分完善的,但对于单片机开发人员就不太友好了,需要自行根据用户手册在单片机上编写底层的驱动。 其地址的分配是通过模块右上方的短接焊盘来确定的,从A0-A5表示地址的最低位到最高位,也就是最多可级联2^5=32个模块,地址为: 1+A5+A4+A3+A2+A1+A0+rw。如果不用短接的话Ax=0;短接的话Ax=1;rw为写的话rw=0;
[单片机]
stm32+pca9685控制舵机机械臂
STM32的USB外设初窥
这几天在考虑项目是用USB还是用以太网,但是我们用的平台STM32F103ZET6好像没有Enternet这个外设,所以就先考虑USB吧。 USB外设的一大特点就是即插即用,之所以能够这样是因为USB协议规定在主机启动或是USB外设插入系统的时候都要对外设进行配置。这里所说的配置,就是按照USB协议在USB主机和USB设备之间进行一系列的问答过程。 这一问答过程是通过主机与USB设备的端点0进行通信完成的。USB设备在插入USB端点时,主机都通过默认地址0与USB设备的端点0进行通信。在这个过程中,主机发出一系列试图得到设备描述符的标准请求,通过这些请求,主机得到所有感兴趣的设备信息,从而知道了设备的情况以及如何与之通信。随后主机
[单片机]
STM32 | 在SRAM、FLASH中调试代码的配置方法
STM32的FLASH擦写次数有限(大概为1万次),所以为了延长FLASH的使用时间,我们平时调试时可以选择在SRAM中进行硬件调试。除此之外,SRAM 存储器的写入速度比在内部 FLASH 中要快得多,所以下载程序到SRAM中的速度较快。 所以我们很有必要建立两个版本的工程配置,在SRAM中调试程序完毕后,再把代码下载到FLASH中即可。这篇笔记主要分享在keil5中配置FLASH调试与SRAM调试的详细配置方法及如何切换两种配置。 本篇笔记以STM32F103ZET6为例。其FLASH大小为512KB,SRAM的大小为64KB。FLASH基地址为0x08000000,SRAM基地址为0x20000000。在STM32F
[单片机]
<font color='red'>STM32</font> | 在SRAM、FLASH中调试代码的配置方法
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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