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

news2024/11/21 0:31:35

目录

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

复用功能

复用功能的初始化

重映射功能

重映射功能的初始化

复用功能和重映射的区别

部分重映射与完全重映射

补充


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

复用功能

首先、我们可以这样去理解stm32引脚的复用功能。以stm32F103RCT6芯片引脚PA9、PA10为例。
这两个芯片引脚定义如下:
PA9引脚: PA9/USART1_TX/TIM1_CH2
PA10引脚:PA10/USART1_RX/TIM1_CH3
1、这里的PA9引脚和PA10引脚我们可以理解为引脚名,用于区分两个不同的引脚。
2、可以看到PA9引脚、PA10引脚都有三种功能。其中第一项PA9和PA10是其默认功能,默认功能为GPIO功能,也即是作为通用的输入输出端口使用。
3、这样我们就知道,当PA9引脚和PA10引脚不在作为默认的GPIO功能使用,而是作为USART1_TX/USART1_RX或者作为TIM1_CH2/TIM1_CH3功能使用时,就是对PA9引脚和PA10引脚的复用。
4、总而言之,对于stm32来说,由于其内部各种外设的存在,往往每个引脚都会有几种不同的功能,这几种不同的功能都可以使用这一个端口引脚。但是由于stm32的端口引脚都有一个自己的默认功能存在,当该引脚不在作为默认功能使用时对于该引脚来说就是复用。由于大多数引脚的默认功能和其引脚名称PA9引脚或者PA10引脚一样都是作为GPIO功能使用,因此当不在作为GPIO功能而是作为其他外设的相关功能使用时就是对引脚的复用。

复用功能的初始化

通过前面的分析我们可以知道,在使用stm32的引脚复用功能时,最少要使能2个时钟。
1、无论引脚使用哪种功能,总之是要使用引脚的,因此要使能对应的GPIO组的端口时钟。
例如,对于复用为串口1的PA9、PA10引脚来说需要使能PA组端口的时钟。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
2、由于引脚不在作为默认功能,而是复用为其他外设的相关功能使用,因此还需要使能对应外设的时钟。
对于复用为串口1的PA9、PA10引脚来说还需要使能外设USART1的时钟。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
3、复用后的引脚的功能配置及对应外设功能的初始化。以PA9、PA10引脚为例:
    3.1 复用后的引脚功能配置
    //PA9引脚复用为USART1_TX功能,复用后的引脚配置为复用推挽输出模式 
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; 
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    //PA10引脚复用为USART1_RX功能,复用后的引脚配置为浮空输入模式
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    3.2 复用后的外设功能初始化
    //这里初始化串口的各种功能

重映射功能

为了让工程师能够更好的安排布局及方便布线,在stm32中引入了外设引脚的重映射功能。即一个外设的引脚除了具有默认的引脚外还可以通过配置重映射寄存器的方式将这个外设的引脚映射到其他的引脚上去。
同样的以PA9引脚和PA10引脚为例,对于stm32F103RCT6芯片来说,有如下引脚定义:
PA9引脚: PA9/USART1_TX/TIM1_CH2
PA10引脚:PA10/USART1_RX/TIM1_CH3
PB6引脚: PB6/I2C1_SCL/TIM4_CH1/USART1_TX
PB7引脚: PB7/I2C1_SDA/FSMC_NADV/TIM4_CH2/USART1_RX

1、首先、我们要明确一点,重映射的概念是对于芯片的各种外设本身来说的而非GPIO。因为引脚作为GPIO功能使用时一般是其默认的功能,而重映射的概念是建立在对引脚的复用功能上的。也即是当引脚复用为非GPIO功能时才可能会使用到重映射的功能。
2、USART1_REMAP=0表示没有使用重映射功能的情况;USART1_REMAP=1则表示使用重映射功能的情况。
3、从上面表中可以看到,默认情况下(没有使用重映射),USART1的TX和RX引脚默认使用的就是PA9引脚和PA10引脚。
4、在开启重映射功能时,USART1的TX和RX引脚还可以重映射到PB6和PB7引脚上去。

重映射功能的初始化

在使用重映射功能时,除了需要使能复用功能的GPIO组的端口时钟和对应的外设时钟外我们还需要使能AFIO功能时钟。
例如当开启串口1的重映射时:
1、使能PB组端口时钟:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
2、使能串口1外设时钟:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
3、使能AFIO功能时钟:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
4、开启重映射功能
GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);
5、之后就是对重映射后的引脚的功能配置及对应外设功能的初始化。

复用功能和重映射的区别

通过以上对于复用功能和重映射功能的分析我们可以知道:
复用功能和重映射最大的区别就在于引脚复用功能是对于单个引脚来说的。比如同一个引脚既可以作为GPIO功能又可以作为其他外设功能使用。而重映射功能往往是对于芯片内部外设的一组引脚或者某些引脚来说的。例如USART1的发送功能引脚和接收功能引脚既可以使用PA9、PA10引脚又可以使用PB6和PB7引脚。

部分重映射与完全重映射

通过前面对于重映射功能的分析,我们理解部分重映射及完全重映射将不再困难。
从字面意思也容易知道,部分重映射就是把一部分的功能引脚重映射为其他的引脚而另外一部分引脚仍然使用默认的引脚。
完全重映射就是把所有的功能引脚全部重映射到其他的引脚上。    
如下图是USART3外设的重映射功能引脚对应情况:

通过表中的信息我们可以知道:
1、对于USART3的五个功能引脚来说,默认使用的五个引脚为PB10-PB14这5个引脚。
2、部分重映射时,原来默认使用的PB10、PB11、PB12三个功能引脚将重映射到引脚PC10、PC11和PC12上。而PB13和PB14仍然使用原来的默认引脚。
3、完全重映射就是将原来默认使用的PB10、PB11、PB12、PB13、PB14五个功能引脚全部重映射到引脚PD8、PD9、PD10、PD11和PD12上去。
4、以USART3为例,部分重映射时,我们需要使用的接口函数为:
GPIO_PinRemapConfig(GPIO_PartialRemap_USART3, ENABLE);
5、以USART3为例,全部重映射时,我们需要使用的接口函数为:
GPIO_PinRemapConfig(GPIO_FullRemap_USART3, ENABLE);

补充

重映射的配置函数:
void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState)
1、对于有些外设只有一种重映射时,例如前面的USART1时,第一个参数GPIO_Remap只需要设置为:GPIO_Remap_USART1即可。
2、对于有些外设有两种重映射时,例如前面的USART3时,第一个参数GPIO_Remap可以根据情况设置为:
部分重映射:GPIO_PartialRemap_USART3
完全重映射:GPIO_FullRemap_USART3
完结。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1628852.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

车道分割YOLOV8-SEG

车道分割YOLOV8-SEG,训练得到PT模型,然后转换成ONNX,OPENCV的DNN调用,支持C,PYTHON,ANDROID开发 车道分割YOLOV8-SEG

【C++ | 复合类型】结构体、共用体、枚举、引用

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 ⏰发布时间⏰: 本文未经允许…

AndroidStudio中虚拟机(AVD)无法启动,出现unable to locate adb错误

1.检查Android SDK Platform-Tools是否安装(个人是通过这个方法解决的) 首先通过File-Project Structure-Project SDK检查SDK有没有被选中 步骤:打开file -> settings ,搜索SDK 之后点击"-",在点击Apply进行安装 2.可能是驱动的问题 电脑…

Web前端开发 小实训(二) 简易计算器

实训目的 学生能够使用函数完成简易计算器编写 操作步骤 1、请将加减乘除四个方法生成为以下函数,且有返回值 中文英语加法add减法subtract乘法multi除法division次幂pow()平方根sqrt() 提示: 除法中的除数不能为0! 参考代码&#xff1…

OpenHarmony实战开发-动画概述

UI(用户界面)中包含开发者与设备进行交互时所看到的各种组件(如时间、壁纸等)。属性作为接口,用于控制组件的行为。例如,开发者可通过位置属性调整组件在屏幕上的位置。 属性值的变化,通常会引…

python作业 切片逆转

题目: (反转显示一个整数)编写下面的函数,反向显示一个整数。 列如:reserse(3456)。编写一个测试程序,提示用户输入一个整数,然后显示它的反向数。 第一步定义一个函数: def rev…

Docker容器部署overleaf

overleaf在线版限制很多,好在开源,准备在本地Docker部署,网上翻了翻,似乎本地部署并非易事,我也尝试了一下,发现直接使用docker-compose拉官方最新镜像部署的确问题很多,不过最终还是完美解决。…

前端学习<四>JavaScript——54-原型链

常见概念 构造函数 构造函数-扩展 原型规则和示例 原型链 instanceof 构造函数 任何一个函数都可以被 new,new 了之后,就成了构造方法。 如下: function Foo(name, age) {this.name name;this.age age;//retrun this; //默认有这…

系统思考—高效激励和沟通艺术

前两天结束建工集团的下属公司《高效激励和沟通艺术》的课程,不仅讨论了一些实用的管理技巧,更多的是从系统思考的视角,探讨了“结构如何影响行为”。这种方法让我们认识到系统力量的重要性,并且通过理解这些力量,我们…

武汉星起航:亚马逊助力中国卖家扬帆全球,共筑跨境电商新篇章

自1995年7月诞生以来,亚马逊以其前瞻性的视野和不懈的创新精神,迅速崛起为全球电商领域的领军者。总部设在美国西雅图的亚马逊,以其卓越的技术实力、丰富的商品资源和优质的服务体验,赢得了全球消费者的广泛认可。 随着全球化的加…

数据结构 - 队列 [动画+代码注释超详解],萌新轻松上手!!!

一. 队列的概念 队列是一种特殊的线性表,用于存储元素,并且按照先进先出(First In First Out)的顺序进行管理,这意味着最先加入队列的元素将会是最先从队列中被移除的元素 队列的原型:只允许在一端进行插入数据的操作&#xff0c…

ArcGIS Pro 和 Python — 分析全球主要城市中心的土地覆盖变化

第一步——设置工作环境 1–0. 地理数据库 在下载任何数据之前,我将创建几个地理数据库,在其中保存和存储所有数据以及我将创建的后续图层。将为我要分析的五个城市中的每一个创建一个地理数据库,并将其命名为: “Phoenix.gdb” “Singapore.gdb” “Berlin.gdb” “B…

入户厨房设计,220大平层现代风三室装修。福州中宅装饰,福州装修

设计亮点 220㎡的平层住宅需要在氛围、功能和储物空间方面进行质的提升,以满足三口之家的需求。原始结构包括五个卧室和两个客厅,客餐厅整体通透,但厨房稍显局促,主卧功能分区不够清晰。 入户厨房 设计亮点 这个充满现代氛围的入…

SpringBoot---------Hutool

第一步&#xff1a;引入依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-parent</artifactId><version>5.7.17</version></dependency> 第二步&#xff1a;各种用法 ①生成随机数 //生成验证码 String s …

29.Gateway网关的全局过滤器GlobalFilter

全局过滤器的作用也是处理一切进入网关的请求和微服务响应。 与GatewayFilter的作用一样(filters, default-filters) 区别 GatewayFilter通过配置定义&#xff0c;处理逻辑是固定的。 GlobalFilter的逻辑需要自己写代码实现&#xff0c;可以自定义。 exchange表示 请求上下…

EXCEL表格中的数字,为什么每次打开会自动变成日期?

一、典型现象 在工作中&#xff0c;有时会发现公司里的报表&#xff0c;经过多人多次的重复的使用和修改后&#xff0c;会出现这种情况&#xff1a; 1.在表格里按照需要输入数字&#xff0c;保存工作簿。 2.然而&#xff0c;再次打开工作簿&#xff0c;里面的数字变成日期&a…

【嵌入式AI开发】轻量级卷积神经网络MobileNetV2详解

前言:MobileNetV2网络先升维后降维,在降维时使用线性激活函数,带残差的Inverted bottleck模块,防止ReLU信息丢失。在图像分类、目标检测、语义分割等任务上实现了网络轻量化、速度和准确度的权衡。 回顾MobileNetV1的理论和MobileNetV2项目实战可查阅如下链接: 【嵌入式AI…

【前端开发基础知识快速入门】

前端开发基础知识&快速入门 一、VSCode 使用1.1 安装常用插件1.2 创建项目1.3 创建网页1.4 运行效果二、ES62.1 简介2.2 什么是 ECMAScript2.3 ES6 新特性2.3.1 let 声明变量2.3.2 const 声明常量(只读变量)2.3.3 解构表达式2.3.4 字符串扩展2.3.5 函数优化2.3.6 对象优化…

ADM2483BRWZ 封装SOIC-16-300mil 隔离器芯片

ADM 2483 BRWZ 是一款由Analog Devices&#xff08;模拟器件公司&#xff09;生产的隔离式RS-485差分总线收发器。以下是ADM 2483 BRWZ的一些主要功能和参数介绍&#xff1a; 主要功能&#xff1a; 隔离通信: 提供电气隔离&#xff0c;以保护敏感的电子设备免受噪声干扰和高压…

nvm基本使用

nvm基本使用 文章目录 nvm基本使用1.基本介绍2.下载地址3.常用指令 1.基本介绍 NVM是一个用于管理 Node.js 版本的工具。它允许您在同一台计算机上同时安装和管理多个 Node.js 版本&#xff0c;针对于不同的项目可能需要不同版本的 Node.js 运行环境。 NVM 主要功能&#xff…