STM32F1 端口复用、端口(部分和完全)重映射

端口复用功能
        STM32 有很多的内置外设(比如:串口、ADC、DAC等是独立的模块和内核连接在一起),这些外设的外部引脚都是与 GPIO 复用的。也就是说,一个 GPIO如果可以复用为内置外设的功能引脚,那么当这个 GPIO 作为内置外设使用的时候,就叫做复用。
        大家都知道,MCU 都有串口,STM32 有好几个串口。比如说 STM32F103ZET6 有 5 个串口,我们可以查手册知道,串口 1 的引脚对应的 IO 为 PA9,PA10.PA9,PA10 默认功能是 GPIO,所以当PA9,PA10 引脚作为串口 1 的 TX,RX 引脚使用的时候,那就是端口复用。查看芯片资料可知道那些口是复用端口。

复用端口初始化有几个步骤:

  • GPIO 端口时钟使能。要使用到端口复用,当然要使能端口的时钟了。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  • 复用的外设时钟使能。比如你要将端口 PA9,PA10 复用为串口,所以要使能串口时钟。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
  • 端口模式配置。 在 IO 复用为内置外设功能引脚的时候,必须设置 GPIO 端口的模式,至于 在复用功能下 GPIO 的模式是怎么对应的,这个可以查看手册《STM32 中文参考手册 V10》 P110 的表格“8.1.11 外设的 GPIO 配置”。这里我们拿 Usart1 举例:
    在这里插入图片描述从表格中可以看出,我们要配置全双工的串口 1,那么 TX 管脚需要配置为推挽复用输出,RX 管脚配置为浮空输入或者带上拉输入。

代码如下:

//USART1_TX PA.9 复用推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure);
//USART1_RX PA.10 浮空输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);

我们在使用复用功能的是时候,最少要使能 2 个时钟:

  • GPIO 时钟使能
  • 复用的外设时钟使能同时要初始化 GPIO 以及复用外设功能

端口重映射
        为了使不同器件封装的外设 IO 功能数量达到最优,可以把一些复用功能重新映射到其他一些引脚上。STM32 中有很多内置外设的输入输出引脚都具有重映射(remap)的功能。我们知道每个内置外设都有若干个输入输出引脚,一般这些引脚的输出端口都是固定不变的,为了让设计工程师可以更好地安排引脚的走向和功能,在 STM32 中引入了外设引脚重映射的概念,即一个外设的引脚除了具有默认的端口外,还可以通过设置重映射寄存器的方式,把这个外设的引脚映射到其它的端口。
        简单的讲就是把管脚的外设功能映射到另一个管脚,但不是可以随便映射的,具体对应关系《STM32 中文参考手册 V10》的 P116 页“8.3 复用功能和调试配置”有讲解。这里我们同样拿串口 1 为例来讲解。
在这里插入图片描述         上图是截取的中文参考手册中的重映射表,从表中可以看出,默认情况下,串口 1 复用的时候的引脚位 PA9,PA10,同时我们可以将 TX 和 RX 重新映射到管脚 PB6 和 PB7 上面去。
        所以重映射我们同样要使能复用功能的时候讲解的 2 个时钟外,还要使能 AFIO 功能时钟,然后要调用重映射函数。详细步骤为:

  • 使能 GPIOB 时钟:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  • 使能串口 1 时钟:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
  • 使能 AFIO 时钟:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

PS: 在对寄存器AFIO_MARR,AFIO_EXTICRX和AFIO_EVCP进行读写操作前,应首先打开AFIO时钟。
1、 AFIO_MARR:配置复用功能映射
2、 AFIO_EXTICRX:配置外部中断线映射
3、 AFIO_EVCP:配置EVENTOUT事件输出

  • 开启重映射:
GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);

这样就将串口的 TX 和 RX 重映射到管脚 PB6 和 PB7 上面了。至于有哪些功能可以重映射,大家除了查看中文参考手册之外,还可以从 GPIO_PinRemapConfig 函数入手查看第一个入口参数的取值范围可以得知。在stm32f10x_gpio.h 文件中定义了取值范围为下面宏定义的标识符,这里我们贴一小部分:

#define GPIO_Remap_SPI1 ((uint32_t)0x00000001) 
#define GPIO_Remap_I2C1 ((uint32_t)0x00000002) 
#define GPIO_Remap_USART1 ((uint32_t)0x00000004) 
#define GPIO_Remap_USART2 ((uint32_t)0x00000008) 
#define GPIO_PartialRemap_USART3 ((uint32_t)0x00140010) 
#define GPIO_FullRemap_USART3 ((uint32_t)0x00140030)

从上面可以看出,USART1 只有一种重映射,而对于 USART3,存在部分重映射和完全重映射。所谓部分重映射就是部分管脚和默认的是一样的,而部分管脚是重新映射到其他管脚。而完全重映射就是所有管脚都重新映射到其他管脚。看看手册中的 USART3 重映射表:
在这里插入图片描述部分重映射就是 PB10,PB11,PB12 重映射到 PC10,PC11,PC12 上。而 PB13 和 PB14 和没有重映射情况是一样的,都是 USART3_CTS 和 USART3_RTS 对应管脚。完全重映射就是将这两个脚重新映射到 PD11 和 PD12 上去。我们要使用 USART3 的部分重映射,我们调用函数方法为:

GPIO_PinRemapConfig(GPIO_PartialRemap_USART3, ENABLE);

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

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

相关文章

docker启动容器后容器状态为Exited (137) 5 seconds ago

1:因为容器里的运行的代码报错了,然后容器 Exited (1) 3 seconds ago 了,通过 docker logs -f container_id 能看到哪里错了 容器桩体为exited,说明容器已经退出停止 先查看查看镜像id ps images 在后台运行一个容器 为了保证提…

ReflectionClass与Closure

<?php /*** Class A*/ class A{}$obj new ReflectionClass(A); var_export($obj.PHP_EOL); 类后面加上PHP_EOL会把当前类的详细接口文档打印出来。 ReflectionClass 可以利用这个动态创建类&#xff0c;动态使用类方法参数。 try{ //如果存在控制器名字的类 if(class_exis…

STM32中断优先级的管理(NVIC)

STM32 NVIC 中断优先级管理 CM3 内核支持 256 个中断&#xff0c;其中包含了 16 个内核中断和 240 个外部中断&#xff0c;并且具有 256级的可编程中断设置。STM32 并没有使用 CM3 内核的全部东西&#xff0c;而是只用了它的一部分。STM32 有 84 个中断&#xff0c;包括 16 个…

docker修改容器名字

查看一下容器的名字 这个laughing_elion是下载es时候默认的名字 修改容器名字 docker rename 容器原来名 要改为的名字 最后可以看到容器名已经修改成功

STM32 串行通信原理

处理器与外部设备通信的两种方式&#xff1a; 并行通信 传输原理&#xff1a;数据各个位同时传输。优点&#xff1a;速度快缺点&#xff1a;占用引脚资源多 串行通信 传输原理&#xff1a;数据按位顺序传输。优点&#xff1a;占用引脚资源少缺点&#xff1a;速度相对较慢 …

linus下centos7防火墙设置

CentOS7 默认使用firewalld防火墙&#xff0c;如果想换回iptables防火墙&#xff0c;可关闭firewalld并安装iptables。 1:安装firewalld服务 yum install firewalld 2、firewalld的基本使用 启动&#xff1a; systemctl start firewalld &#xff08;关闭后显示notrunning&a…

串口通信寄存器/库函数配置、实例编写

常用的串口相关寄存器 USART_SR状态寄存器USART_DR数据寄存器USART_BRR波特率寄存器 串口操作相关库函数&#xff08;省略入口参数&#xff09;&#xff1a; void USART_Init(); //串口初始化&#xff1a;波特率&#xff0c;数据字长&#xff0c;奇偶校验&#xff0c;硬件流…

使用docker安装Mongodb

下载mongo3.2的docker镜像&#xff1a; docker pull mongo:3.2 使用docker命令启动&#xff1a; docker run -p 27017:27017 --name mongo \ -v /mydata/mongo/db:/data/db \ -d mongo:3.2 查看已经成功启动

移动端meta标签

现在的手机或平板电脑等移动设备上的浏览器默认都有双击放大的设置&#xff0c;如何阻止双击放大&#xff1f;user-scalableno <!-- 禁止缩放 --> <meta name”viewport” content”widthdevice-width,initial-scale1.0,maximum-scale1.0,user-scalableno”> <!…

正点原子stm32--串口通信实验讲解里关于USART_RX_STA的问题与思考

这篇博文讲的挺详细的可以参考以下&#xff1a; USART_RX_STA详解

什么是真正的程序员?

什么是真正的程序员 这篇文章的原文来自&#xff1a;A Little Printf Story作者仿照《小王子》中的情节&#xff0c;通过小printf遇见的不同类型的程序员&#xff0c;最后悟出什么才是真正的程序员&#xff01;第一次翻译有很多不妥&#xff0c;欢迎留言指正。 文章略长&#x…

为什么会出现docker

docker镜像&#xff0c;一次构建&#xff0c;到处运行

docker和虚拟机的区别

虚拟机缺点&#xff1a; docker和虚拟机的不同之处&#xff1a;

独立看门狗实验

为什么要看门狗 在由单片机构成的微型计算机系统中&#xff0c;由于单片机的工作常常会受到来自外界电磁场的干扰&#xff0c;造成程序的跑飞&#xff0c;而陷入死循环&#xff0c;程序的正常运行被打断&#xff0c;由单片机控制的系统无法继续工作&#xff0c;会造成整个系统…

Manthan, Codefest 16

暴力 A - Ebony and Ivory import java.util.*; import java.io.*;public class Main {public static void main(String[] args) {Scanner cin new Scanner (new BufferedInputStream (System.in));int a cin.nextInt ();int b cin.nextInt ();int c cin.nextInt ();for…

docker资源

Docker资源 Docker官方英文资源&#xff1a; docker官网&#xff1a;http://www.docker.com Docker windows入门&#xff1a;https://docs.docker.com/windows/ Docker Linux 入门&#xff1a;https://docs.docker.com/linux/ Docker mac 入门&#xff1a;https://docs.do…

ios apple pay 证书配置

一 环境配置 需要开发者账号 开发者中心https://developer.apple.com/membercenter/index.action 添加一个APP IDs二&#xff0e;配置Merchant IDs商业ID 下面进行appids和商业id的绑定 之后在回到appids中查看id中的apple pay&#xff0c;发现已经变为可使用状态了 接下来是为…

STM32 通用定时器基本原理

STM32F10x系列总共最多有8个定时器&#xff1a; 三种STM32定时器区别&#xff1a; 通用定时器功能特点描述&#xff1a; ①、 STM32 的通用 TIMx (TIM2、TIM3、TIM4 和 TIM5)定时器功能特点包括&#xff1a; 位于低速的APB1总线上(时钟来源可以是APB1的时钟) 16 位向上、向…