hhhhhhhaa 发表于 2018-11-9 08:49:24

UART4和UART5的配置问题

我自己用的STM32F103VC的MCU,自带的串口是5个,所以想把5个串口都测试一下,编写了如下代码,串口1-3使用都么有问题,但是UART4,UART5使用中断,返回的数据错误,是什么原因引起的啊,配置代码如下void My_USART_Init(void)
{

      
      GPIO_InitTypeDef GPIO_A_InitStrue;
      GPIO_InitTypeDef GPIO_B_InitStrue;
      GPIO_InitTypeDef GPIO_C_InitStrue;
      GPIO_InitTypeDef GPIO_D_InitStrue;
      
      
      
      
      USART_InitTypeDef USART_1_InitStrue;
      USART_InitTypeDef USART_2_InitStrue;
      USART_InitTypeDef USART_3_InitStrue;
      USART_InitTypeDef UART_4_InitStrue;
      USART_InitTypeDef UART_5_InitStrue;
      
      
      
      NVIC_InitTypeDef NVIC_1_InitStrue;
      NVIC_InitTypeDef NVIC_2_InitStrue;
      NVIC_InitTypeDef NVIC_3_InitStrue;
      NVIC_InitTypeDef NVIC_4_InitStrue;
      NVIC_InitTypeDef NVIC_5_InitStrue;
      
      
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_USART1,ENABLE);
      RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2|RCC_APB1Periph_USART3|RCC_APB1Periph_UART4|RCC_APB1Periph_UART5,ENABLE);
      
      GPIO_A_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;
      GPIO_A_InitStrue.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_9;
      GPIO_A_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOA,&GPIO_A_InitStrue);
      
      GPIO_A_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;
      GPIO_A_InitStrue.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_10;
      GPIO_A_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOA,&GPIO_A_InitStrue);
      
      //配置B口
      GPIO_B_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;
      GPIO_B_InitStrue.GPIO_Pin=GPIO_Pin_10;
      GPIO_B_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOB,&GPIO_B_InitStrue);
      
      GPIO_B_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;
      GPIO_B_InitStrue.GPIO_Pin=GPIO_Pin_11;
      GPIO_B_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOB,&GPIO_B_InitStrue);
      
      //配置C口
      
      GPIO_C_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;
      GPIO_C_InitStrue.GPIO_Pin=GPIO_Pin_10|GPIO_Pin_12;
      GPIO_C_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOC,&GPIO_C_InitStrue);
      
      GPIO_C_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;
      GPIO_C_InitStrue.GPIO_Pin=GPIO_Pin_11;
      GPIO_C_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOC,&GPIO_C_InitStrue);
      //配置D口
      
      
      GPIO_D_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;
      GPIO_D_InitStrue.GPIO_Pin=GPIO_Pin_2;
      GPIO_D_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOD,&GPIO_D_InitStrue);
      
      //串口1配置
      
      USART_1_InitStrue.USART_BaudRate=9600;
      USART_1_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
      USART_1_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
      USART_1_InitStrue.USART_Parity=USART_Parity_No;
      USART_1_InitStrue.USART_StopBits=USART_StopBits_1;
      USART_1_InitStrue.USART_WordLength=USART_WordLength_8b;
      USART_Init(USART1,&USART_1_InitStrue);
      
      //串口2配置
      
      USART_2_InitStrue.USART_BaudRate=9600;
      USART_2_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
      USART_2_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
      USART_2_InitStrue.USART_Parity=USART_Parity_No;
      USART_2_InitStrue.USART_StopBits=USART_StopBits_1;
      USART_2_InitStrue.USART_WordLength=USART_WordLength_8b;
      USART_Init(USART2,&USART_2_InitStrue);
      
      //串口3配置
      USART_3_InitStrue.USART_BaudRate=9600;
      USART_3_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
      USART_3_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
      USART_3_InitStrue.USART_Parity=USART_Parity_No;
      USART_3_InitStrue.USART_StopBits=USART_StopBits_1;
      USART_3_InitStrue.USART_WordLength=USART_WordLength_8b;
      USART_Init(USART3,&USART_3_InitStrue);
      //串口4配置
      UART_4_InitStrue.USART_BaudRate=9600;
      UART_4_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
      UART_4_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
      UART_4_InitStrue.USART_Parity=USART_Parity_No;
      UART_4_InitStrue.USART_StopBits=USART_StopBits_1;
      UART_4_InitStrue.USART_WordLength=USART_WordLength_8b;
      USART_Init(UART4,&UART_4_InitStrue);
      //串口5配置
      UART_5_InitStrue.USART_BaudRate=9600;
      UART_5_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
      UART_5_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
      UART_5_InitStrue.USART_Parity=USART_Parity_No;
      UART_5_InitStrue.USART_StopBits=USART_StopBits_1;
      UART_5_InitStrue.USART_WordLength=USART_WordLength_8b;
      USART_Init(UART5,&UART_5_InitStrue);
      
      
      //判断串口是否触发接受
      USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
      USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
      USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);
      USART_ITConfig(UART4,USART_IT_RXNE,ENABLE);
      USART_ITConfig(UART5,USART_IT_RXNE,ENABLE);
      
      //中断配置
      
      
      NVIC_1_InitStrue.NVIC_IRQChannel=USART1_IRQn;
      NVIC_1_InitStrue.NVIC_IRQChannelCmd=ENABLE;
      NVIC_1_InitStrue.NVIC_IRQChannelPreemptionPriority=1;
      NVIC_1_InitStrue.NVIC_IRQChannelSubPriority=1;
      NVIC_Init(&NVIC_1_InitStrue);
      
      
      
      NVIC_2_InitStrue.NVIC_IRQChannel=USART2_IRQn;
      NVIC_2_InitStrue.NVIC_IRQChannelCmd=ENABLE;
      NVIC_2_InitStrue.NVIC_IRQChannelPreemptionPriority=1;
      NVIC_2_InitStrue.NVIC_IRQChannelSubPriority=1;
      NVIC_Init(&NVIC_2_InitStrue);
      
      NVIC_3_InitStrue.NVIC_IRQChannel=USART3_IRQn;
      NVIC_3_InitStrue.NVIC_IRQChannelCmd=ENABLE;
      NVIC_3_InitStrue.NVIC_IRQChannelPreemptionPriority=1;
      NVIC_3_InitStrue.NVIC_IRQChannelSubPriority=1;
      NVIC_Init(&NVIC_3_InitStrue);
      
      
      NVIC_4_InitStrue.NVIC_IRQChannel=UART4_IRQn;
      NVIC_4_InitStrue.NVIC_IRQChannelCmd=ENABLE;
      NVIC_4_InitStrue.NVIC_IRQChannelPreemptionPriority=1;
      NVIC_4_InitStrue.NVIC_IRQChannelSubPriority=1;
      NVIC_Init(&NVIC_4_InitStrue);
      
      NVIC_5_InitStrue.NVIC_IRQChannel=UART5_IRQn;
      NVIC_5_InitStrue.NVIC_IRQChannelCmd=ENABLE;
      NVIC_5_InitStrue.NVIC_IRQChannelPreemptionPriority=1;
      NVIC_5_InitStrue.NVIC_IRQChannelSubPriority=1;
      NVIC_Init(&NVIC_5_InitStrue);
      
      //串口使能
      
      USART_Cmd(USART1,ENABLE);
      USART_Cmd(USART2,ENABLE);
      USART_Cmd(USART3,ENABLE);
      USART_Cmd(UART4,ENABLE);
      USART_Cmd(UART5,ENABLE);
      
}


void USART1_IRQHandler(void)
{
      u8 Res;
         if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
                {
                Res =USART_ReceiveData(USART1);      
    Res++;
                USART_SendData(USART1, Res);
                        
   }
}
void USART2_IRQHandler(void)
{
      u8 Res;
         if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
                {
                Res =USART_ReceiveData(USART2);      
    Res++;
                USART_SendData(USART2, Res);
                        
   }
}void USART3_IRQHandler(void)
{
      u8 Res;
         if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
                {
                Res =USART_ReceiveData(USART3);      
    Res++;
                USART_SendData(USART3, Res);
                        
   }
}void UART4_IRQHandler(void)
{
      u8 Res;
         if(USART_GetITStatus(UART4, USART_IT_RXNE) != RESET)
                {
                Res =USART_ReceiveData(UART4);      
    Res++;
                USART_SendData(UART4, Res);
                        
   }
}



void UART5_IRQHandler(void)
{
      u8 Res;
         if(USART_GetITStatus(UART5, USART_IT_RXNE) != RESET)
                {
                Res =USART_ReceiveData(UART5);      
    Res++;
                USART_SendData(UART5, Res);
                        
   }
}


jeffhe1 发表于 2018-11-9 10:15:02

感覺 pin 配置怪怪的 ?
:o

hhhhhhhaa 发表于 2018-11-9 11:33:44

jeffhe1 发表于 2018-11-9 10:15
感覺 pin 配置怪怪的 ?

pin配置没问题

jeffhe1 发表于 2018-11-9 13:26:16

那只能先查看原理圖? , 接著查看程序哪邊是否有重複使用 ?, 或著 uart 暫存器 是否有共用?:o

hhhhhhhaa 发表于 2018-11-9 14:26:15

jeffhe1 发表于 2018-11-9 13:26
那只能先查看原理圖? , 接著查看程序哪邊是否有重複使用 ?, 或著 uart 暫存器 是否有共用? ...

用的中断接收,能进中断关于UART4   485通讯的问题
http://www.openedv.com/forum.php?mod=viewthread&tid=282471&fromuid=115630
(出处: OpenEdv-开源电子网)
原理图

dataozi 发表于 2018-11-16 14:15:43

我这里有一个 自己写的串口5的 发给您参照一下
void GPIO_UART5_Configuration(void)//PC12---TX PD2---RX
{
        GPIO_InitTypeDef GPIO_InitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5,ENABLE);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOC, &GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOD, &GPIO_InitStructure);
}
void UART5_Configuration(u32 Band)
{
        USART_InitTypeDef USART_InitStructure;
        USART_InitStructure.USART_BaudRate = Band;//²¨ÌØÂÊ
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×Ö³¤
        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);
        USART_ITConfig(UART5,USART_IT_RXNE,ENABLE);
        USART_Cmd(UART5, ENABLE);
}
NVIC_InitStructure.NVIC_IRQChannel=UART5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 6;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
void UART5_IRQHandler(void)
{
        if(USART_GetITStatus(UART5, USART_IT_RXNE)!= RESET)
        {
                USART_ClearITPendingBit(UART5,USART_IT_RXNE);
                UART5_RES= USART_ReceiveData(UART5);
        }
}

hhhhhhhaa 发表于 2018-11-19 13:34:15

dataozi 发表于 2018-11-16 14:15
我这里有一个 自己写的串口5的 发给您参照一下
void GPIO_UART5_Configuration(void)//PC12---TX PD2---RX
...

谢谢您的回复,我的问题已经解决了,UART4和USART1用起来是没区别的,我用的不是232芯片是485芯片,485是半双工的,所以发送和接收要分开执行,在发送的时候不能接收,接收的时候不能发送,我用232的时候发送和接收都放在中断里,现在放到中断里就出问题了,485芯片反应不过来,导致的问题
页: [1]
查看完整版本: UART4和UART5的配置问题