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

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

[复制链接]
攻城狮Melo 发布时间:2023-4-2 15:38
今天给大家分享两点内容:
" m, D9 l2 I( ]/ h
一是,为什么我们要先开启STM32外设时钟;二是,关于STM32的 I/O 复用功能及什么时候开启AFIO时钟。
. W( L3 A. w# m5 v3 r- U3 V
STM32为什么要先开启外设时钟?
相信很多朋友都曾遇到过这种坑,我最初学习STM32的时候同样也遇到过。下面,我就来说说为什么我们要先开启STM32外设模块时钟,再对其外设模块初始化配置?

+ @/ O/ J' e# s' N7 l9 ]
1、系统架构

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


) C+ g! p1 S4 n, [

以STM32F4为例:

● 八条主控总线:
— Cortex™-M4F 内核 I 总线、 D 总线和 S 总线— DMA1 存储器总线. ?0 d8 p4 O, V: u' \1 a* N
— DMA2 存储器总线2 s5 W3 d' K' L! P0 V( [
— DMA2 外设总线5 i' r' ^( {2 N0 _7 s) I, F" T
— 以太网 DMA 总线* z6 {% T$ j, M) h/ m
— USB OTG HS DMA 总线
, o% O& e6 u6 @( k5 ^- O
● 七条被控总线:
/ H% O( X/ H$ h  `9 @0 w, J- h— 内部 Flash ICode 总线
# J: ~7 c' S7 p' H, h7 L! A6 v6 e— 内部 Flash DCode 总线! e4 j- g' |* A2 J
— 主要内部 SRAM1 (112 KB)' Y3 O9 C. U" J. Q3 O
— 辅助内部 SRAM2 (16 KB)
! Y. `& Y6 X" v" x, s* Z" s, l8 [— 辅助内部 SRAM3 (64 KB)(仅适用于 STM32F42xxx 和 STM32F43xxx 器件)5 \9 [3 U- X5 o$ b0 i5 W; R
— AHB1 外设(包括 AHB-APB 总线桥和 APB 外设)
, j# @) d# n/ l/ j$ Y' H# E— AHB2 外设— FSMC
2 c; P3 t% l; o7 M# s

6 X: [6 g! \3 \/ H  T/ ]0 l! X
微信图片_20230402153829.jpg
2 L% V. \2 q* d
4 ~8 @1 K0 _  }" A, }* n
借助总线矩阵,可以实现主控总线到被控总线的访问,这样即使在多个高速外设同时运行期间,系统也可以实现并发访问和高效运行。& m3 W4 @4 e; H0 |: y( _' |6 {
! F+ N% h! a9 {
2、关于AHB和APB总线
, O: i# ]; L4 \4 X" l1 N
AHB:Advanced High-performance Bus,即先进的高性能总线。# d" ?1 U$ F, Z, G, y. r
APB:Advanced Peripheral Bus,即先进的外围(外设)总线。8 a  t- ]  ^9 {  B$ @, |
上面说了系统总线的架构引伸出来的就是AHB和APB总线,那为什么要讲述AHB和APB总线呢?. M) a" i. g% S, `. s
我们操作的外围设备一般都是位于AHB和APB总线上,而AHB可以引伸出AHB1、AHB2,甚至AHB3。同样APB也存在APB1、APB2等。
5 `: i! j2 m# [* ~# Q! f, W9 f
比如,USART1外设位于APB1总线上,GPIOA位于AHB1高速总线上。. j: N  ~/ W; N2 W
请注意参考手册中“AHB/APB 总线桥”这一小节,有一条重要的内容:每次芯片复位后,所有外设时钟都被关闭( SRAM 和 Flash 接口除外)。使用外设前,必须在 RCC_AHBxENR 或 RCC_APBxENR 寄存器中使能其时钟。% K7 X4 o% P$ G
2 _8 P0 k2 ^/ @- E) o% x* U3 j2 `
3、STM32时钟控制
- z* i, a5 K  z- {8 `* d
$ D$ m" D% b7 t0 U0 H  Q
微信图片_20230402153823.jpg . s) s9 c) M1 Y

# Q) @8 o9 y$ [4 j! `0 m$ h7 w
STM32的时钟控制模块因MCU芯片不同,各有差异,但原理都类似,功能也相当丰富。主要的目的就是给相对独立的外设模块提供时钟,也是为了降低整个芯片的功能。
8 e, a* ^8 a  R  i  _6 q3 c/ \/ I$ }
! |! V" `. ?2 t8 }! G
降低功耗是主要原因,还有一个原因,就是为了兼容不同速度的设备,有些高速,有些低速,如果都用高速时钟,势必造成浪费。
5 b9 y4 G4 Q8 G' W, l8 h# `

- r: m% q, e9 `/ R3 D4 K
RCC给外设提供时钟是一个主要目的,那么为什么要提供时钟呢? 原因在于外围设备的寄存器需要时钟才能工作。你可以把外设当做一个设备,而这个设备需要给它提供电源(时钟)才能工作。, S5 s% K, y4 {, A$ y6 Y0 U

, V% J) ]  h9 q4 ~; _7 Z7 }/ n; d) e
你在STM32参考手册的“RCC”章节可能会看到这么一句话:当外设时钟没有启用时,软件不能读出外设寄存器的数值,返回的数值始终是0x0。( @4 @8 v" Y% l! I! B
; O5 ^! z* ^( j
4、总结
: y  s! w2 q. o0 m1 J4 ~
看到这里,相信聪明的你已经明白了为什么我们要先开启STM32外设模块时钟,再配置其外设模块了。( S. z1 m2 h- w) }: X; n
简单来说,就是操作外设是通过外设总线来实现,只有外设总线有时钟了才能操作外设。3 e* _4 j8 R/ n0 W) H
坑:* k+ h, _, ^9 Z) O
A.先使能外设时钟,再对其进行配置* a& f  q) G8 p" Z% T, s3 v
! x: a  t2 ?: T1 g( Z' X, z9 I& q
微信图片_20230402153817.jpg 5 f& `5 n$ X2 J3 D% e/ y, h

+ A! L  d# F* I7 j8 d. W5 B- V6 r; T
B.时钟配置需对应总线
. f1 n; W5 Z0 J5 K5 D0 \- j& \: m

, f9 {' l* a8 m
微信图片_20230402153812.png
" O) K! ]  Y2 `  f0 X
! y8 ^) S% W0 {9 p0 \% J
这种基于标准外设库的低级错误,相信肯定有不少人遇到过,希望提高警惕。
) {0 R  l: F! X2 L, b  I- L7 ?; C! ~1 V/ S& {  P) N
AFIO复用时钟
有朋友问:“什么时候开启AFIO时钟”。写了上面章节,就顺便再讲述一下关于STM32的I/O复用功能及什么时候开启AFIO时钟。
% e, l1 H1 R1 H% j" u
1、什么是I/O 复用功能?

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


& T+ l! K& O1 E7 g

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

1 ]' F  Z( L4 @; x

微信图片_20230402153800.jpg


( j+ `/ F$ }( ~$ _6 y
2、什么时候开启AFIO时钟?

( b8 v" d# A4 G

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

9 S5 K; B3 @- D

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

. A7 C9 _. ^$ B9 I$ t0 _2 W

简单来说,如果需要使用重定义功能,那么就需要开启AFIO时钟。% n8 t% ~; D7 ?* h3 y

1 u$ R0 [" x/ z3 P

最后,如果你觉得你的程序可能是因为时钟配置的问题,不妨上电第一步使能所有时钟试试。
4 s8 U" F) O% x7 t( R+ \6 P( H* d4 x! A8 d5 ]& b

2 l1 E- ^7 O- F8 }2 f% L
2 l2 |8 f& s8 }& Y4 t& k7 i

/ O" v4 J% x, j# d+ w# i转载自:嵌入式微处理器! S- w5 a% F$ N/ R  f' a- i
如有侵权请联系删除
; s3 q; m, v9 {! G
' U: x) F$ C, }- U! j( h8 E
$ A+ }8 a# D. D3 ]0 {
赞 收藏 评论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 手机版