400-035-6699
当前位置: 首页 » 技术支持 » 博文资讯 »

STM32时钟设置详解:避开常见配置误区

在深入探讨STM32的开发过程中,我们经常会遇到关于外设模块时钟配置的问题。理解其背后的原理和正确配置方法对于确保系统稳定运行至关重要。
首先,我们需要明白为什么在配置STM32的外设模块前要优先开启时钟。想象一下,如果想要操作某个设备,我们必须先确保该设备已经接通电源。同样,在STM32中,外设模块的“电源”就是时钟信号。没有时钟,外设的寄存器就无法工作,任何试图读取或写入的操作都会失败。
STM32的系统架构基于多总线设计,其中包括高性能的AHB总线和外围的APB总线。不同的外设连接在不同的总线上,如USART1位于APB1总线,而GPIOA位于AHB1总线。关键的一点是,每当芯片复位后,所有外设的时钟默认都是关闭状态,这就要求我们必须在RCC相关寄存器中明确开启所需的外设时钟。
在STM32的复位与时钟控制(RCC)模块中,时钟控制是核心功能之一。通过RCC,可以为每个外设独立配置时钟,这样可以降低整体功耗,同时兼容不同速度的外设。没有时钟的外设寄存器在读取时始终返回0x0,这是STM32手册中的明确说明。
那么,如何避免这些常见的“坑”呢?首先,确保在配置任何外设之前,首先使能其时钟。其次,要确保时钟配置与外设所在的总线相匹配。这些都是基于标准外设库的低级错误,但却是导致许多开发者困惑的常见问题。
接下来,让我们聊聊STM32的I/O复用功能。STM32的引脚多功能性是其一大特色,允许我们将普通I/O引脚用作其他功能,例如将某个引脚用作USART的通信引脚。这种灵活性使得我们可以根据需要重新映射引脚的功能,但这也要求我们在必要时开启AFIO时钟。
AFIO时钟的开启时机通常是在我们需要重映射引脚功能时。例如,如果我们想将某个外设的引脚从默认位置移动到另一个位置,就需要通过AFIO模块来配置。在这种情况下,开启AFIO时钟是必不可少的。
最后,如果开发者怀疑程序的问题可能与时钟配置有关,一个有效的方法是上电后第一步就使能所有时钟,然后再逐步禁用不需要的时钟。这种方法可以确保所有外设在配置前都有时钟供应,有助于快速定位问题。
在STM32的开发过程中,深入理解时钟配置的重要性,遵循正确的配置步骤,可以帮助我们避免许多不必要的麻烦,确保系统的稳定性和性能。记住,正确的时钟配置是确保外设正常工作的关键。

STM32时钟设置详解:避开常见配置误区

今天分享以下两点内容:

1.为什么我们要先开启STM32外设模块时钟

2.关于STM32的 I/O 复用功能及什么时候开启AFIO时钟;

1为什么我们要先开启STM32外设时钟

讲述本节内容之前先说一个案例:

前段时间,有一个朋友为配置EXTI的代码折腾了一天,最终没有结果。于是问了我这样一个问题:“你用过STM32F051C8T6的外部中断吗,就是GPIO管脚做中断,我这边就是进不了中断”。

然后他把基于标准外设库、寄存器写的代码都给我发过来了。我仔细看了又看,没发现有什么毛病啊。(但是,代码是截图分来给我发过来的)。

于是,我将之前配置IO外部中断的代码,按照他(PB2)的要求,写成一个“EXTI配置”函数发给他,他直接拷贝过去,成功了。

于是,他仔细对比了代码,终于发现了问题的原因,配置的顺序不对,使能时钟不是在最开始。

我想许多朋友都曾遇到过这种坑,我最初学习STM32的时候同样也遇到过,下面我就来说说为什么我们要先开启STM32外设模块时钟,再对其外设模块初始化配置?

1.系统架构

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

如STM32F4:

● 八条主控总线:

— Cortex-M4F 内核 I 总线、 D 总线和 S 总线

DMA1 存储器总线

— DMA2 存储器总线

— DMA2 外设总线

以太网 DMA 总线

USB OTG HS DMA 总线

● 七条被控总线:

— 内部 Flash ICode 总线

— 内部 Flash DCode 总线

— 主要内部 SRAM1 (112 KB)

— 辅助内部 SRAM2 (16 KB)

— 辅助内部 SRAM3 (64 KB)(仅适用于 STM32F42xxx 和 STM32F43xxx 器件)

— AHB1 外设(包括 AHB-APB 总线桥和 APB 外设)

— AHB2 外设

— FSMC

借助总线矩阵,可以实现主控总线到被控总线的访问,这样即使在多个高速外设同时运行期间,系统也可以实现并发访问和高效运行。

2.关于AHB和APB总线

AHB:Advanced High-performance Bus,即先进的高性能总线.

APB:Advanced Peripheral Bus,即先进的外围(外设)总线.

上面说了系统总线的架构引伸出来的就是AHB和APB总线,那为什么要讲述AHB和APB总线呢?

我们操作的外围设备一般都是位于AHB和APB总线上,而AHB可以引伸出AHB1、AHB2,甚至AHB3。同样APB也存在APB1、APB2等。

如:USART1外设位于APB1总线上,GPIOA位于AHB1高速总线上。

请注意参考手册中“AHB/APB 总线桥”这一小节,有一条重要的内容:每次芯片复位后,所有外设时钟都被关闭( SRAM 和 Flash 接口除外)。使用外设前,必须在 RCC_AHBxENR 或 RCC_APBxENR 寄存器中使能其时钟。

3.STM32时钟控制

请参看STM32参考手册关于【复位与时钟控制RCC】章节。

STM32的时钟控制模块因MCU芯片不同,各有差异,但原理都类似,功能也相当丰富。主要的目的就是给相对独立的外设模块提供时钟,也是为了降低整个芯片的功能。

低功耗是主要原因,还有一个原因,就是为了兼容不同速度的设备,有些高速,有些低速,如果都用高速时钟,势必造成浪费。

RCC给外设提供时钟是一个主要目的,那么为什么要提供时钟呢?原因在于外围设备的寄存器需要时钟才能工作。你可以把外设当做一个设备,而这个设备需要给它提供电源(时钟)才能工作。

你在STM32参考手册的“RCC”章节可能会看到这么一句话:当外设时钟没有启用时,软件不能读出外设寄存器的数值,返回的数值始终是0x0。

4.总结

看到这里相信聪明的你其中已经明白为什么我们要先开启STM32外设模块时钟,再配置其外设模块了。

简单来说:操作外设是通过外设总线来实现,只有外设总线有时钟了才能操作外设。

坑:

A.先使能外设时钟,再对其进行配置

B.时钟配置需对应总线

这种基于标准外设库的低级错误,相信肯定有不少人遇到过,希望提高警惕。

2关于STM32的I/O复用功能及什么时候开启AFIO时钟

前面有朋友问:“什么时候开启AFIO时钟”。写了上面章节,就顺便再讲述一下关于STM32的I/O复用功能及什么时候开启AFIO时钟。

1.什么是I/O 复用功能?

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

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

2.什么时候开启AFIO时钟

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

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

简单来说,如果需要使用重定义功能,那么就需要开启AFIO时钟。

最后,如果你觉得你的程序可能是因为时钟配置的问题,不妨上电第一步使能所有时钟试试。

推荐阅读:

1.STM32标准外设库SPL转换成Cube LL

2.利用STM32 ST-LINK Utility查看内核运行状态,助你判断程序是否跑飞

5最后

若觉得文章好,记得点赞、分享。扫描下面二维码、关注,在底部菜单中查看更多精彩内容!

长按识别图中二维码关注

赞赏是对作者的认可与支持!

原文标题:关于STM32时钟配置的那些坑

文章出处:【微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。

【限时免费】一键获取网络规划系统模板+传输架构设计+连通性评估方案

STM32相关文章

服务电话:
400-035-6699
企服商城