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

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

[复制链接]
攻城狮Melo 发布时间:2023-4-2 15:38
今天给大家分享两点内容:
9 B( j/ H! D9 j- u
一是,为什么我们要先开启STM32外设时钟;二是,关于STM32的 I/O 复用功能及什么时候开启AFIO时钟。

4 u2 I/ k$ W( q+ B' y
STM32为什么要先开启外设时钟?
相信很多朋友都曾遇到过这种坑,我最初学习STM32的时候同样也遇到过。下面,我就来说说为什么我们要先开启STM32外设模块时钟,再对其外设模块初始化配置?
" E4 C: ~' B. S
1、系统架构

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

5 M7 d! c( y% V  n) e4 x8 |

以STM32F4为例:

● 八条主控总线:
— Cortex™-M4F 内核 I 总线、 D 总线和 S 总线— DMA1 存储器总线2 x/ r, y6 m+ V5 }
— DMA2 存储器总线! P/ \" E4 j% |  G
— DMA2 外设总线
( |8 O9 j$ I) V) x5 ~8 V, b— 以太网 DMA 总线5 n1 n$ c/ y  c0 W# N
— USB OTG HS DMA 总线& [# m. y, }# m
● 七条被控总线:: [- F) L4 g7 D2 f$ V
— 内部 Flash ICode 总线
% u' V, Y- [  @8 d  h9 m— 内部 Flash DCode 总线! O1 W7 P+ ?- n
— 主要内部 SRAM1 (112 KB)
) t- X6 X+ C7 Q" }8 u, C: g— 辅助内部 SRAM2 (16 KB)! z0 }6 e, c. l6 ?4 H: z
— 辅助内部 SRAM3 (64 KB)(仅适用于 STM32F42xxx 和 STM32F43xxx 器件)) F- J3 e: y( n7 m  h
— AHB1 外设(包括 AHB-APB 总线桥和 APB 外设)9 n3 ]5 n0 H0 a+ o, e" H# a. s
— AHB2 外设— FSMC
4 v9 |+ L3 ?  _% Z% e' {  Y/ y

1 u( e$ O2 K! z8 a& o  t8 C
微信图片_20230402153829.jpg
. {+ z6 @4 J; X# N( Z3 [9 e9 D7 I
  H3 B0 N/ g+ _& X9 \$ a# J* d
借助总线矩阵,可以实现主控总线到被控总线的访问,这样即使在多个高速外设同时运行期间,系统也可以实现并发访问和高效运行。6 b) w6 u* {# D- ^! |9 }

9 S, ^. C4 [! `2 E' H+ j" f# z4 N
2、关于AHB和APB总线
  g: `) |3 A" ^. b+ v
AHB:Advanced High-performance Bus,即先进的高性能总线。
+ z' F6 a; c# g
APB:Advanced Peripheral Bus,即先进的外围(外设)总线。
; O( i( @1 w" U) ~
上面说了系统总线的架构引伸出来的就是AHB和APB总线,那为什么要讲述AHB和APB总线呢?
' t: P1 l8 S, n
我们操作的外围设备一般都是位于AHB和APB总线上,而AHB可以引伸出AHB1、AHB2,甚至AHB3。同样APB也存在APB1、APB2等。
9 w' E  n- u, ~  Z
比如,USART1外设位于APB1总线上,GPIOA位于AHB1高速总线上。0 [  O, k. [3 B* X1 r" S! y; m9 a
请注意参考手册中“AHB/APB 总线桥”这一小节,有一条重要的内容:每次芯片复位后,所有外设时钟都被关闭( SRAM 和 Flash 接口除外)。使用外设前,必须在 RCC_AHBxENR 或 RCC_APBxENR 寄存器中使能其时钟。
  y: z* b+ _6 f. L  p; H$ \
1 }$ M7 E( G5 {3 Z( k! v$ ~. X: o
3、STM32时钟控制# _( f, t7 f: ]9 f4 ?5 e" M

3 r! j2 _$ N4 ]. V1 V
微信图片_20230402153823.jpg / X( C. N2 r. u3 p4 \3 T) X

4 s, X8 w$ t8 e4 x! [0 O
STM32的时钟控制模块因MCU芯片不同,各有差异,但原理都类似,功能也相当丰富。主要的目的就是给相对独立的外设模块提供时钟,也是为了降低整个芯片的功能。
, ~: i5 L7 c7 k3 ^" V! c# P$ y: ~' H! U! i+ o) c! L( m5 y, o
降低功耗是主要原因,还有一个原因,就是为了兼容不同速度的设备,有些高速,有些低速,如果都用高速时钟,势必造成浪费。
2 \+ ~2 B/ [* l

) I  A6 ~( U, `' x) B: a% I" |; J8 c
RCC给外设提供时钟是一个主要目的,那么为什么要提供时钟呢? 原因在于外围设备的寄存器需要时钟才能工作。你可以把外设当做一个设备,而这个设备需要给它提供电源(时钟)才能工作。
$ g! K# S+ ?" X# B. P
: o0 M6 w6 z. D
你在STM32参考手册的“RCC”章节可能会看到这么一句话:当外设时钟没有启用时,软件不能读出外设寄存器的数值,返回的数值始终是0x0。& c6 }, J( B/ ]6 f9 i5 |, ^
' l$ k+ S% |8 H/ s( C
4、总结; N" [) C9 T( K+ C  H+ T
看到这里,相信聪明的你已经明白了为什么我们要先开启STM32外设模块时钟,再配置其外设模块了。
) x: L6 X6 L+ \) V1 w7 \
简单来说,就是操作外设是通过外设总线来实现,只有外设总线有时钟了才能操作外设。
7 E# y4 Q3 {6 }( v* Z" E
坑:
0 D9 f$ _- ~; O
A.先使能外设时钟,再对其进行配置. u% r& ?( C+ y4 q  ^! S7 Z7 Z
2 V5 F% h4 p5 Y  x8 E2 E
微信图片_20230402153817.jpg
) O  L: v* K% ?. y
" ~* y1 ~3 V  `( u
B.时钟配置需对应总线( p- ^1 g4 Z# \, ^! v6 q! B  m5 _. J3 {

6 Z! S, X5 g; u9 j' f9 k. R  E
微信图片_20230402153812.png ! I% P( o9 M6 r- f# F; b9 X

3 ?9 q/ }9 h) r' P" L
这种基于标准外设库的低级错误,相信肯定有不少人遇到过,希望提高警惕。2 R) s& W6 `* O  T6 F
* j( M* r; p4 |
AFIO复用时钟
有朋友问:“什么时候开启AFIO时钟”。写了上面章节,就顺便再讲述一下关于STM32的I/O复用功能及什么时候开启AFIO时钟。

  L- j- U6 w1 m1 {( `' [
1、什么是I/O 复用功能?

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

0 j# Y) G9 |) l8 W

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

  ^9 S4 r0 N& y4 M0 [; ]

微信图片_20230402153800.jpg

' p! @! n6 g* m
2、什么时候开启AFIO时钟?


. N; l5 o3 B- T: C

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


0 M) X5 R3 d& H. o$ S

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


1 v* E. a9 f$ I# m/ |7 `* w# e4 ^

简单来说,如果需要使用重定义功能,那么就需要开启AFIO时钟。
6 [+ N! U' M4 P


; {; V) c" q0 q

最后,如果你觉得你的程序可能是因为时钟配置的问题,不妨上电第一步使能所有时钟试试。6 j# @/ M, Z% R: y# Y8 {* p

8 ^; y, o2 H. b) \: h1 b8 G. l7 C; @$ P8 W7 C0 `) t- S

& v3 h. `" P- C2 G* E- ~8 G

  Y" m, a- j  Z2 y; i0 C转载自:嵌入式微处理器9 R) ]5 i# A1 y. y( Z
如有侵权请联系删除5 n- \+ ?) e+ ]) A

2 h3 h7 v" u. f- {

  i  L3 S( e, Y
赞 收藏 评论1 发布时间:2023-4-2 15:38

举报

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

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

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

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版