stm32f4 DMA调试记录

在项目中使用了串口与外设进行通信,发送指令后,接收外设返回的消息。
串口使用DMA进行数据接收,由于返回的数据的长度不一致,因此使用串口的IDLE中断,读取DMA中的数据。
在每次中断时,需要先停止DMA,读取串口收到的数据,然后重新设置DMA缓冲区的长度,最后在重启DMA。

调试时,出现了一个问题,每次复位后,只有第一次运行能从DMA中接收到数据,当重启DMA后,数据接收不到。 主要调试思路记录如下:
1 使用USB转TTL线以及串口调试助手,观察外设返回的消息,经证实,外设确实返回了数据;
2 在DMA处设置断点,查看DMA的状态。经过多次实验后,发现停止DMA后,再重启DMA并没有使DMA使能。通过查看外设寄存器状态,下面的语句彬没有得到执行
DMA_Cmd(IM3331_USART_DMA_STREAM, ENABLE);
3 查看stm32f4参考手册,在DMA数据流配置寄存器里面发现问题。
在这里插入图片描述
EN位不仅具有置位功能,还可以作为状态位反应当前DMA的状态。注意到下面的注意字样,程序reset后,进行了第一次DMA传输,DMA_LISR不再是零状态,具体是DMA_LISR中的TCIF标志位为1,但是DMA传输并没有结(传输数据量没有达到需求的数量)
继续查阅参考手册相关内容,
在这里插入图片描述
在关于DMA传输完成条件时,第二条即时当前程序的情况,即在完成传输之前,停止了DMA传输数据流。
到此为止,只需要在DMA再次使能之前清除掉TCIF中的标志位,便可以重新置位DMA。
好了,问题解决了, 看来还是用的少,还要多做点东西呀。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值