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官方手册或。
作者:123精彩