当前位置: 首页 > news >正文

STM32的端口引脚的复用功能及重映射功能解析

STM32微控制器因其强大的外设功能和灵活的引脚复用能力而被广泛应用于嵌入式系统设计中。本文将详细介绍STM32的端口引脚复用功能和重映射功能,以及如何通过代码实现这些功能。

端口引脚复用功能

STM32的GPIO端口可以被复用为多种外设功能,如USART、SPI、I2C等。这种复用功能使得单一引脚可以用于不同的外设,从而节省了引脚资源,提高了设计的灵活性。

复用功能的实现

  1. 使能GPIO时钟:首先需要使能GPIO端口的时钟。

    __HAL_RCC_GPIOA_CLK_ENABLE();
    
  2. 配置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);
    
  3. 使能外设时钟:使能需要复用的外设时钟。

    __HAL_RCC_USART1_CLK_ENABLE();
    

端口引脚重映射功能

重映射功能允许将某些外设的引脚映射到其他引脚上,这在不同封装的STM32芯片中尤其有用,可以优化引脚布局和布线。

重映射功能的实现

  1. 使能AFIO时钟:重映射需要使能AFIO时钟。

    __HAL_RCC_AFIO_CLK_ENABLE();
    
  2. 配置重映射:根据需要的外设和引脚配置重映射寄存器。

    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和PB7GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);
}void SystemClock_Config(void) {// 时钟配置代码
}

注意事项

  1. 时钟配置:确保GPIO和AFIO时钟使能。
  2. GPIO配置:确保引脚作为复用功能使用时,GPIO配置正确。
  3. 重映射配置:确保重映射寄存器配置正确,以避免外设功能冲突。

通过上述步骤,我们可以在STM32上成功配置端口引脚的复用功能和重映射功能,实现灵活的引脚分配和外设功能映射。这为开发需要灵活引脚使用的嵌入式系统提供了基础。

✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进

❤欢迎关注我的知乎:对error视而不见

代码获取、问题探讨及文章转载可私信。

☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。

🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!👇

点击领取更多详细资料


http://www.mrgr.cn/news/70028.html

相关文章:

  • 科技型中小企业的认定标准
  • 自适应数据结构、自适应哈希表 (Adaptive Hash Table)详细介绍
  • JMeter基础篇
  • PHPCUSTOM用久了占用变大,请关闭日志功能即可
  • STL常用遍历算法
  • 解锁 Spring Boot 的隐藏技能:让开发更轻松的实用技巧!
  • 【数据结构】交换排序——冒泡排序 和 快速排序
  • 设计模式之责任链模式(Chain Of Responsibility)
  • Python——数列1/2,2/3,3/4,···,n/(n+1)···的一般项为Xn=n/(n+1),当n—>∞时,判断数列{Xn}是否收敛
  • 距离向量路由选择协议和链路状态路由选择协议介绍
  • 【电子通识】TINA-TI中怎么用分段线性源做周期性波形
  • redis集群介绍
  • 【SpringCloud】SpringBoot集成Swagger 常用Swagger注解
  • 丹摩征文活动|AIGC实践-基于丹摩算力和CogVideoX-2b实现文生视频
  • Vue3-06_路由
  • Qt文件系统-文本文件读写
  • hudi写时复制与读时合并
  • 计算机组成原理(指令格式)
  • 被秀到了!注意力+时空特征融合,秒锁1区!快码住学思路
  • 【初阶数据结构篇】二叉树OJ题
  • crond 任务调度 (Linux相关指令:crontab)
  • 算法求解--计算两个字符串之间的最小交换次数(相似度为 K 的字符串)
  • 大数据入门-什么是HBase
  • 基于Spring Boot+Vue的学院食材采供管理系统
  • 大厂面试真题-说说tomcat的优缺点
  • C++builder中的人工智能(19):如何在C++中制作一个简单但强大的聊天机器人?