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

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

[复制链接]
攻城狮Melo 发布时间:2023-4-2 15:38
今天给大家分享两点内容:( u2 g- T$ ?% J) ?+ |9 P6 w
一是,为什么我们要先开启STM32外设时钟;二是,关于STM32的 I/O 复用功能及什么时候开启AFIO时钟。
" S, R4 C1 ^4 K# o% ]8 [9 P
STM32为什么要先开启外设时钟?
相信很多朋友都曾遇到过这种坑,我最初学习STM32的时候同样也遇到过。下面,我就来说说为什么我们要先开启STM32外设模块时钟,再对其外设模块初始化配置?
+ d3 @4 b4 |9 h2 W$ t3 {1 \
1、系统架构

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

$ S; {( u( ^( p; R: X0 E, l: F

以STM32F4为例:

八条主控总线:
— Cortex™-M4F 内核 I 总线、 D 总线和 S 总线— DMA1 存储器总线% \( Y' ^! }1 o4 p# e; }* {
— DMA2 存储器总线8 d" K5 o3 w3 a0 T5 O( W( p
— DMA2 外设总线: z3 |4 x" k& V2 ?0 B1 J0 a3 S1 B
— 以太网 DMA 总线
; i; }! y' B! k2 I( z$ n— USB OTG HS DMA 总线
. z4 U( ]2 L# u& g9 o( ]
七条被控总线:
, T4 [  y' a3 F— 内部 Flash ICode 总线
6 |0 C7 M/ p' l, J! G7 p: g$ ?— 内部 Flash DCode 总线
1 n& ~; J( o/ Y, [# w  o- G$ N— 主要内部 SRAM1 (112 KB)  e, l# M: i- j4 E. l* E' D) ^
— 辅助内部 SRAM2 (16 KB)
! N* I" o0 d7 G/ L6 Z. u— 辅助内部 SRAM3 (64 KB)(仅适用于 STM32F42xxx 和 STM32F43xxx 器件)0 `. }4 b) V  c0 k. D. V
— AHB1 外设(包括 AHB-APB 总线桥和 APB 外设)
8 G0 o, H+ ^$ H9 C1 K! S4 [, r— AHB2 外设— FSMC
" p* M; c! U2 J, F0 H# \. a  j

  o$ x( {7 A" `  {
微信图片_20230402153829.jpg - h4 {$ Y8 z$ N$ s& }
% H# v! ]$ g+ s' ]- j. k# r, M
借助总线矩阵,可以实现主控总线到被控总线的访问,这样即使在多个高速外设同时运行期间,系统也可以实现并发访问和高效运行。
1 Q0 C! b& S% {2 X9 p! X* N" z$ o- _
2、关于AHB和APB总线
& X& }$ `1 ~& `$ ]
AHB:Advanced High-performance Bus,即先进的高性能总线。) A/ Z* ~% n5 \5 Q' V
APB:Advanced Peripheral Bus,即先进的外围(外设)总线。! n2 q8 s$ ]: j4 |, |( o
上面说了系统总线的架构引伸出来的就是AHB和APB总线,那为什么要讲述AHB和APB总线呢?5 R4 R% i1 Q4 V7 O) e) v5 e
我们操作的外围设备一般都是位于AHB和APB总线上,而AHB可以引伸出AHB1、AHB2,甚至AHB3。同样APB也存在APB1、APB2等。9 B" j0 ?1 @1 t% l$ I) M- \% a
比如,USART1外设位于APB1总线上,GPIOA位于AHB1高速总线上。7 E# r  R6 [$ p% \- |
请注意参考手册中“AHB/APB 总线桥”这一小节,有一条重要的内容:每次芯片复位后,所有外设时钟都被关闭( SRAM 和 Flash 接口除外)。使用外设前,必须在 RCC_AHBxENR 或 RCC_APBxENR 寄存器中使能其时钟
$ p+ K* o. C4 @% \5 y$ A! [& I1 }
8 E$ A5 }% V) Y1 N1 q
3、STM32时钟控制' O9 E) X; {  Z

' N/ |* C1 n8 w
微信图片_20230402153823.jpg * e8 [( w! j* x& q+ ?2 q
! b! `* L& Y5 q
STM32的时钟控制模块因MCU芯片不同,各有差异,但原理都类似,功能也相当丰富。主要的目的就是给相对独立的外设模块提供时钟,也是为了降低整个芯片的功能。
& I+ |/ O7 ?% h* R4 S" ?( X& T, b8 G8 |% _  q
降低功耗是主要原因,还有一个原因,就是为了兼容不同速度的设备,有些高速,有些低速,如果都用高速时钟,势必造成浪费。: p. e4 v% c* Q  y$ t
: g' f! w. h! H" ?2 w) }! D. w
RCC给外设提供时钟是一个主要目的,那么为什么要提供时钟呢? 原因在于外围设备的寄存器需要时钟才能工作。你可以把外设当做一个设备,而这个设备需要给它提供电源(时钟)才能工作。
& t' j0 V% L0 M  G3 J

0 g3 q$ l! B; ]% N  r
你在STM32参考手册的“RCC”章节可能会看到这么一句话:当外设时钟没有启用时,软件不能读出外设寄存器的数值,返回的数值始终是0x0
, U) D2 H! s' q7 ^- C2 q* I0 ~+ D* Z4 @- x; s
4、总结" q8 Q6 o/ b3 o
看到这里,相信聪明的你已经明白了为什么我们要先开启STM32外设模块时钟,再配置其外设模块了。
7 ~; }* e1 t3 [, y6 p7 k1 o. @
简单来说,就是操作外设是通过外设总线来实现,只有外设总线有时钟了才能操作外设。
  V5 V* }6 M- L4 U4 E$ x
坑:( J3 c$ {3 S0 h9 e- ?7 v- X
A.先使能外设时钟,再对其进行配置# m" U; p: {6 Z3 z3 u; R
9 N' r; O2 W( @
微信图片_20230402153817.jpg 3 {1 X9 ^+ s  v  O& r* `
7 o, ~  b+ _& L) v. F
B.时钟配置需对应总线) G7 z5 a- X9 y
% r- o: c$ K8 N7 {" _* ~3 u
微信图片_20230402153812.png 9 x4 q9 w5 e5 m1 h$ Y) l
: d0 p( ]8 P7 `0 K6 V
这种基于标准外设库的低级错误,相信肯定有不少人遇到过,希望提高警惕。
! S8 |( U  r5 ^- e. U: [& M, l9 d, A  d( s
AFIO复用时钟
有朋友问:“什么时候开启AFIO时钟”。写了上面章节,就顺便再讲述一下关于STM32的I/O复用功能及什么时候开启AFIO时钟。

- T2 i( C& A8 i# Z
1、什么是I/O 复用功能?

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


6 A, ]$ q1 c9 q6 C5 T; M3 H) p

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


) N5 b1 t& [( p

微信图片_20230402153800.jpg


" x: L* @) j; L+ a- a* l
2、什么时候开启AFIO时钟?

+ B$ T) w# W4 J) ~) R: Y

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


+ K, T- s8 e. P. }

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


" E: e9 T# s+ a- E( r7 D2 @

简单来说,如果需要使用重定义功能,那么就需要开启AFIO时钟。0 h1 `6 y, ?2 z+ \- D& }

1 K$ w- {5 w6 X* ?

最后,如果你觉得你的程序可能是因为时钟配置的问题,不妨上电第一步使能所有时钟试试。. B% _1 w5 ~& V$ L) v$ r7 x

) x5 q* c$ \+ A) i! }& o& M, U$ Q, R  Q5 w9 N* s! ]
- T+ s  Z# \. [/ Q6 z$ ^
! |2 B; x  u5 L  ^4 h3 b7 C9 X
转载自:嵌入式微处理器  l! }7 W& A$ k+ V
如有侵权请联系删除
* Q0 A( L% E' D5 r6 [' |
/ H, O4 L+ a; }1 N: ]3 i
3 L9 |0 i5 m5 _
收藏 评论1 发布时间:2023-4-2 15:38

举报

1个回答
这辈子不打工 回答时间:4 天前

我以前以为只要启用复用(AFIO)功能就需要开启AFIO时钟,今天发现定时器初始化,不启用AFIO也能正常使用,搞得我有点困惑.

现在明白了,整篇文章的重点是"简单来说,如果需要使用重定义功能,那么就需要开启AFIO时钟。"

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版