STM32引脚模式(默认,复用,重映射)详解与例程(基于STM32F10x系列)

嵌入式裸机&RTOS开发杂谈系列

第一章 STM32引脚模式(默认,复用,重映射)详解与例程(基于STM32F10x系列)



前言

为什么引脚会有三种模式?猜测:所有外设都配备自己的专属引脚,会导致引脚利用率过低,成本也会上升。单一的让多个外设用同一组引脚,又会导致资源严重冲突。一种合理的方式,还是多个外设用同一组引脚,但可以灵活切换匹配方案。就入STM所采用的那样。本质:引脚少,外设多,资源要合理分配。


一、引脚模式定义

1.默认模式(普通GPIO)

当引脚作为普通输入/输出使用时,也就是处于默认模式(普通GPIO)。在这种模式下,引脚与外设功能没有关联,这就像是一个独立的输入或输出端口,可以根据我们的需求进行灵活配置。但是,这并不意味着不需要任何准备工作。首先,我们需要配置GPIO时钟。时钟对于芯片内部的各个模块来说就像是心跳一样重要,没有时钟信号,模块就无法正常工作。然后,还需要明确配置引脚的模式,例如是作为输入还是输出,或者是模拟模式等。这就好比是给这个端口赋予了特定的身份,让它知道自己的任务是接收外部信号(输入模式),还是向外发送信号(输出模式),亦或是作为模拟信号的接口(模拟模式)。这种普通GPIO模式在很多简单的应用场景中非常有用,比如控制一个LED灯的亮灭,我们只需要将引脚配置为输出模式,然后通过相应的代码来控制输出电平的高低就可以实现。

2.复用模式(Alternate Function)

复用模式(Alternate Function)是STM32引脚模式中非常重要的一种。在现代电子设备中,为了实现多功能集成,往往需要引脚能够在不同功能之间灵活切换。这种复用模式就是为了满足这样的需求而设计的。引脚在这种模式下用于内置外设,像USART(通用同步异步收发器)、SPI(串行外设接口)、TIM(定时器)等都是非常常见的内置外设。当我们要使用这些外设功能时,就需要开启相应外设的时钟并且将引脚配置为复用功能模式。这就好比是在一个多功能的工具箱里,每个工具都有其特定的功能,而复用模式就是让引脚能够从一种基本功能(普通GPIO)转换为特定外设所需的功能。以USART为例,如果我们要实现串口通信功能,就需要将对应的引脚配置为USART的复用模式,这样这个引脚就能够按照USART的通信协议来进行数据的收发操作了。

3.重映射模式(Remap)

重映射模式(Remap)为STM32的引脚功能带来了更大的灵活性。在实际的电路设计和系统开发过程中,可能会遇到默认引脚分配不符合需求的情况。比如说,在某些特定的PCB布局中,默认引脚的位置可能会与其他元件产生干扰,或者由于布线的复杂性导致默认引脚的使用不太方便。这时,重映射模式就发挥了作用。它能够将外设的默认引脚映射到其他GPIO引脚,例如将USART1_TX从PA9映射到PB6。不过,要实现这种重映射,并不是简单地进行引脚的切换,还需要配置AFIO时钟和重映射寄存器。这就像是在一个复杂的交通网络中,要改变某条道路的通行路线,不仅需要调整道路的连接方式(重映射引脚),还需要对交通管理系统(配置AFIO时钟和重映射寄存器)进行相应的设置,以确保交通(数据传输等功能)能够正常进行。

二、配置步骤与例程

1.默认模式(普通GPIO)

代码如下(示例):

// 示例:配置PA5为推挽输出 
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  // 开启GPIOA时钟 
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;         // 推挽输出模式 
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);

2.复用模式(以USART1为例)

代码如下(示例):

// 示例:配置PA9为USART1_TX(复用推挽输出)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE);  // 开启GPIOA和USART1时钟 
 
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;          // 复用推挽输出 
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
 
// 配置USART1参数(波特率、数据位等)
USART_InitTypeDef USART_InitStruct;
USART_InitStruct.USART_BaudRate = 9600;
USART_InitStruct.USART_WordLength = USART_WordLength_8b;
USART_InitStruct.USART_StopBits = USART_StopBits_1;
USART_InitStruct.USART_Parity = USART_Parity_No;
USART_InitStruct.USART_Mode = USART_Mode_Tx;
USART_Init(USART1, &USART_InitStruct);
USART_Cmd(USART1, ENABLE);

3.重映射模式(以USART1重映射到PB6/PB7为例)

代码如下(示例):

// 示例:将USART1_TX/RX从PA9/PA10重映射到PB6/PB7 
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO, ENABLE);  // 开启GPIOB、USART1、AFIO时钟 
 
GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);       // 使能USART1重映射
 
// 配置PB6为USART1_TX(复用推挽输出)
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStruct);
 
// 配置PB7为USART1_RX(浮空输入)
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStruct);
 
// USART1初始化同上(参数配置后需重新使能)

三.关键注意事项

1.复用模式

需同时使能GPIO和外设时钟(如USART、SPI)。
复用功能对应的引脚模式需参考手册(如USART_TX需配置为复用推挽输出)。

2.重映射模式

必须开启AFIO时钟(RCC_APB2Periph_AFIO)。
重映射范围受芯片限制(参考手册中的重映射表)。
调试引脚(如PA13/PA14)需解除JTAG/SWD复用后才能作为普通GPIO使用。

3.优先级规则

若同时使能默认引脚和重映射引脚,外设优先使用重映射后的引脚。

4.解决引脚冲突

当默认引脚被其他功能占用时,重映射可优化PCB布局。

5.多外设复用

同一引脚可动态切换为不同外设(需重新配置时钟和模式)。
完整代码和配置细节可参考ST官方手册或。

### 推挽输出复用推挽输出的区别及其使用场景 #### 推挽输出 (Push-Pull Output) 推挽输出是一种常见的GPIO配置方式,其中两个晶体管分别连接到电源(Vcc)和地(GND),通过交替开启这两个晶体管实现高低电平的切换。这种方式能快速改变引脚状态并提供较强的驱动能力。 对于STM32而言,当设置为推挽输出模式时,可以直接控制该引脚作为标准数字I/O接口工作,适用于需要频繁翻转信号或传输较大电流的情况[^1]。 ```c // 设置PA0为推挽输出模式 GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // Push-pull output mode GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); ``` #### 复用推挽输出 (Alternate Function Push-Pull Output) 相比之下,复用推挽输出则是指将特定功能分配给某个GPIO引脚,并允许其执行预定义的功能而非简单的高/低电平操作。这通常涉及到外部设备如定时器、SPI总线或其他通信协议。在这种情况下,硬件资源被共享以减少所需的物理引脚数量。 在STM32中,如果要利用USART串口或者其他外设,则应选择此选项来激活相应的外围电路并之交互[^2]。 ```c // 配置PB6为USART1_TX复用推挽输出 GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOB_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // Alternate function push-pull output GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Alternate = GPIO_AF7_USART1; // Select alternate function 7 for USART1 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); ``` #### 使用场景差异 - **推挽输出**: 主要用作常规的通用目的I/O线路,适合那些仅需发送简单二进制数据流的应用程序。 - **复用推挽输出**: 更加专注于其他专用模块协作的任务,比如UART通讯、PWM波形生成或是传感器读取等复杂任务处理。它不仅限于基本的数据交换,还可能涉及更高级别的协议解析和服务支持[^3].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值