OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5038|回复: 1

STM32VET6 UART4初始化完毕后只能发送不能接受数据

[复制链接]

2

主题

8

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2020-12-23
在线时间
5 小时
发表于 2023-3-4 20:44:48 | 显示全部楼层 |阅读模式
5金钱
这是我的初始化代码。其中通过UART4和串口迪文屏通信(485通信),在调试过程中发现单片机向迪文屏发送数据正常 但是接收不到迪文屏发送过来的数据
串口的初始化:
void USART2_Screen_Config(void )
{  
    GPIO_InitTypeDef GPIO_InitStruct;
       USART_InitTypeDef USART_InitStruct;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE);//使能GPIOA,D时钟
    //RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能复用时钟,并不需要
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4,ENABLE);//使能USART2时钟
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;                 //PD7端口配置
     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;         
     GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
     GPIO_Init(GPIOA, &GPIO_InitStruct);
    GPIO_SetBits(GPIOA,GPIO_Pin_1);//进入发送模式
   
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOC,&GPIO_InitStruct);   
   
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_11;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOC,&GPIO_InitStruct);        
   
    USART_InitStruct.USART_BaudRate    = 115200;
    USART_InitStruct.USART_WordLength = USART_WordLength_8b;
    USART_InitStruct.USART_StopBits = USART_StopBits_1;
    USART_InitStruct.USART_Parity = USART_Parity_No;
    USART_InitStruct.USART_Mode = USART_Mode_Tx |USART_Mode_Rx;
    USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_Init(UART4,&USART_InitStruct);
    USART_Cmd(UART4,ENABLE);
    USART_ITConfig(UART4,USART_IT_RXNE,ENABLE);
    USART_ITConfig(UART4, USART_IT_ERR, ENABLE);
    // 如下语句解决第1个字节无法正确发送出去的问题   
    USART_ClearFlag(UART4, USART_FLAG_TC);     // 清标志
}
串口发送函数:
void USART2_Send_Screen_Cmd(uint8_t *table,uint8_t counter)
{
    u8 i = 0;
    GPIO_SetBits(GPIOA,GPIO_Pin_1); //进入发送模式。
    for(i = 0;i <= counter ;i++)
    {
        Uart2_send_buff[i] = table[i];   
    }   

    /***串口中断发送一定长度的数据***/
    Uart2_send_counter = counter+1;//一共多少个字节,好好计算下,这里要8+1.以后考虑一下。
    Uart2_send_pointer = Uart2_send_buff;
    USART_SendData(UART4, *Uart2_send_pointer++);
    // 这里的话如果发的命令是 0x83类型的 那迪文屏就会返回需要的数据(通过中断)
    // 这玩意通过中断发的?
    USART_ITConfig(UART4, USART_IT_TXE, ENABLE);
}
串口中断处理函数:
void UART4_IRQHandler(void)
{
    // 这里的话因为串口2的收发挺频繁的 所以USART_GetFlagStatus(USART2, USART_FLAG_ORE)不能完全解决问题
    // 要不然你调试会发现 卡死在内个ORE的判断里了
    if (USART_GetFlagStatus(UART4, USART_FLAG_ORE) != RESET)
    {
        LED1=0;
        USART_ReceiveData(UART4);
        USART_ClearFlag(UART4, USART_FLAG_ORE);
    }
    if (USART_GetFlagStatus(UART4, USART_FLAG_FE) != RESET)
    {
        USART_ReceiveData(UART4);
        USART_ClearFlag(UART4, USART_FLAG_FE);
    }     //
    if(USART_GetFlagStatus(UART4, USART_FLAG_PE) != RESET)         
    {   
        USART_ReceiveData(UART4);  
        USART_ClearFlag(UART4, USART_FLAG_PE);               
    }
    if(USART_GetITStatus(UART4,USART_IT_RXNE) != RESET)
    {
        USART_ClearITPendingBit(UART4,USART_IT_RXNE);
        Uart2_rev_buff[Uart2_rev_count++]= USART_ReceiveData(UART4);
        if(USART_ReceiveData(UART4) == 0xff)//偶尔出现0xff情况
        {
            Uart2_rev_count = 0;
        }
        
        if((Uart2_rev_buff[0] == 0x5A)&&(Uart2_rev_buff[1] == 0xA5))//接收到屏幕的指令
        {
            if(Uart2_rev_count >= 9)
            {
                //USART1_Send_Cmd(Uart2_rev_buff,8);
                Uart2_rev_count = 0;
                Uart2_rev_screen_comflag = 1;//屏幕接收完成
            }
        }
        // 收到的消息不对 直接就不看了
        if(Uart2_rev_count >=9)
        {
            Uart2_rev_count = 0;
        }
        //GPIO_WriteBit(GPIOD,GPIO_Pin_2,(BitAction)(1 - GPIO_ReadOutputDataBit(GPIOD,GPIO_Pin_2)));        
    }
    if(USART_GetITStatus(UART4, USART_IT_TXE) != RESET)
    {   
        Uart2_send_counter--;
        if(Uart2_send_counter>0)
        {
              USART_SendData(UART4, *Uart2_send_pointer++);
        }
        else
        {
            unsigned char i = 0 ;
            USART_ITConfig(UART4, USART_IT_TXE, DISABLE);
                    GPIO_ResetBits(GPIOA,GPIO_Pin_1); //进入接收模式
            for(i = 0;i <10; i++)
            {
                Uart2_send_buff[i] = 0;
            }
        }
      }
}



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2020-12-23
在线时间
5 小时
 楼主| 发表于 2023-3-4 21:00:11 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 15:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表