开启空闲中断并开启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:还未解决:
上电第一次点击发送下位机不会回应,点击第二次才开始回应后面点击都正常?