STM32微控制器因其强大的外设功能和灵活的引脚复用能力而被广泛应用于嵌入式系统设计中。本文将详细介绍STM32的端口引脚复用功能和重映射功能,以及如何通过代码实现这些功能。
端口引脚复用功能
STM32的GPIO端口可以被复用为多种外设功能,如USART、SPI、I2C等。这种复用功能使得单一引脚可以用于不同的外设,从而节省了引脚资源,提高了设计的灵活性。
复用功能的实现
-
使能GPIO时钟:首先需要使能GPIO端口的时钟。
__HAL_RCC_GPIOA_CLK_ENABLE();
-
配置GPIO模式:将GPIO引脚配置为复用功能模式,并设置相应的速度和上拉/下拉设置。
GPIO_InitTypeDef GPIO_InitStruct; 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);
-
使能外设时钟:使能需要复用的外设时钟。
__HAL_RCC_USART1_CLK_ENABLE();
端口引脚重映射功能
重映射功能允许将某些外设的引脚映射到其他引脚上,这在不同封装的STM32芯片中尤其有用,可以优化引脚布局和布线。
重映射功能的实现
-
使能AFIO时钟:重映射需要使能AFIO时钟。
__HAL_RCC_AFIO_CLK_ENABLE();
-
配置重映射:根据需要的外设和引脚配置重映射寄存器。
GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE); // 将USART1的TX和RX引脚映射到PB6和PB7
代码示例
以下是一个完整的代码示例,展示了如何配置STM32的GPIO引脚为USART1的TX和RX,并使用重映射功能将这些功能映射到PB6和PB7。
#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();
MX_GPIO_Init();
MX_USART1_UART_Init();
char txBuffer[] = "Hello, USART1!";
HAL_UART_Transmit(&huart1, (uint8_t*)txBuffer, sizeof(txBuffer), HAL_MAX_DELAY);
while (1) {
// 主循环中的其他任务
}
}
static void MX_USART1_UART_Init(void) {
huart1.Instance = USART1;
huart1.Init.BaudRate = 9600;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
HAL_UART_Init(&huart1);
}
static void MX_GPIO_Init(void) {
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_AFIO_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
// USART1 TX PA9 复用推挽输出
GPIO_InitStruct.Pin = GPIO_PIN_9;
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);
// USART1 RX PA10 浮空输入
GPIO_InitStruct.Pin = GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// 重映射USART1到PB6和PB7
GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);
}
void SystemClock_Config(void) {
// 时钟配置代码
}
注意事项
- 时钟配置:确保GPIO和AFIO时钟使能。
- GPIO配置:确保引脚作为复用功能使用时,GPIO配置正确。
- 重映射配置:确保重映射寄存器配置正确,以避免外设功能冲突。
通过上述步骤,我们可以在STM32上成功配置端口引脚的复用功能和重映射功能,实现灵活的引脚分配和外设功能映射。这为开发需要灵活引脚使用的嵌入式系统提供了基础。
✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进
❤欢迎关注我的知乎:对error视而不见
代码获取、问题探讨及文章转载可私信。
☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。
标签:HAL,映射,引脚,STM32,及重,Init,InitStruct,GPIO From: https://blog.csdn.net/weixin_66608063/article/details/143668178