串口+DMA 数据收发编程实践

更多交流欢迎关注作者抖音号:81849645041

目标

        了解DMA 的工作原理,通过配置 STM32F407 芯片的DMA,实现串口+ DMA数据收发。

原理

        基于USART的数据通讯中采用中断方式可以在接收到信息或需要发送数据时产生中断,在中断服务程序中完成数据的接收与发送,但是中断方式的CPU使用率要高。在简单的系统中,使用中断方式确实是一种好方法。但是在复杂的系统中,处理器需要处理串口通信,多个传感器数据的采集及处理,牵扯到多个中断的优先级分配问题。为了保证数据发送与接收的可靠性,需要把USART的中断优先级设计较高,但是系统可能还有其他的需要更高优先级的中断,必须保证其定时的准确,这样就有可能造成串行通讯的中断不能及时响应,从而造成数据丢失。 为了保证串行通讯的数据及时可靠的接收,同时兼顾其它任务不受影响,采用了基于DMA和中断方式相结合的USART串行通信方式。

        DMA,全称:Direct  Memory  Access,即直接存储器访问。DMA传输将数据从一个地址空间复制到另一个地址空间。当CPU初始化这个动作,传输动作本身是由DMA控制器来实现和完成的。DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场过程,通过硬件为RAM和IO设备开辟一条直接传输数据的通道,使得CPU的效率大大提高。DMA最主要的作用是为CPU减小负担。

        STM32F4xx 系列的 DMA功能齐全,工作模式众多,适合不同编程环境要求。STM32F4xx 系列的 DMA 支持外设到存储器传输、存储器到外设传输和存储器到存储器传输三种传输模式。这里的外设一般指外设的数据寄存器,比如 ADC、SPI、I2C、DCMI等等外设的数据寄存器,存储器一般是指片内 SRAM、外部存储器、片内 Flash 等等。

        外设到存储器传输就是把外设数据寄存器内容转移到指定的内存空间。比如进行 ADC采集时我们可以利用 DMA 传输把 AD 转换数据转移到我们定义的存储区中,这样对于多通道采集、采样频率高、连续输出数据的 AD采集是非常高效的处理方法。

        存储区到外设传输就是把特定存储区内容转移至外设的数据寄存器中,这种多用于外设的发送通信。

        存储器到存储器传输就是把一个指定的存储区内容拷贝到另一个存储区空间。功能类似于 C语言内存拷贝函数 memcpy,利用 DMA传输可以达到更高的传输效率,特别是DMA传输是不占用 CPU的,可以节省很多 CPU资源。

        STM32F4xx 系列的 DMA可以实现外设寄存器与存储器之间或者存储器与存储器之间传输三种模式,这要得益于 DMA 控制器是采样 AHB主总线的,可以控制 AHB总线矩阵来启动 AHB事务DMA控制框图如下所示:

串口+DMA 数据收发编程实践_第1张图片

 

  • 外设通道选择

        STM32F4xx 系列资源丰富,具有两个 DMA 控制器,同时外设繁多,为实现正常传输,DMA需要通道选择控制。每个 DMA控制器具有 8个数据流,每个数据流对应 8个外设请求。在实现 DMA 传输之前,DMA控制器会通过 DMA数据流 x 配置寄存器 DMA_SxCR(x为 0~7,对应 8

你可能感兴趣的:(嵌入式基础-STM32,单片机,stm32,物联网)