当前位置: 首页 > news >正文

解析stm32的时钟

 

STM32 时钟系统  http://blog.chinaunix.net/uid-24219701-id-4081961.html

STM32的时钟系统 ***   http://www.cnblogs.com/wangh0802PositiveANDupward/archive/2012/12/24/2831535.html    

高速时钟提供给芯片主体的主时钟.低速时钟只是提供给芯片中的RTC(实时时钟)及独立看门狗使用。内部时钟是在芯片内部RC振荡器产生的,起振较快,所以时钟在芯片刚上电的时候,默认使用内部高速时钟。而外部时钟信号是由外部的晶振输入的,在精度和稳定性上都有很大优势,所以上电之后我们再通过软件配置,转而采用外部时钟信号.

STM32有以下4个时钟源: 
    高速外部时钟(HSE):以外部晶振作时钟源,晶振频率可取范围为4~16MHz,我们一般采用8MHz的晶振。 
    高速内部时钟(HSI): 由内部RC振荡器产生,频率为8MHz,但不稳定。  
    低速外部时钟(LSE):以外部晶振作时钟源,主要提供给实时时钟模块,所以一般采用32.768KHz。 
    低速内部时钟(LSI):由内部RC振荡器产生,也主要提供给实时时钟模块,频率大约为40KHz。

    OSC_OUT和OSC_IN开始,这两个引脚分别接到外部晶振8MHz,第一个分频器PLLXTPRE,遇到开关PLLSRC(PLL entry clock source),我们可以选择其输出,输出为外部高速时钟(HSE)或是内部高速时钟(HSI)。这里选择输出为HSE,接着遇到锁相环PLL,具有倍频作用,在这里我们可以输入倍频因子PLLMUL,要是想超频,就得在这个寄存器上做手脚啦。经过PLL的时钟称为PLLCLK。倍频因子我们设定为9倍频,也就是说,经过PLL之后,我们的时钟从原来8MHz的 HSE变为72MHz的PLLCLK。紧接着又遇到了一个开关SW,经过这个开关之后就是STM32的系统时钟(SYSCLK)了。通过这个开关,可以切换SYSCLK的时钟源,可以
选择为HSI、PLLCLK、HSE。我们选择为PLLCLK时钟,所以SYSCLK就为72MHz了。PLLCLK在输入到SW前,还流向了USB预分频器,这个分频器输出为USB外设的时钟(USBCLK)。回到SYSCLK,SYSCLK经过AHB预分频器,分频后再输入到其它外设。如输出到称为HCLK、FCLK的时钟,还直接输出到SDIO外设的
SDIOCLK时钟、存储器控制器FSMC的FSMCCLK时钟,和作为APB1、APB2的预分频器的输入端。GPIO外设是挂载在APB2总线上的, APB2的时钟是APB2预分频器的输出,而APB2预分频器的时钟来源是AHB预分频器。因此,把APB2预分频器设置为不分频,那么我们就可以得到GPIO外设的时钟也等于HCLK,为72MHz了。

        SYSCLK:系统时钟,STM32大部分器件的时钟来源。主要由AHB预分频器分配到各个部件。 
        HCLK:由AHB预分频器直接输出得到,它是高速总线AHB的时钟信号,提供给存储器,DMA及cortex内核,是cortex内核运行的时钟,cpu主频就是这个信号,它的大小与STM32运算速度,数据存取速度密切相关。 
        FCLK:同样由AHB预分频器输出得到,是内核的“自由运行时钟”。“自由”表现在它不来自时钟 HCLK,因此在HCLK时钟停止时 FCLK 也继续运行。它的存在,可以保证在处理器休眠时,也能够采样和到中断和跟踪休眠事件 ,它与HCLK互相同步。

       PCLK1:外设时钟,由APB1预分频器输出得到,最大频率为36MHz,提供给挂载在APB1总线上的外设。 
       PCLK2:外设时钟,由APB2预分频器输出得到,最大频率可为72MHz,提供给挂载在APB2总线上的外设。

 

//1. 实测程序表述不正确的的延时函数++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

// sys clk = 72Mhz, Fsys = 1/72Mhz
// 1000循环里面主要是 cmp, bcc, add三条指令。1000循环完以后,有个位数条数的装载Time值的指令,精度要求不高以及时间不参与累计时,误差可以忽略不计。
// T_Delay_ms = 1000* 3 * Fsys = 3*1000/72 us = 3*14us = 42us
// if(Time = 72000), delay = 3*1s;
// 实测结果: 6s //推断错误,差了两倍
void Delay_ms(unsigned int Time)
{
    unsigned int n;
    while(Time--)
        for(n=0;n<1000;n++);
}

// sys clk = 72Mhz, Fsys = 1/72Mhz
// 主要是sub, bne两条指令。
// T_Delay_us = 2 * Fsys = 2/72 us = 27ns
// if(nTime = 36) delay = 1us
// if(nTime = 200) delay = 400/72 us = 5.55us //推断错误, 差了5倍
void Delay_us(unsigned int nTime)
{
    while(nTime--);
}



Delay_ms(10); //840us  Delay_ms实际的效果是84us
Delay_ms(500);//42ms
Delay_ms(1000);//84ms
Delay_ms(10000);//840ms
Delay_ms(72000);//6s 

Delay_us(1);// 625ns
Delay_us(100);//13us
Delay_us(200);//25.6us
Delay_us(800);//100.4us
Delay_us(1600);//200us
Delay_us(3200);//400us

//2. 通过ndelay()解析系统的时钟++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void ndelay(void)
{
    __asm("NOP");    __asm("NOP");    __asm("NOP");    __asm("NOP");    __asm("NOP");    
    __asm("NOP");    __asm("NOP");    __asm("NOP");    __asm("NOP");    __asm("NOP");    
    __asm("NOP");    __asm("NOP");    __asm("NOP");    __asm("NOP");    __asm("NOP");    
    __asm("NOP");    __asm("NOP");    __asm("NOP");    __asm("NOP");    __asm("NOP");    
    __asm("NOP");    __asm("NOP");    __asm("NOP");    __asm("NOP");    __asm("NOP");    
    __asm("NOP");    __asm("NOP");    __asm("NOP");    __asm("NOP");    __asm("NOP");
    __asm("NOP");    __asm("NOP");    __asm("NOP");    __asm("NOP");    __asm("NOP");    __asm("NOP");
}

//ndelay()实测 1us,说明系统时钟: 36 * T_sys = 1us ; T_sys = 1/36 us; F_sys = 36Mhz, 这里和Delay_ms的推论有联系。
//STM32有三级流水线,指令周期不定的,arm给出的是1.25MIPS/Mhz,一个平均执行速度, 就是1Mhz的频率,每秒钟可以执行1.25M指令
//HCLK:由AHB预分频器直接输出得到,它是高速总线AHB的时钟信号,提供给存储器,DMA及cortex内核,是cortex内核运行的时钟,cpu主频就是这个信号,它的大小与STM32运算速度,数据存取速度密切相关。 
//根据代码的注释看, /* Select PLL as system clock source */ /* PLLCLK = 8MHz * 9 = 72 MHz */ /* HCLK = SYSCLK */ ,程序运行的时钟应该是 72 MHz。

 

相关文章:

  • BZOJ 1001 狼抓兔子 (网络流最小割/平面图的对偶图的最短路)
  • Material Design 控件
  • ARCproject中加入非ARC文件,或者非ARC环境中加入ARC文件
  • IOS开发UI篇--IOS动画(Core Animation)总结
  • css中的单位
  • 关于退运美国转基因玉米含有MRI 162转基因成分的质疑
  • Shiro基于组织机构的登录验证
  • maven部署构建到私服
  • Android 发送短信总结
  • 笔记 - 10.4、HTML - CSS滤镜笔记
  • Java BigDecimal详解
  • javap的使用
  • java面向对象中的方法重载与方法重写的区别
  • Hadoop2.7实战v1.0之Hive-2.0.0+MySQL本地模式安装
  • 封装常用的Javascript跨浏览器方法
  • [译]如何构建服务器端web组件,为何要构建?
  • css系列之关于字体的事
  • echarts的各种常用效果展示
  • Leetcode 27 Remove Element
  • mongodb--安装和初步使用教程
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • - 概述 - 《设计模式(极简c++版)》
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 如何设计一个微型分布式架构?
  • 优化 Vue 项目编译文件大小
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (1)STL算法之遍历容器
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (zhuan) 一些RL的文献(及笔记)
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (力扣)循环队列的实现与详解(C语言)
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .Net FrameWork总结
  • .NET多线程执行函数
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • @private @protected @public
  • [3300万人的聊天室] 作为产品的上游公司该如何?
  • [APIO2015]巴厘岛的雕塑
  • [C#][DevPress]事件委托的使用
  • [C++数据结构](22)哈希表与unordered_set,unordered_map实现
  • [Fri 26 Jun 2015 ~ Thu 2 Jul 2015] Deep Learning in arxiv
  • [Hive] 常见函数
  • [ios] IOS文件操作的两种方式:NSFileManager操作和流操作【转】
  • [JS]变量