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

查看: 708|回复: 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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版