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

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

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

9 G+ |0 _- q# Q1 o1 d7 O, f8 ~
STM32为什么要先开启外设时钟?
相信很多朋友都曾遇到过这种坑,我最初学习STM32的时候同样也遇到过。下面,我就来说说为什么我们要先开启STM32外设模块时钟,再对其外设模块初始化配置?

! s9 V- }( ]( z" I* m  O6 y" m
1、系统架构

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


, w/ ]9 W6 C8 Z8 a7 u

以STM32F4为例:

● 八条主控总线:
— Cortex™-M4F 内核 I 总线、 D 总线和 S 总线— DMA1 存储器总线
4 L/ c( p% o) ~4 t— DMA2 存储器总线
$ L  v8 Q8 u9 I$ c4 g— DMA2 外设总线* N5 u( ^" B3 }4 H9 p8 V+ I
— 以太网 DMA 总线. ?) z( v( U. b0 p: Y: Z" q
— USB OTG HS DMA 总线! d  L- w( [3 D% z/ E
● 七条被控总线:$ N+ u9 x, y7 r; H' S
— 内部 Flash ICode 总线! f" j# ^* T) X1 \& e
— 内部 Flash DCode 总线! D7 Z0 q2 K# W; h
— 主要内部 SRAM1 (112 KB)
- q! e7 w+ G1 H: p— 辅助内部 SRAM2 (16 KB)' `! C& s+ |7 q+ b3 ~# i$ c
— 辅助内部 SRAM3 (64 KB)(仅适用于 STM32F42xxx 和 STM32F43xxx 器件)7 W! b  C% ^' ]' t. O
— AHB1 外设(包括 AHB-APB 总线桥和 APB 外设)0 G2 |) B4 l; {5 r' V/ T- q$ l
— AHB2 外设— FSMC
2 r- j# O+ h: A3 X
4 X+ d' [8 Y9 a- w; I8 J  t
微信图片_20230402153829.jpg ; Q! G0 j6 K! P, c7 ^: @( u8 B
) S/ _+ \) @; C: g/ n
借助总线矩阵,可以实现主控总线到被控总线的访问,这样即使在多个高速外设同时运行期间,系统也可以实现并发访问和高效运行。4 i3 y$ ~* M% ?, h! g6 f& w

/ X: Z: v9 W8 W  i& w5 B* [9 I) J* r
2、关于AHB和APB总线# P% v5 F' S7 [( z
AHB:Advanced High-performance Bus,即先进的高性能总线。& C/ K5 L* ^2 W# H- B- Y  l
APB:Advanced Peripheral Bus,即先进的外围(外设)总线。
- K' N+ k& J% |2 {- r7 f
上面说了系统总线的架构引伸出来的就是AHB和APB总线,那为什么要讲述AHB和APB总线呢?
7 b# b' r) j& p, `7 S
我们操作的外围设备一般都是位于AHB和APB总线上,而AHB可以引伸出AHB1、AHB2,甚至AHB3。同样APB也存在APB1、APB2等。
5 s! I0 t& ]5 ?- H5 X
比如,USART1外设位于APB1总线上,GPIOA位于AHB1高速总线上。. R* f1 F  N* Y. P# y5 g0 j
请注意参考手册中“AHB/APB 总线桥”这一小节,有一条重要的内容:每次芯片复位后,所有外设时钟都被关闭( SRAM 和 Flash 接口除外)。使用外设前,必须在 RCC_AHBxENR 或 RCC_APBxENR 寄存器中使能其时钟。; ~* s) z- x0 D9 }1 \

6 I* q1 b" O  ~+ T3 p4 v; B
3、STM32时钟控制# X* A& M* v; x9 }4 m/ i

, s( w% `" L( b+ i8 d. C
微信图片_20230402153823.jpg 7 m; S/ H6 J* {3 m8 }

2 m: I& ~/ M$ t
STM32的时钟控制模块因MCU芯片不同,各有差异,但原理都类似,功能也相当丰富。主要的目的就是给相对独立的外设模块提供时钟,也是为了降低整个芯片的功能。) [$ F3 e4 U" K4 F& U

* w  z% G- O& I, @$ N$ a+ r
降低功耗是主要原因,还有一个原因,就是为了兼容不同速度的设备,有些高速,有些低速,如果都用高速时钟,势必造成浪费。
6 e# _5 k' B1 E' u2 M

4 J( t5 p- y; k: ^! L- I
RCC给外设提供时钟是一个主要目的,那么为什么要提供时钟呢? 原因在于外围设备的寄存器需要时钟才能工作。你可以把外设当做一个设备,而这个设备需要给它提供电源(时钟)才能工作。, P4 P; A- G' G1 Q: s1 J' O6 v
( P: C+ c9 o. }" _; q( M
你在STM32参考手册的“RCC”章节可能会看到这么一句话:当外设时钟没有启用时,软件不能读出外设寄存器的数值,返回的数值始终是0x0。, U( |6 K! R6 D" m
" A8 X' H' A# \1 ~! r0 L
4、总结2 @* d' C5 y* ?9 o* G6 R3 }. t6 j
看到这里,相信聪明的你已经明白了为什么我们要先开启STM32外设模块时钟,再配置其外设模块了。, b6 Z+ H& }" X* Y4 c$ Z/ |. W
简单来说,就是操作外设是通过外设总线来实现,只有外设总线有时钟了才能操作外设。) T  l- S$ I4 k/ D
坑:
3 M/ G8 ]0 s: M  O, F! h
A.先使能外设时钟,再对其进行配置
6 a/ ]( z) G, r( V; w# K  G" v
, Q$ v. f5 e# A8 q7 x
微信图片_20230402153817.jpg
2 [& l( a$ Y! P, P+ [4 n. d4 A3 e4 ]$ \, n/ r  e6 |2 E" A
B.时钟配置需对应总线" v3 D/ o$ S$ l) \. Q9 n& s  w
+ n" f$ y0 n) T" E! }
微信图片_20230402153812.png ) b; }; h8 j% }& z/ G8 K9 q
2 ~7 _+ i# P$ e, W6 S, |) Q1 f% s5 K
这种基于标准外设库的低级错误,相信肯定有不少人遇到过,希望提高警惕。+ q- m3 X; U8 j0 D* R" V5 u

' v3 F! Q5 c- e. Z: _' c7 i% G
AFIO复用时钟
有朋友问:“什么时候开启AFIO时钟”。写了上面章节,就顺便再讲述一下关于STM32的I/O复用功能及什么时候开启AFIO时钟。

; {* a# }9 x+ P) y( b
1、什么是I/O 复用功能?

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


! ]) m/ y% t2 ~: g9 b

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

* O  O8 ?4 |' y! R# ?9 M

微信图片_20230402153800.jpg


- I. x1 a  }; S$ [4 |
2、什么时候开启AFIO时钟?

" E. z: g* a% q9 X" z# [8 ]

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


5 j! ^" B2 ^) F# D( l, L

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


5 x: j3 r+ C7 E6 p3 Y- U6 Q

简单来说,如果需要使用重定义功能,那么就需要开启AFIO时钟。
5 l6 V  e# _7 i* l8 h: _* @


2 p7 A. M8 x6 n" h! ^% g1 f

最后,如果你觉得你的程序可能是因为时钟配置的问题,不妨上电第一步使能所有时钟试试。8 T7 o9 w% a3 b7 h2 n% e( q
0 X6 t+ d4 c( H* n# [2 ^

3 x7 m0 Z) r1 m, m: b6 e4 w# Z' J" {0 P$ [0 S8 @  `! V& X- W

1 Z  ?, W. a- ^转载自:嵌入式微处理器! s6 D6 }: z& o5 e" F2 ^
如有侵权请联系删除  b6 e* o& ~0 H3 y! |3 `% u

. d7 Z  a2 O0 \

! {9 D1 r$ U& J2 b- E
赞 收藏 评论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 手机版