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

相关文章

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示

spring IOC的理解之原理和实现过程

《springIOC的理解之原理和实现过程》:本文主要介绍springIOC的理解之原理和实现过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、IoC 核心概念二、核心原理1. 容器架构2. 核心组件3. 工作流程三、关键实现机制1. Bean生命周期2.

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

深入理解Apache Kafka(分布式流处理平台)

《深入理解ApacheKafka(分布式流处理平台)》ApacheKafka作为现代分布式系统中的核心中间件,为构建高吞吐量、低延迟的数据管道提供了强大支持,本文将深入探讨Kafka的核心概念、架构... 目录引言一、Apache Kafka概述1.1 什么是Kafka?1.2 Kafka的核心概念二、Ka

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

深入理解Apache Airflow 调度器(最新推荐)

《深入理解ApacheAirflow调度器(最新推荐)》ApacheAirflow调度器是数据管道管理系统的关键组件,负责编排dag中任务的执行,通过理解调度器的角色和工作方式,正确配置调度器,并... 目录什么是Airflow 调度器?Airflow 调度器工作机制配置Airflow调度器调优及优化建议最

一文带你理解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影响与危