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

目录

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
完结。。。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenStack云计算(十一)——OpenStack网络管理,验证OpenStack网络资源模型,验证来巩固和加深对OpenStack网络资源模型的理解

项目实训一 【实训题目】 验证OpenStack网络资源模型 【实训目的】 通过验证来巩固和加深对OpenStack网络资源模型的理解。 【实训准备】 (1)复习Neutron网络资源模型。 (2)重点理解网络、子网、端口和路由器的概念。 【实…

定制自己的 AI 角色CustomChar;AI知识点和面试题;提高llama 3 的微调速度Unsloth

✨ 1: CustomChar 允许你创建和定制自己的 AI 角色 CustomChar 是一个开源项目,它允许你创建和定制自己的 AI 角色。无论是游戏中的角色,还是个人的虚拟助手(比如电脑上的 JARVIS),甚至是在线教育体验中的虚拟朋友或…

vue列表穿梭框,可进行前端查询

// 这是组件,可以直接用 <template><div class"box"><el-row><el-col :span"11"><div class"box_left"><SearchContent :queryParams"queryParams" query"handleQuery" reset"resetQ…

rtthread 使用 scons 生成的项目

Env 工具 Env 是 RT-Thread 推出的开发辅助工具&#xff0c;针对基于 RT-Thread 操作系统的项目工程&#xff0c;提供编译构建环境、图形化系统配置及软件包管理功能。 其内置的 menuconfig 提供了简单易用的配置剪裁工具&#xff0c;可对内核、组件和软件包进行自由裁剪&…

【Linux】学习记录_14_线程

14 线程 14.1 线程和进程 进程是资源管理的最小单位&#xff0c;每个进程都有数据段、代码段和堆栈段&#xff0c;进程切换时都有复杂的上下文切换等动作。进程切换上下文时&#xff0c; 需要重新映射虚拟地址空间、进出OS内核、寄存器切换&#xff0c;还会干扰处理器的缓存机…

2010年认证杯SPSSPRO杯数学建模C题(第一阶段)高校图书馆的智能服务全过程文档及程序

2010年认证杯SPSSPRO杯数学建模 C题 高校图书馆的智能服务 原题再现&#xff1a; 图书馆源于保存记事的习惯。图书馆是为读者在馆内使用文献而提供的专门场所。而高校的图书馆为教学和科研服务&#xff0c;具有服务性和学术性强的特点。   现在的高校图书馆存在着许多不良的…

华为交换机重置密码

1.进入bootrom 加电后&#xff0c;18S左右&#xff0c;在启动菜单按 CtrlB 进入bootrom&#xff08;3s内&#xff09; 注意&#xff1a;本步骤属于高危操作&#xff0c;一定小心切勿删除系统或修改bootrom密码&#xff01; 输入bootrom密码&#xff0c;按6 看到提示成功后按…

Java基础之JVM基础调优与常见问题

常见命令 以下命令的介绍&#xff0c;全部在jdk8环境下运行的&#xff1b; jps ☆☆☆☆☆ 查看当前运行的进程号&#xff1b; jmap ☆☆☆ jmap命令可以查看jvm的内存信息&#xff0c;class对应的实例个数以及占用的内存大小 jmap -histo 查看当前java进程 [rdVM-8-12-c…

网动统一通信平台(Active UC) downloadDocument.action 任意文件读取漏洞复现

0x01 产品简介 网动统一通信平台(Active UC) 是一个涵盖了多种通信功能的综合平台&#xff0c;通常包括文字、语音、视频通讯等功能&#xff0c;并且可能提供了一系列的通讯工具和服务。这样的平台通常旨在提升用户的沟通效率和便利性&#xff0c;为用户提供一个统一的通信环境…

Tomcat源码解析——一次请求的处理流程

在上一篇文章中&#xff0c;我们知道Tomcat在启动后&#xff0c;会在Connector中开启一个Acceptor(接收器)绑定线程然后用于监听socket的连接&#xff0c;那么当我们发出请求时&#xff0c;第一步也就是建立TCP连接&#xff0c;则会从Acceptor的run方法处进入。 Acceptor&…

用户体验至上:独立站脱颖而出的关键要素解析

在数字化时代&#xff0c;独立站成为了许多品牌和企业展示自身形象、推广产品、建立客户联系的重要平台。然而&#xff0c;要想在众多的独立站中脱颖而出&#xff0c;吸引并留住用户&#xff0c;良好的用户体验至关重要。本文Nox聚星将和大家探讨如何做好独立站的用户体验&…

antDesignPro ProForm表单里使用dependencies属性

场景&#xff1a;ProForm表单里前一个下拉框选择的值带出后面下拉框的枚举值 <script><ProFormformRef{formRef}onFinish{{}}><ProForm.Group><ProFormSelectname"projectId"label"项目"width"sm"request{projectList}plac…

echerts饼图分割操作

在饼图制作中遇到了一个难点就是饼图中间是分散的 试了很多方法&#xff0c;最后选择了给每个值中间再加一节的处理方式&#xff0c;并把颜色设置为透明就能达到相同效果。 处理后的样式&#xff1a; 代码&#xff1a; let list this.data.list;/饼图内部展示数据// let _t…

文心一言 VS 讯飞星火 VS chatgpt (242)-- 算法导论17.4 1题

一、假定我们希望实现一个动态的开地址散列表。为什么我们需要当装载因子达到一个严格小于 1 的值 a 时就认为表满&#xff1f;简要描述如何为动态开地址散列表设计一个插入算法&#xff0c;使得每个插入操作的摊还代价的期望值为 O(1) 。为什么每个插入操作的实际代价的期望值…

React基础知识大汇总

函数组件和类组件 函数组件与类组件有什么区别呢&#xff1f; function getName(params:{name:string}){const count 0;return params.name -count; } getName({name:"test"}) getName({name:"哈哈哈"})getName是一个纯函数&#xff0c;不产生任何副作用…

54、图论-实现Trie前缀树

思路&#xff1a; 主要是构建一个trie前缀树结构。如果构建呢&#xff1f;看题意&#xff0c;应该当前节点对象下有几个属性&#xff1a; 1、next节点数组 2、是否为结尾 3、当前值 代码如下&#xff1a; class Trie {class Node {boolean end;Node[] nexts;public Node(…

nginx配置挂载html

目标 很多软件的官方文档&#xff0c;在国内打开很慢&#xff0c;每次都得等很久&#xff0c;看到官方同时提供了html的包&#xff0c;所以想着挂载到本地nginx下&#xff0c;查看会方便很多。 下载官方html文档包&#xff0c;解压到documentation_htmls下 想添加新的文档也是…

Sql Server 数据库:查询表结构脚本

查询脚本: SELECT CASE WHEN col.colorder 1 THEN obj.name ELSE END AS 表名, col.colorder AS 序号 , col.name AS 列名 , ISNULL(ep.[value], ) AS 列说明 , t.name AS 数据类型 , col.length AS 长度 , ISNULL(COLUMNPROPERTY(col.id, col.name, Scale), 0) AS 小数位数…

<开源> 轮廓内缩外扩算法

轮廓内缩外扩算法 项目是论文A new offset algorithm for closed 2D lines with Islands的JAVA实现。 项目的GitHub地址&#xff1a;https://github.com/Lee-0o0/polygon-offset-algorithm。 参考博客 https://blog.csdn.net/qq_41261251/article/details/114462696

设计模式 -- 行为型模式

1. 行为型模式概述 行为型模式用于描述程序在运行时复杂的流程控制&#xff0c;即描述多个类或对象之间怎样相互协作共同完成单个对象无法单独完成的任务&#xff0c;它涉及算法与对象间职责的分配。 行为型模式分为类行为模式和对象行为模式&#xff0c;前者采用继承机制在类…