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

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

[复制链接]
攻城狮Melo 发布时间:2023-4-2 15:38
今天给大家分享两点内容:
: P( Y) N& \) c, X
一是,为什么我们要先开启STM32外设时钟;二是,关于STM32的 I/O 复用功能及什么时候开启AFIO时钟。
4 [4 K. x, k, a% V0 x% \" E3 e
STM32为什么要先开启外设时钟?
相信很多朋友都曾遇到过这种坑,我最初学习STM32的时候同样也遇到过。下面,我就来说说为什么我们要先开启STM32外设模块时钟,再对其外设模块初始化配置?

" a8 T( X* J# @, r# t
1、系统架构

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


- R8 ^# N8 A  b# ^

以STM32F4为例:

八条主控总线:
— Cortex™-M4F 内核 I 总线、 D 总线和 S 总线— DMA1 存储器总线' X. }, M' C6 C! R+ F+ x
— DMA2 存储器总线. @; D6 B3 ~9 A8 o
— DMA2 外设总线
- Z, l' H8 B1 q9 L* V— 以太网 DMA 总线
- z) u) ?" {3 t+ W— USB OTG HS DMA 总线6 b8 t; C- O# e
七条被控总线:0 l. Q/ J& G( y9 `$ ^
— 内部 Flash ICode 总线% r2 V. r( W8 R/ X6 A
— 内部 Flash DCode 总线
1 o: n7 R( l9 `/ Z7 t5 Z— 主要内部 SRAM1 (112 KB)
3 d! b  M- f! y. i- f— 辅助内部 SRAM2 (16 KB)) g4 ~0 t6 _# `7 @7 p  i- I
— 辅助内部 SRAM3 (64 KB)(仅适用于 STM32F42xxx 和 STM32F43xxx 器件)  G: Z! e, J' p& t) ?4 n4 w- J4 N
— AHB1 外设(包括 AHB-APB 总线桥和 APB 外设)
; C& V* R( c5 s) Q+ h4 [' ~  R  I— AHB2 外设— FSMC
: o# {0 A5 f7 f# A& U

! ]" |! Y0 q0 h$ o5 x& A
微信图片_20230402153829.jpg # k9 Q5 Z8 ]& A# E9 K: L% d
7 l0 i' @8 v: A; o7 e& F0 E) R0 I* X
借助总线矩阵,可以实现主控总线到被控总线的访问,这样即使在多个高速外设同时运行期间,系统也可以实现并发访问和高效运行。
' N$ [1 H' N4 N+ ^  l4 k# h. }  |6 V
2、关于AHB和APB总线
% \, t& g; {. g1 j
AHB:Advanced High-performance Bus,即先进的高性能总线。5 w7 K7 y1 g2 R, H
APB:Advanced Peripheral Bus,即先进的外围(外设)总线。. U$ ^% f' j! D  Y
上面说了系统总线的架构引伸出来的就是AHB和APB总线,那为什么要讲述AHB和APB总线呢?% J7 e+ d! E8 c3 s% r! }
我们操作的外围设备一般都是位于AHB和APB总线上,而AHB可以引伸出AHB1、AHB2,甚至AHB3。同样APB也存在APB1、APB2等。' C4 l8 N$ P# O4 X. F. e
比如,USART1外设位于APB1总线上,GPIOA位于AHB1高速总线上。
2 a4 Y/ H6 ~% K: [7 O
请注意参考手册中“AHB/APB 总线桥”这一小节,有一条重要的内容:每次芯片复位后,所有外设时钟都被关闭( SRAM 和 Flash 接口除外)。使用外设前,必须在 RCC_AHBxENR 或 RCC_APBxENR 寄存器中使能其时钟" t: {, `  m+ K
' U9 K% G2 C9 f7 ^7 P& I/ k1 d) U- N
3、STM32时钟控制
  q' s9 N  d8 h) d! y5 I8 y. P

1 r* L" b+ V% D8 l6 T% u) D/ ^1 V
微信图片_20230402153823.jpg ' U5 g5 {6 p: E. |5 a& U7 d
* T  i* U9 \& r' E" r0 x) H
STM32的时钟控制模块因MCU芯片不同,各有差异,但原理都类似,功能也相当丰富。主要的目的就是给相对独立的外设模块提供时钟,也是为了降低整个芯片的功能。
5 ~0 ^1 m/ F( f+ d+ J6 d3 S  Z; |. i. r. K; Y; j
降低功耗是主要原因,还有一个原因,就是为了兼容不同速度的设备,有些高速,有些低速,如果都用高速时钟,势必造成浪费。
2 s5 X6 J* z- Y
8 v# x8 A' m- N
RCC给外设提供时钟是一个主要目的,那么为什么要提供时钟呢? 原因在于外围设备的寄存器需要时钟才能工作。你可以把外设当做一个设备,而这个设备需要给它提供电源(时钟)才能工作。
1 A/ c% i2 M: f  C: b- l  O7 m
  l0 w' K9 p/ l
你在STM32参考手册的“RCC”章节可能会看到这么一句话:当外设时钟没有启用时,软件不能读出外设寄存器的数值,返回的数值始终是0x0
1 u& G& a) j$ A( F. X: i0 r9 I
7 ]* z3 D9 C/ O( l
4、总结
" @! j( o% p& J/ F' F( a4 m
看到这里,相信聪明的你已经明白了为什么我们要先开启STM32外设模块时钟,再配置其外设模块了。
+ M1 a* L% `+ o7 M5 e# p7 h
简单来说,就是操作外设是通过外设总线来实现,只有外设总线有时钟了才能操作外设。. @+ x) b: E7 j  s$ t# ?
坑:
" M- d1 E3 I2 p6 z% A) O. O
A.先使能外设时钟,再对其进行配置: A9 z  P- u/ b. q4 g  \& `9 \

' X. W" h/ X3 n
微信图片_20230402153817.jpg ' l% |5 A. I7 @* s0 ^7 J. v5 W% F  M
6 e* U5 t- I$ F& Z" D" ]2 U1 s" c
B.时钟配置需对应总线# a5 y& q+ x4 ^; p: D* K

0 l  n' q8 n0 Y' r: r
微信图片_20230402153812.png
& G' Q4 @% x2 m
8 c% s4 ^# b. W8 N1 v
这种基于标准外设库的低级错误,相信肯定有不少人遇到过,希望提高警惕。1 G  ~$ E3 T8 K  Y

: T; R; O* I1 h( Z3 Y
AFIO复用时钟
有朋友问:“什么时候开启AFIO时钟”。写了上面章节,就顺便再讲述一下关于STM32的I/O复用功能及什么时候开启AFIO时钟。
7 M& b) `# n9 F. h- C
1、什么是I/O 复用功能?

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


+ t# k0 f2 B; N5 H  n4 |

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

3 w2 C/ x# G' k% ^0 T+ u

微信图片_20230402153800.jpg


/ g4 x2 s; p" _" v
2、什么时候开启AFIO时钟?

( V1 t/ {2 w1 ]) b$ j

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


) J& b! y) a1 g+ P+ p

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


2 x. K# y5 V( G) Q% h0 A7 M

简单来说,如果需要使用重定义功能,那么就需要开启AFIO时钟。) v. B: v3 K5 G) u

* S% B3 G% G& h5 {6 A6 B

最后,如果你觉得你的程序可能是因为时钟配置的问题,不妨上电第一步使能所有时钟试试。4 o2 U% F7 W' k7 ?
; |- `( N" k, T7 H
0 o" `  C' P6 o) k! v7 w( }9 A3 a

, ~# ]2 q$ O3 J" I  Z
- G) Q: c+ q! e$ d. i) I$ A- m
转载自:嵌入式微处理器8 n8 Z& {. j/ M% _: @9 n% Z
如有侵权请联系删除8 g0 B/ P( \* a: G. ]' O, d

$ t" \. x( z7 v/ u: Z

# K9 }5 D. I/ Y9 _; N) E
收藏 评论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 手机版