嵌入式c语言——学习笔记5
一、STM32系统架构
STM32主系统主要是由四个驱动单元和四个被动单元构成:
四个驱动单元:(图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的时钟系统框图
系统时钟有很多种选择,系统时钟SYSCLK 的左边的部分就是设置系统时钟使用那个时钟源; 系统时钟SYSCLK 的右边,则是系统时钟通过AHB预分频器,给相对应的外设设置相对应的时钟频率。
从左到右可以简单理解为:各个时钟源--->系统时钟来源的设置--->各个外设时钟的设置
在 STM32 中,有五个时钟源,为 HSI、HSE、LSI、LSE、PLL。从时钟频率来分可以分为高速时钟源和低速时钟源,在这 5 个中 HIS,HSE 以及 PLL 是高速时钟,LSI 和 LSE 是低速时钟。从来源可分为外部时钟源和内部时钟源,外部时钟源就是从外部通过接晶振的方式获取时钟源,其中 HSE 和 LSE 是外部时钟源,其他的是内部时钟源。下面是 STM32 的 5 个时钟源:
①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