你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 654|回复: 1

[STM32L476] 串口DMA发送和中断接收的问题?

[复制链接]

3

主题

5

回帖

0

蝴蝶豆

新手上路

最后登录
2020-7-10
发表于 2019-5-22 22:37:13 | 显示全部楼层 |阅读模式
我打算用串口控制EC20模块,今天调试串口的DMA发送和串口接收,
开发板通过CH340电脑相连,单独接收和发送数据没有问题,想连起来一起调试,
通过串口调试助手向开发板发送数据,通过串口中断接收到数据后,在通过串口的DMA功能发送出去,
程序一直会进入DMA的半传输完成功能中断,还会触发串口的接收中断,串口会不断的将最后收到的那个字节的数据发回电脑:
例如:发送"ABC"
开发板 会一直回复 “ABCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC.......”
回复

使用道具 举报

3

主题

5

回帖

0

蝴蝶豆

新手上路

最后登录
2020-7-10
 楼主| 发表于 2019-5-23 09:19:57 | 显示全部楼层
这块是中断的处理代码

void USART3_IRQHandler()       //串口3中断接收数据
{
        RxTimeout =10;
        HAL_NVIC_ClearPendingIRQ(USART3_IRQn);    // 清除中断标志位     解决使用DMA发送后,一直进入接收中断的问题
       
        HAL_UART_IRQHandler(&Uart3Handle);     //中断处理函数   清除中断标注位    会间接的调用接收回调函数
    if (RxCount< Rx_MAXSIZE)             //接收缓冲区没满  还可以接收数据
        {
                RxBuf[RxCount++]=RxData;           //接收的数据放在接受缓冲区中
        }
        else
        {
                 USART3_RX_STA|=1<<15;                                //缓冲区已满 强制标记接收完成
               
                 ReceCount=RxCount;                //记录接收到的数据个数
                 RxCount=0;                         //接收数量清零
                 RxTimeout=0;                       //接收超时清零
        }
        HAL_UART_Receive_IT(&Uart3Handle, (uint8_t *)(&RxData), 1);     //** 接收完成后会关闭中断所以要循环调用次函数 接收一个字节进入一次接收完成回调函数

}

void DMA1_Channel2_IRQHandler(void)
{
        HAL_DMA_IRQHandler(Uart3Handle.hdmatx);
}

在定时器里进行超时的接收完成
__weak void HAL_IncTick(void)
{
  uwTick++;
       
        if (RxTimeout>0)                                                    //2019-05-20  zhang
        {
                RxTimeout--;
                if(RxTimeout==0)
                {
                        USART3_RX_STA|=1<<15;                          //接收超时 标记接收完成

                        ReceCount =RxCount;              //记录接收到的数据个数
                        RxCount=0;                         //接收数量清零
                    RxTimeout=0;                       //接收超时清零
                }                       
        }                                               
}

在主函数里面判断 接收标志位,将收到的数据发送回来

          if(USART3_RX_STA&0X8000)                //接收到数据
    {
                HAL_sta=HAL_UART_Transmit_DMA(&Uart3Handle,RxBuf, ReceCount);
               
                while(TX_END !=1)  {} //等待放松完成
                       
                //HAL_UART_Transmit(&UartHandle,RxBuf, ReceCount,2000);
                ReceCount=0;
                USART3_RX_STA=0;
    }
回复 支持 反对

使用道具 举报

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版