STM32串口3 映射和完全重映射 PB10 PB11 / PD8 PD9 / PC10 PC11

发布者:chunli最新更新时间:2024-09-30 来源: cnblogs关键字:STM32  串口  映射  完全重映射 手机看文章 扫描二维码
随时随地手机看文章

STM32F103共有五个串口,有时候在项目中,其他的引脚已经配置用了,重新改太麻烦



STM32串口3 映射和完全重映射 PB10 PB11 PD8 PD9  PC10 PC11



所有本次实验 使用了串口3的映射端口,配置和普通的类似 



只是注意要使用映射使能说明


GPIO_PinRemapConfig(GPIO_FullRemap_USART3  , ENABLE); 

点击(此处)折叠或打开


void USART3_Configuration(u32 bound)

{

  //GPIO端口设置

  GPIO_InitTypeDef GPIO_InitStructure;

    USART_InitTypeDef USART_InitStructure;

    NVIC_InitTypeDef NVIC_InitStructure;

    

 #if 1

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO, ENABLE); //remap时钟|RCC_APB2Periph_AFIO //开启GPIOB时钟

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);//这里要分开打开 //USART3时钟 来自APB1

#endif

    

#if 0

    

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//开启GPIOB和USART3时钟

    

        //USART3_TX GPIOB.10

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB.10

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽输出

    GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOA.10

    

    //USART3_RX     GPIOB.11初始化

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PB11

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入

    GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB.11

    

#endif    

    

 

#if 0    //重映射

 

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO, ENABLE); //remap时钟|RCC_APB2Periph_AFIO //开启GPIOB时钟

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);//这里要分开打开 //USART3时钟 来自APB1

    

    //GPIO_PartialRemap_USART3 部分重映射 GPIOC_10 GPIOC_11

    

    GPIO_PinRemapConfig(GPIO_PartialRemap_USART3,ENABLE);

    //USART3_TX GPIOC.10

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽输出

  GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化

   

  //USART3_RX     GPIOC.11初始化

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入

  GPIO_Init(GPIOC, &GPIO_InitStructure);//初始

#endif

 

 

#if 1

 

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO, ENABLE); //remap时钟|RCC_APB2Periph_AFIO //开启GPIOB时钟

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);//这里要分开打开 //USART3时钟 来自APB1

 

     //GPIO_FullRemap_USART3 完全重映射 D8 D9

     GPIO_PinRemapConfig(GPIO_FullRemap_USART3,ENABLE);

    //USART3_TX GPIOD8

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽输出

  GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化

   

  //USART3_RX     GPIOD9

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入

  GPIO_Init(GPIOD, &GPIO_InitStructure);//初始

#endif

 

 

  //Usart3 NVIC 配置

  NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;//抢占优先级3

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;        //子优先级3

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //IRQ通道使能

    NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化VIC寄存器

  

   //USART 初始化设置

 

    USART_InitStructure.USART_BaudRate = bound;//串口波特率

    USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式

    USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位

    USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位

    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制

    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;    //收发模式

 

  USART_Init(USART3, &USART_InitStructure); //初始化串口3

  USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启串口接受中断

  USART_Cmd(USART3, ENABLE); //使能串口3

 

}


点击(此处)折叠或打开


#include 'sys.h'

#include 'usart.h'

#include 'timer.h'

#include 'stdint.h'

 u8     checkdata[8];        //检测串口1接收的特定数据数据

//发送上位机的数据

//

uint32_t crc16_data1[] = { 0x00,0x00, 0x00 };//饮水机数据

uint32_t crc16_data2[] = { 0x00,0x00, 0x00 };//

uint32_t crc16_data3[] = { 0x00,0x00, 0x00 };//

uint32_t crc16_data4[] = { 0x00,0x00, 0x00 };//

uint32_t crc16_data5[] = { 0x00,0x00, 0x00 };//

uint32_t crc16_data6[] = { 0x00,0x00, 0x00 };//

uint32_t crc16_data7[] = { 0x00,0x00, 0x00 };//

uint32_t crc16_data8[] = { 0x00,0x00, 0x00 };//

uint32_t crc16_data9[] = { 0x00,0x00, 0x00 };//

uint32_t crc16_data10[]= { 0x00,0x00, 0x00 };//

 

 

//串口1队列定义

u8     UART1SendBuff[UART1BuffSize];        //发送数据

u8     UART1ReceBuff[UART1BuffSize];        //接收数据?

u16 UART1ReceIn = 0;//接收状态标记数据位    

u8 UART1ReceFullFlag = 0;//接收完数据标志位

 

 

//串口3队列定义

u8     UART3SendBuff[UART3BuffSize];        //发送数据

u8     UART3ReceBuff[UART3BuffSize];        //接收数据?

u16 UART3ReceIn = 0;//接收状态标记数据位    

u8 UART3ReceFullFlag = 0;//接收完数据标志位

 

void USART1_Configuration(u32 bound){

  //GPIO端口设置

  GPIO_InitTypeDef GPIO_InitStructure;

    USART_InitTypeDef USART_InitStructure;

    NVIC_InitTypeDef NVIC_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);    //使能USART1,GPIOA时钟

  

    //USART1_TX GPIOA.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);//初始化GPIOA.9

   

  //USART1_RX     GPIOA.10初始化

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入

  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10

 

  //Usart1 NVIC 配置

  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//抢占优先级3

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;        //子优先级3

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //IRQ通道使能

    NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化VIC寄存器

  

   //USART 初始化设置

    USART_InitStructure.USART_BaudRate = bound;//串口波特率

    USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式

    USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位

    USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位

    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制

    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;    //收发模式

 

  USART_Init(USART1, &USART_InitStructure); //初始化串口1

  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断

  USART_Cmd(USART1, ENABLE); //使能串口1

 

}

 

void USART3_Configuration(u32 bound)

{

  //GPIO端口设置

  GPIO_InitTypeDef GPIO_InitStructure;

    USART_InitTypeDef USART_InitStructure;

    NVIC_InitTypeDef NVIC_InitStructure;

    

 #if 1

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO, ENABLE); //remap时钟|RCC_APB2Periph_AFIO //开启GPIOB时钟

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);//这里要分开打开 //USART3时钟 来自APB1

#endif

    

#if 0

    

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//开启GPIOB和USART3时钟

    

        //USART3_TX GPIOB.10

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB.10

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽输出

    GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOA.10

    

    //USART3_RX     GPIOB.11初始化

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PB11

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入

    GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB.11

    

#endif    

    

 

#if 0    //重映射

 

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO, ENABLE); //remap时钟|RCC_APB2Periph_AFIO //开启GPIOB时钟

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);//这里要分开打开 //USART3时钟 来自APB1

    

    //GPIO_PartialRemap_USART3 部分重映射 GPIOC_10 GPIOC_11

    

    GPIO_PinRemapConfig(GPIO_PartialRemap_USART3,ENABLE);

    //USART3_TX GPIOC.10

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽输出

  GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化

   

  //USART3_RX     GPIOC.11初始化

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//

[1] [2] [3]
关键字:STM32  串口  映射  完全重映射 引用地址:STM32串口3 映射和完全重映射 PB10 PB11 / PD8 PD9 / PC10 PC11

上一篇:STM32 控制舵机, 动态调整PWM
下一篇:在STM32添加看门狗

推荐阅读最新更新时间:2026-03-22 10:54

STM32学习笔记之串口映射
在进行原理图设计的时候发现管脚的分配之间有冲突,需要对管脚进行重映射,在手册中了解到STM32上有很多I/O口,也有很多的内置外设像:I2C,ADC,ISP,USART等,为了节省引出管脚,这些内置外设基本上是与I/O口共用管脚的,也就是I/O管脚的复用功能。但是STM32还有一特别之处就是:很多复用内置的外设的I/O引脚可以通过重映射功能,从不同的I/O管脚引出,即复用功能的引脚是可通过程序改变的。 第一次这么干感觉心里没底,所以针对USART1在STM32F103RBT6的板子上实现了一把,以下是相关的测试代码: void Uart1_Init(void) { RCC_APB2PeriphClockCmd(
[单片机]
STM32F07xx单片机串口1重映射配置
void USART1_Config(unsigned int BaudRate) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; /********************************************************************************************************************** **************************************
[单片机]
STM32F103 USART1串口映射功能的实现
我们知道,F103的usart1串口是PA8 PA9的复用功能,我们在使用的时候直接配置这两个引脚,配置复用即可,但有时,在实际工作中,也会采用串口的重映射功能。 由图可知,usart1是PB6 PB7的重定义功能,也就是重映射功能,话不多说,直接上代码。我使用的是103C8T7,请知悉。 static void Gpio_Config1(void){ GPIO_InitTypeDef GPIO_InitStructure; /* TX PB6 */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Pin = GPI
[单片机]
STM32F103 USART1<font color='red'>串口</font>重<font color='red'>映射</font>功能的实现
STM32单片机重映射USART设计
需要用到外设的重映射功能时才需要使能AFIO的时钟 外部中断(EXTI)中与AFIO有关的寄存器是AFIO-EXTICR1、2、3,它们是用来选择EXTIx外部中断的输入脚之用。 举例:重映射USART2 USART2的TX/RX在PA.2/3 PA.2已经被Timer2的channel3使用需要把USART2的TX/RX重映射到PD.5/6库函数的调用 (1)使能被重新映射到的I/O端口时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); (2)使能被重新映射的外设时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, E
[单片机]
<font color='red'>STM32</font>单片机重<font color='red'>映射</font>USART设计
stm32f103串口实现重映射功能
在实际开发中,经常遇到串口的默认输出IO口被其他模块占用了,所以我们要用到串口IO口映射功能,是指将原来实现功能的IO口映射到其他指定IO口,其他不变。具体操作如下: 先贴出默认下的串口初始化设置: void USART1Conf(u32 baudRate) { USART_InitTypeDef USART_InitSturct;//定义串口1的初始化结构体 GPIO_InitTypeDef GPIO_InitStruct;//定义串口对应管脚的结构体 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA , ENABLE);
[单片机]
STM32 LL库编程】端口复用与重映射
0x01 什么是端口复用 STM32有很多的内置外设,这些外设的外部引脚都是与GPIO复用的。 一个GPIO如果可以复用为内置外设的功能引脚,那么当这个GPIO作为内置外设使用的时候,就叫做复用。 端口复用 通过上图我们可以将 PA9、PA10 复用为 USART1_TX UASRT1_RX 或 定时器 TIM1的通道2和通道3 0x02 端口复用 端口复用步骤包括 使能端口时钟 使能复用的端口时钟 对应的端口模式设置 在配置复用端口时如何选择端口模式 ? 在 IO 复用位内置 外设功能引脚的时候,必须设置GPIO 端口的模式,至于在复用功能下 GPIO 的模式是怎么对应,这个可以查看手册《 STM32 STM
[单片机]
STM32端口复用和端口重映射?什么是端口复用重映射
对于单片机而言,GPIO引脚配置是最基本的,也是最重要的,因为所有的(信号)输入和(控制)输出都是通过这些配置起作用的。这里就不得不提到单片机的复用功能AF(Alternate Function),这篇文章我们说一说复用功能。 STM32Fxx系列单片机的GPIO可以配置为浮空输入(input floating)、上拉输入(input pull-up)、下拉输入(input pull-down)、模拟输入(analog)、开漏输出(output open-drain)、推挽输出(ouput push-pull)、复用开漏输出(alternate function open-drain)、复用推挽输出(alternate fun
[单片机]
<font color='red'>STM32</font>端口复用和端口重<font color='red'>映射</font>?什么是端口复用重<font color='red'>映射</font>?
stm32——端口重映射
我们先来看什么是复用功能? 我们在《stm32f103rc_datasheet.pdf》中可以看到对I/O口的功能描述表格 比如:PC10 I/O口,UART4_TX与SDIO_D2功能都是PC10 I/O口的复用功能。也就是说,PC10 I/O口不仅仅只能进行由内核控制的输入/输出功能,还可以进行由片上外设控制的UART4_TX与SDIO_D2功能。注意:UART4_TX与SDIO_D2功能是来自不同模块的功能。 当我们使用复用功能UART4_TX时,那么PC10 I/O口就由UART外设模块控制,此时PC10 I/O口输入/输出的数据就都来自于UART外设模块了,而不是来自于内核或者其他外设模块。 注意:
[单片机]
<font color='red'>stm32</font>——端口重<font color='red'>映射</font>
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved