使用5个串口,现在串口3与串口5收不到东西,1.2.4都正常

2019-08-13 20:16发布

#if EN_USART3_RX   //èç1ûê1Äüá˽óêÕ
//′®¿ú1ÖD¶Ï·tÎñ3ìDò
//×¢òa,¶áè¡USARTx->SRÄü±üÃaÄaÃûÆäÃîμÄ′íÎó          
u8 USART_RX_BUF3[USART_REC_LEN];     //½óêÕ»o3å,×î′óUSART_REC_LEN¸ö×Ö½ú.

//½óêÕ×′ì¬
//bit15£¬        ½óêÕíê3é±êÖ¾
//bit14£¬        ½óêÕμ½0x0d
//bit13~0£¬        ½óêÕμ½μÄóDD§×Ö½úêyÄ¿
u16 USART_RX_STA3=0;       //½óêÕ×′쬱ê¼Ç          

void uart3_init(u32 bound){
  //GPIO¶Ë¿úéèÖÃ
  GPIO_InitTypeDef GPIO_InitStructure3;
        USART_InitTypeDef USART_InitStructure3;
        NVIC_InitTypeDef NVIC_InitStructure3;
         
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);        //ê1ÄüUSART3

        //////////////////////////////////////////////////////////////////////////////////////
        //USART3_TX   GPIOB.10
  GPIO_InitStructure3.GPIO_Pin = GPIO_Pin_10; //PB.10
  GPIO_InitStructure3.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure3.GPIO_Mode = GPIO_Mode_AF_PP;        //¸′óÃíÆíìêä3ö
  GPIO_Init(GPIOB, &GPIO_InitStructure3);//3õê¼»ˉGPIOB.10

  //USART3_RX          GPIOB.11 3õê¼»ˉ
  GPIO_InitStructure3.GPIO_Pin = GPIO_Pin_11;//PB.11
  GPIO_InitStructure3.GPIO_Mode = GPIO_Mode_IN_FLOATING;//¸¡¿Õêäèë
  GPIO_Init(GPIOB, &GPIO_InitStructure3);//3õê¼»ˉGPIOB.11  

  //Usart2 NVIC ÅäÖÃ
  NVIC_InitStructure3.NVIC_IRQChannel = USART3_IRQn;
        NVIC_InitStructure3.NVIC_IRQChannelPreemptionPriority=0 ;//ÇàÕ¼óÅÏ輶0
        NVIC_InitStructure3.NVIC_IRQChannelSubPriority = 3;                //×óóÅÏ輶3
        NVIC_InitStructure3.NVIC_IRQChannelCmd = ENABLE;                        //IRQí¨μàê1Äü
        NVIC_Init(&NVIC_InitStructure3);        //¸ù¾YÖ¸¶¨μÄ2Îêy3õê¼»ˉVIC¼Ä′æÆ÷
       
           //USART 3õê¼»ˉéèÖÃ
        USART_InitStructure3.USART_BaudRate = bound;//′®¿ú2¨ìØÂê
        USART_InitStructure3.USART_WordLength = USART_WordLength_8b;//×Ö3¤Îa8λêy¾Y¸ñê½
        USART_InitStructure3.USART_StopBits = USART_StopBits_1;//ò»¸öí£Ö1λ
        USART_InitStructure3.USART_Parity = USART_Parity_No;//ÎTÆæżD£Ñéλ
        USART_InitStructure3.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//ÎTó2¼têy¾Yá÷¿ØÖÆ
        USART_InitStructure3.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        //êÕ·¢Ä£ê½

  USART_Init(USART3, &USART_InitStructure3); //3õê¼»ˉ′®¿ú3
  USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//¿aÆô′®¿ú½óêüÖD¶Ï
  USART_Cmd(USART3, ENABLE);                    //ê1Äü′®¿ú3

}

void USART3_IRQHandler(void)                        //′®¿ú3ÖD¶Ï·tÎñ3ìDò
        {
        u8 Res3;
#if SYSTEM_SUPPORT_OS                 //èç1ûSYSTEM_SUPPORT_OSÎaÕ棬ÔòDèòaÖ§3ÖOS.
        OSIntEnter();   
#endif
        if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)  //½óêÕÖD¶Ï(½óêÕμ½μÄêy¾Y±ØDëêÇ0x0d 0x0a½áÎ2)
                {
                Res3 =USART_ReceiveData(USART3);        //¶á衽óêÕμ½μÄêy¾Y
               
                if((USART_RX_STA3&0x8000)==0)//½óêÕÎ′íê3é
                        {
                        if(USART_RX_STA3&0x4000)//½óêÕμ½áË0x0d
                                {
                                if(Res3!=0x0a)USART_RX_STA3=0;//½óêÕ′íÎó,ÖØD¿aê¼
                                else USART_RX_STA3|=0x8000;        //½óêÕíê3éáË
                                }
                        else //»1ûêÕμ½0X0D
                                {       
                                if(Res3==0x0d)USART_RX_STA3|=0x4000;
                                else
                                        {
                                        USART_RX_BUF3[USART_RX_STA3&0X3FFF]=Res3 ;
                                        USART_RX_STA3++;
                                        if(USART_RX_STA3>(USART_REC_LEN-1))USART_RX_STA3=0;//½óêÕêy¾Y′íÎó,ÖØD¿aê¼½óêÕ          
                                        }                 
                                }
                        }                    
     }

#if SYSTEM_SUPPORT_OS         //èç1ûSYSTEM_SUPPORT_OSÎaÕ棬ÔòDèòaÖ§3ÖOS.
        OSIntExit();                                                                                           
#endif
}
#endif       


#if EN_USART5_RX   
u8 USART_RX_BUF5[USART_REC_LEN];   
u16 USART_RX_STA5=0;     

void uart5_init(u32 bound){
  GPIO_InitTypeDef GPIO_InitStructure5;
        USART_InitTypeDef USART_InitStructure5;
        NVIC_InitTypeDef NVIC_InitStructure5;       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5,ENABLE);
        //////////////////////////////////////////////////////////////////////////////////////
        //USART5_TX   GPIOC.12
  GPIO_InitStructure5.GPIO_Pin = GPIO_Pin_12; //PC.12
  GPIO_InitStructure5.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure5.GPIO_Mode = GPIO_Mode_AF_PP;        //¸′óÃíÆíìêä3ö
  GPIO_Init(GPIOC, &GPIO_InitStructure5);//3õê¼»ˉGPIOC.12

  //USART5_RX          GPIOD.2 3õê¼»ˉ
  GPIO_InitStructure5.GPIO_Pin = GPIO_Pin_2;//PC.11
  GPIO_InitStructure5.GPIO_Mode = GPIO_Mode_IN_FLOATING;//¸¡¿Õêäèë
  GPIO_Init(GPIOD, &GPIO_InitStructure5);//3õê¼»ˉGPIOB.11  

  //Usart5 NVIC ÅäÖÃ
  NVIC_InitStructure5.NVIC_IRQChannel = UART5_IRQn;
        NVIC_InitStructure5.NVIC_IRQChannelPreemptionPriority=0 ;//ÇàÕ¼óÅÏ輶3
        NVIC_InitStructure5.NVIC_IRQChannelSubPriority = 5;                //×óóÅÏ輶3
        NVIC_InitStructure5.NVIC_IRQChannelCmd = ENABLE;                        //IRQí¨μàê1Äü
        NVIC_Init(&NVIC_InitStructure5);        //¸ù¾YÖ¸¶¨μÄ2Îêy3õê¼»ˉVIC¼Ä′æÆ÷
       
           //USART 3õê¼»ˉéèÖÃ
        USART_InitStructure5.USART_BaudRate = bound;//′®¿ú2¨ìØÂê
        USART_InitStructure5.USART_WordLength = USART_WordLength_8b;//×Ö3¤Îa8λêy¾Y¸ñê½
        USART_InitStructure5.USART_StopBits = USART_StopBits_1;//ò»¸öí£Ö1λ
        USART_InitStructure5.USART_Parity = USART_Parity_No;//ÎTÆæżD£Ñéλ
        USART_InitStructure5.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//ÎTó2¼têy¾Yá÷¿ØÖÆ
        USART_InitStructure5.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        //êÕ·¢Ä£ê½

  USART_Init(UART5, &USART_InitStructure5); //3õê¼»ˉ′®¿ú5
  USART_ITConfig(UART5, USART_IT_RXNE, ENABLE);//¿aÆô′®¿ú½óêüÖD¶Ï
  USART_Cmd(UART5, ENABLE);                    //ê1Äü′®¿ú5

}

void UART5_IRQHandler(void)                        //′®¿ú5ÖD¶Ï·tÎñ3ìDò
        {
        u8 Res5;
#if SYSTEM_SUPPORT_OS                 //èç1ûSYSTEM_SUPPORT_OSÎaÕ棬ÔòDèòaÖ§3ÖOS.
        OSIntEnter();   
#endif
        if(USART_GetITStatus(UART5, USART_IT_RXNE) != RESET)  //½óêÕÖD¶Ï(½óêÕμ½μÄêy¾Y±ØDëêÇ0x0d 0x0a½áÎ2)
                {
                Res5 =USART_ReceiveData(UART5);        //¶á衽óêÕμ½μÄêy¾Y
               
                if((USART_RX_STA5&0x8000)==0)//½óêÕÎ′íê3é
                        {
                        if(USART_RX_STA5&0x4000)//½óêÕμ½áË0x0d
                                {
                                if(Res5!=0x0a)USART_RX_STA5=0;//½óêÕ′íÎó,ÖØD¿aê¼
                                else USART_RX_STA5|=0x8000;        //½óêÕíê3éáË
                                }
                        else
                                {       
                                if(Res5==0x0d)USART_RX_STA5|=0x4000;
                                else
                                        {
                                        USART_RX_BUF5[USART_RX_STA5&0X3FFF]=Res5 ;
                                        USART_RX_STA5++;
                                        if(USART_RX_STA5>(USART_REC_LEN-1))USART_RX_STA5=0;//½óêÕêy¾Y′íÎó,ÖØD¿aê¼½óêÕ          
                                        }                 
                                }
                        }                    
     }

#if SYSTEM_SUPPORT_OS         //èç1ûSYSTEM_SUPPORT_OSÎaÕ棬ÔòDèòaÖ§3ÖOS.
        OSIntExit();                                                                                           
#endif
}
#endif       

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
huanghan
1楼-- · 2019-08-13 23:17
这里配置没看出问题,你看看IO时钟开没,这里只看到开串口的时钟
山雀
2楼-- · 2019-08-14 04:45
没有开设IO时钟
hasaki
3楼-- · 2019-08-14 08:11
确实是没开时钟把时钟打开
山雀
4楼-- · 2019-08-14 13:33
 精彩回答 2  元偷偷看……
PURSRE
5楼-- · 2019-08-14 17:55
大兄弟,可不可以把这个程序发出来分享一下,最近也在弄多串口的问题
山雀
6楼-- · 2019-08-14 18:37
我上面的配置很全了,4个串口都有

一周热门 更多>