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

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

[复制链接]
攻城狮Melo 发布时间:2023-4-2 15:38
今天给大家分享两点内容:
3 N9 T+ v% [7 x# C, j
一是,为什么我们要先开启STM32外设时钟;二是,关于STM32的 I/O 复用功能及什么时候开启AFIO时钟。
% |! f- U3 B, v" _
STM32为什么要先开启外设时钟?
相信很多朋友都曾遇到过这种坑,我最初学习STM32的时候同样也遇到过。下面,我就来说说为什么我们要先开启STM32外设模块时钟,再对其外设模块初始化配置?
4 y+ x: s8 ?% s" r2 x
1、系统架构

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


$ f5 T  ~" J7 n  c  A. u5 `

以STM32F4为例:

八条主控总线:
— Cortex™-M4F 内核 I 总线、 D 总线和 S 总线— DMA1 存储器总线
, l9 r/ Z6 K7 V6 b! i— DMA2 存储器总线
" n( N9 Z& w0 W  H  u# g— DMA2 外设总线1 Y: A# L1 h4 _9 U+ X% b
— 以太网 DMA 总线
3 v0 t- A/ @5 [! d* z— USB OTG HS DMA 总线" N( a7 d# G7 G6 w% d
七条被控总线:, ?7 K. g& F2 n
— 内部 Flash ICode 总线
3 K: Z9 m" F  G3 o7 ^- F! e— 内部 Flash DCode 总线& J. n. E5 C% B+ Y! P, T
— 主要内部 SRAM1 (112 KB)
5 S3 e! ], p1 j3 I  ~— 辅助内部 SRAM2 (16 KB)
) m  z7 e/ x7 v2 V4 h$ C0 u& }6 O— 辅助内部 SRAM3 (64 KB)(仅适用于 STM32F42xxx 和 STM32F43xxx 器件)5 d4 W3 n* t: D* T) i. P7 l
— AHB1 外设(包括 AHB-APB 总线桥和 APB 外设)
- `3 x  M; P" z1 f6 Y— AHB2 外设— FSMC% B" H% F0 W# m0 N* ^& r

0 B% h7 P1 x2 B; i
微信图片_20230402153829.jpg . z" O( ^$ b/ S2 \# b

3 [- v& ^8 K" t0 c! W/ k
借助总线矩阵,可以实现主控总线到被控总线的访问,这样即使在多个高速外设同时运行期间,系统也可以实现并发访问和高效运行。, P$ @4 n, _: j! L* [
' n) ]) A8 ?. N# ]
2、关于AHB和APB总线
9 A% |2 F6 ?  T6 R4 I. U
AHB:Advanced High-performance Bus,即先进的高性能总线。4 [8 w( M( M! y2 L
APB:Advanced Peripheral Bus,即先进的外围(外设)总线。
; D, z- C/ n0 W5 e
上面说了系统总线的架构引伸出来的就是AHB和APB总线,那为什么要讲述AHB和APB总线呢?( ~8 W& |: }9 U$ K
我们操作的外围设备一般都是位于AHB和APB总线上,而AHB可以引伸出AHB1、AHB2,甚至AHB3。同样APB也存在APB1、APB2等。' f0 F' h: M. y4 i* ]* H7 _0 y7 e6 W) a
比如,USART1外设位于APB1总线上,GPIOA位于AHB1高速总线上。! t/ c  h7 q5 \
请注意参考手册中“AHB/APB 总线桥”这一小节,有一条重要的内容:每次芯片复位后,所有外设时钟都被关闭( SRAM 和 Flash 接口除外)。使用外设前,必须在 RCC_AHBxENR 或 RCC_APBxENR 寄存器中使能其时钟* p7 V: Z0 N1 ]8 K  ~

" l9 M( U/ }% r1 @( R4 A9 }
3、STM32时钟控制
- q9 `7 ?6 ~8 {: q: z5 }

; }1 C/ p( ]2 a. _. T: u8 \
微信图片_20230402153823.jpg
3 k1 p, K" L. L4 ~9 F5 O
0 Q; A5 ^3 M) S# q
STM32的时钟控制模块因MCU芯片不同,各有差异,但原理都类似,功能也相当丰富。主要的目的就是给相对独立的外设模块提供时钟,也是为了降低整个芯片的功能。# F) W1 a  E! }0 z) h+ V

3 w" }: N! R$ L
降低功耗是主要原因,还有一个原因,就是为了兼容不同速度的设备,有些高速,有些低速,如果都用高速时钟,势必造成浪费。
' f( O+ ~6 U2 D( A" S$ \

, w/ P- O  k  l  Z, W( R
RCC给外设提供时钟是一个主要目的,那么为什么要提供时钟呢? 原因在于外围设备的寄存器需要时钟才能工作。你可以把外设当做一个设备,而这个设备需要给它提供电源(时钟)才能工作。
/ U) p, r9 L) L1 A1 H
& k0 L1 a$ }6 j9 l$ ]6 X" y, x
你在STM32参考手册的“RCC”章节可能会看到这么一句话:当外设时钟没有启用时,软件不能读出外设寄存器的数值,返回的数值始终是0x02 B0 b& f+ [! q6 v- \7 g* i2 S

8 }# P6 z# s! w) ~
4、总结
7 ~% R; O0 u1 Y+ O% o1 e; Z
看到这里,相信聪明的你已经明白了为什么我们要先开启STM32外设模块时钟,再配置其外设模块了。$ i$ e, S! k' ]* j3 ~
简单来说,就是操作外设是通过外设总线来实现,只有外设总线有时钟了才能操作外设。
2 n3 g6 N; J. I" j/ W# }- H
坑:
' e9 U8 ^8 \! h& E( Y: \3 K" ^' \
A.先使能外设时钟,再对其进行配置
2 M% E, Z  T7 d$ c  ]8 p  `. }
/ a0 G, A7 a1 f% h: y" Y
微信图片_20230402153817.jpg - g  a, q6 Q9 U# i
# a9 x$ s$ a9 [2 x. q4 T. w
B.时钟配置需对应总线$ e4 ^/ }. A2 Q6 a" E6 X
' H$ }7 F3 N& H" ^. D# \
微信图片_20230402153812.png 6 y2 x- ?2 R2 D/ o

: c  H- d# n, Z- B, f( N: N
这种基于标准外设库的低级错误,相信肯定有不少人遇到过,希望提高警惕。* [9 R3 z9 N9 a+ `& Y& ?# F; N

& q( X( b2 ~) K$ D2 w& b
AFIO复用时钟
有朋友问:“什么时候开启AFIO时钟”。写了上面章节,就顺便再讲述一下关于STM32的I/O复用功能及什么时候开启AFIO时钟。
; [- d4 w1 ^& W1 ~! B
1、什么是I/O 复用功能?

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


9 [; W  b8 X& M. z% N! ^; o

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

" Z: C  H: H( i

微信图片_20230402153800.jpg

8 n$ Z% q! U+ Q4 E( J$ X0 \
2、什么时候开启AFIO时钟?

4 w" ]5 a/ ?- p8 z& \7 Z, ?

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

1 K) s& _2 ?5 ?. n. e2 V2 [6 m2 [. U- r

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


% R" ]9 C3 z/ i  s* t8 a

简单来说,如果需要使用重定义功能,那么就需要开启AFIO时钟。
/ R" j0 v9 S: Q+ O, U2 j


! K8 B. @: X- t$ F/ U$ w

最后,如果你觉得你的程序可能是因为时钟配置的问题,不妨上电第一步使能所有时钟试试。
4 I3 J# c$ m% g# P. P  D1 Q
' ^7 q3 v# g, G$ Y1 C
2 K6 z* c* J+ X* `! }" ?! k
# m- c) S! S7 S  j* z) C: y
& b3 m0 \; i9 T) t
转载自:嵌入式微处理器
; J  o' i  g; R& T. q7 l2 b如有侵权请联系删除) N8 H$ S; N. o4 Z+ [

; d/ P3 E) Y! V! j" s

& e9 @' x7 V( @4 j
收藏 评论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 手机版