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

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

[复制链接]
攻城狮Melo 发布时间:2023-4-2 15:38
今天给大家分享两点内容:: }2 `. c, W1 z. _, Y5 x& s( H
一是,为什么我们要先开启STM32外设时钟;二是,关于STM32的 I/O 复用功能及什么时候开启AFIO时钟。

3 I$ i6 r# C; \% @, X
STM32为什么要先开启外设时钟?
相信很多朋友都曾遇到过这种坑,我最初学习STM32的时候同样也遇到过。下面,我就来说说为什么我们要先开启STM32外设模块时钟,再对其外设模块初始化配置?

; X; ?& j/ ?9 z! t% _4 J7 D/ Q) v
1、系统架构

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


7 A0 y/ h  v7 T: Q

以STM32F4为例:

八条主控总线:
— Cortex™-M4F 内核 I 总线、 D 总线和 S 总线— DMA1 存储器总线* k. ?9 h9 s& c! J
— DMA2 存储器总线
  _' l" y$ C/ y, i6 f2 Q— DMA2 外设总线
% H0 ~1 l$ B; F$ T! U% }1 F+ v— 以太网 DMA 总线
7 }" W9 m7 ]$ J$ d3 \  @. n# N& P" M— USB OTG HS DMA 总线- J- r) B% S8 ^3 q: O
七条被控总线:
* l4 F  g7 L. P- O* C— 内部 Flash ICode 总线7 E& G) I" S& l" u5 H
— 内部 Flash DCode 总线# t! v6 ?" I; x. P: J, p
— 主要内部 SRAM1 (112 KB)) @& q9 A2 |; I& r: P' P1 W' m4 L* _1 u
— 辅助内部 SRAM2 (16 KB); t, q' V  J/ @
— 辅助内部 SRAM3 (64 KB)(仅适用于 STM32F42xxx 和 STM32F43xxx 器件)
' W7 F/ O5 C" N$ Y, L% l, N— AHB1 外设(包括 AHB-APB 总线桥和 APB 外设)
  w! `9 W2 P$ ]$ Y* T3 Y— AHB2 外设— FSMC
& f- j6 ?/ u4 S$ ^
  X- |" ~' L  |7 w! @6 R
微信图片_20230402153829.jpg $ l0 N9 c, Q; d0 u- P" V" {
: b! z; |5 N" k6 k) N
借助总线矩阵,可以实现主控总线到被控总线的访问,这样即使在多个高速外设同时运行期间,系统也可以实现并发访问和高效运行。8 r, {3 J; c4 e

& P  n# F0 u  o
2、关于AHB和APB总线4 r" ~4 }! _' z( u( c( x8 @! Y& s
AHB:Advanced High-performance Bus,即先进的高性能总线。1 }: m' P" u5 l) K( o/ F
APB:Advanced Peripheral Bus,即先进的外围(外设)总线。
3 J: B  f" B7 b7 z) b& y! l
上面说了系统总线的架构引伸出来的就是AHB和APB总线,那为什么要讲述AHB和APB总线呢?( E' X& V2 L# @1 n# q6 _7 D6 E2 ]4 U
我们操作的外围设备一般都是位于AHB和APB总线上,而AHB可以引伸出AHB1、AHB2,甚至AHB3。同样APB也存在APB1、APB2等。9 \( ^+ b9 D, Z# z& R& |4 B
比如,USART1外设位于APB1总线上,GPIOA位于AHB1高速总线上。
$ }( B  M, S. ~! E& Z  V$ w
请注意参考手册中“AHB/APB 总线桥”这一小节,有一条重要的内容:每次芯片复位后,所有外设时钟都被关闭( SRAM 和 Flash 接口除外)。使用外设前,必须在 RCC_AHBxENR 或 RCC_APBxENR 寄存器中使能其时钟
4 u1 ^+ q* z3 V/ O/ l
8 G$ f2 O* K/ B/ O% [& n
3、STM32时钟控制
$ }, F! p+ Y$ s

* ~9 g4 l7 z9 @
微信图片_20230402153823.jpg
( F7 ^: _( Y& {  @9 d
3 _" f: {* _" J" c" J2 e  s) |9 R7 @
STM32的时钟控制模块因MCU芯片不同,各有差异,但原理都类似,功能也相当丰富。主要的目的就是给相对独立的外设模块提供时钟,也是为了降低整个芯片的功能。& o% _6 ^$ R2 T5 u+ W8 g9 P9 K

* O6 }9 b" D7 Y' [. M& L! p
降低功耗是主要原因,还有一个原因,就是为了兼容不同速度的设备,有些高速,有些低速,如果都用高速时钟,势必造成浪费。
# W8 u% r7 [, V- }# r% E
2 e$ }6 a4 k: }, K
RCC给外设提供时钟是一个主要目的,那么为什么要提供时钟呢? 原因在于外围设备的寄存器需要时钟才能工作。你可以把外设当做一个设备,而这个设备需要给它提供电源(时钟)才能工作。( z: Y6 A& p6 O$ k9 J
; w) J6 o0 k. @
你在STM32参考手册的“RCC”章节可能会看到这么一句话:当外设时钟没有启用时,软件不能读出外设寄存器的数值,返回的数值始终是0x0" M+ m8 W* H7 w3 O

* Y! L) P9 R* X% o2 u
4、总结2 Z% U! V: p& r/ L) @
看到这里,相信聪明的你已经明白了为什么我们要先开启STM32外设模块时钟,再配置其外设模块了。
$ o# R! O9 ^" K" B2 k  ~0 `' D+ M% y3 }
简单来说,就是操作外设是通过外设总线来实现,只有外设总线有时钟了才能操作外设。
! q* D8 F8 Z) g/ c: b# W
坑:
5 C$ {) [" n7 r* P8 E- J8 O
A.先使能外设时钟,再对其进行配置# V, e- b7 p* Q* y$ e; C+ t/ s
/ `2 I' N; k0 ?! P
微信图片_20230402153817.jpg
- l: Q! R7 E/ |/ |  ?
, z3 F0 l$ l% u
B.时钟配置需对应总线5 x+ v8 O1 p/ Z2 Y' j

- f; T( t$ J& x( C
微信图片_20230402153812.png
; Z/ U" x* t2 l4 k! O& O2 T
+ I; W" C1 }7 Q8 \+ Y. ]1 b
这种基于标准外设库的低级错误,相信肯定有不少人遇到过,希望提高警惕。
0 |+ u9 C# \) ?
$ K4 d% F; K0 D5 g0 W0 v- i
AFIO复用时钟
有朋友问:“什么时候开启AFIO时钟”。写了上面章节,就顺便再讲述一下关于STM32的I/O复用功能及什么时候开启AFIO时钟。

% I' {* L8 q6 v, n: |6 g
1、什么是I/O 复用功能?

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

2 j- F! g. ~  W! I# d& Q* V

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


& Z% g. n& Z! e! X1 I; T

微信图片_20230402153800.jpg


7 o4 _6 y8 a6 Y3 m
2、什么时候开启AFIO时钟?


: M  u' W  n$ @7 Y4 S5 G

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

' t! B# M2 ]# \9 E. W7 j' A

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


5 {. A/ h- }1 A

简单来说,如果需要使用重定义功能,那么就需要开启AFIO时钟。
- K3 B- u: A& X# [/ L


6 g6 _! _0 n/ D/ U3 Y9 |

最后,如果你觉得你的程序可能是因为时钟配置的问题,不妨上电第一步使能所有时钟试试。: U  u2 f2 G* j! c9 e; ?0 N4 A- v

% _# C: s! P/ H* B- C8 f; ], a' i. s! D

' z+ j% ^! y+ v4 ^) v

; E/ S3 a+ o. l- O转载自:嵌入式微处理器5 X. p1 C# M5 F4 q1 Y
如有侵权请联系删除
. m6 k" x7 Q0 S, t. U
9 R' a6 ]3 H$ K* s+ a' ]7 O. h* p
. E, ^5 Q1 ^* |# q
收藏 评论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 手机版