我们每次在新建工程中对外设模块进行初始化的第一步就是RCC开启时钟
我刚开始学的时候对这个没什么概念,就只知道初始化之前要开启时钟,就要用RCC相关的函数,得过且过照着别人的代码敲,但是程序多写几个就会疑惑时钟到底是什么,为什么必须要开启……带着这些疑问我查阅了一些资料和其他大佬的博客,总结成了这一篇文章
其实RCC在STM32参考手册里有详细介绍,很多,有兴趣可以看看
详情可以参考 :STM32F10xxx参考手册(中文).pdf
链接: https://pan.baidu.com/s/14Md6vDMiS4uXUT0Nz6V5nw?pwd=ugx4
提取码: ugx4
时钟的基本概念
时钟是指用于同步系统操作、控制外设工作频率以及管理数据传输的信号
时钟是单片机运行的基础,时钟信号推动单片机内各个部分执行相应的指令
时钟系统就是CPU的脉搏,决定cpu速率,像人的心跳一样 只有有了心跳,人才能做其他的事情,而单片机有了时钟,才能够运行执行指令,才能够做其他的处理 (点灯,串口,ADC),时钟的重要性不言而喻
[引用文章 系统时钟RCC详解(超详细,超全面) 中的内容]
与时钟相关的基本概念
-
时钟频率:时钟频率指的是时钟信号的周期性重复次数,通常以赫兹(Hz)为单位表示。它表示每秒钟时钟信号的发生次数。较高的时钟频率可以提供更高的系统性能,但也会增加功耗和热量
-
时钟周期:时钟周期是时钟信号完成一个完整周期所需的时间。它是时钟频率的倒数,表示一个时钟周期的持续时间。例如,一个1 MHz的时钟频率对应的时钟周期为1微秒(1μs)
-
时钟源:时钟源是提供时钟信号的来源。在计算机系统中,可以使用外部晶体振荡器、外部时钟信号或内部振荡器作为时钟源
-
时钟同步:时钟同步是确保多个组件或设备使用相同的时钟信号进行操作的过程。同步时钟信号可以确保系统的稳定性和可靠性,避免数据损坏或操作错误
-
时钟分频器:时钟分频器是一种用于减小时钟频率的电路或模块。它可以通过将时钟信号分频来降低系统时钟频率,以适应特定的需求。分频器可以将高频时钟信号分成较低频率的时钟信号
-
时钟延迟:时钟延迟是指由于时钟信号的传播和处理所引入的时间延迟。在计算机系统中,时钟延迟可能会对操作的准确性和性能产生影响。因此,在设计和优化系统时,需要考虑和管理时钟延迟
[引用文章 STM32的时钟系统(嵌入式学习) 中的内容]
时钟系统的组成
STM32微控制器内部有一个时钟树结构,负责将主时钟信号分配到各个外设和子系统,这个时钟树通过RCC(Reset and Clock Control)模块进行配置和管理
可以把时钟树理解为时钟系统框图
看起来有些复杂,但是只需要将该框图以系统时钟SYSCLK为中心分为左右两部分理解
【分析】
-
时钟源(左边部分):STM32 有4个独立时钟源:HSI、HSE、LSI、LSE
-
系统时钟SYSCLK:系统时钟SYSCLK可来源于三个时钟源,最大为72MHz
- HSI振荡器时钟
- HSE振荡器时钟
- PLL时钟
-
系统时钟通过AHB分频器给外设提供时钟【重点】(右边部分)
从左到右可以简单理解为:
系统时钟 ➡️ AHB分频器 ➡️ 各个外设分频倍频器 ➡️ 外设时钟的设置
系统时钟SYSCLK通过AHB分频器分频后送给各模块使用,AHB分频器可选择1、2、4、8、16、64、128、256、512分频。其中AHB分频器输出的时钟送给5大模块使用:
- **内核总线:**送给AHB总线、内核、内存和DMA使用的HCLK时钟
- **TIMxCLK定时器:**通过8分频后送给Cortex的系统定时器时钟
- I2S总线:直接送给Cortex的空闲运行时钟FCLK
- APB1外设:
送给APB1分频器,APB1分频器可选择1、2、4、8、16分频,其输出一路供APB1外设使用(PCLK1,最大频率36MHz),另一路送给通用定时器使用
该倍频器可选择1或者2倍频,时钟输出供定时器2~7使用 - APB2外设:
送给APB2分频器,APB2分频器可选择1、2、4、8、16分频,其输出一路供APB2外设使用(PCLK2,最大频率72MHz),另一路送给高级定时器
该倍频器可选择1或者2倍频,时钟输出供定时器1和定时器8使用
APB1和APB2的对应外设:参考 STM32F10xxx参考手册
RCC的概念
在STM32中,RCC(Reset and Clock Control)是时钟和复位控制模块
它负责管理系统时钟的生成和分配,以及控制外设的复位和时钟开启/关闭
RCC的主要功能包括:
- 时钟源选择:RCC可以选择不同的时钟源,比如内部振荡器、外部晶振等
- 时钟配置:可以配置主时钟、外设时钟等,以满足不同外设的工作频率需求
- 复位控制:RCC可以对各个外设进行复位,确保在系统初始化时外设处于已知状态
- 时钟使能/禁用:动态地开启或关闭外设的时钟,以节省功耗
通过RCC配置,开发者可以优化STM32的性能和功耗,确保系统在不同工作条件下稳定运行
RCC相关函数
在标准库函数 stm32f10x_rcc.h 文件中可以查看RCC相关函数,在 stm32f10x_rcc.c 文件中查看函数的具体定义
详细的说明也可以参考 RCC库函数 这篇文章的讲解
在这里只介绍三个最常用的函数
void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);
//使能或者失能挂载到AHB总线上的外设时钟
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
//使能或者失能挂载到APB2高速总线上的外设时钟
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);
//使能或者失能挂载到APB1低速总线上的外设时钟
这只是对时钟系统和RCC的简单讲解,如果是入门的话先理解这些就足够了,在以后的工程中见的多了自然就懂了,反正不要急,慢慢来
标签:分频器,系统,STM32,RCC,外设,时钟 From: https://blog.csdn.net/m0_74209563/article/details/143307037