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 1RCC_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 0RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//开启GPIOB和USART3时钟//USART3_TX   GPIOB.10GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB.10GPIO_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;//PB11GPIO_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_11GPIO_PinRemapConfig(GPIO_PartialRemap_USART3,ENABLE);  //USART3_TX   GPIOC.10GPIO_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 1RCC_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   D9GPIO_PinRemapConfig(GPIO_FullRemap_USART3,ENABLE);  //USART3_TX   GPIOD8GPIO_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    GPIOD9GPIO_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 ;//抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;       //子优先级3NVIC_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); //初始化串口3USART_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.9GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9GPIO_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;//PA10GPIO_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 ;//抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;       //子优先级3NVIC_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); //初始化串口1USART_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 1RCC_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 0RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//开启GPIOB和USART3时钟//USART3_TX   GPIOB.10GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB.10GPIO_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;//PB11GPIO_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_11GPIO_PinRemapConfig(GPIO_PartialRemap_USART3,ENABLE);  //USART3_TX   GPIOC.10GPIO_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 1RCC_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   D9GPIO_PinRemapConfig(GPIO_FullRemap_USART3,ENABLE);  //USART3_TX   GPIOD8GPIO_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    GPIOD9GPIO_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 ;//抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;       //子优先级3NVIC_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); //初始化串口3USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启串口接受中断USART_Cmd(USART3, ENABLE);                    //使能串口3 }//串口1发送一帧数据
void USART1_SendOneData(uint32_t SendOneData)
{USART_SendData(USART1, SendOneData);while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET){}
}
//串口2发送一帧数据
void USART2_SendOneData(uint32_t SendOneData)
{USART_SendData(USART2, SendOneData);while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET){}
}//串口3发送一帧数据
void USART3_SendOneData(uint32_t SendOneData)
{USART_SendData(USART3, SendOneData);while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET){}
}
//串口1发送一列数据
void USART1_SendUnfixedData(uint32_t *Buffer, uint8_t Length)
{uint8_t  i;for(i=0;i<Length;i++){USART1_SendOneData(*Buffer++);}
}//串口2发送一列数据
void USART2_SendUnfixedData(uint32_t *Buffer, uint8_t Length)
{uint8_t  i;for(i=0;i<Length;i++){USART2_SendOneData(*Buffer++);}
}//串口3发送一列数据
void USART3_SendUnfixedData(uint32_t *Buffer, uint8_t Length)
{uint8_t  i;for(i=0;i<Length;i++){USART3_SendOneData(*Buffer++);}
}//串口1中断服务函数
void USART1_IRQHandler(void)
{u8 Res;//数据暂存if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断{Res =USART_ReceiveData(USART1);   //读取接收到的数据      switch(UART1ReceIn)//读取接收到的数据有几位 每一位对应的数据协议校验{case 0:if(Res==0xFE)UART1ReceBuff[UART1ReceIn++] = Res;elseUART1ReceIn = 0;break;case 1:if(Res==0xFE)UART1ReceBuff[UART1ReceIn++] = Res;elseUART1ReceIn = 0;break;case 2://此处为判断数据的位置  正反转
//              if(Res==0x02)//在其他位置判断数据
//              {UART1ReceBuff[UART1ReceIn++] = Res;
//                  checkdata[0]=UART1ReceBuff[2];}{UART1ReceBuff[UART1ReceIn++] = Res;checkdata[0]=UART1ReceBuff[2];}break;case 3://此处为判断数据的位置  旋转角度
//              if(Res==0x02)//在其他位置判断数据
//              {UART1ReceBuff[UART1ReceIn++] = Res;
//                  checkdata[0]=UART1ReceBuff[2];}{UART1ReceBuff[UART1ReceIn++] = Res;checkdata[1]=UART1ReceBuff[3];  //接收到的角度数据和实际齿轮数据不一致        }   break;          case 4:if(Res==0xFD)UART1ReceBuff[UART1ReceIn++] = Res;elseUART1ReceIn = 0;break;case 5:if(Res==0xFD)UART1ReceBuff[UART1ReceIn++] = Res;elseUART1ReceIn = 0;break;default:UART1ReceBuff[UART1ReceIn++] = Res;break;}if(UART1ReceIn >= 5){UART1ReceFullFlag = 1; //数据完整接受完 UART1ReceIn = 0;timer8flag=0;}
//      USART_ClearFlag(USART1, USART_IT_RXNE);//清除相对应的中断位   清除中断预处理位USART_ClearITPendingBit左移八位是USART_ClearFlag USART_ClearITPendingBit(USART1, USART_IT_RXNE);//清除相对应的中断位   清除中断预处理位USART_ClearITPendingBit左移八位是USART_ClearFlag
//       }if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET) // 发送中断  USART_GetITStatus{//   USART_ClearFlag(USART1, USART_IT_TXE);                  // clear interrupt  清除中断预处理位USART_ClearITPendingBit(USART1, USART_IT_TXE);                  // clear interrupt  清除中断预处理位}
//  if(USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET)
//  {
//      USART_ClearFlag(USART1, USART_FLAG_ORE);
//  }}//串口3中断服务函数
void USART3_IRQHandler(void)
{u8 Res;//数据暂存if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)  //接收中断{Res =USART_ReceiveData(USART3);   //读取接收到的数据 USART_ReceiveDataUSART_SendData(USART1,Res);//将读取到的数据通过串口1发送switch(UART3ReceIn)//读取接收到的数据有几位 每一位对应的数据协议校验{case 0:if(Res==0XFE)UART3ReceBuff[UART3ReceIn++] = Res;elseUART3ReceIn = 0;break;case 10:if(Res==0xFF)UART3ReceBuff[UART3ReceIn++] = Res;elseUART3ReceIn = 0;break;default:UART3ReceBuff[UART3ReceIn++] = Res;break;}if(UART3ReceIn >= 11){UART3ReceFullFlag = 1;  //数据完整接受完 }USART_ClearITPendingBit(USART3, USART_IT_RXNE);//清除相对应的中断位   清除中断预处理位USART_ClearITPendingBit左移八位是USART_ClearFlag  }else if(USART_GetITStatus(USART3, USART_IT_TXE) != RESET)    // 发送中断  USART_GetITStatus{USART_ClearITPendingBit(USART3, USART_IT_TXE);                   // clear interrupt  清除中断预处理位}
}void send_data()
{//刷新位置信息
if(timer8flag100ms==1)
{
timer8flag100ms=0;//发送协议头 FE FE D1USART_SendData(USART1,0xFA);//向串口1发送数据while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束USART_SendData(USART1,0xFC);while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束 //发送数据内容1           USART1_SendUnfixedData(crc16_data1,1);//空开1while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束//发送数据内容2 USART1_SendUnfixedData(crc16_data2,1);//空开2while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束//发送数据内容3     USART1_SendUnfixedData(crc16_data3,1);//空开3while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束//发送数据内容4     USART1_SendUnfixedData(crc16_data4,1);//空开4  while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束//发送数据内容5           USART1_SendUnfixedData(crc16_data5,2);//饮水机 空烧数据while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束//发送数据内容设备接地的数据 (过载实验)(1111 1111)(八个设备)USART1_SendUnfixedData(crc16_data6,1);while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束//发送数据内容7   接地触电 crc16_data7[0] 湿手触电 crc16_data7[1]USART1_SendUnfixedData(crc16_data7,1);while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束//发送数据内容8      发送给串口的数据USART1_SendUnfixedData(crc16_data8,1);while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束                       //发送协议尾 FD FDUSART_SendData(USART1,0xFD);//向串口1发送数据while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束USART_SendData(USART1,0xFD);while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
}}void send_data_usart3(void)
{//刷新位置信息
if(timer8flag200ms==1)
{
timer8flag200ms=0;//发送协议头 FE FE D1USART_SendData(USART3,0xFA);//向串口1发送数据while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待发送结束USART_SendData(USART3,0xFC);while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待发送结束 //发送数据内容1           USART3_SendUnfixedData(crc16_data1,1);//空开1while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待发送结束//发送数据内容2 USART3_SendUnfixedData(crc16_data2,1);//空开2while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待发送结束//发送数据内容3     USART3_SendUnfixedData(crc16_data3,1);//空开3while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待发送结束//发送数据内容4     USART3_SendUnfixedData(crc16_data4,1);//空开4  while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待发送结束//发送数据内容5           USART3_SendUnfixedData(crc16_data5,2);//饮水机 空烧数据while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待发送结束//发送数据内容设备接地的数据 (过载实验)(1111 1111)(八个设备)USART3_SendUnfixedData(crc16_data6,1);while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待发送结束//发送数据内容7   接地触电 crc16_data7[0] 湿手触电 crc16_data7[1]USART3_SendUnfixedData(crc16_data7,1);while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待发送结束//发送数据内容8      发送给串口的数据USART3_SendUnfixedData(crc16_data8,1);while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待发送结束                       //发送协议尾 FD FDUSART_SendData(USART3,0xFD);//向串口1发送数据while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待发送结束USART_SendData(USART3,0xFD);while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待发送结束
}}

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

  1. 【STM32】端口复用和重映射,完全重映射,部分重映射

    文章目录 端口复用 端口复用函数总结 端口重映射 完全重映射 完全重映射函数总结 部分重映射 端口复用 当 PA9,PA10 引脚作为串口 1 的 TX,RX 引脚使用的时候,那就是端口复用(相较于作 ...

  2. 完全重映射和部分重映射分析(超详细)

    大目前的主流芯片都具有重映射的功能,很多刚入坑的小伙伴不太清楚重映射功能,本文章以STM32F103C8T6为例子,对该功能进行说明. 重映射功能的作用:芯片的重映射功能是为了最大化利用IO口,减少I ...

  3. android 重映射按键,键盘重映射的终极教程 | MOS86

    许多电脑用户认为电脑键盘上不同按键提供的功能固定在石头上,根本无法改变.大多数人可能会惊讶地发现可以重新映射Windows中的电脑键盘上的所有键. 但是为什么有人想要更改键盘上的特定键,以便它们具有不 ...

  4. stm32之端口复用和重映射

    文章目录 端口复用 端口重映射 端口复用 WHAT IS 端口复用? 一个GPIO如果可以复用为内置外设的功能引脚,那么当这个GPIO作为内置外设使用的时候,就叫做复用 端口复用配置过程(以串口1位例 ...

  5. STM32 端口复用与重映射及低功耗引脚配置

    STM32 端口复用与重映射及低功耗引脚配置 什么是复用? 在TSM32里面,大部分的引脚都是有GPIO复用功能,也就是说,一个 GPIO如果可以复用为内置外设的功能引脚,那么当这个 GPIO 作为内 ...

  6. STM32端口复用和端口重映射

    参考:stm32 端口复用和重映射 作者:点灯小哥 发布时间: 2021-03-09 13:49:19 网址:https://blog.csdn.net/weixin_46016743/article ...

  7. STM32之端口复用与重映射

    STM32 --端口复用和重映射 首先来说下什么是端口复用. STM32有很多的内置外设,这些外设的外部引脚都是与GPIO复用的.也就是说,一个GPIO如果可以复用为内置外设的功能引脚,那么当这个GP ...

  8. STM32学习笔记(三)端口复用与重映射(stm32c8t6)

    记录一下学习过程 1.端口复用 STM32有很多内置外设,这些外设的外部引脚是与GPIO复用的.默认情况下,这些GPIO口只能作为普通的IO口输入输出,把一个GPIO口的引脚复用为内置外设的功能引脚, ...

  9. STM32——端口复用与重映射

    目录 端口复用的概念 内置外设的概念 端口复用的概念 端口复用的配置 配置示例(串口1) 复用GPIO的配置 STM32中文参考手册 110页 端口重映射概念 端口重映射概念 部分重映射 完全重映射 ...

  10. STM32端口重映射

    笔者在使用STM32F103C8T6时,不能使用TIM3输出2路PWM波的问题分析和解决办法. PS. PB4(部分重映射,TIM3_CH1) ,PB5(部分重映射,TIM3_CH2) STM32的端 ...

最新文章

  1. AxonFramework,快照(Snapshotting)
  2. android横竖屏切换不刷新,关于Android中使用BottomNavigationView切换横屏导致返回主页的问题...
  3. improve怎么加ing_英语当中的ing
  4. 自然常数 e 的理解与应用
  5. 同步异步单线程多线程初级理解
  6. java newfile() bug_java初学者小白?遇到BUG就慌了?有关java异常的十大问题详解!...
  7. mysql中创建视图语法错误_mysql - 使用过程MySQL创建视图时出错 - 堆栈内存溢出
  8. 执行环境及作用域分析
  9. PyTorch并行与分布式(三)DataParallel原理、源码解析、举例实战
  10. [转]C#:手把手教你用C#打包应用程序(安装程序卸载程序)
  11. Pytorch:GPU版代码改成CPU版(RuntimeError: torch.cuda.FloatTensor is not enabled.)
  12. 基本 SQL 之增删改查
  13. UI设计作品中经常会用到的设计技巧?|优漫动游
  14. 解决win10+Ubuntu20.0.4双系统,win10时间错误问题
  15. please execute the cleanup command
  16. html css 浏览器 响应式 面试题持续更新!
  17. python图片提取文字软件_这款Python 库 4行代码提取图片中的文字
  18. 线控转向,包含设计说明书,carsim模型,MATLAB Simulink模型全套
  19. 数据库原理及应用第2版(雷景生编著)课后习题答案第4章
  20. 小白用户也能看懂的卷积神经网络5

热门文章

  1. ffmpeg 自定义IO与Seek
  2. 术语-MOSS-微软协作工具:MOSS(微软协作工具)
  3. 什么是CTP程序化交易:系统入门
  4. enterprise architect 小实验
  5. python_计算股票指标
  6. 计算机网络体系结构-虚拟专用网
  7. 高级系统架构师培训笔记
  8. 什么是网站服务器 域名 备案号,什么是网站服务器 域名 备案
  9. 前端性能优化 24 条建议
  10. 计算机无法读取exe文件,exe无法正常运行怎么办 电脑打不开exe文件的解决方法...