RCC外设的学习和理解(有几点新的认识20171113)

2023-11-29 10:32

本文主要是介绍RCC外设的学习和理解(有几点新的认识20171113),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

4. RCC外设的学习和理解http://blog.csdn.net/zc1107473010/article/details/45190093

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,理解了这些,后续程序运行时所花费的时间通过计算即可精确的知晓,这对于整个嵌入式的学习以及之后理解实时操作系统都是很有帮助的。


这篇关于RCC外设的学习和理解(有几点新的认识20171113)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/432495

相关文章

一文带你理解Python中import机制与importlib的妙用

《一文带你理解Python中import机制与importlib的妙用》在Python编程的世界里,import语句是开发者最常用的工具之一,它就像一把钥匙,打开了通往各种功能和库的大门,下面就跟随小... 目录一、python import机制概述1.1 import语句的基本用法1.2 模块缓存机制1.

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的

深入理解Redis大key的危害及解决方案

《深入理解Redis大key的危害及解决方案》本文主要介绍了深入理解Redis大key的危害及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、背景二、什么是大key三、大key评价标准四、大key 产生的原因与场景五、大key影响与危

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

每天认识几个maven依赖(ActiveMQ+activemq-jaxb+activesoap+activespace+adarwin)

八、ActiveMQ 1、是什么? ActiveMQ 是一个开源的消息中间件(Message Broker),由 Apache 软件基金会开发和维护。它实现了 Java 消息服务(Java Message Service, JMS)规范,并支持多种消息传递协议,包括 AMQP、MQTT 和 OpenWire 等。 2、有什么用? 可靠性:ActiveMQ 提供了消息持久性和事务支持,确保消

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;