4.RCC外设的学习和理解

  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)

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

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

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

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

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

MCO: 输出内部时钟

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

PCLK1时钟区域:

PCLK2时钟区域:

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

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

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

unsigned char PLL = 4;          //PLL为设定放大的倍数
unsigned char temp = 0;

//1.HSE时钟使能                     //时钟控制寄存器 RCC->CR

RCC->CR &= 1<<16;                  //使能HSE

While(!(RCC-CR)>>17));             //判断HSE就绪标志位

//2.配置PLL,APB2,APB1,AHB          //时钟配置寄存器RCC->CFGR

RCC->CFGR |= 0x00000400; 

//AHBCLK = SysTick, APB2CLK = AHBCLK,APB1CLK = AHBCLK/2

PLL-=2;

RCC->CFGR |= PLL<<18;              //参考寄存器功能表,0010~4倍,依次增加,最大9倍

RCC->CFGR |= 3<<16;                //HSE/2作为PLL的输入

//3.FLASH预存取即时钟配置            //FLASH预存取寄存器FLASH->ACR

//注:具体参见《STM32闪存flash编程》,但有一点要注意,系统时钟大于30MHZ后一定需要配置,默认24MHZ后就需要配置

 FLASH->ACR |= 0x32;        //开启预存取,2个等待周期

//4.PLL使能                  //时钟控制寄存器   RCC->CR

RCC->CR |= 1<<24;           //PLL使能

while(!(RCC->CR>>25));      //判断PLL使能标志位

//5.PLL作为系统时钟

RCC->CFGR | = 0x00000002;   //PLL作为系统时钟

while(temp!=0x02)          //PLL成功作为系统时钟,标志位
{
  temp= RCC->CFGR>>2;
  temp&= 0x03;
}    

  通过上述方式就完成了时钟的一般外设的时钟初始化设置,配置系统时钟50MHZ,APB2外设时钟50MHZ,APB1外设时钟25MHZ,理解了这些,后续程序运行时所花费的时间通过计算即可精确的知晓,这对于整个嵌入式的学习以及之后理解实时操作系统都是很有帮助的。

时间: 2024-10-31 23:23:02

4.RCC外设的学习和理解的相关文章

SSH加密原理、RSA非对称加密算法学习与理解

首先声明一下,这里所说的SSH,并不是Java传统的三大框架,而是一种建立在应用层和传输层基础上的安全外壳协议,熟悉Linux的朋友经常使用到一 个SSH Secure Shell Cilent的工具,本文也是基于此工具加密原理的学习,在SSH的加密原理中,使用到了RSA非对称加密算法,本文也一并做了学习和了解. 非对称加密算法 在日常的工作生产中, 我们经常需要进行数据的通讯,开发人员经常需要对数据进行加解密操作,以保证数据的安全.数据的加密算法非为对称加密和非对称加密两种,常用的DES.三

JDK学习---深入理解java中的LinkedList

本文参考资料: 1.<大话数据结构> 2.http://blog.csdn.net/jzhf2012/article/details/8540543 3.http://blog.csdn.net/jzhf2012/article/details/8540410 4.http://www.cnblogs.com/ITtangtang/p/3948610.html 5.http://blog.csdn.net/zw0283/article/details/51132161 本来在分析完HashSe

一名工程师对于深度学习的理解-神经网络基础ANN

原文链接 序 读书期间对于深度学习也有涉及,不过只是皮毛,在这个数据和算法的时代,也需要更加贴近算法.于是从一名工程师角度出发,希望通过几篇文章,将深度学习基础记录下来,同时也是对于自己学习的总结和积累.总体思路是ANN-CNN-DNN,中间想起来有什么忘记的,也会加番. 神经网络概述 这是一张典型的人工神经网络的图,图中的节点称为神经元,图共分为三层,第一层为输入层,第二层为隐藏层,第三层为输出层.输入层接受外部世界的输入,具像化为图像的像素值,实体的特征值等,输出层概率预测结果,具像化为该图

对属性动画ObjectAnimator.ofObject方法的学习和理解

关于对属性动画 ObjectAnimator.ofObject(view, "position", new PointEvaluator(), pStart, pEnd); 方法的学习和理解,做个总结,也当做笔记记在这里,遗忘的时候以便查阅,也希望能帮助正在学习这块知识的同学. 这个方法的主要作用是根据一定的规则对目标对象的某个具体属性进行改变,从而使目标对象实现与该属性相关的动画效果. 参数的讲解: 第一个参数:动画的实施对象 第二个参数:关键词,在动画的实施对象中必须要有一个 &q

python基础知识的学习和理解

参考链接:https://github.com/yanhualei/about_python/tree/master/python_learning/python_base python基础知识笔记 Flask aiohttp的学习和理解 assert() asyncio的学习和理解 continue_break学习和理解 cprofile代码效率分析 datatime dict字典学习与理解 django_project eval() filter() gevent协程的学习和理解 http服

对英语语法定语从句学习的理解

学习英语语法,首先要了解英语有哪些句型? 从轮廓上大致知道英语的形,从而能够建立对英语的初步认识. 英语句子分为5中基本句型 1.主谓(i do)2.主谓宾(l like you) 3.主谓双宾(i buy you gifts) 4.主谓宾补(you make me happy) 5.主系表(l am a boy) 英语中都有哪些成分? 由形在到内部详细构造,主要有定语,同位语,插入语,状语,(其他不再多说) 定语的识别? 1.前置定语(忽略不计)2.后置定语 后置定语(1.形容词性短语 2.现

学习和理解C#的委托

去年自学C#用的教程是入门级的<学通C#的24堂课>,教材里面也没有提到委托和事件,工作中也没怎么用到.后来一次在网上看了一些大牛的博客,读完之后感觉懵懵懂懂,似懂非懂,过了两三天之后,却又全然忘记了.毕竟学习这事,温故而知新,学了不用,自然忘得也很快.对于如我一样的初学者来说,较好地理解委托和事件并是一件容易的事.其实掌握了的人,会觉得也没什么,而没有掌握的人,每次见到委托和事件就会觉得很畏惧.前段时间看到张旭亮老师的博客中关于.NET 开发系列PPT中提到一个观点,没学会委托就等不会.NE

[express.js学习笔记]理解Router

(本文内容纯属个人理解,仅供学习探讨) 博主的工作用的是Java Web,私下对JavaScript很感兴趣,也就接触了Node.js,听过Node一般使用Express来搭建Web服务器,就找到了Express,开始阅读文档和例子. 发现官方文档API页面的导航列出了express的几个核心的类(对象): 1. express 2. Application 3. Request 4. Response 5. Router 其中,按照我的理解,express是一个Application对象的工厂

PHP面向对象三大特点学习(充分理解抽象、封装、继承、多态)

PHP面向对象三大特点学习 学习目标:充分理解抽象.封装.继承.多态 面象对向的三大特点:封装性.继承性.多态性 首先简单理解一下抽象:我们在前面定义一个类的时候,实际上就是把一类事物共有的属性和行为提取出来,形成一个物理模型(模版),这种研究问题的方法称为抽象 一.封装性 封装就是把抽取出来的数据和对数据的操作封装在一起,数据被保护在内部,程序的其他部分只有被授权的操作(方法)才能对数据进行操作. php提供了三种访问控制修饰符 public 表示全局,本类内部,类外部,子类都可以访问 pro