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

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

[复制链接]
攻城狮Melo 发布时间:2023-4-2 15:38
今天给大家分享两点内容:) w( g. R: N( a2 p& Z& C1 x6 W9 ^
一是,为什么我们要先开启STM32外设时钟;二是,关于STM32的 I/O 复用功能及什么时候开启AFIO时钟。
" x7 l6 B* n  T) w
STM32为什么要先开启外设时钟?
相信很多朋友都曾遇到过这种坑,我最初学习STM32的时候同样也遇到过。下面,我就来说说为什么我们要先开启STM32外设模块时钟,再对其外设模块初始化配置?

% Y, M' W. x8 O* Y" J/ L
1、系统架构

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


5 s$ f9 t# O* g

以STM32F4为例:

八条主控总线:
— Cortex™-M4F 内核 I 总线、 D 总线和 S 总线— DMA1 存储器总线" M' S5 {7 L& @  p- r% E3 J
— DMA2 存储器总线
% |3 t) _" {" r9 V1 N* X8 O: m— DMA2 外设总线: B5 E$ Z4 M% E
— 以太网 DMA 总线. y1 q' M7 N# y" p- i0 ?
— USB OTG HS DMA 总线/ F+ B5 W( {- {6 s( J. G
七条被控总线:
' b8 G; k) ^) |— 内部 Flash ICode 总线
$ J0 ^1 q: a) r- t0 P% ~0 ^7 Y— 内部 Flash DCode 总线- w) M/ M" V) M9 W. D/ Y
— 主要内部 SRAM1 (112 KB)! M3 A6 u3 B* G7 q  `5 O! {8 G
— 辅助内部 SRAM2 (16 KB)
/ D% a2 l$ z) y9 v: q+ ]— 辅助内部 SRAM3 (64 KB)(仅适用于 STM32F42xxx 和 STM32F43xxx 器件)
+ c) Z5 a1 y: b5 c7 m— AHB1 外设(包括 AHB-APB 总线桥和 APB 外设)9 ?2 l. R. i" ]" T
— AHB2 外设— FSMC# j" U- }8 u% T. t+ @, q, W4 ~
8 x  T$ a+ @. P# N0 N5 h
微信图片_20230402153829.jpg
' T* n8 }, ]% }% M" B8 b% {' g0 r* n; S! V  Y, d
借助总线矩阵,可以实现主控总线到被控总线的访问,这样即使在多个高速外设同时运行期间,系统也可以实现并发访问和高效运行。: T" r& |4 }7 r' w$ h

$ `0 I9 q# B9 X! L3 _9 _) U
2、关于AHB和APB总线
! ~& k4 w; G# o9 r) ~
AHB:Advanced High-performance Bus,即先进的高性能总线。9 d, O$ t9 w$ Z- U
APB:Advanced Peripheral Bus,即先进的外围(外设)总线。
" i, P0 S7 w+ U" `* ~
上面说了系统总线的架构引伸出来的就是AHB和APB总线,那为什么要讲述AHB和APB总线呢?
) Z, F  Q* _7 T" E* z9 B* O
我们操作的外围设备一般都是位于AHB和APB总线上,而AHB可以引伸出AHB1、AHB2,甚至AHB3。同样APB也存在APB1、APB2等。
! j+ x' A/ i9 S4 B) D
比如,USART1外设位于APB1总线上,GPIOA位于AHB1高速总线上。: J$ L! L7 n' m4 V, }0 d
请注意参考手册中“AHB/APB 总线桥”这一小节,有一条重要的内容:每次芯片复位后,所有外设时钟都被关闭( SRAM 和 Flash 接口除外)。使用外设前,必须在 RCC_AHBxENR 或 RCC_APBxENR 寄存器中使能其时钟4 S) ?: l& g: e! A0 Y' C
, @- g  W7 l6 f, f1 F0 \7 B/ ?
3、STM32时钟控制, {: h& A( f1 O( K

5 e* e; o, u3 _
微信图片_20230402153823.jpg $ W4 E1 s+ @5 H1 Q/ s6 d

! X' L) u% Z! C( _( S, e
STM32的时钟控制模块因MCU芯片不同,各有差异,但原理都类似,功能也相当丰富。主要的目的就是给相对独立的外设模块提供时钟,也是为了降低整个芯片的功能。
$ Z8 n! M. z0 X2 x1 @. S4 e" H& _" ?
降低功耗是主要原因,还有一个原因,就是为了兼容不同速度的设备,有些高速,有些低速,如果都用高速时钟,势必造成浪费。
$ r% b4 g/ q3 D' X- y

: ?9 H: x# m. U5 Q3 B4 h! a7 g* y
RCC给外设提供时钟是一个主要目的,那么为什么要提供时钟呢? 原因在于外围设备的寄存器需要时钟才能工作。你可以把外设当做一个设备,而这个设备需要给它提供电源(时钟)才能工作。9 R# O; H  d) V0 T1 C, m0 b

7 `) N5 d6 g8 q! T; R6 V! ]
你在STM32参考手册的“RCC”章节可能会看到这么一句话:当外设时钟没有启用时,软件不能读出外设寄存器的数值,返回的数值始终是0x0
7 h* e( r& u. |2 `& b2 |6 m3 b5 C( Z/ o+ ]* z2 j6 F6 B6 K
4、总结
7 U2 e" f/ E2 L3 o
看到这里,相信聪明的你已经明白了为什么我们要先开启STM32外设模块时钟,再配置其外设模块了。5 t" j; w/ g2 \1 g
简单来说,就是操作外设是通过外设总线来实现,只有外设总线有时钟了才能操作外设。
' u' y* T9 A& F( t1 [, I. I
坑:
5 ?5 f; d* C0 w2 u. h
A.先使能外设时钟,再对其进行配置
5 G! a, K. ?; l2 d% L
/ [( S9 a1 D+ e) d7 l
微信图片_20230402153817.jpg 2 c2 n5 [" u9 S1 [

! Y3 r! @( ~7 ?- i  I0 C
B.时钟配置需对应总线
" j7 E+ ]* K% V- R  p' t% e
& K* c! J# V0 N7 ^
微信图片_20230402153812.png 1 T5 l8 f) z% R4 R2 h4 s
) _# K  s0 l5 B) T2 i* e
这种基于标准外设库的低级错误,相信肯定有不少人遇到过,希望提高警惕。
( B: h' D! @- j& n' Y. F+ t* d) A: I. E6 T( ~8 Y1 l
AFIO复用时钟
有朋友问:“什么时候开启AFIO时钟”。写了上面章节,就顺便再讲述一下关于STM32的I/O复用功能及什么时候开启AFIO时钟。

8 X/ G" M: Y# t2 [; |4 `( x3 P
1、什么是I/O 复用功能?

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


" y- ^/ M" E7 E8 r, d# f! q

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


- j% G0 y& M" v1 ~% K0 J: G

微信图片_20230402153800.jpg

! l% k0 l  r4 _3 B3 ^
2、什么时候开启AFIO时钟?

7 O" c0 f1 {$ w' u" P4 X

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

$ ~: ~  W0 @5 f1 M) E$ p

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


0 M  W( u0 D3 E% O

简单来说,如果需要使用重定义功能,那么就需要开启AFIO时钟。
( ]* L3 n- I) I. t$ c/ _5 c


2 Z5 W8 m+ u" B

最后,如果你觉得你的程序可能是因为时钟配置的问题,不妨上电第一步使能所有时钟试试。! S  v: i* }: y2 f6 i/ @

6 ?& x6 F2 `: s1 D! E7 C- S7 L
4 r  H5 p1 a3 M' M  I8 J- j/ j7 @5 L* ]

* f4 T/ c+ c% P2 n1 c转载自:嵌入式微处理器
. ]: ?) a! |: t6 e* q8 P' k* d. r如有侵权请联系删除! t1 d5 h; P# P* N+ q% N
% m' i" x% q, j4 q+ R
% ^7 E. j' T6 ^4 }" V) O+ R
收藏 评论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 手机版