OpenEdv-开源电子网

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

STM32 串口冲突(串口1和串口3)

[复制链接]

1

主题

3

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2023-11-28
在线时间
2 小时
发表于 2023-12-17 15:14:27 | 显示全部楼层 |阅读模式
1金钱
串口1、串口3分别接两个设备,也配置了中断优先级,秒定时中断来采集两个设备的数据。即每秒向两个串口分别发送一次数据采集任务。
故障现象:单独接一个设备,通讯数据正常,两个设备同时接上时,串口3接收的数据不完整。附部分代码,求指导!
void USART1_Init(void)                                 
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//定义MCU中断类型为16级抢断式

    GPIO_InitStructure.GPIO_Pin = USART1_TX_PIN;        //串口发送引脚配置         
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(USART1_TX_PORT, &GPIO_InitStructure);
         
    GPIO_InitStructure.GPIO_Pin = USART1_RX_PIN;        //串口接收引脚配置
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(USART1_RX_PORT, &GPIO_InitStructure);

    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;     
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 5;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    USART_StructInit(&USART_InitStructure);             //初始化USART1
    USART_InitStructure.USART_BaudRate = 9600;                //配置波特率
    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_Tx | USART_Mode_Rx ;
    USART_Init(USART1, &USART_InitStructure);

//    GPIO_InitStructure.GPIO_Pin = USART1_RS485_PIN;     //USART1_RS485
//    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
//    GPIO_Init(USART1_RS485_PORT, &GPIO_InitStructure);   
//    USART1_RS485_DISABLE;                               //USART1_RS485发送失能

    USART_ITConfig(USART1, USART_IT_TC, ENABLE);        
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);            
    USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);        
    USART_Cmd(USART1, ENABLE);                          
}

void USART3_Init(void)                                 
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    GPIO_InitStructure.GPIO_Pin = USART3_TX_PIN;        //TX发送引脚配置
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(USART3_TX_PORT, &GPIO_InitStructure);
         
    GPIO_InitStructure.GPIO_Pin = USART3_RX_PIN;        //RX接收引脚配置
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(USART3_RX_PORT, &GPIO_InitStructure);

    NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;     
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);   

    USART_InitStructure.USART_BaudRate = 9600;          //设置波特率
    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(USART3, &USART_InitStructure);   

    GPIO_InitStructure.GPIO_Pin = USART3_RS485_PIN;     //USART3_RS485
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(USART3_RS485_PORT, &GPIO_InitStructure);
    USART3_RS485_DISABLE;                               //USART3_RS485失能

    USART_ITConfig(USART3, USART_IT_TC, ENABLE);        
    USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);      
    USART_ITConfig(USART3, USART_IT_IDLE, ENABLE);        
    USART_Cmd(USART3, ENABLE);                          
}   

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

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2023-11-28
在线时间
2 小时
 楼主| 发表于 2023-12-17 15:20:12 | 显示全部楼层
问题附件补充:串口1、串口3中断接收处理函数。
void USART1_IRQHandler(void)
{
    INT8U ucRev;

    if(USART_GetITStatus(USART1, USART_IT_TC) != RESET)
    {
        if((USART1_TxBuf.Head<USART1_TxBuf.Wlen)&&(USART1_TxBuf.Head < (USART1_BUF_SIZE-1)))
        {
            USART1->DR = USART1_TxBuf.ucQueue[USART1_TxBuf.Head++];
        }
        else
        {
            USART1_RS485_DISABLE;                             //释放485总线
            USART1_TxBuf.Head = 0;
            USART1_TxBuf.Wlen = 0;
            USART1_TxBuf.TX_flag = 1;                           //置位发送完毕标志位
            memset(USART1_TxBuf.ucQueue, 0, USART1_BUF_SIZE);
        }
        USART_ClearITPendingBit(USART1, USART_IT_TC);
    }
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
    {
        ucRev = USART1->DR;
        USART1_RxBuf.Wait_timer = 0;
        if((USART1_RxBuf.Wlen < (USART1_BUF_SIZE-1))&&(USART1_RxBuf.RX_flag==0))   //刚开始接收数据
        {
            USART1_RxBuf.ucQueue[USART1_RxBuf.Wlen] = ucRev;              
            if(USART1_RxBuf.Wlen < (USART1_BUF_SIZE-1))USART1_RxBuf.Wlen++;     //对接收指针大小进行限制,防止程序跑飞
        }
        else if(USART1_RxBuf.RX_flag==1)//数据接收过程
        {
            //数据接收后,主程序未处理上次接收的数据。新的数据不予处理
            //需要定时清除串口缓冲区数据。
        }
        USART_ClearFlag(USART1, USART_IT_RXNE);
    }
    if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)
    {
        USART1->DR;  
        USART1_RxBuf.RX_flag = 1;
        USART_ClearFlag(USART1, USART_IT_IDLE);
    }
}
void USART3_IRQHandler(void)
{
    INT8U ucRev;

    if(USART_GetITStatus(USART3, USART_IT_TC) != RESET)
    {
        if(USART3_TxBuf.Head > 0)
        {
            if((USART3_TxBuf.Head<USART3_TxBuf.Wlen)&&(USART3_TxBuf.Head < (USART3_BUF_SIZE-1)))
            {       
                USART3->DR = USART3_TxBuf.ucQueue[USART3_TxBuf.Head++];
            }
             else
            {
                //Usart3_Send_Allow = 1;                      //串口3发送允许
            
                USART3_RS485_DISABLE;                         //释放485总线
                USART3_TxBuf.Head = 0;
                USART3_TxBuf.Wlen = 0;
                USART3_TxBuf.TX_flag = 1;                       //置位发送完毕标志位
                memset(USART3_TxBuf.ucQueue, 0, USART3_BUF_SIZE);
            }
        }
        USART_ClearITPendingBit(USART3, USART_IT_TC);
    }
    //===============================================================

    if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
    {
        ucRev = USART3->DR;
        USART3_RxBuf.Wait_timer = 0;
        if((USART3_RxBuf.Wlen < (USART3_BUF_SIZE-1))&&(USART3_RxBuf.RX_flag==0))   //刚开始接收数据
        {
            USART3_RxBuf.ucQueue[USART3_RxBuf.Wlen] = ucRev;              
            if(USART3_RxBuf.Wlen <(USART3_BUF_SIZE-1))USART3_RxBuf.Wlen++;
        }
        else if((USART3_RxBuf.Wlen > 0)&&(USART3_RxBuf.RX_flag==1))//数据接收过程
        {
            //数据接收后,主程序未处理上次接收的数据。新的数据不予处理
            //需要定时清除串口缓冲区数据。
        }                     
        USART_ClearFlag(USART3, USART_IT_RXNE);        
    }
    //===============================================================
    if(USART_GetITStatus(USART3, USART_IT_IDLE) != RESET)
    {
        USART3->DR;  
        USART3_RxBuf.RX_flag = 1;  
        USART_ClearFlag(USART3, USART_IT_IDLE);
    }
}
回复

使用道具 举报

54

主题

347

帖子

0

精华

高级会员

Rank: 4

积分
950
金钱
950
注册时间
2022-4-20
在线时间
357 小时
发表于 2023-12-18 10:03:10 | 显示全部楼层
两个都有非空中断,同时接受数据的时候在打架呢,打输的掉数据
又菜又爱指点
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-25 10:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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