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

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

[复制链接]
攻城狮Melo 发布时间:2023-4-2 15:38
今天给大家分享两点内容:
5 t. ]$ A4 @$ D" k: i, O! g
一是,为什么我们要先开启STM32外设时钟;二是,关于STM32的 I/O 复用功能及什么时候开启AFIO时钟。
$ H; u" \& u7 c6 t
STM32为什么要先开启外设时钟?
相信很多朋友都曾遇到过这种坑,我最初学习STM32的时候同样也遇到过。下面,我就来说说为什么我们要先开启STM32外设模块时钟,再对其外设模块初始化配置?
7 [! E: y. e- g
1、系统架构

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

/ n8 \8 U4 `" G5 ~

以STM32F4为例:

八条主控总线:
— Cortex™-M4F 内核 I 总线、 D 总线和 S 总线— DMA1 存储器总线
% J( h! v4 a1 U2 @$ A— DMA2 存储器总线4 G; |3 l4 f& Z6 }9 A+ q6 u4 b
— DMA2 外设总线4 z) a( S0 ^, b0 }! D0 G5 J
— 以太网 DMA 总线; x0 F0 h5 ^$ {$ X0 \, t) X
— USB OTG HS DMA 总线
- U6 z" U6 v( T% j7 A- }
七条被控总线:
0 h/ c+ C" o! {2 B9 M* S, U— 内部 Flash ICode 总线: M3 f6 v8 _' v  \
— 内部 Flash DCode 总线
' R% d1 o0 K( v9 ?8 _— 主要内部 SRAM1 (112 KB); W4 \' Y/ c6 T7 w+ i6 C- s
— 辅助内部 SRAM2 (16 KB)
' @! A8 ?' }6 P— 辅助内部 SRAM3 (64 KB)(仅适用于 STM32F42xxx 和 STM32F43xxx 器件)
. B) i5 f8 m( i- H/ Y0 L8 k6 L— AHB1 外设(包括 AHB-APB 总线桥和 APB 外设)
+ R; m: S6 n( D5 I$ B— AHB2 外设— FSMC
5 v) M2 G* y. \; Q3 n3 t" d( R
- n4 I3 v# n$ x5 N
微信图片_20230402153829.jpg & l9 {; Z, G: y' k! f, p  v
5 b" A9 p6 Q# u: o! M
借助总线矩阵,可以实现主控总线到被控总线的访问,这样即使在多个高速外设同时运行期间,系统也可以实现并发访问和高效运行。* ~$ X+ M" J' Y' }1 E9 u
: M: o6 \% r1 x; m- s& k; G$ V
2、关于AHB和APB总线
( ?- {: w9 Q/ A- b# D7 S: a" K# A
AHB:Advanced High-performance Bus,即先进的高性能总线。% a7 y& N  G% H* _! D* d- d
APB:Advanced Peripheral Bus,即先进的外围(外设)总线。( X3 E' j9 n. a4 D% |. d1 b
上面说了系统总线的架构引伸出来的就是AHB和APB总线,那为什么要讲述AHB和APB总线呢?$ e; H1 X. n. n" ^
我们操作的外围设备一般都是位于AHB和APB总线上,而AHB可以引伸出AHB1、AHB2,甚至AHB3。同样APB也存在APB1、APB2等。; D) X4 R) [+ F' U  B" R1 N
比如,USART1外设位于APB1总线上,GPIOA位于AHB1高速总线上。
: U" }6 p, A2 y, O* q$ o! s
请注意参考手册中“AHB/APB 总线桥”这一小节,有一条重要的内容:每次芯片复位后,所有外设时钟都被关闭( SRAM 和 Flash 接口除外)。使用外设前,必须在 RCC_AHBxENR 或 RCC_APBxENR 寄存器中使能其时钟
/ p7 m$ {( {3 W- U
0 n0 t% I, `+ x5 V
3、STM32时钟控制' ^. q" F, Y5 ?9 \7 k8 c4 h+ {

( K5 D% ?( C* s) M; S* r9 o. ^
微信图片_20230402153823.jpg & Z7 J  ^2 [+ c: |* l/ T

( X5 c0 ]8 J( U* E# M" d- k
STM32的时钟控制模块因MCU芯片不同,各有差异,但原理都类似,功能也相当丰富。主要的目的就是给相对独立的外设模块提供时钟,也是为了降低整个芯片的功能。
4 y; Y2 u+ B/ _1 h' C- o2 _9 I
% C* `( x; X4 I: ~+ X( j$ E, M
降低功耗是主要原因,还有一个原因,就是为了兼容不同速度的设备,有些高速,有些低速,如果都用高速时钟,势必造成浪费。
3 x2 Q  d0 N# `7 u0 C7 c: N
, ?! C! D! `! K" e: G  X
RCC给外设提供时钟是一个主要目的,那么为什么要提供时钟呢? 原因在于外围设备的寄存器需要时钟才能工作。你可以把外设当做一个设备,而这个设备需要给它提供电源(时钟)才能工作。) ?3 `9 Z# }, c4 w/ S& i( J& m. Q

# @1 K8 S' h! S$ f- ^
你在STM32参考手册的“RCC”章节可能会看到这么一句话:当外设时钟没有启用时,软件不能读出外设寄存器的数值,返回的数值始终是0x0
) B  }' ]0 I( H% r# M6 w. d5 k0 Z& I% _% S
4、总结
. Q# Y$ a' [  x5 K2 D) @
看到这里,相信聪明的你已经明白了为什么我们要先开启STM32外设模块时钟,再配置其外设模块了。
" h5 a8 ~8 s2 G8 @# K% p- S
简单来说,就是操作外设是通过外设总线来实现,只有外设总线有时钟了才能操作外设。- i" r4 {- T! f# w5 {
坑:6 G2 \. N7 Y; b$ \' W( _
A.先使能外设时钟,再对其进行配置
8 R/ Y% K; h4 v- e

8 T* u; D8 R$ U$ K% q5 Q$ \
微信图片_20230402153817.jpg
& \$ E& }& F+ f8 {1 l# N; ~  l  B  T
B.时钟配置需对应总线
! Y7 S9 u' x( T* V3 U5 R& }
9 j% y1 F7 P3 M' B& s* I- d
微信图片_20230402153812.png
0 J& E/ U, b- W; \* w8 F  z- `
1 L9 s" L1 g7 W2 E7 \+ `
这种基于标准外设库的低级错误,相信肯定有不少人遇到过,希望提高警惕。
6 L  \% h( [3 |8 A: @
. f, h% d; i: H4 M8 w+ o
AFIO复用时钟
有朋友问:“什么时候开启AFIO时钟”。写了上面章节,就顺便再讲述一下关于STM32的I/O复用功能及什么时候开启AFIO时钟。
8 l4 x; Z% l0 W
1、什么是I/O 复用功能?

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

# B& F, a  Z  ~7 P, |  @

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

6 @; i7 S" n  h

微信图片_20230402153800.jpg


2 Z: A% F0 L" `& ?- |
2、什么时候开启AFIO时钟?


% y  e+ `$ a2 S, A( T0 k' }# ~: F9 P

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

, L4 z( J: E6 \& a" g+ g( p( f" J7 |# a

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


; v4 ~- D# V9 H& S* l& T4 ?' Z

简单来说,如果需要使用重定义功能,那么就需要开启AFIO时钟。
3 S* J& B% J% N' w, W


, @. M  z  v' D( h

最后,如果你觉得你的程序可能是因为时钟配置的问题,不妨上电第一步使能所有时钟试试。: e% T9 g! i8 s) E1 r) X. T! x

6 A9 ~- v" `3 T0 `- Y2 B- U8 ^; j9 u
7 u0 t# ~! O9 U

/ e9 }# z- @7 `1 a1 x/ z5 }转载自:嵌入式微处理器; X6 S7 F4 S0 W
如有侵权请联系删除
2 V9 b3 f' G( U  Y+ T
& f- {) s& a  c* h9 u' P5 I
0 q; g  P& T( ?& g0 e# \" A- N) R5 o
收藏 评论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 手机版