文章内容偏向HAL库的移植和使用,以个人观点及了解为主,若与事实不符,则以www.st.com、www.stmcu.org.cn等平台为准。
历程代码:https://gitee.com/cai_xl/MyWayToLearnSTM32H7
中断方式使得CPU不用一直等待TXE和TC标志位,但每次有一个字节的数据写入TDR寄存器,都会触发一次中断(TXE或者TC)。像STM32L0这样主频很低(32MHz)的型号,通过HAL库用中断方式在较高波特率条件下发送大量数据,可能会让CPU在发送数据时卡死在中断中。STM32H7系列的主频已经让这个问题不是那么明显了,但依然有更高效的方法——DMA方式。
DMA全称Direct Memory Access,意为直接内存访问(其他翻译可能不同,但都是一个意思),是一种可以不占用CPU的数据传输方式。要使用DMA的话,只需要告诉它,从哪里把数据传输到哪里,一共传输多少数据,DMA就可以开始工作。直到所有数据全部传输完成,DMA才会用中断通知CPU,上一次的DMA传输任务已经完成了。和中断方式相比,DMA并不会每次向串口传输一个字节(9bit数据位的话,是两个字节)就产生一次中断,所以CPU开销相当小。实际上,DMA在STM32和其他微控制器中,都得到了相当广泛的应用。对于STM32,DMA几乎可以涉及到所有外设,除串口之外,SPI、TIM、I2C等外设都可以使用DMA收发数据。DMA的功能十分强大,也就使得DMA相当的复杂,所以这篇文章不会细讲DMA,只编写一个使用DMA方式通过串口发送数据的历程。