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时钟。
最后,如果你觉得你的程序可能是因为时钟配置的问题,不妨上电第一步使能所有时钟试试。
如何实现更高效的VLN算法
单片机与模糊控制的温控仪设计与实现
aigc是什么?aigc和chatGPT的区别
AEC-Q102 VS IEC 60810-2017标准,谁更强?
如何为Raspberry Pi开发一个GUI?
使用STM32开发为什么要先开启外设模块?什么时候开启AFIO时钟?
鸿利智汇表示UVC LED已经批量出货 且MiniLED也处于小批量出货阶段
亚洲工业机器人市场发展迅速,在运工业机器人总量再创新高
华为的鸿蒙电视与智能电视有什么区别
为什么1P断路器需要接在零排上这一点不难解释?
华为Mate10什么时候上市?华为Mate10最新消息:华为Mate10全面屏+3D感测黑科技值得期待
历时一年,蔚来正式下线ET5全工艺生产线试制车
索尼PS5即将推出,官方号称最简单的编码平台
华为Mate40 Pro+要停产?
NOR门教程等效电路
MathWorks实现自动化视觉系统设计 提高了FPGA和ASIC的分辨率
SB-50ALTX无线遥控发射机的电路原理
宽电压输入正负200V250V300V高电压稳压升压电源模块
佳都科技发布“AI Family”系列人脸识别解决方案,布局全场景AI
锂电池分选机为什么要做老化试验及测试