STM32 HAL库中串口空闲中断+DMA实验

开启空闲中断并开启dma 无IT接收
添加空闲中断处理函数与实体
编写中断处理实体
 
此时我们定义的数组长度是50
发送超过10个以上的字符将会被截断

设置DMA发送:
发送好几次4个字节每次只接受的到一个:
调试发现memset不能在DMA传送之后,因为DMA被cpu开启后就会自己传送,cpu接着执行下一条语句memeset会删除DMA需要发送的缓存区.
所以需要在传送完成之后在执行memset,需要配合DMA传送完成中断来做
其实配置发现DMA在usart配置中是默认开启的。
所以:
如果传输要启动中断,需要调用:HAL_UART_Transmit_IT,以中断方式启动DMA才会传输完成是启动回调函数
在Transmit_DMA函数中:
传送完成将调用框中的DMA传送完成函数:此函数又将调用:
而一般USE_HAL_UART_REGISTER_CALLBACKS=0,所以会调用弱函数
串口注册的回调函数,所以,最终传输完成会调用上图中的函数
我们实现此函数:传送完成在清除数据:
数据正常

用Queue实现指针传送:queue传送有数据的结构体的地址。
 
指针4字节也就是32位
创建结构体:
定义两个结构体也就是两个缓冲区,一个接收则另一个发送
重新定义空闲中断处理函数:和清零回调函数,pre_stru表示当前是0号还是1号结构体正在被接收DMA使用
设置改任务的优先级最高,当有队列消息是立马通过发送过来的结构体地址回发出去

 

有个小bug:还未解决:
上电第一次点击发送下位机不会回应,点击第二次才开始回应后面点击都正常?
posted @ 2020-12-02 18:31  cczyd  阅读(1547)  评论(0编辑  收藏  举报