如何使用stm32F407ZGT6单片机串口实现串行通信(要求:不能使用串口1)

加急,解决好问题可以加赏. 如何使用stm32F407ZGT6单片机串口实现串行通信(要求:不能使用串口1)


把代码里和配置里的USART1都换成其它串口即可。

要串行通信啊!!

串口编写程序如:


//usart.c
#include "sys.h"
#include "usart.h"
 
//AlwaySun 2020/01/05
//»ùÓÚÕýµãÔ­×Ó¹¤³ÌÐÞ¸Ä
//ºê¶¨Òå´®¿Ú½ÓÊܳ¤¶ÈºÍʹÄÜ´®¿Ú
 
#if SYSTEM_SUPPORT_OS
#include "includes.h"                    //ucos ʹÓà      
#endif
 
#if 1
#pragma import(__use_no_semihosting)             
//±ê×¼¿âÐèÒªµÄÖ§³Öº¯Êý                 
struct __FILE 
{ 
    int handle; 
}; 
 
FILE __stdout;       
//¶¨Òå_sys_exit()ÒÔ±ÜÃâʹÓðëÖ÷»úģʽ    
void _sys_exit(int x) 
{ 
    x = x; 
} 
//ÖØ¶¨Òåfputcº¯Êý 
int fputc(int ch, FILE *f)
{     
    while((USART1->SR&0X40)==0);//Ñ­»··¢ËÍ,Ö±µ½·¢ËÍÍê±Ï   
    USART1->DR = (u8) ch;      
    return ch;
}
#endif
 
 
#if EN_USART1_RX   //Èç¹ûʹÄÜÁ˽ÓÊÕ
//´®¿Ú1ÖжϷþÎñ³ÌÐò
//×¢Òâ,¶ÁÈ¡USARTx->SRÄܱÜÃâĪÃûÆäÃîµÄ´íÎó       
u8 USART_RX_BUF[USART_REC_LEN];     //½ÓÊÕ»º³å,×î´óUSART_REC_LEN¸ö×Ö½Ú.
//½ÓÊÕ״̬
//bit15£¬    ½ÓÊÕÍê³É±êÖ¾
//bit14£¬    ½ÓÊÕµ½0x0d
//bit13~0£¬    ½ÓÊÕµ½µÄÓÐЧ×Ö½ÚÊýÄ¿
u16 USART_RX_STA=0;       //½ÓÊÕ״̬±ê¼Ç    
 
//³õʼ»¯IO ´®¿Ú1 
//bound:²¨ÌØÂÊ
void uart_init(u32 bound){
   //GPIO¶Ë¿ÚÉèÖÃ
  GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //ʹÄÜGPIOAʱÖÓ
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//ʹÄÜUSART1ʱÖÓ
 
    //´®¿Ú1¶ÔÓ¦Òý½Å¸´ÓÃÓ³Éä
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //GPIOA9¸´ÓÃΪUSART1
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //GPIOA10¸´ÓÃΪUSART1
    
    //USART1¶Ë¿ÚÅäÖÃ
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9ÓëGPIOA10
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//¸´Óù¦ÄÜ
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    //ËÙ¶È50MHz
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //ÍÆÍ츴ÓÃÊä³ö
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //ÉÏÀ­
    GPIO_Init(GPIOA,&GPIO_InitStructure); //³õʼ»¯PA9£¬PA10
 
   //USART1 ³õʼ»¯ÉèÖÃ
    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_Cmd(USART1, ENABLE);  //ʹÄÜ´®¿Ú1 
    
    //USART_ClearFlag(USART1, USART_FLAG_TC);
    
#if EN_USART1_RX    
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//¿ªÆôÏà¹ØÖжÏ
 
    //Usart1 NVIC ÅäÖÃ
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//´®¿Ú1ÖжÏͨµÀ
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//ÇÀÕ¼ÓÅÏȼ¶3
    NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;        //×ÓÓÅÏȼ¶3
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //IRQͨµÀʹÄÜ
    NVIC_Init(&NVIC_InitStructure);    //¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯VIC¼Ä´æÆ÷¡¢
 
#endif
    
}
 
void USART1_IRQHandler(void)                    //´®¿Ú1ÖжϷþÎñ³ÌÐò
{
    u8 Res;
#if SYSTEM_SUPPORT_OS         //Èç¹ûSYSTEM_SUPPORT_OSÎªÕæ£¬ÔòÐèÒªÖ§³ÖOS.
    OSIntEnter();    
#endif
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //½ÓÊÕÖжÏ(½ÓÊÕµ½µÄÊý¾Ý±ØÐëÊÇ0x0d 0x0a½áβ)
    {
        Res =USART_ReceiveData(USART1);//(USART1->DR);    //¶ÁÈ¡½ÓÊÕµ½µÄÊý¾Ý
        
        if((USART_RX_STA&0x8000)==0)//½ÓÊÕδÍê³É
        {
            if(USART_RX_STA&0x4000)//½ÓÊÕµ½ÁË0x0d
            {
                if(Res!=0x0a)USART_RX_STA=0;//½ÓÊÕ´íÎó,ÖØÐ¿ªÊ¼
                else USART_RX_STA|=0x8000;    //½ÓÊÕÍê³ÉÁË 
            }
            else //»¹Ã»ÊÕµ½0X0D
            {    
                if(Res==0x0d)USART_RX_STA|=0x4000;
                else
                {
                    USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
                    USART_RX_STA++;
                    if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//½ÓÊÕÊý¾Ý´íÎó,ÖØÐ¿ªÊ¼½ÓÊÕ      
                }         
            }
        }            
  } 
#if SYSTEM_SUPPORT_OS     //Èç¹ûSYSTEM_SUPPORT_OSÎªÕæ£¬ÔòÐèÒªÖ§³ÖOS.
    OSIntExit();                                               
#endif
} 
#endif    
 
 
 
#if EN_USART2_RX   //Èç¹ûʹÄÜÁ˽ÓÊÕ
//´®¿Ú2ÖжϷþÎñ³ÌÐò
//×¢Òâ,¶ÁÈ¡USARTx->SRÄܱÜÃâĪÃûÆäÃîµÄ´íÎó       
u8 USART2_RX_BUF[USART2_REC_LEN];     //½ÓÊÕ»º³å,×î´óUSART_REC_LEN¸ö×Ö½Ú.
//½ÓÊÕ״̬
//bit15£¬    ½ÓÊÕÍê³É±êÖ¾
//bit14£¬    ½ÓÊÕµ½0x0d
//bit13~0£¬    ½ÓÊÕµ½µÄÓÐЧ×Ö½ÚÊýÄ¿
u16 USART2_RX_STA=0;       //½ÓÊÕ״̬±ê¼Ç    
 
//³õʼ»¯IO ´®¿Ú2
//bound:²¨ÌØÂÊ
void uart2_init(u32 bound){
   //GPIO¶Ë¿ÚÉèÖÃ
  GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //ʹÄÜGPIOAʱÖÓ
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//ʹÄÜUSART2ʱÖÓ
 
    //´®¿Ú2¶ÔÓ¦Òý½Å¸´ÓÃÓ³Éä
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_USART2); //GPIOA2¸´ÓÃΪUSART2
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_USART2); //GPIOA3¸´ÓÃΪUSART2
    
    //USART2¶Ë¿ÚÅäÖÃ
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; //GPIOA2ÓëGPIOA3
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//¸´Óù¦ÄÜ
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    //ËÙ¶È50MHz
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //ÍÆÍ츴ÓÃÊä³ö
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //ÉÏÀ­
    GPIO_Init(GPIOA,&GPIO_InitStructure); //³õʼ»¯PA2£¬PA3
 
   //USART2 ³õʼ»¯ÉèÖÃ
    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(USART2, &USART_InitStructure); //³õʼ»¯´®¿Ú1
    
  USART_Cmd(USART2, ENABLE);  //ʹÄÜ´®¿Ú2
    
#if EN_USART2_RX    
    USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//¿ªÆôÏà¹ØÖжÏ
    //Usart2 NVIC ÅäÖÃ
  NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;//´®¿Ú2ÖжÏͨµÀ
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//ÇÀÕ¼ÓÅÏȼ¶3
    NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;        //×ÓÓÅÏȼ¶3
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //IRQͨµÀʹÄÜ
    NVIC_Init(&NVIC_InitStructure);    //¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯VIC¼Ä´æÆ÷¡¢
 
#endif
    
}
 
void USART2_IRQHandler(void)                    //´®¿Ú2ÖжϷþÎñ³ÌÐò
{
    u8 Res;
#if SYSTEM_SUPPORT_OS         //Èç¹ûSYSTEM_SUPPORT_OSÎªÕæ£¬ÔòÐèÒªÖ§³ÖOS.
    OSIntEnter();    
#endif
    if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  //½ÓÊÕÖжÏ(½ÓÊÕµ½µÄÊý¾Ý±ØÐëÊÇ0x0d 0x0a½áβ)
    {
        Res =USART_ReceiveData(USART2);//(USART2->DR);    //¶ÁÈ¡½ÓÊÕµ½µÄÊý¾Ý
        
        if((USART2_RX_STA&0x8000)==0)//½ÓÊÕδÍê³É
        {
            if(USART2_RX_STA&0x4000)//½ÓÊÕµ½ÁË0x0d
            {
                if(Res!=0x0a)USART2_RX_STA=0;//½ÓÊÕ´íÎó,ÖØÐ¿ªÊ¼
                else USART2_RX_STA|=0x8000;    //½ÓÊÕÍê³ÉÁË 
            }
            else //»¹Ã»ÊÕµ½0X0D
            {    
                if(Res==0x0d)USART2_RX_STA|=0x4000;
                else
                {
                    USART2_RX_BUF[USART2_RX_STA&0X3FFF]=Res ;
                    USART2_RX_STA++;
                    if(USART2_RX_STA>(USART2_REC_LEN-1))USART2_RX_STA=0;//½ÓÊÕÊý¾Ý´íÎó,ÖØÐ¿ªÊ¼½ÓÊÕ      
                }         
            }
        }            
  } 
#if SYSTEM_SUPPORT_OS     //Èç¹ûSYSTEM_SUPPORT_OSÎªÕæ£¬ÔòÐèÒªÖ§³ÖOS.
    OSIntExit();                                               
#endif
} 
#endif    
 
 
//´®¿Ú3
#if EN_USART3_RX   //Èç¹ûʹÄÜÁ˽ÓÊÕ
//´®¿Ú3ÖжϷþÎñ³ÌÐò
//×¢Òâ,¶ÁÈ¡USARTx->SRÄܱÜÃâĪÃûÆäÃîµÄ´íÎó       
u8 USART3_RX_BUF[USART3_REC_LEN];     //½ÓÊÕ»º³å,×î´óUSART_REC_LEN¸ö×Ö½Ú.
//½ÓÊÕ״̬
//bit15£¬    ½ÓÊÕÍê³É±êÖ¾
//bit14£¬    ½ÓÊÕµ½0x0d
//bit13~0£¬    ½ÓÊÕµ½µÄÓÐЧ×Ö½ÚÊýÄ¿
u16 USART3_RX_STA=0;       //½ÓÊÕ״̬±ê¼Ç    
 
//³õʼ»¯IO ´®¿Ú3 
//bound:²¨ÌØÂÊ
void uart3_init(u32 bound){
   //GPIO¶Ë¿ÚÉèÖÃ
  GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE); //ʹÄÜGPIOBʱÖÓ
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);//ʹÄÜUSART3ʱÖÓ
 
    //´®¿Ú3¶ÔÓ¦Òý½Å¸´ÓÃÓ³Éä
    GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_USART3); //GPIOB10¸´ÓÃΪUSART3
    GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_USART3); //GPIOB11¸´ÓÃΪUSART3
    
    //USART3¶Ë¿ÚÅäÖÃ
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11; //GPIOB10 GPIOB11
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//¸´Óù¦ÄÜ
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    //ËÙ¶È50MHz
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //ÍÆÍ츴ÓÃÊä³ö
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //ÉÏÀ­
    GPIO_Init(GPIOB,&GPIO_InitStructure); //³õʼ»¯GPIOB11£¬GPIOB10
 
   //USART3 ³õʼ»¯ÉèÖÃ
    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_Cmd(USART3, ENABLE);  //ʹÄÜ´®¿Ú3
    
    //USART_ClearFlag(USART1, USART_FLAG_TC);
    
#if EN_USART3_RX    
    USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//¿ªÆôÏà¹ØÖжÏ
 
    //Usart1 NVIC ÅäÖÃ
  NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;//´®¿Ú3ÖжÏͨµÀ
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//ÇÀÕ¼ÓÅÏȼ¶3
    NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;        //×ÓÓÅÏȼ¶3
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //IRQͨµÀʹÄÜ
    NVIC_Init(&NVIC_InitStructure);    //¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯VIC¼Ä´æÆ÷¡¢
 
#endif
    
}
 
void USART3_IRQHandler(void)                    //´®¿Ú3ÖжϷþÎñ³ÌÐò
{
    u8 Res;
#if SYSTEM_SUPPORT_OS         //Èç¹ûSYSTEM_SUPPORT_OSÎªÕæ£¬ÔòÐèÒªÖ§³ÖOS.
    OSIntEnter();    
#endif
    if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)  //½ÓÊÕÖжÏ(½ÓÊÕµ½µÄÊý¾Ý±ØÐëÊÇ0x0d 0x0a½áβ)
    {
        Res =USART_ReceiveData(USART3);//(USART3->DR);    //¶ÁÈ¡½ÓÊÕµ½µÄÊý¾Ý
        
        if((USART3_RX_STA&0x8000)==0)//½ÓÊÕδÍê³É
        {
            if(USART3_RX_STA&0x4000)//½ÓÊÕµ½ÁË0x0d
            {
                if(Res!=0x0a)USART3_RX_STA=0;//½ÓÊÕ´íÎó,ÖØÐ¿ªÊ¼
                else USART3_RX_STA|=0x8000;    //½ÓÊÕÍê³ÉÁË 
            }
            else //»¹Ã»ÊÕµ½0X0D
            {    
                if(Res==0x0d)USART3_RX_STA|=0x4000;
                else
                {
                    USART3_RX_BUF[USART3_RX_STA&0X3FFF]=Res ;
                    USART3_RX_STA++;
                    if(USART3_RX_STA>(USART3_REC_LEN-1))USART3_RX_STA=0;//½ÓÊÕÊý¾Ý´íÎó,ÖØÐ¿ªÊ¼½ÓÊÕ      
                }         
            }
        }            
  } 
#if SYSTEM_SUPPORT_OS     //Èç¹ûSYSTEM_SUPPORT_OSÎªÕæ£¬ÔòÐèÒªÖ§³ÖOS.
    OSIntExit();                                               
#endif
} 
#endif    
 
 
 
//´®¿Ú4
#if EN_USART4_RX   //Èç¹ûʹÄÜÁ˽ÓÊÕ
//´®¿Ú1ÖжϷþÎñ³ÌÐò
//×¢Òâ,¶ÁÈ¡USARTx->SRÄܱÜÃâĪÃûÆäÃîµÄ´íÎó       
u8 USART4_RX_BUF[USART4_REC_LEN];     //½ÓÊÕ»º³å,×î´óUSART_REC_LEN¸ö×Ö½Ú.
//½ÓÊÕ״̬
//bit15£¬    ½ÓÊÕÍê³É±êÖ¾
//bit14£¬    ½ÓÊÕµ½0x0d
//bit13~0£¬    ½ÓÊÕµ½µÄÓÐЧ×Ö½ÚÊýÄ¿
u16 USART4_RX_STA=0;       //½ÓÊÕ״̬±ê¼Ç    
 
//³õʼ»¯IO ´®¿Ú4
//bound:²¨ÌØÂÊ
void uart4_init(u32 bound){
   //GPIO¶Ë¿ÚÉèÖÃ
  GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //ʹÄÜGPIOAʱÖÓ
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4,ENABLE);//ʹÄÜUSART4ʱÖÓ
 
    //´®¿Ú4¶ÔÓ¦Òý½Å¸´ÓÃÓ³Éä
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_UART4); //GPIOA0¸´ÓÃΪUSART4
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource1,GPIO_AF_UART4); //GPIOA1¸´ÓÃΪUSART4
    
    //USART4¶Ë¿ÚÅäÖÃ
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; //GPIOA0ÓëGPIOA1
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//¸´Óù¦ÄÜ
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    //ËÙ¶È50MHz
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //ÍÆÍ츴ÓÃÊä³ö
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //ÉÏÀ­
    GPIO_Init(GPIOA,&GPIO_InitStructure); //³õʼ»¯PA0£¬PA1
 
   //USART4 ³õʼ»¯ÉèÖÃ
    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(UART4, &USART_InitStructure); //³õʼ»¯´®¿Ú4
    
  USART_Cmd(UART4, ENABLE);  //ʹÄÜ´®¿Ú4 
    
    //USART_ClearFlag(USART1, USART_FLAG_TC);
    
#if EN_USART4_RX    
    USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);//¿ªÆôÏà¹ØÖжÏ
 
    //Usart4 NVIC ÅäÖÃ
  NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;//´®¿Ú4ÖжÏͨµÀ
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//ÇÀÕ¼ÓÅÏȼ¶3
    NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;        //×ÓÓÅÏȼ¶3
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //IRQͨµÀʹÄÜ
    NVIC_Init(&NVIC_InitStructure);    //¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯VIC¼Ä´æÆ÷¡¢
 
#endif
    
}
 
void USART4_IRQHandler(void)                    //´®¿Ú4ÖжϷþÎñ³ÌÐò
{
    u8 Res;
#if SYSTEM_SUPPORT_OS         //Èç¹ûSYSTEM_SUPPORT_OSÎªÕæ£¬ÔòÐèÒªÖ§³ÖOS.
    OSIntEnter();    
#endif
    if(USART_GetITStatus(UART4, USART_IT_RXNE) != RESET)  //½ÓÊÕÖжÏ(½ÓÊÕµ½µÄÊý¾Ý±ØÐëÊÇ0x0d 0x0a½áβ)
    {
        Res =USART_ReceiveData(UART4);//(USART4->DR);    //¶ÁÈ¡½ÓÊÕµ½µÄÊý¾Ý
        
        if((USART4_RX_STA&0x8000)==0)//½ÓÊÕδÍê³É
        {
            if(USART4_RX_STA&0x4000)//½ÓÊÕµ½ÁË0x0d
            {
                if(Res!=0x0a)USART4_RX_STA=0;//½ÓÊÕ´íÎó,ÖØÐ¿ªÊ¼
                else USART4_RX_STA|=0x8000;    //½ÓÊÕÍê³ÉÁË 
            }
            else //»¹Ã»ÊÕµ½0X0D
            {    
                if(Res==0x0d)USART4_RX_STA|=0x4000;
                else
                {
                    USART4_RX_BUF[USART4_RX_STA&0X3FFF]=Res ;
                    USART4_RX_STA++;
                    if(USART4_RX_STA>(USART4_REC_LEN-1))USART4_RX_STA=0;//½ÓÊÕÊý¾Ý´íÎó,ÖØÐ¿ªÊ¼½ÓÊÕ      
                }         
            }
        }            
  } 
#if SYSTEM_SUPPORT_OS     //Èç¹ûSYSTEM_SUPPORT_OSÎªÕæ£¬ÔòÐèÒªÖ§³ÖOS.
    OSIntExit();                                               
#endif
} 
#endif    
 
//´®¿Ú5
#if EN_USART5_RX   //Èç¹ûʹÄÜÁ˽ÓÊÕ
//´®¿Ú1ÖжϷþÎñ³ÌÐò
//×¢Òâ,¶ÁÈ¡USARTx->SRÄܱÜÃâĪÃûÆäÃîµÄ´íÎó       
u8 USART5_RX_BUF[USART5_REC_LEN];     //½ÓÊÕ»º³å,×î´óUSART_REC_LEN¸ö×Ö½Ú.
//½ÓÊÕ״̬
//bit15£¬    ½ÓÊÕÍê³É±êÖ¾
//bit14£¬    ½ÓÊÕµ½0x0d
//bit13~0£¬    ½ÓÊÕµ½µÄÓÐЧ×Ö½ÚÊýÄ¿
u16 USART5_RX_STA=0;       //½ÓÊÕ״̬±ê¼Ç    
 
//³õʼ»¯IO ´®¿Ú5
//bound:²¨ÌØÂÊ
void uart5_init(u32 bound){
   //GPIO¶Ë¿ÚÉèÖÃ
  GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE); //ʹÄÜGPIOCʱÖÓ
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE); //ʹÄÜGPIODʱÖÓ
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5,ENABLE);//ʹÄÜUSART5ʱÖÓ
 
    //´®¿Ú1¶ÔÓ¦Òý½Å¸´ÓÃÓ³Éä
    GPIO_PinAFConfig(GPIOC,GPIO_PinSource12,GPIO_AF_UART5); //GPIOC12¸´ÓÃΪUSART5
    GPIO_PinAFConfig(GPIOD,GPIO_PinSource2,GPIO_AF_UART5); //GPIOD2¸´ÓÃΪUSART5
    
    //USART5¶Ë¿ÚÅäÖÃ
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //GPIOC12
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//¸´Óù¦ÄÜ
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    //ËÙ¶È50MHz
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //ÍÆÍ츴ÓÃÊä³ö
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //ÉÏÀ­
    GPIO_Init(GPIOC,&GPIO_InitStructure); //³õʼ»¯PC12
    
    //USART5¶Ë¿ÚÅäÖÃ
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //GPIOD2
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//¸´Óù¦ÄÜ
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    //ËÙ¶È50MHz
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //ÍÆÍ츴ÓÃÊä³ö
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //ÉÏÀ­
    GPIO_Init(GPIOD,&GPIO_InitStructure); //³õʼPD2
    
 
   //USART5 ³õʼ»¯ÉèÖÃ
    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(UART5, &USART_InitStructure); //³õʼ»¯´®¿Ú5
    
  USART_Cmd(UART5, ENABLE);  //ʹÄÜ´®¿Ú5
    
    
#if EN_USART5_RX    
    USART_ITConfig(UART5, USART_IT_RXNE, ENABLE);//¿ªÆôÏà¹ØÖжÏ
 
    //Usart1 NVIC ÅäÖÃ
  NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQn;//´®¿Ú5ÖжÏͨµÀ
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//ÇÀÕ¼ÓÅÏȼ¶3
    NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;        //×ÓÓÅÏȼ¶3
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //IRQͨµÀʹÄÜ
    NVIC_Init(&NVIC_InitStructure);    //¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯VIC¼Ä´æÆ÷¡¢
 
#endif
    
}
 
 
void USART5_IRQHandler(void)                    //´®¿Ú5ÖжϷþÎñ³ÌÐò
{
    u8 Res;
#if SYSTEM_SUPPORT_OS         //Èç¹ûSYSTEM_SUPPORT_OSÎªÕæ£¬ÔòÐèÒªÖ§³ÖOS.
    OSIntEnter();    
#endif
    if(USART_GetITStatus(UART5, USART_IT_RXNE) != RESET)  //½ÓÊÕÖжÏ(½ÓÊÕµ½µÄÊý¾Ý±ØÐëÊÇ0x0d 0x0a½áβ)
    {
        Res =USART_ReceiveData(UART5);//(USART5->DR);    //¶ÁÈ¡½ÓÊÕµ½µÄÊý¾Ý
        //USART_SendData(UART5,Res);
        if((USART5_RX_STA&0x8000)==0)//½ÓÊÕδÍê³É
        {
            if(USART5_RX_STA&0x4000)//½ÓÊÕµ½ÁË0x0d
            {
                if(Res!=0x0a)USART5_RX_STA=0;//½ÓÊÕ´íÎó,ÖØÐ¿ªÊ¼
                else USART5_RX_STA|=0x8000;    //½ÓÊÕÍê³ÉÁË 
            }
            else //»¹Ã»ÊÕµ½0X0D
            {    
                if(Res==0x0d)USART5_RX_STA|=0x4000;
                else
                {
                    USART5_RX_BUF[USART5_RX_STA&0X3FFF]=Res ;
                    USART5_RX_STA++;
                    if(USART5_RX_STA>(USART5_REC_LEN-1))USART5_RX_STA=0;//½ÓÊÕÊý¾Ý´íÎó,ÖØÐ¿ªÊ¼½ÓÊÕ      
                }         
            }
        }          
  } 
#if SYSTEM_SUPPORT_OS     //Èç¹ûSYSTEM_SUPPORT_OSÎªÕæ£¬ÔòÐèÒªÖ§³ÖOS.
    OSIntExit();                                               
#endif
} 
#endif    
 
 
//´®¿Ú6
#if EN_USART6_RX   //Èç¹ûʹÄÜÁ˽ÓÊÕ
//´®¿Ú6ÖжϷþÎñ³ÌÐò
//×¢Òâ,¶ÁÈ¡USARTx->SRÄܱÜÃâĪÃûÆäÃîµÄ´íÎó       
u8 USART6_RX_BUF[USART6_REC_LEN];     //½ÓÊÕ»º³å,×î´óUSART_REC_LEN¸ö×Ö½Ú.
//½ÓÊÕ״̬
//bit15£¬    ½ÓÊÕÍê³É±êÖ¾
//bit14£¬    ½ÓÊÕµ½0x0d
//bit13~0£¬    ½ÓÊÕµ½µÄÓÐЧ×Ö½ÚÊýÄ¿
u16 USART6_RX_STA=0;       //½ÓÊÕ״̬±ê¼Ç    
 
//³õʼ»¯IO ´®¿Ú6
//bound:²¨ÌØÂÊ
void uart6_init(u32 bound){
   //GPIO¶Ë¿ÚÉèÖÃ
  GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE); //ʹÄÜGPIOCʱÖÓ
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART6,ENABLE);//ʹÄÜUSART6ʱÖÓ
 
    //´®¿Ú6¶ÔÓ¦Òý½Å¸´ÓÃÓ³Éä
    GPIO_PinAFConfig(GPIOC,GPIO_PinSource6,GPIO_AF_USART6); //GPIOC6¸´ÓÃΪUSART6
    GPIO_PinAFConfig(GPIOC,GPIO_PinSource7,GPIO_AF_USART6); //GPIOAC7¸´ÓÃΪUSART6
    
    //USART6¶Ë¿ÚÅäÖÃ
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; //GPIOC6ÓëGPIOC7
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//¸´Óù¦ÄÜ
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    //ËÙ¶È50MHz
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //ÍÆÍ츴ÓÃÊä³ö
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //ÉÏÀ­
    GPIO_Init(GPIOC,&GPIO_InitStructure); //³õʼ»¯PC6£¬PC7
    
    
 
   //USART6 ³õʼ»¯ÉèÖÃ
    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(USART6, &USART_InitStructure); //³õʼ»¯´®¿Ú1
    
  USART_Cmd(USART6, ENABLE);  //ʹÄÜ´®¿Ú6
    
    
#if EN_USART6_RX    
    USART_ITConfig(USART6, USART_IT_RXNE, ENABLE);//¿ªÆôÏà¹ØÖжÏ
 
    //Usart6 NVIC ÅäÖÃ
  NVIC_InitStructure.NVIC_IRQChannel = USART6_IRQn;//´®¿Ú6ÖжÏͨµÀ
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//ÇÀÕ¼ÓÅÏȼ¶3
    NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;        //×ÓÓÅÏȼ¶3
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //IRQͨµÀʹÄÜ
    NVIC_Init(&NVIC_InitStructure);    //¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯VIC¼Ä´æÆ÷¡¢
 
#endif
    
}
 
 
void USART6_IRQHandler(void)                    //´®¿Ú6ÖжϷþÎñ³ÌÐò
{
    u8 Res;
#if SYSTEM_SUPPORT_OS         //Èç¹ûSYSTEM_SUPPORT_OSÎªÕæ£¬ÔòÐèÒªÖ§³ÖOS.
    OSIntEnter();    
#endif
    if(USART_GetITStatus(USART6, USART_IT_RXNE) != RESET)  //½ÓÊÕÖжÏ(½ÓÊÕµ½µÄÊý¾Ý±ØÐëÊÇ0x0d 0x0a½áβ)
    {
        Res =USART_ReceiveData(USART6);//(USART6->DR);    //¶ÁÈ¡½ÓÊÕµ½µÄÊý¾Ý
        
        if((USART6_RX_STA&0x8000)==0)//½ÓÊÕδÍê³É
        {
            if(USART6_RX_STA&0x4000)//½ÓÊÕµ½ÁË0x0d
            {
                if(Res!=0x0a)USART6_RX_STA=0;//½ÓÊÕ´íÎó,ÖØÐ¿ªÊ¼
                else USART6_RX_STA|=0x8000;    //½ÓÊÕÍê³ÉÁË 
            }
            else //»¹Ã»ÊÕµ½0X0D
            {    
                if(Res==0x0d)USART6_RX_STA|=0x4000;
                else
                {
                    USART6_RX_BUF[USART6_RX_STA&0X3FFF]=Res ;
                    USART6_RX_STA++;
                    if(USART6_RX_STA>(USART6_REC_LEN-1))USART6_RX_STA=0;//½ÓÊÕÊý¾Ý´íÎó,ÖØÐ¿ªÊ¼½ÓÊÕ      
                }         
            }
        }            
  } 
#if SYSTEM_SUPPORT_OS     //Èç¹ûSYSTEM_SUPPORT_OSÎªÕæ£¬ÔòÐèÒªÖ§³ÖOS.
    OSIntExit();                                               
#endif
} 
#endif    
 

详细参考:https://blog.csdn.net/qq_34020487/article/details/103851107
代码中有中文乱码不用管

你这个问题出现基本上是出现在了端口复用上,建议使用hal库进行开发,配置完成基本就可以通信了,如还不行可以联系我,