你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

为什么要先开启STM32外设时钟?

[复制链接]
攻城狮Melo 发布时间:2023-4-2 15:38
今天给大家分享两点内容:4 {- z$ R7 o* S' m9 Y4 [
一是,为什么我们要先开启STM32外设时钟;二是,关于STM32的 I/O 复用功能及什么时候开启AFIO时钟。
* ^! q2 i. Q6 p& S5 U3 L1 R
STM32为什么要先开启外设时钟?
相信很多朋友都曾遇到过这种坑,我最初学习STM32的时候同样也遇到过。下面,我就来说说为什么我们要先开启STM32外设模块时钟,再对其外设模块初始化配置?

' o+ s5 g! ~" o3 ?* f) z5 w
1、系统架构

不同类型的STM32,它的系统架构各有不同,但原理都类似,由多条主控总线和多条被控总线组成(请参看【参考手册】存储器和总线架构章节)。

3 b* V: H1 W+ ^1 x3 [

以STM32F4为例:

八条主控总线:
— Cortex™-M4F 内核 I 总线、 D 总线和 S 总线— DMA1 存储器总线
+ |1 D3 w0 u. R0 e+ |$ ^— DMA2 存储器总线1 Q# Q) \% }' s* y" \3 `2 ?
— DMA2 外设总线
* D' C0 O) l, b$ |— 以太网 DMA 总线
* f8 v& h) b' C) g7 {. t$ d& K. B— USB OTG HS DMA 总线: L: m$ [+ o) g3 b4 m+ h9 B
七条被控总线:
8 f! G# p$ U' I5 J— 内部 Flash ICode 总线, a) Z) H( j. o3 U' p' L& I# u
— 内部 Flash DCode 总线
! V2 p& s; `" ?) B— 主要内部 SRAM1 (112 KB)  `5 z. s- ]7 j; c! x
— 辅助内部 SRAM2 (16 KB). E# h# C! E/ H# M
— 辅助内部 SRAM3 (64 KB)(仅适用于 STM32F42xxx 和 STM32F43xxx 器件)5 B5 S" w' A) u# ]) K, _
— AHB1 外设(包括 AHB-APB 总线桥和 APB 外设)
' l3 F% n' c$ \5 f— AHB2 外设— FSMC7 u4 [& W' A- K& ^% w$ d( d* `3 G
; V8 N! Z* n( Z$ M- A( x' l
微信图片_20230402153829.jpg 3 Q% j- H) B5 M) [% ]2 x

9 R, \+ l7 C0 j
借助总线矩阵,可以实现主控总线到被控总线的访问,这样即使在多个高速外设同时运行期间,系统也可以实现并发访问和高效运行。, A8 f0 I/ Z$ g: w# P! [/ ]+ C
8 i' w( w1 j# I0 f
2、关于AHB和APB总线5 r$ {1 ^/ p+ n7 L' h" J0 ?
AHB:Advanced High-performance Bus,即先进的高性能总线。- u2 K& m( E- |6 F- c6 c) a
APB:Advanced Peripheral Bus,即先进的外围(外设)总线。
- T& u# c  N. Z: Y, p
上面说了系统总线的架构引伸出来的就是AHB和APB总线,那为什么要讲述AHB和APB总线呢?. Z4 A/ o6 W4 q& n! l$ \
我们操作的外围设备一般都是位于AHB和APB总线上,而AHB可以引伸出AHB1、AHB2,甚至AHB3。同样APB也存在APB1、APB2等。
8 m' E- M2 f1 d6 q" }
比如,USART1外设位于APB1总线上,GPIOA位于AHB1高速总线上。4 J- D  l% k9 I- P; ?$ s$ q& j. s
请注意参考手册中“AHB/APB 总线桥”这一小节,有一条重要的内容:每次芯片复位后,所有外设时钟都被关闭( SRAM 和 Flash 接口除外)。使用外设前,必须在 RCC_AHBxENR 或 RCC_APBxENR 寄存器中使能其时钟
: c7 f& W: e& s2 `5 H" Q7 E
# o* k5 L3 O6 r' \, g2 C& m  `6 M
3、STM32时钟控制
' I9 |8 Q) Q4 P9 o4 j
- i7 `! N6 f0 o* d$ P" V" e
微信图片_20230402153823.jpg
) ?9 o0 @( N/ h9 p6 Q6 W- K4 q( R1 v1 s2 b; D5 P( H3 Y+ Y8 s
STM32的时钟控制模块因MCU芯片不同,各有差异,但原理都类似,功能也相当丰富。主要的目的就是给相对独立的外设模块提供时钟,也是为了降低整个芯片的功能。* G( K9 s4 G. B# \
0 E& C) Q! |( V
降低功耗是主要原因,还有一个原因,就是为了兼容不同速度的设备,有些高速,有些低速,如果都用高速时钟,势必造成浪费。" F9 u( f, M* V& D- F. _; r- _
$ G: j7 g; Y3 t5 D
RCC给外设提供时钟是一个主要目的,那么为什么要提供时钟呢? 原因在于外围设备的寄存器需要时钟才能工作。你可以把外设当做一个设备,而这个设备需要给它提供电源(时钟)才能工作。; l3 J2 r9 @  k0 y3 I: R( h/ O

- a, G5 O9 t% [: O
你在STM32参考手册的“RCC”章节可能会看到这么一句话:当外设时钟没有启用时,软件不能读出外设寄存器的数值,返回的数值始终是0x0! V1 ?5 B+ b) R: N. J
; ~1 W# F& p4 a+ z; w0 z
4、总结
- t. ~$ ~) m& E( D2 s
看到这里,相信聪明的你已经明白了为什么我们要先开启STM32外设模块时钟,再配置其外设模块了。
8 D. ?; n$ U. \/ V; u4 H  d4 f
简单来说,就是操作外设是通过外设总线来实现,只有外设总线有时钟了才能操作外设。
  y0 T4 C( l* [3 t' Z( @( S: _+ P
坑:( p0 w1 }1 \; a. C
A.先使能外设时钟,再对其进行配置5 A) v( `/ P; u

$ B0 K& k) X8 |
微信图片_20230402153817.jpg 9 V- l( e  P6 n) Y* q: W1 T
- K1 I" H1 n1 M) n7 a' G
B.时钟配置需对应总线7 p' E% a# T. e/ Z) y: u8 G0 e

3 s& b6 Q1 P. G. X" b
微信图片_20230402153812.png
% q& k3 T5 L# X, A
) q! I+ y8 Y9 `4 V+ N
这种基于标准外设库的低级错误,相信肯定有不少人遇到过,希望提高警惕。" O% B2 S4 d( ^7 T9 w' f+ V8 V

( \7 A* H9 S/ s) y% L' R1 o; B
AFIO复用时钟
有朋友问:“什么时候开启AFIO时钟”。写了上面章节,就顺便再讲述一下关于STM32的I/O复用功能及什么时候开启AFIO时钟。
2 Q( V+ v8 H7 b, u# z* V4 e! R9 t
1、什么是I/O 复用功能?

简单来说,就是把普通I/O用作其它的功能。如:将PA9引脚用作USART1的Tx引脚,那么我们就把这个Tx引脚称为PA9的复用功能。


0 i1 F9 l; P- m  P

打开数据手册,会发现类似如下的列表:

- [; [. D$ `+ e5 u4 y: K. f

微信图片_20230402153800.jpg

( ?3 l1 J' R. T+ J: p
2、什么时候开启AFIO时钟?


/ ^4 @; m1 p8 p' \( Q) s8 ?) H$ ]

为了优化芯片引脚封装的外设数目,可以把一些复用功能重新映射到其他引脚上。设置复用重映射和调试I/O配置寄存器实现引脚的重新映射。这时,复用功能不再映射到它们的原始分配上,而是映射到“重定义功能”上(见上图)。

0 ^% S. k! q# c

这种将引脚重定义到其它引脚上的功能在几乎所有STM32芯片中都有这个功能,但是实现的方法可能有所不同,其中STM32F1就是通过事件控制的方式将特定功能引脚连接到对应PORT和PIN上。


1 I3 M+ q( u+ S- n4 t, I, W

简单来说,如果需要使用重定义功能,那么就需要开启AFIO时钟。+ m9 e' ~6 {5 E# l1 j& f4 v


0 u; p6 K3 `! I: M5 G7 _

最后,如果你觉得你的程序可能是因为时钟配置的问题,不妨上电第一步使能所有时钟试试。, C! m" B# B: O+ }: D

7 I% j. Z7 v& h; y, X4 q
! I$ D. [1 d2 y& v& Q0 p5 k' Q  l0 \. V4 j) e8 e3 f

. ^8 P( o1 M' {8 e2 E转载自:嵌入式微处理器9 ~8 w% S7 O: S: {
如有侵权请联系删除
5 ~: w' a: w* M: V% Q; K, ^
$ X0 h7 [( L6 f/ e5 `# I& v+ |, v

5 u1 b8 @1 w3 M3 u9 v
收藏 评论1 发布时间:2023-4-2 15:38

举报

1个回答
这辈子不打工 回答时间:2024-12-16 19:58:06

我以前以为只要启用复用(AFIO)功能就需要开启AFIO时钟,今天发现定时器初始化,不启用AFIO也能正常使用,搞得我有点困惑.

现在明白了,整篇文章的重点是"简单来说,如果需要使用重定义功能,那么就需要开启AFIO时钟。"

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版