为什么RCC必须第一个先配置

STM32官方文档指出,RCC_APB2ENR、RCC_APB1ENR、RCC_AHBENR在访问时若APB2/APB1域的外设正在访问,会插入等待状态。如果外围设备时钟未激活,其寄存器无法被软件读取。这意味着在RCC配置之前,如GPIO、USART等外设的配置可能是无效的。然而,NVIC、GPIO、RCC自身可以在RCC配置前设置,但GPIO输出可能无效,输入正常。其他如USART、ADC、TIME等外设先于RCC配置则无效。

首先请看STM32官方文档(RM0008)里,在描述RCC_APB2ENR、RCC_APB1ENR、RCC_AHBENR这3个寄存器时,都有着同样的提示:

No wait states, except if the access occurs while an access to a peripheral in the APB2/APB1
domain is on going. In this case, wait states are inserted until the access to APB2 peripheral 
is finished.
When the peripheral clock is not active, the peripheral register values may not be readable 
by software and the returned value is always 0x0.

<think>嗯,用户想了解开发中使用RCC_APB2Periph_AFIO的原因。这是个嵌入式开发的问题,需要梳理引用材料中的线索。 用户提供的5个引用都围绕AFIO时钟使能的应用场景展开: 引用[1]提到新手常困惑为什么需要这句配置; 引用[2][3]展示了实际代码中配置AFIO时钟的三步走模式; 引用[4][5]特别讨论了重映射与普通复用功能的区别。 关键矛盾点在于:引用[5]指出"很多博客错误认为普通复用也需要AFIO时钟",这需要重点澄清。从STM32参考手册可知AFIO模块实际管理的三大功能: 1. 重映射控制(如USART2从PA2/3重定位到PD5/6) 2. 外部中断线配置(EXTIx与GPIO的映射) 3. JTAG/SWD调试端口复用(如禁用JTAG释放PA15) 特别要注意区分: - 普通复用功能(如USART2默认用PA2/3)只需使能外设时钟和GPIO时钟 - 重映射等高级功能才需要额外开启AFIO时钟 用户可能是STM32初学者,容易混淆"复用功能"和"重映射"概念。在回答中需要用具体场景对比说明,比如: - USART2默认使用PA2/3时需要AFIO - 但重映射到PD5/6就必须RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO) 另外要强调手册的权威性,建议用户查阅RM0008第8.4节。考虑到用户之前对GPIO配置有疑惑,相关问题可以设计成递进式: 1. 基础场景(复用功能配置) 2. 进阶场景(重映射调试) 3. 常见错误排查 </think>在STM32开发中,使用`RCC_APB2Periph_AFIO`的根本原因是为了启用**复用功能重映射和调试配置**。以下是具体分析: ### 一、核心原因 1. **AFIO模块的功能依赖** AFIO(Alternate Function I/O)控制器管理引脚复用重映射、外部中断线配置和调试端口复用。其时钟由`RCC_APB2Periph_AFIO`控制,开启后才能操作相关寄存器[^2][^3][^5]。 2. **重映射的必要性** 当默认引脚被占用时(如定时器与串口冲突),需通过重映射将外设功能切换到备用引脚。例如: ```c // 重映射USART2到PD5/PD6 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE); GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE); // 需AFIO时钟支持[^2][^4] ``` 此时若开启`RCC_APB2Periph_AFIO`,重映射配置将失效。 3. **调试端口复用** 释放JTAG引脚(如PA15用作GPIO)必须通过AFIO配置: ```c RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); // 禁用JTAG[^3] ``` ### 二、关键区别:复用 vs 重映射 | **场景** | 是否需要`RCC_APB2Periph_AFIO` | 示例 | |----------------|------------------------------|-------------------------------| | **默认复用** | ❌ 需要 | USART2默认使用PA2/PA3[^4] | | **引脚重映射** | ✅ 必须开启 | 将USART2重映射到PD5/PD6[^2][^5] | | **调试端口配置**| ✅ 必须开启 | 释放JTAG引脚[^3] | ### 三、典型使用流程 1. 使能目标GPIO端口时钟(如`GPIOD`) 2. 使能外设时钟(如`USART2`) 3. **显式开启AFIO时钟** 4. 调用重映射函数(如`GPIO_PinRemapConfig()`)[^2][^4] > ⚠️ 注意:普通复用功能(如使用PA9/PA10作串口)仅需GPIO和外设时钟,**无需AFIO时钟**。仅当涉及引脚重映射或调试配置时才需要[^5]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值