STM32管脚的复用与重映像关系

最近记忆力以指数形式下降,以前弄明白的东西结果又忘了,故而将之写下避免下次又得重新查阅资料

这里讲的是关于STM32F10X的,和STM32F0XX系列的还是有一些区别的,F0的下次有空在写了....

概括一下:复用就是一个引脚有几个功能,1.做普通IO输入输出2.其他外设的输入输出(比如I2C,TIM,SPI等等),这就是复用。

重映射就是将引脚功能重新定义到其他引脚,例如PA9是USART1-TX默认的管脚,但是现在PA9用做它用了,那可以将USART1-TX重新映射到PB6,当然这种映射不是随意的想映射到哪个脚就哪个脚,芯片内部已经固定了只能映射到固定的地方

OK,说完了概念  下面是用法

MCU复位后PA8的默认功能是普通IO管脚,我想将它设为TIM1的PWM-CH1复用输出

步骤就是:1、将TIM1初始化好,设成PWM输出,使能定时器。2、将PA8管脚设为复用推挽输出。这样就可以使用PWM了,也就是复用的用法

### STM32 微控制器中的复用引脚和映射功能 STM32 微控制器提供了灵活的外设信号路由机制,允许通过配置来改变某些外设信号默认连接的引脚位置。这种灵活性主要体现在两个方面:复用引脚(Alternate Function Pin)和映射(Remapping)。对于 STM32F103 和其他系列而言,这些特性使得硬件设计更加灵活。 #### 复用引脚的概念 在 STM32 中,许多 GPIO 引脚具有多种可能的功能选项,除了作为普通的输入/输出之外还可以被设置成特定外设模块的数据线或控制线。当某个引脚用于非基本 I/O 功能时,则称为该引脚处于“复用模式”。为了启用某一外设并将其分配给指定的 GPIO 引脚,在初始化阶段需正确设定相应的寄存器[^1]。 #### 映射的作用 映射是指新定义标准外设接口所使用的物理引脚位置的能力。例如,默认情况下 UART 接口可能会占用一组固定的引脚;然而借助于 AFIO (Alternative Function Input Output) 寄存器组内的 REMAP 字段,可以将同一UART实例切换至另一组备用引脚上工作。这对于 PCB 布局优化以及解决资源冲突非常有用[^2]。 #### 配置过程概述 要实现上述两种功能,通常涉及以下几个方面的操作: - **使能相关时钟**:确保 APB2 或者 AHB 总线上对应的外设已经开启供电。 - **选择合适的端口引脚编号**:查阅数据手册确认目标外设有无提供多路选择,并决定具体要用哪一对GPIO组合。 - **调整AFIO设置**:如果需要更改默认映射关系,则应访问 `SYSCFG->EXTICR` 或者专门针对某外设的REMAP位域进行编程。 - **编写启动代码片段** 下面给出一段简单的 C 语言代码示例,展示如何为 STM32F103 设置 USART1 的全映射到 PA9(TX)/PA10(RX),而不是其默认的位置 PB6/TX & PB7/RX: ```c #include "stm32f1xx_hal.h" void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_USART1_UART_Init(void); int main(void){ HAL_Init(); SystemClock_Config(); /* Initialize all configured peripherals */ MX_GPIO_Init(); // 初始化 GPIO MX_USART1_UART_Init();// 初始化 USART1 while (1){} } // 定义函数体... static void MX_GPIO_Init(void){ __HAL_RCC_AFIO_CLK_ENABLE(); // 启用 AFIO 时钟 __HAL_AFIO_REMAP_USART1_ENABLE(); // 开启 USART1 全部映射 GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); // 使能 GPIOA 时钟 /**USART1 GPIO Configuration PA9 ------> USART1_TX PA10 ------> USART1_RX */ GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_10; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // 设定为推挽输出方式下的复用功能 GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } ```
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值