打印
[STM32F4]

STM32F429的UART做RS485时发送正常,接收不到数据。

[复制链接]
4978|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wyjben|  楼主 | 2014-4-13 00:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32F429的UART在做RS232时收发正常,但做RS485时发送正常,接收不到数据。

void Uart5_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
   
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOC|RCC_AHB1Periph_GPIOD,ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5,ENABLE);
   

    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_OType=GPIO_OType_OD;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;
    GPIO_Init(GPIOC,&GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;
    GPIO_Init(GPIOD,&GPIO_InitStructure);
      
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
    GPIO_Init(GPIOB,&GPIO_InitStructure);
   
    GPIO_ResetBits(GPIOB,GPIO_Pin_4);
   
    GPIO_PinAFConfig(GPIOC,GPIO_PinSource12,GPIO_AF_UART5);
    GPIO_PinAFConfig(GPIOD,GPIO_PinSource2,GPIO_AF_UART5);
        
    USART_DeInit(UART5);
        
    USART_InitStructure.USART_BaudRate=4800;
    USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
    USART_InitStructure.USART_WordLength=USART_WordLength_9b;
    USART_InitStructure.USART_Parity=USART_Parity_Odd;
    USART_InitStructure.USART_StopBits=USART_StopBits_1;
    USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
    USART_Init(UART5,&USART_InitStructure);
   
     NVIC_InitStructure.NVIC_IRQChannel=UART5_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;
    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
    NVIC_Init(&NVIC_InitStructure);
   
    USART_ITConfig(UART5,USART_IT_RXNE,ENABLE);
    USART_Cmd(UART5,ENABLE);

}

void UART5_IRQHandler(void)
{

      rec_num=0;
      while(USART_GetITStatus(UART5,USART_IT_RXNE)==SET)
       {
           USART_ClearITPendingBit(UART5,USART_IT_RXNE);
           recdata[rec_num]=USART_ReceiveData(UART5);
           rec_num++;
       }
    USART_SendStr(UART5,recdata);
    GPIO_ToggleBits(GPIOG,GPIO_Pin_14);

}

void USART_SendStr(USART_TypeDef* USARTx,uint8_t *str)
{
    //USART_ITConfig(UART5,USART_IT_RXNE,DISABLE);
  GPIO_SetBits(GPIOB,GPIO_Pin_4);
    while(*str)
    {
        while((USART_GetFlagStatus(USARTx,USART_FLAG_TXE))!=SET);
        USART_SendData(USARTx,*str);
        str++;
    }
    while((USART_GetFlagStatus(USARTx,USART_FLAG_TC))!=SET);

    GPIO_ResetBits(GPIOB,GPIO_Pin_4);
    //USART_ITConfig(UART5,USART_IT_RXNE,ENABLE);
}


沙发
airwill| | 2014-4-13 07:30 | 只看该作者
不知道楼主的 DE RE 引脚是怎么处理的, RxD 引脚上有信号输入了吗?

使用特权

评论回复
板凳
mmuuss586| | 2014-4-13 09:39 | 只看该作者

UART通讯程序问题应该不大,不知道你485的发送、接收,软/硬件怎么控制的。

空闲的时候,将485置成接收状态

使用特权

评论回复
地板
wyjben|  楼主 | 2014-4-13 10:11 | 只看该作者
初始化时默认就是接收状态GPIO_ResetBits(GPIOB,GPIO_Pin_4);

使用特权

评论回复
5
mmuuss586| | 2014-4-13 13:17 | 只看该作者
wyjben 发表于 2014-4-13 10:11
初始化时默认就是接收状态GPIO_ResetBits(GPIOB,GPIO_Pin_4);

发送和接收的控制脚的图怎么连的?

使用特权

评论回复
6
yuxhuitx| | 2014-4-13 18:35 | 只看该作者
示波器先确认RE数据出来没

使用特权

评论回复
7
Z赤心木QW| | 2014-4-13 21:40 | 只看该作者
RS485是半双工,不像RS232那样是全双工,所以要有收发控制

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

24

主题

99

帖子

1

粉丝