RCC时钟模块并不好理解,初次接触我也是一头雾水,而且我真正掌握它的时候也比较晚,是我在学习uC/os-II,需要分析时钟时才有了深刻认识。但在学习中我却一定要把放在了前列,因为这是整个嵌入式最重要的基础之一,可以说是M3芯片的心脏。初学者理解是比较困难,但是掌握清晰对于嵌入式操作系统特别是Timer定时器以及通讯领域具有重大意义。下面进入正题,先上一章RCC模块的结构图:

初看此图是不是感觉太复杂了,事实上我第一次看这张图的时候也是的,完全理不清结构,不过不用担心,下面我就分层带你来理解这幅图。

(1)时钟源(4个晶振源,1个中介源)

HSI(RC):  内部高速晶振,~8MHz

HSE(Osc): 外部高速晶振(与电路设计时选择有关,25MHz)

LSE(Osc): 外部低速晶振(默认为32.768KHZ)

LSI(RC):  内部低速晶振,~40KHz

PLLCLK:  锁向环倍频输出,最大频率小于72MHz,注:PLLCLK来源HSE,HSE/2,HSI/2

(2)系统时钟源

     SYSCLK:  系统时钟

来源HSI,PLLCLK,HSE,若CSS(时钟监视系统)检测到HSE失效,SYSCLK = HSI;

(3)主要输出时钟源

HCLK:高性能总线时钟(SYSCLK通过AHB Prescaler,最高72MHZ)

PCLK1:外设1区域时钟(通过APB1 Prescaler,最高36MHZ)

PCLK2:外设2区域时钟(通过APB2 Prescaler,最高72MHZ)

  此外APB1,APB2外设时钟除了给对应外设区域提供时钟外,还可通过TIMERX Prescaler分配不同的定时器时钟。

     ADCCLK:ADC外设时钟(PCLK2通过ADC Prescaler)

USBCLK:通用串行接口时钟(PLLCLK通过USB Prescaler,等于48MHZ)

RTCCLK:实时时钟,来源LSI,LSE,HSE/128

IWDGCLK:独立看门狗时钟,来源LSI

MCO: 输出内部时钟

从上面看,我们前面学到的GPIOD外设还有后面的USART等的时钟都没有提到,为什么,其实它们包含在PCLK1,PCLK2这两个外设区域时钟里,也就是说他们的外设时钟来源于该区域的时钟。下面是STM32Fxxx固件函数库中15.2.22以及15.2.23所提到的图,包含所有外设对应的区域:

PCLK1时钟区域:

PCLK2时钟区域:

 通过上诉两张图可以清晰的知晓我在第一章节流水灯时时钟使能如此选择APB2外设的原因,当然我是以stm32f10x为例的,如果你使用不同的芯片就要去查相应的寄存器手册。了解了这些其实已经对系统时钟掌握差不多了,下面我就以寄存器控制方式展现嵌入式时钟的配置(库函数操作对于理解时钟配置过程的帮助并不大,特别只是单纯调用而没有理解每个函数内容的情况下)。

(4)系统时钟配置实例(以使用HSE晶振,最后系统时钟为50MHZ为例)

 注:RCC寄存器功能可参考《STM32中文参考手册》6.3(互联型产品)

unsigned char PLL = ;            //PLL为设定放大的倍数
unsigned char temp = ; //1.HSE时钟使能 //时钟控制寄存器 RCC->CR
RCC->CR &= <<; //使能HSE
While(!(RCC-CR)>>)); //判断HSE就绪标志位 //2.配置PLL,APB2,APB1,AHB //时钟配置寄存器RCC->CFGR
RCC->CFGR |= 0x00000400;
PLL-=;                 //AHBCLK = SysTick, APB2CLK = AHBCLK,APB1CLK = AHBCLK/2
RCC->CFGR |= PLL<<;        //参考寄存器功能表,0010~4倍,依次增加,最大9倍 RCC->CFGR |= <<; //HSE/2作为PLL的输入
//3.FLASH预存取即时钟配置            //FLASH预存取寄存器FLASH->ACR
//注:具体参见《STM32闪存flash编程》,但有一点要注意,系统时钟大于30MHZ后一定需要配置,默认24MHZ后就需要配置
FLASH->ACR |= 0x32;     //开启预存取,2个等待周期

//4.PLL使能    //时钟控制寄存器 RCC->CR
RCC->CR |= <<;    //PLL使能
while(!(RCC->CR>>)); //判断PLL使能标志位 //5.PLL作为系统时钟
RCC->CFGR | = 0x00000002; //PLL作为系统时钟
while(temp!=0x02) //PLL成功作为系统时钟,标志位
{
  temp= RCC->CFGR>>;
  temp&= 0x03;
}

  通过上述方式就完成了时钟的一般外设的时钟初始化设置,配置系统时钟50MHZ,APB2外设时钟50MHZ,APB1外设时钟25MHZ,理解了这些,延时时间和通讯速率等通过计算即可精确的知晓,这对于整个stm32的学习以及后续理解嵌入式实时操作系统都具有重要意义。

STM32学习笔记(四) RCC外设的学习和理解的更多相关文章

  1. 《深入理解java虚拟机》学习笔记四/垃圾收集器GC学习/一

    Grabage Collection      GC GC要完毕的三件事情: 哪些内存须要回收? 什么时候回收? 怎样回收? 内存运行时区域的各个部分中: 程序计数器.虚拟机栈.本地方法栈这3个区域随 ...

  2. Linux学习笔记(四) vi编辑器

    一.vi 编辑器 vi 编辑器 (Visual Interface) 是所有 Unix 及 Linux 系统下标准的编辑器,相当于 Windows 系统中的记事本 它有三种模式,分别是: Comman ...

  3. C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻

    前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...

  4. IOS学习笔记(四)之UITextField和UITextView控件学习

    IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...

  5. java之jvm学习笔记四(安全管理器)

    java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...

  6. Learning ROS for Robotics Programming Second Edition学习笔记(四) indigo devices

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  7. javascript学习笔记(四) Number 数字类型

    数字格式化方法toFixed().toExponential().toPrecision(),三个方法都四舍五入 toFixed() 方法指定小数位个数  toExponential() 方法 用科学 ...

  8. Typescript 学习笔记四:回忆ES5 中的类

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  9. ES6学习笔记<四> default、rest、Multi-line Strings

    default 参数默认值 在实际开发 有时需要给一些参数默认值. 在ES6之前一般都这么处理参数默认值 function add(val_1,val_2){ val_1 = val_1 || 10; ...

随机推荐

  1. fuelux.tree用法

    ACE中带了一个树,样式和操作挺好看的,就是难用,下面记录下如何使用. 首先fuelux.tree接受的数据源是Json,关键这个Json还不怎么标准,可接受的Json示例如下: { '刑侦': { ...

  2. iOS后台定位,实时向服务器发送最新位置

    第一步,开启后台模式,选中定位,选择project --> capabilities-->Backgorund Modes --> Location updates 如图: Past ...

  3. CentOS修改mysql 用户root的密码并允许远程登录

    第一步:用帐号登录mysql[root@CentOs5 ~]# mysql -u root -p 第二步:改变用户数据库mysql> use mysql 第三步:修改密码,记得密码要用passw ...

  4. [BS-27] 创建NSURL的几个方法的区别

    创建NSURL的几个方法的区别     URL的基本格式 = 协议://主机地址/路径 URL和Path的区别 * URL:统一资源定位符,格式 “协议+主机名称+路径”   例如:[NSURL UR ...

  5. MVC项目实践,在三层架构下实现SportsStore,从类图看三层架构

    在"MVC项目实践,在三层架构下实现SportsStore-02,DbSession层.BLL层"一文的评论中,博友浪花一朵朵建议用类图来理解本项目的三层架构.于是就有了本篇: I ...

  6. 数据库的Instance/Crash Recovery

    crash recovery是指单实例数据库发生了failure.或者rac数据库中的所有实例都发生了failure后进行的recovery.rac数据库crash后,rac中第一个重启启动的inst ...

  7. 20145320 《Java程序设计》第2周学习总结

    20145320 <Java程序设计>第2周学习总结 教材学习内容总结 3.1 类型.变量与运算符 基本类型 整数(short.int.long) .字节(byte) .浮点数(float ...

  8. Maven聚合与继承的实例讲解(二)

    继续上一节讲Maven的内容,我们这个节继续讲Maven继承和聚合的其他内容.    现在我们新建一个实例来测试Maven有关于聚合的部分     测试开始 一.建立以pom为packaging的项目 ...

  9. 树的Prufer 编码和最小生成树计数

      Prufer数列 Prufer数列是无根树的一种数列.在组合数学中,Prufer数列由有一个对于顶点标过号的树转化来的数列,点数为n的树转化来的Prufer数列长度为n-2.它可以通过简单的迭代方 ...

  10. R.java 文件内报错:Underscores can only be used with source level 1.7 or greater。

    R.java 文件内报错:Underscores can only be used with source level 1.7 or greater 网上查找后得知是Android工程图片资源命名的问 ...