stm32f1时钟分析

stm32f1时钟分析

 

STM32片上时钟分析

一、前言

1、本文主要讨论系统时钟以至外设时钟之间的源流关系。介绍stm32的片上时钟系统,描述系统时钟初始化函数SystemInit()对时钟的控制(从HSE到SYSCLK,第二节)与配置(SYSCLK到外设,第三节)。

2、103与107所用时钟系统略有不同,但系统时钟(SYSCLK)都是72MHz。

3、f107应当使用25MHz晶振。若采用8MHz的晶振,搭配3.0.0版固件库,则将f107当做f103使用,不能驱动通信线产品所有功能(以太网)。

4、以太网的时钟可以参考f107数据手册,附录A2.

5、RTC时钟源来自32.768kHZ晶振。

二、系统时钟SYSCLK

本节关注SYSCLK的来源。

f107与f103时钟系统略有不同,以下讨论除非特别说明,全都针对f107,采用25MHz晶振,时钟树见附录。

1、系统时钟:SYSCLK

系统复位后,HSI振荡器被选为系统时钟(8MHz),通过软件(SystemInit()函数)将系统时钟源切换到PLLCLK。

PLLCLK的来源是外部晶振HSE,由HSE信号经过5分频、8倍频、5分频得到8MHz的PLL时钟源,将其9倍频得到72MHzPLLCLK。(若在f107上采用8MHz晶振,则将HSE信号9倍频得到PLLCLK(72MHz),即系统时钟)

2、SystemInit()函数对时钟的控制(时钟控制寄存器CR,时钟配置寄存器2CFGR2)

此函数在3.0.0与3.1.2版本固件库中是不同的。相较于f103,f107在硬件上多了两个锁相环和一个CFGR2寄存器,并且定义了CR寄存器的26~29位。3.0.0版本固件库升级为3.1.2版本,正是为了配合这种变化,并实现新增的功能。

调用3.0.0库中的SystemInit()函数,结果如下:

寄存器

CR

0101 0083

CFGR

001D 0402

CFGR2

函数未涉及此寄存器

CIR

0000 0000

对此不作过多讨论,这样的方式会使以太网无法使用。

调用3.1.2库中的SystemInit()函数,结果如下:

寄存器

CR

0501 0083

CFGR

001D 0402

CFGR2

0001 0644

CIR

009F 0000

前三个寄存器配置了系统时钟,CIR是对中断的设置。这样,系统时钟的来源如下图。蓝色为复位后的时钟系统,红色为软件设置的时钟。

stm32f1时钟分析

3.1.0版本的固件库中,SystemInit()函数有bug,会在下文提到。

三、总线时钟与外设时钟。

本节关注从SYSCLK生发出的时钟(PCLK等)。

1、特性与相互关系

由系统时钟分频得AHB时钟(也称为HCLK),AHB时钟供给内核的有三路:HCLK、FCLK、系统定时器(可能需要分频,视芯片型号而定)。

两个高速外设总线的最高时钟不同,但都来自于HCLK。

定时器有硬件设置的分频器,所以CK_INT(internal clock,或称作TIMxCLK)并不一定等于相应总线的频率,其规则为:如果相应的APB预分频系数是1,定时器的时钟频率与所在APB总线频率一致。否则,定时器的时钟频率被设为与其相连的APB总线频率的2倍。 

ADC时钟ADCCLK有最大限制,对于103和107,最大为14MHz。所谓最快AD时间为1M分之一秒的说法是这么来的:

TCONV 采样时间+ 12.5个周期

采样时间设为最短的1.5个周期,这样TCONV就是14个ADCCLK周期,当ADCCLK取最大的14MHz时,TCONV的时间就是1M分之一秒。

有个有趣的现象:系统时钟配置成72MHz时,无法实现最快ADC。这是因为由于ADCCLK的上限限制,要对PCLK2进行分频,而72M无法分频为14M,最大可用只能为12M,这样自然不能实现最快ADC。

2、SystemInit()对RCC的配置(时钟配置寄存器CFGR)

AHBCLK=HCLK=SYSCLK=72MHz

PCLK1=HCLK/2=36MHz,  

PCLK2=HCLK=72MHz

TIMx(所有定时器)=PCLK1*2=PCLK2=72MHz

ADCCLK=36MHz

以上就是正常情况下SystemInit()的配置。所谓“正常”,是针对3.1.0版本固件库的bug来说的。此固件库的SetSysClockTo72函数(在system_stm32f10x.c文件中,被SystemInit调用),在配置通信线产品的PREDIV1时(或称为prediv1factor),错将5分频配置成3分频,导致芯片的系统时钟超频运行在120MHz。3.1.2版本外设固件库修正了这个bug。出错代码如下图:

stm32f1时钟分析

 另外,在调用SystemInit()函数以后,ADCCLK是超频的(PCLK2/2, 36M),无法有保障地使用,需要调用RCC_ADCCLKConfig(RCC_PCLK2_Div6)将其配置成12MHz。这种麻烦特性到3.5.0版本固件库仍然存在,不知是什么意图。

附录:f107时钟树,或见参考手册7.2,图11

stm32f1时钟分析

转载于:https://www.cnblogs.com/lxjsailor/archive/2012/07/06/2793486.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/110371.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • padstart兼容_显示列出polyfill

    padstart兼容_显示列出polyfill?原文链接:欢迎star.今天在看ES7新增的部分Api的时候刚好看到padStart的这个方法,好像还挺实用的,而且也想在正式开始工作之前先找找写代码的感觉,于是顺手(其实还是花了不少时间的)就实现了这个polyfill。相关的API用法在MDN上有说明。链接下面是具体实现if(!String.p…

    2025年8月27日
    6
  • WTL介绍

    WTL介绍

    2021年12月8日
    55
  • 海思Hi3798处理器参数,Hi3798芯片详细信息介绍「建议收藏」

    海思Hi3798处理器参数,Hi3798芯片详细信息介绍「建议收藏」Hi3798CV200集成4核64位高性能CortexA53处理器、内置NEON加速引擎,强大的CPU处理能力可以满足各种差异化的业务需求。在码流兼容性、在线视频播放的流畅性、图像质量以及整机性能方面保持业界最好的用户体验。支持4K2KP60@10bit超高清视频解码和显示,支持H.265/HEVC、H.264/AVC、AVS+、MVC、MPEG2、MPEG4、VC-1、VP6、VP…

    2022年6月30日
    626
  • python调用c++动态库_python登陆mt4

    python调用c++动态库_python登陆mt4广告关闭腾讯云11.11云上盛惠,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元!运行平台:windowspython版本:python3.6ide:sublimetext其他工具:chrome浏览器0、写在前面的话本文是基于基础版上做的修改,如果没有阅读基础版,请移步python爬虫抓取智联招聘(基础版)在基础版中,构造url时使用了urllib…

    2022年8月15日
    10
  • Optimal Keypad[通俗易懂]

    Optimal Keypad[通俗易懂]Description OptimusMobilesproducesmobilephonesthatsupportSMSmessages.TheMobileshaveakeypadof12keys,numbered1to12.Thereisacharacterstringassignedtoeachkey.Totypeinthe

    2022年4月28日
    33
  • java applet介绍,Java Applet教程介绍[通俗易懂]

    java applet介绍,Java Applet教程介绍[通俗易懂]Applet是一种特殊类型的程序,嵌入在网页中以生成动态内容。它在浏览器中运行,并在客户端运行。小程序的优势小程序有很多优点。它们如下:它在客户端工作,因此响应时间更少。担保的它可以由在许多平台下运行的浏览器执行,包括Linux,Windows,MacOs等。小程序的缺点客户端浏览器需要插件才能执行applet。你知道吗小程序的层次结构如上图所示,Applet类扩展了Panel。…

    2022年7月7日
    18

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号