0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

关于 STM32 时钟配置的那些坑

黄工的嵌入式技术圈 来源:黄工的嵌入式技术圈 2020-03-08 12:06 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

今天分享以下两点内容:

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】欢迎添加关注!文章转载请注明出处。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ARM
    ARM
    +关注

    关注

    135

    文章

    9499

    浏览量

    388702
  • STM32
    +关注

    关注

    2305

    文章

    11120

    浏览量

    371147
  • Atmel
    +关注

    关注

    17

    文章

    312

    浏览量

    109902
  • AMBA
    +关注

    关注

    0

    文章

    70

    浏览量

    15917
  • AFIO
    +关注

    关注

    0

    文章

    6

    浏览量

    3252
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    那些年我用OpenCV+Qt趟过哪些?写给视觉应用开发者的避指南

    从一个写脚本的算法爱好者,到能独立设计交付跨平台视觉检测系统,中间踩了无数的,也总结出一套还算行之有效的方法。今天,中际赛威刘老师不谈高深理论,就想把这套从基础搭建、核心架构到项目实战的完整
    发表于 12-02 09:43

    STM32 5 个容易踩的外设使用技巧

    甚至有经验的工程师,也常在外设配置上浪费大量时间,调试半天仍然找不到问题。本文总结了5个最容易踩STM32外设使用技巧,让你少走弯路、提高开发效率。1.GPIO
    的头像 发表于 11-24 19:04 509次阅读
    <b class='flag-5'>STM32</b> 5 个容易踩<b class='flag-5'>坑</b>的外设使用技巧

    晶振与STM32那些小关系

    STM32 适配晶振,以及晶振解剖图
    的头像 发表于 11-21 15:37 4510次阅读
    晶振与<b class='flag-5'>STM32</b>的<b class='flag-5'>那些</b>小关系

    Proteus中配置STM32外部时钟HSE如何配置

    有大佬会配置Proteus中的STM32F103C8的外部时钟吗 这个proteus中打印不出来数据,但是在实物的连接中可以正常打印 代码如下: 并且配置proteus中的虚拟串口
    发表于 11-02 13:54

    国产MCU开始卷开发工具了?McuStudio是对STM32Cube的拙劣模仿还是真香逆袭?

    开McuStudio,老STM32用户DNA就动了。时钟树、引脚分配、外设配置,全是那个味儿。可以说,在降低STM32用户迁移成本这点上,它算是玩明白了。 ⚡ 解决痛点 最直接的,就是
    发表于 10-31 10:18

    ‌CDC1104 1至4可配置时钟缓冲器技术文档摘要

    CDC1104是一个 1 到 4 可配置时钟缓冲器。该器件接受输入参考时钟,并创建 4 个缓冲输出时钟,输出频率等于输入时钟的一半 频率。
    的头像 发表于 09-16 09:37 561次阅读
    ‌CDC1104 1至4可<b class='flag-5'>配置</b><b class='flag-5'>时钟</b>缓冲器技术文档摘要

    求助,关于cubemx + nano 4.1.1 + STM32F405时钟的问题求解

    有一个关于rtthread的问题:有一个主控stm32F405VGxx的板子,使用rtthread studio创建一个标准版4.1.0的工程,运行没问题;;用stm32cubemx 新建了一个
    发表于 09-16 06:05

    选择身份核验终端硬件设备,你需要避开那些

    假如你是一个安防软硬件方案集成商,需要采购一批身份核验终端硬件设备进行集成开发,功能包括人脸识别、扫码识别和刷卡识别,最好能支持国产系统,在选择硬件合作商时需要注意什么,又需要避开哪些呢?以下
    的头像 发表于 09-02 10:23 485次阅读
    选择身份核验终端硬件设备,你需要避开<b class='flag-5'>那些</b><b class='flag-5'>坑</b>?

    求助 有那些机构 有关于 GB/T 4706.1 国标的实操培训

    求助 有那些机构 有关于 GB/T 4706.1 国标的实操培训
    发表于 04-30 16:20

    Modbus TCP通信的那些!你遇到过几个?

    凌晨三点,产线骤停!触摸屏疯狂报通讯超时,老板夺命连环Call轰炸,而你盯着PLC的Error灯狂闪、仪表数据集体躺平——Modbus TCP的,谁踩谁懂! 别慌!这篇Modbus TCP常见问题
    的头像 发表于 04-16 17:17 1120次阅读
    Modbus TCP通信的<b class='flag-5'>那些</b><b class='flag-5'>坑</b>!你遇到过几个?

    STM32CubeMX用于STM32配置和初始化C代码生成

    电子发烧友网站提供《STM32CubeMX用于STM32配置和初始化C代码生成.pdf》资料免费下载
    发表于 02-26 17:32 678次下载

    时钟配置来啦!HPMicro Tool Web v0.5.0 更新

    各位先楫的小伙伴们久等啦,先楫时钟配置工具跟随0.5.0版本正式上线啦!还有个好消息要告诉大家,我们已将先楫配置工具VSCode插件发布到了VSCode插件市场,各位小伙伴们再也不用手动安装插件了
    的头像 发表于 02-08 13:43 944次阅读
    <b class='flag-5'>时钟</b><b class='flag-5'>配置</b>来啦!HPMicro Tool Web v0.5.0 更新

    面向Switchtec和数据中心应用的预配置时钟发生器器件编号

    电子发烧友网站提供《面向Switchtec和数据中心应用的预配置时钟发生器器件编号.pdf》资料免费下载
    发表于 01-15 15:27 0次下载
    面向Switchtec和数据中心应用的预<b class='flag-5'>配置</b><b class='flag-5'>时钟</b>发生器器件编号

    一千余字解读stm32时钟

    转换为多个外部设备的周期性运作。这种时钟“能量”的传递路径类似于大树的养分由主干流向各个分支,因此被称为时钟树。STM32内部也是由多种多样的电路模块组合在一起实现
    的头像 发表于 12-30 21:01 3231次阅读
    一千余字解读<b class='flag-5'>stm32</b><b class='flag-5'>时钟</b>树

    用SPI来配置ADS7229芯片,用外部时钟SCLK和内部时钟CCLK有区别吗?

    频率会减小一半使用 2.手册中在说明配置内部寄存器时,并没有说什么脚电平如何拉低和拉高,所以想使用外部SPI提供的时钟也没办法做到,在配置为内部时钟或外部
    发表于 12-23 07:58