DMA:mem-to-mem mem-to-device device-to-mem

2019-04-15 17:23发布

    换了工作,算是步入汽车行业了。汽车不同于消费类电子,使用的是"高性能单片机",尽管物理通讯方式为:can lin spi 这些相对与消费类电子比较慢速的外设,但是AutoSar规范定义的比较详细。    刚开始接触"高性能单片机"。不知道怎么定义这样的芯片,有着200MHz的主频(甚至是多核)但是没有MMU。作为单片机类型的,所以称之为:高性能单片机。(不知道怎么描述,这些芯片多数用于汽车行业)
    既然做底层驱动免不了和DMA打交道。之前有意识无意识的也使用DMA。但是没有真的体会到一个DMA的属性    Mem to Mem     Device to Mem    Mem to Device  同样作为DMA搬移数据,搬移的过程还要考虑一个问题。数据不光是从哪里来,到哪里去,而且还要考虑数据从什么设备来,到什么设备去的问题。
内存到内存这不用多说了,配置好DMA的目的地址,源地址,搬移大小,然后使能。但是到了内存和设备交互的时候,DMA为什还要再定义这两种属性呢?原因在于到底是谁触发了DMA的搬移动作。从内存搬移数据到外设的应用中,外设如何触发DMA。应为DMA的触发源可以和设备的缓存以及外设收发数据的状态决定DMA到底需不需要搬移数据。这样的应用中完全不要CPU的干预,CPU只需要DMA的搬运结束后的收尾工作。比如:一个硬件的接受缓存状态为不满,满。芯片内部会有DMA的触发源选择,把这个硬件的缓存和DMA的触发源“链接”起来。所谓链接指的是寄存器中可以具体把触发源设置为“Enable”的状态。同时也可以通过寄存器把触发源的ID写如DMA的控制寄存器。又或者是DMA的触发源固定为某个硬件类型的触发源。比如:DMA channel 0         UART 1 DMA channel 1         UART 2DMA channel 2         ADC外设缓存为空或者满的时候出自动触发DMA进行搬移,而不是软件触发。
文章中出现错误,欢迎指正。谢谢