嵌入式c语言——学习笔记

嵌入式c语言——学习笔记5

一、STM32系统架构

STM32主系统主要是由四个驱动单元和四个被动单元构成:

嵌入式c语言——学习笔记

嵌入式c语言——学习笔记

四个驱动单元:(图4.2.1中②③④)

①内核DCode总线
②系统总线
③通用DMA1
④通用DMA2

四个被动单元:(图4.2.1中⑥⑦⑧⑨)

⑥AHB到APB的桥:连接所有的APB设备
⑦内部flash闪存
⑧内部SRAM
⑨FSMC

图4.2.1中六个总线:

ICode总线:该总线将M3内核指令总线和闪存指令接口相连,指令的预取在该总线上面完成。
DCode总线:该总线将M3内核的DCode总线与闪存存储器的数据接口相连接,常量加载和调试访问在该总线上面完成。
系统总线:该总线连接M3内核的系统总线到总线矩阵,总线矩阵协调内核和DMA间访问。
DMA总线:该总线将DMA的AHB主控接口与总线矩阵相连,总线矩阵协调CPU的DCode和DMA到SRAM,闪存和外设的访问。
总线矩阵:总线矩阵协调内核系统总线和DMA主控总线之间的访问仲裁,仲裁利用轮换算法。
AHB/APB桥:这两个桥在AHB和2个APB总线间提供同步连接,APB1操作速度限于36MHz,APB2操作速度全速(72MHz)。

二、时钟系统

时钟定义:时钟是单片机运行的基础,时钟信号推动单片机内各个部分执行相应的指令。时钟系统就是CPU的脉搏,决定cpu速率,像人的心跳一样 只有有了心跳,人才能做其他的事情,而单片机有了时钟,才能够运行执行指令,才能够做其他的处理 (点灯,串口,ADC),时钟的重要性不言而喻。

总结:

  • STM32时钟系统主要的目的就是给相对独立的外设模块提供时钟,也是为了降低整个芯片的耗能
  • 系统时钟,是处理器运行时间基准(每一条机器指令一个时钟周期)
  • 时钟是单片机运行的基础,时钟信号推动单片机内各个部分执行相应的指令。
  • 一个单片机内提供多个不同的系统时钟,可以适应更多的应用场合。
  • 不同的功能模块会有不同的时钟上限,因此提供不同的时钟,也能在一个单片机内放置更多的功能模块。
    对不同模块的时钟增加开启和关闭功能,可以降低单片机的功耗
  • STM32为了低功耗,他将所有的外设时钟都设置为disable(不使能),用到什么外设,只要打开对应外设的时钟就可以, 其他的没用到的可以还是disable(不使能),这样耗能就会减少。  这就是为什么不管你配置什么功能都需要先打开对应的时钟的原因

STM32的时钟系统框图

嵌入式c语言——学习笔记

系统时钟有很多种选择,系统时钟SYSCLK 的左边的部分就是设置系统时钟使用那个时钟源;  系统时钟SYSCLK 的右边,则是系统时钟通过AHB预分频器,给相对应的外设设置相对应的时钟频率。

从左到右可以简单理解为:各个时钟源--->系统时钟来源的设置--->各个外设时钟的设置 

 

在 STM32 中,有五个时钟源,为 HSI、HSE、LSI、LSE、PLL。从时钟频率来分可以分为高速时钟源和低速时钟源,在这 5 个中 HIS,HSE 以及 PLL 是高速时钟,LSI 和 LSE 是低速时钟。从来源可分为外部时钟源和内部时钟源,外部时钟源就是从外部通过接晶振的方式获取时钟源,其中 HSE 和 LSE 是外部时钟源,其他的是内部时钟源。下面是 STM32 的 5 个时钟源:

嵌入式c语言——学习笔记

HSI 是高速内部时钟,RC 振荡器,频率为 8MHz
HSE 是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。我们的开发板接的是 8M 的晶振
LSI 是低速内部时钟,RC 振荡器,频率为 40kHz独立看门狗的时钟源只能是 LSI,同时 LSI 还可以作为 RTC 的时钟源
LSE 是低速外部时钟,接频率为 32.768kHz 的石英晶体。这个主要是 RTC 的时钟源。
PLL 为锁相环倍频输出,其时钟输入源可选择为 HSI/2、HSE 或者 HSE/2。倍频可选择为2~16 倍,但是其输出频率最大不得超过 72MHz

A、MCO 是 STM32 的一个时钟输出 IO(PA8),它可以选择一个时钟信号输出,可以选择为 PLL 输出的 2 分频、HSI、HSE、或者系统时钟。这个时钟可以用来给外部其他系统提供时钟源。

B、这里是 RTC 时钟源,从图上可以看出,RTC 的时钟源可以选择 LSI,LSE,以及HSE 的 128 分频。

C、从图中可以看出 C 处 USB 的时钟是来自 PLL 时钟源。STM32 中有一个全速功能的 USB 模块,其串行接口引擎需要一个频率为 48MHz 的时钟源。该时钟源只能从 PLL 输出端获取,可以选择为 1.5 分频或者 1 分频,也就是,当需要使用 USB
模块时,PLL 必须使能,并且时钟频率配置为 48MHz 或 72MHz

D、D 处就是 STM32 的系统时钟 SYSCLK它是供 STM32 中绝大部分部件工作的时钟源。系统时钟可选择为 PLL 输出、HSI 或者 HSE。系统时钟最大频率为72MHz,当然你也可以超频,不过一般情况为了系统稳定性是没有必要冒风险去超频的。

E、这里的 E 处是指其他所有外设了。从时钟图上可以看出,其他所有外设的时钟最终来源都是 SYSCLK。SYSCLK 通过 AHB 分频器分频后送给各模块使用。其中,模块包括:

①AHB 总线、内核、内存和 DMA 使用的 HCLK 时钟
②通过 8 分频后送给 Cortex 的系统定时器时钟,也就是 systick 了。
③直接送给 Cortex 的空闲运行时钟 FCLK
④送给 APB1 分频器。APB1 分频器输出一路供 APB1 外设使用(PCLK1,最大频率 36MHz),另一路送给定时器(Timer)2、3、4 倍频器使用。
⑤送给 APB2 分频器。APB2 分频器分频输出一路供 APB2 外设使用(PCLK2,最大频率 72MHz),另一路送给定时器(Timer)1 倍频器使用。

APB1 和 APB2 的区别:APB1 上面连接的是低速外设,包括电源接口、备份接口、CAN、USB、I2C1、I2C2、UART2、UART3 等等;APB2 上面连接的是高速外设包括 UART1、SPI1、Timer1、ADC1、ADC2、所有普通 IO 口(PA~PE)、第二功能 IO 口等。居宁老师的《稀里糊涂玩 STM32》资料里面教大家的记忆方法是 2>1, APB2 下面所挂的外设的时钟要比 APB1 的高。

SystemInit()函数中设置的系统时钟大小总结:

SYSCLK(系统时钟) =72MHz
AHB总线时钟(使用SYSCLK) =72MHz
APB1总线时钟(PCLK1) =36MHz
APB2总线时钟(PCLK2) =72MHz
PLL时钟 =72MHz

 

 

上一篇:element-ui vue子组件调用父组件($parent)的坑


下一篇:replication crash safe