关于STM32时钟配置的那些坑

发布者:tanjunhui最新更新时间:2021-01-23 来源: eefocus关键字: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时钟。


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


关键字:STM32  时钟  配置 引用地址:关于STM32时钟配置的那些坑

上一篇:基于STM32、FreeRTOS实现硬件看门狗+软件看门狗监测多任务的方法
下一篇:宏定义“中断函数接口”的注意事项

推荐阅读最新更新时间:2024-11-13 12:56

STM32_BKP备份数据
今天提供并讲解的软件工程,基于前面的软件工程“TIM延时”修改而来。若有疑问,请关注微信公众号获取更多信息。 每天提供下载的“软件工程”都是在硬件板子上进行多次测试、并保证没问题才上传至360云盘。 今天的软件工程下载地址(360云盘): https://yunpan.cn/cP7FTUw4XCYNw 访问密码 0ebe STM32F10x的资料可以在我360云盘下载: https://yunpan.cn/crBUdUGdYKam2 访问密码 ca90 工程概要说明:第一次上电写入BKP一个数据0xA55A,第二次及以后MCU重新上电读取BKP数据就是0xA55A(只要中间没有修改过),软件工程是在每次上电
[单片机]
STM32_BKP备份数据
JSN-SR04T超声波模块驱动(模式三、STM32
一、前期准备 单片机:STM32F103C8T6 开发环境:MDK5.14 库函数:标准库V3.5 JSN-SR04T模块:淘宝有售 二、实验效果 三、驱动原理 此模块分3中模式: (1)模式一:R27 = open,普通驱动模式; (2)模式二:R27 = 47K,串口模式,每隔100ms更新一次数据。 (3)模式三:R27 = 120K,串口模式,发0x55。 注意:次模块测试盲区20cm。 串口二发送0x55,并接收模块数据,每隔100ms刷新次数据,串口接收数据之后,做完校验之后算出测试距离并打印出来。 需要完整工程或者有问题的请加QQ:1002521871,验证:呵呵。 四、驱动代码 JSN-SR04
[单片机]
JSN-SR04T超声波模块驱动(模式三、<font color='red'>STM32</font>)
分析TCP/IP协议栈代码之UDP(STM32平台)
1. UDP介绍 UDP是一个简单的面向数据报的运输层协议:进程的每个输出操作都正好产生一个 UDP数据报,并组装成一份待发送的IP数据报。这与面向流字符的协议不同,如TCP,应用程序产生的全体数据与真正发送的单个IP数据报可能没有什么联系。 UDP数据报封装成一份 IP数据报的格式如图11 - 1所示。 RFC 768 是UDP的正式规范。 UDP不提供可靠性:它把应用程序传给IP层的数据发送出去,但是并不保证它们能到达目的地。由于缺乏可靠性,我们似乎觉得要避免使用UDP而使用一种可靠协议如TCP。在讨论完TCP后将再回到这个话题,看看什么样的应用程序可以使用UDP。 2. UDP首部 UDP首部的各字段如图
[单片机]
分析TCP/IP协议栈代码之UDP(<font color='red'>STM32</font>平台)
基于STM32战舰开发板的内部温度传感器实验
内部温度传感器简介 测量的温度位置 内部温度传感器集成在芯片中,测量的是芯片的温度。 如何测量对应位置的温度? 温度传感器与ADC1_CH16相连,另外ADC1_CH17是与内部参照电压VREF+相连,因此我们可以通过ADC1的第16路通道测量芯片温度实时对应的电压转换得来的数字量,也可以通过ADC1的第17路通道测量内部参照电压对应的数字量。 我们知道STM32的ADC转换DATA是12Bits的,因此输入电压(小于3.3V大于0V)ADC转换为数字量的值为“大于0小于4096”。 我们由“T-V关系图”,“V的数字量”和“ADC量程”,可以得知“此时的温度”。 内部传感器配置注意事项 ① 读取内部温度传
[单片机]
基于<font color='red'>STM32</font>战舰开发板的内部温度传感器实验
基于STM32的自动跟踪小车
概述 小车外形: 功能简介 利用摄像头识别前车尾部的AprilTag,得到前车位置,传回stm32主控板处理,使两车在行驶时保持恒定距离,实现自动跟车。 openMV4摄像头 1.1 Apriltag识别与串口传输 AprilTag是一个视觉基准库,在AR,机器人,相机校准领域广泛使用。通过特定的标志(与二维码相似,但是降低了复杂度以满足实时性要求),可以快速地检测标志,并计算相对位置。 Apriltag示例: 通过识别Apriltag,可以得到x,y,z三个方向的距离以及偏移角度。这里只需要三维的距离即可,通过串口传回stm32. STM32主控板(型号为F407) 2.1 时钟与中断配置 附
[单片机]
STM32 UART2 中断函数的写法
void USART2_IRQHandler(void) { uchar tmp; //接收中断 if(USART_GetITStatus(USART2,USART_IT_RXNE)==SET) // 接收 中断 { USART_ClearITPendingBit(USART2,USART_IT_RXNE); // U1RX_Clear_Intr_Status_Bit; tmp=USART_ReceiveData(USART2); } //USART_IT_TXE // 发送中断 if( USART_GetITStatus(USART2, USART_IT_TXE) == SET ) //一个是TXE=发送数据寄存器空, {
[单片机]
关于STM32F4的AHB和APB时钟频率的问题
1.首先注意的的是图中画绿色圈圈的两个,HSE和HSI分别表示外部时钟和内部时钟,其中HSE 是是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,HSE 也可以直接做为系统时钟或者 PLL 输入(从红圈4处可以看出),频率范围为 4MHz~26MHz。STM32默认为25Mhz,像原子的板子就是8Mhz的,所以移植时一定要格外注意。 2.注意红圈2代表的部分,这里是主锁相环倍频输出,用于产生系统需要的高速时钟信号,如图绿色箭头所示(STM32还有一个副锁相环,如红圈3) 主 PLL 时钟的时钟源要先经过一个分频系数为 M 的分频器,然后经过倍频系数为 N 的倍频器出来之后的时候还需要经过一个分频系数为 P(第一个输出 P
[单片机]
关于STM32F4的AHB和APB<font color='red'>时钟</font>频率的问题
MCS-51单片机内部时钟电路详解
在MCS-51单片机芯片内部有一个高增益反相放大器,其输入端为芯片引脚XTAL1,其输出端为引脚XTAL2 。而在芯片的外部,XTAL1和XTAL2之间跨接晶体振荡器和微调电容,从而构成一个稳定的自激振荡器,这就是单片机的时钟电路。 1.振荡周期:为单片机提供时钟信号的振荡源的周期。 2.时钟周期:是振荡源信号经二分频后形成的时钟脉冲信号。 3.机器周期:通常将完成一个基本操作所需的时间称为机器周期。 4.指令周期:是指CPU执行一条指令所需要的时间。一个指令周期通常含有1~4个机器周期。
[单片机]
MCS-51单片机内部<font color='red'>时钟</font>电路详解
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved