历史上的今天
返回首页

历史上的今天

今天是:2025年01月23日(星期四)

正在发生

2021年01月23日 | 关于STM32时钟配置的那些坑

2021-01-23 来源:eefocus

今天分享以下两点内容:

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时钟。


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


推荐阅读

史海拾趣

Hei Inc Optoelectronic Division公司的发展小趣事
定期对控制电路进行检查和维护,及时发现并处理潜在问题,以确保设备的长期稳定运行。
Curtis Instruments Inc公司的发展小趣事

Curtis自成立以来,始终将创新作为公司的核心驱动力。公司每年将总收入的10%以上投资于研发,运营着四个研发中心,分别位于加利福尼亚、瑞士、纽约和中国。这些研发中心聚集了高度专业化的工程师和技术人员,专注于设计和开发适用于所有类型电动汽车的先进电机速度控制器等产品。正是这种持续的技术创新,使Curtis在电子行业中保持领先地位。

Excelitas公司的发展小趣事

Excelitas公司自成立以来,一直致力于光电技术的研发与创新。在某次关键的技术突破中,公司成功研发出一种新型高效能LED灯,这种灯在紫外光固化领域具有显著优势。这一技术突破不仅为公司赢得了市场份额,还确立了Excelitas在光电领域的领先地位。公司随后围绕这一技术,推出了一系列相关产品,进一步巩固了市场地位。

Echelon公司的发展小趣事

进入21世纪后,Echelon在智能楼宇领域取得了重大突破。公司凭借其先进的LonWorks技术和能源管理服务方案,成功为多个大型楼宇提供了智能化的能源管理解决方案。这些解决方案不仅提高了楼宇的能源利用效率,还降低了运行成本,赢得了客户的广泛赞誉。Echelon在智能楼宇领域的成功,进一步巩固了其在能源管理市场的领先地位。

Anvo-Systems公司的发展小趣事

Anvo-Systems公司自成立以来,一直致力于电子技术的研发与创新。某年,公司成功研发出一款具有高效能源利用率的智能家居控制系统,该产品迅速在市场上获得了广泛关注。通过不断优化产品性能和用户体验,Anvo-Systems逐步扩大了市场份额,并与多家知名家电品牌建立了合作关系。这一技术突破不仅提升了公司的知名度,也为公司的持续发展奠定了坚实基础。

Everett Charles Technologies (ECT)公司的发展小趣事

随着全球电子产业的快速发展和市场竞争的加剧,ECT不断加快全球化战略的实施。公司在全球范围内设立分支机构,积极拓展海外市场,加强与国际知名企业的合作与交流。同时,ECT也注重培养本土人才和创新能力,不断提升公司的核心竞争力。展望未来,ECT将继续秉承“创新、质量、服务”的理念,致力于成为全球领先的电子测试系统供应商和服务商。

以上五个故事概述了Everett Charles Technologies (ECT) 公司的发展历程和关键节点,每个故事都体现了公司在技术创新、市场拓展和全球化战略方面的努力和成果。这些故事不仅展现了ECT的辉煌过去,也预示着其更加美好的未来。

问答坊 | AI 解惑

昂宝电子推出CCFL控制器IC系列,适用于汽车液晶显示器

继成功推出一系列Green model AC-DC PWM电源控制IC后,昂宝电子目前又推出一系列CCFL控制器IC,可广泛用于LCD监视器、LCD-TV、笔记本电脑以及工业设备、汽车、手持设备中的液晶显示器。 目前昂宝电子所推出CCFL控制器IC产品包括:OB3316/OB3316 ...…

查看全部问答>

一篇关于SDRAM不错的文章

一篇关于SDRAM不错的文章…

查看全部问答>

紧急求助:DM9000网卡程序异常?

我在2440上移植了DM9000A的网卡,系统运行后能够被PING通。可是一运行IE就报如下错误: Data Abort: Thread=97d9aab4 Proc=81d96340 \'device.exe\' AKY=ffffffff PC=02b52178(dm9isa.dll+0x00002178) RA=02b52174(dm9isa.dll+0x00002174) BVA=06 ...…

查看全部问答>

arm-linux平台上摄像头 quick capture interface的中断问题

我需要在pxa271平台上通过quick capture interface来获取摄像头图像,程序是从别的操作系统移植过来的,所以CIF寄存器初始化设置的逻辑应该没有问题,现在的问题是只要我设置了Start of Frame的中断,即 CICR0置位 ~(CICR0_SOFM), 再enable CIF接 ...…

查看全部问答>

java 调用DLL 读串口,不久就死了,请帮忙看看什么原因?

经过仔细分析问题出这dll这里,但始终找不到解决办法,请大家帮忙看看,谢谢! dll代码如下: JNIEXPORT jstring JNICALL Java_getGPS (JNIEnv * env, jobject obj) {     char * cIpAddress =compressWideChar((LPCWSTR)L\"empty value! ...…

查看全部问答>

关于格式转换函数sprintf():

关于格式转换函数sprintf(): 我想用sprintf()函数将一个usigned int型变量转换为字符串从串口发送出去 结果调用的时候发现不对 我先定义DeocdeNum=2000;UCHAR *CH 保存转换后的字符串 printf(ch,\"%d\",DeocdeNum); 结果我发现在程序中 Deoc ...…

查看全部问答>

用8962的GPIO采集单总线数据不成功

  源例程,寻求帮助!!!谢谢     GPIO管脚能否配置采样速率? [ 本帖最后由 bjmonsoon 于 2011-1-13 19:35 编辑 ]…

查看全部问答>