解析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。

 

转载于:https://www.cnblogs.com/mylinux/p/5306154.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/418764.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 接口式自定义回调函数

定义接口 package com.zjxnjz.mall.admin.test;public interface CallBack {void handler(String message);}测试 package com.zjxnjz.mall.admin.test;public class TestCallBack {public static void setHello(CallBack callback) {int count0;while(count<100) {count;…

前端学习(1841):前端面试题之react和vue区别

相同点 都有组件化开发和Virtual DOM都支持props进行父子组件间数据通信都支持数据驱动视图, 不直接操作真实DOM, 更新状态数据界面就自动更新都支持服务器端渲染都有支持native的方案,React的React Native,Vue的Weex 不同点 数据绑定: vue实现了数据的双向绑定,react数据流动是…

94--SKU检索

1.SKU就是指每种商品&#xff0c;各种参数不同的就是一种 2.为什么用and,因为这个and用括号把or条件括起来 3.ge大于 le 小于 4.打印日志 这个包下的所有debug都调成debug

redis 缓存 key常量命名规则

package com.awj.mall.restfulapi.common.consts;public class CacheConsts {// 短信验证码类型/*** 登录*/public static final String SMS_TYPE_LOGIN "cache:api:sms_login_";/*** 重置密码*/public static final String SMS_TYPE_RESETPWD "cache:api:sms…

谷粒商城---新增收货地址,设置默认地址实现

今天实现了新增收货地址&#xff0c;设置默认地址的功能。 1、接收两个参数&#xff1a; RequestMapping("/setdefualt") public R setdefualt(RequestParam("memberId")Integer memberId, RequestParam("id")Integer id){memberReceiveAddress…

mysql自增id获取失败

php 数据库pdo对象&#xff0c;如果是返回&#xff0c;如以下伪代码 function getData(){ return $data; } $data getData(); $id $data->lastInsertId(); 此时会获取不到&#xff0c;因为mysql的lastInsertId是和连接相关的&#xff0c;我猜想是返回后&#xff0c;这个数…

Map 的初始化

ImmutableMap 的一些使用&#xff1a;https://www.baeldung.com/java-immutable-maps package com.awj.mall.restfulapi.config;import java.util.HashMap; import java.util.Map;import com.google.common.collect.ImmutableMap;public class Test {public static void main(…

工作容易,赚钱很难

李宗盛有首歌的歌词里写到&#xff1a;「工作是容易的&#xff0c;赚钱是困难的」。乍一听感觉有点矛盾&#xff0c;工作的一个重要结果不就是赚钱么&#xff0c;为什么工作容易赚钱却难&#xff1f;但仔细一想就恍然其中想表达的意思了。 工作的本质是出售劳动价值&#xff0c…

spring框架中@PostConstruct的实现原理

https://www.cnblogs.com/supercj/p/10303645.html

【集合框架】JDK1.8源码分析HashSet LinkedHashSet(八)

一、前言 分析完了List的两个主要类之后&#xff0c;我们来分析Set接口下的类&#xff0c;HashSet和LinkedHashSet&#xff0c;其实&#xff0c;在分析完HashMap与LinkedHashMap之后&#xff0c;再来分析HashSet与LinkedHashSet&#xff0c;就会变成异常简单&#xff0c;下面开…

JavaScript实现快速排序

快速排序是各大IT公司面试必考算法题之一&#xff0c;正好在百度前端技术学院&#xff08;IFE&#xff09;做任务时遇到一道题&#xff0c;要求可视化一个排序算法的计算过程&#xff0c;我第一时间就想到了用JS手写一个快排算法&#xff0c;正好作为练手。 // 快速排序 functi…

js函数节流

我们知道&#xff0c;js有些事件例如resize&#xff0c;mousemove等是会不间断触发的&#xff0c;例如我们简单的一个scroll事件&#xff1a; function scrollFn(){console.log(1) } window.onscrollscrollFn 我们需要在滚动的时候去做一些事情&#xff0c;如上图可见&#…

前端学习(1841):前端面试题之redux管理状态机制

对Redux基本理解 redux是一个独立专门用于做状态管理的JS库, 不是react插件库它可以用在react, angular, vue等项目中, 但基本与react配合使用作用: 集中式管理react应用中多个组件共享的状态和从后台获取的数据 Redux的工作原理Redux使用扩展 使用react-redux简化redux的编码使…

@DateTimeFormat 和 @JsonFormat 注解

https://blog.csdn.net/zhou520yue520/article/details/81348926