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

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

[复制链接]
攻城狮Melo 发布时间:2023-4-2 15:38
今天给大家分享两点内容:
  Y; h0 A5 z( s, D2 _% I6 E4 S
一是,为什么我们要先开启STM32外设时钟;二是,关于STM32的 I/O 复用功能及什么时候开启AFIO时钟。

! c4 m- Z' F1 `, B3 q
STM32为什么要先开启外设时钟?
相信很多朋友都曾遇到过这种坑,我最初学习STM32的时候同样也遇到过。下面,我就来说说为什么我们要先开启STM32外设模块时钟,再对其外设模块初始化配置?

; s5 _1 g) Z8 E; y6 m/ a
1、系统架构

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


% O8 F8 Y4 z0 Z, Y. O( ?0 }. T

以STM32F4为例:

八条主控总线:
— Cortex™-M4F 内核 I 总线、 D 总线和 S 总线— DMA1 存储器总线
0 B5 _4 T" J6 a$ w) m$ Y# p— DMA2 存储器总线  _4 }- L" ^# p) j" h+ X
— DMA2 外设总线. e1 B* ?' E: m; C8 |; A
— 以太网 DMA 总线6 E9 ~/ }$ r8 x/ H0 S
— USB OTG HS DMA 总线
  ^4 H: h0 h% _( |7 E  U
七条被控总线:0 U3 O0 e+ H- m% q
— 内部 Flash ICode 总线. P) u8 `# U# v1 s; _* _( _/ n1 h
— 内部 Flash DCode 总线9 B- N, g$ R4 p3 d8 F& l
— 主要内部 SRAM1 (112 KB)
: E9 d' K* D7 @. @9 q! s— 辅助内部 SRAM2 (16 KB)
7 I+ T! ^* O4 v6 d+ ^— 辅助内部 SRAM3 (64 KB)(仅适用于 STM32F42xxx 和 STM32F43xxx 器件)# H% P# S% }# _4 u  f
— AHB1 外设(包括 AHB-APB 总线桥和 APB 外设), ?0 I7 W* R8 E3 l
— AHB2 外设— FSMC
' K- \4 t- n9 H' o: R

' Y4 j! E# z! D6 G+ g
微信图片_20230402153829.jpg
) m' g- B. @  o$ S
2 U4 o+ M1 \0 \; _* F, d
借助总线矩阵,可以实现主控总线到被控总线的访问,这样即使在多个高速外设同时运行期间,系统也可以实现并发访问和高效运行。9 u: b# L3 A2 K4 [; `$ L- I
& \+ g+ K" B( W% v3 I% }
2、关于AHB和APB总线  `4 R0 @6 S- k9 _9 ~
AHB:Advanced High-performance Bus,即先进的高性能总线。. m, }) T' `; X2 U7 Y' r1 v
APB:Advanced Peripheral Bus,即先进的外围(外设)总线。5 ]) P% a( H9 ]1 ?# y; ^
上面说了系统总线的架构引伸出来的就是AHB和APB总线,那为什么要讲述AHB和APB总线呢?6 [2 |" f! f: S$ H; E  F
我们操作的外围设备一般都是位于AHB和APB总线上,而AHB可以引伸出AHB1、AHB2,甚至AHB3。同样APB也存在APB1、APB2等。; O0 f0 |  ]& v# F  Y# |* \9 X
比如,USART1外设位于APB1总线上,GPIOA位于AHB1高速总线上。
: x; e$ p8 E) w
请注意参考手册中“AHB/APB 总线桥”这一小节,有一条重要的内容:每次芯片复位后,所有外设时钟都被关闭( SRAM 和 Flash 接口除外)。使用外设前,必须在 RCC_AHBxENR 或 RCC_APBxENR 寄存器中使能其时钟
2 ~2 c0 ]7 V5 H% }4 F/ c' `2 ~/ ~( Q9 ?8 ]/ w
3、STM32时钟控制6 y, Y" K7 a. ~; S' Z
' K# k" C8 d/ ]+ k0 \3 _
微信图片_20230402153823.jpg
& |0 M  c& K$ ]9 V- U# n# {# v: p
, {6 c5 U7 n; [7 P- r4 c% k9 \, j
STM32的时钟控制模块因MCU芯片不同,各有差异,但原理都类似,功能也相当丰富。主要的目的就是给相对独立的外设模块提供时钟,也是为了降低整个芯片的功能。
8 C! [3 j3 b9 a$ k4 N$ d% \) h
& r, I6 N" v1 n3 C5 f$ L0 K+ b
降低功耗是主要原因,还有一个原因,就是为了兼容不同速度的设备,有些高速,有些低速,如果都用高速时钟,势必造成浪费。
1 w) v0 b6 o5 P+ k
8 j, N: o) @  K. F
RCC给外设提供时钟是一个主要目的,那么为什么要提供时钟呢? 原因在于外围设备的寄存器需要时钟才能工作。你可以把外设当做一个设备,而这个设备需要给它提供电源(时钟)才能工作。; M* X( u6 C% Z0 j3 k) ?
3 k0 z, e4 B- I7 u$ y7 _+ O7 {
你在STM32参考手册的“RCC”章节可能会看到这么一句话:当外设时钟没有启用时,软件不能读出外设寄存器的数值,返回的数值始终是0x0
+ _. Q9 n3 F' ~- X) y( w! j) Y+ ~! I6 U8 \9 I) }" A; A6 V
4、总结+ e& t2 l9 n$ G
看到这里,相信聪明的你已经明白了为什么我们要先开启STM32外设模块时钟,再配置其外设模块了。0 D9 @7 Y/ e% [4 {5 m4 n
简单来说,就是操作外设是通过外设总线来实现,只有外设总线有时钟了才能操作外设。
7 o; E# e0 m5 Q0 F
坑:
+ D2 Z1 N0 [3 y9 ~( I3 m3 [
A.先使能外设时钟,再对其进行配置+ `' k) m; P8 \9 X1 d
# `+ x( \: d, i& a7 y! t: T
微信图片_20230402153817.jpg 9 n: z2 L8 Z, f/ \9 a* k
; R1 n) X7 x  L! V9 N
B.时钟配置需对应总线- l6 y1 S+ Z# D1 V3 n/ q; |0 P7 R

. W/ Y; |2 s; n% \$ Q# B2 }8 r( {
微信图片_20230402153812.png
$ r1 _$ k" I$ @, b
2 V2 C- p2 u8 j8 G
这种基于标准外设库的低级错误,相信肯定有不少人遇到过,希望提高警惕。
3 L' Z( |' [1 L0 Q) v2 g
5 S3 s0 `$ B4 ?" b; ~& Y
AFIO复用时钟
有朋友问:“什么时候开启AFIO时钟”。写了上面章节,就顺便再讲述一下关于STM32的I/O复用功能及什么时候开启AFIO时钟。
1 l# o- ~+ ^0 m% X" t! I3 u
1、什么是I/O 复用功能?

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

* w$ E1 c7 A0 }) ?1 a! L

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


! y' J8 G( D* ?2 I+ u" x

微信图片_20230402153800.jpg

/ a! X9 Q% M; I2 X2 O! n7 C
2、什么时候开启AFIO时钟?

& Y: @7 u& h% h; G- M

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

+ `: `2 [, o5 s7 L% t

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

2 j' G2 p/ \% q: T

简单来说,如果需要使用重定义功能,那么就需要开启AFIO时钟。
+ n0 S! a$ ~* S. U

- o; p5 j5 p5 v) m) }+ {

最后,如果你觉得你的程序可能是因为时钟配置的问题,不妨上电第一步使能所有时钟试试。
7 U; {6 Y9 @, v# L) g8 J" Z/ B4 m
( }) e  t0 L6 h' S# L6 k4 J
! K( u+ N8 [% s2 M8 D
  X) [8 G0 j0 F
% z; S8 i6 [* t6 J8 U
转载自:嵌入式微处理器# u6 P. Q/ n9 M1 W" v, k3 k; O
如有侵权请联系删除4 \# q  a$ D/ m" i( h, v2 C
/ U+ H9 \' `6 S* }3 m* l$ P
$ ^4 J& p& o; 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 手机版