住房和城乡建设统计网站,十堰微网站建设费用,百度指数分析工具,男女直接做那个的视频网站1. 简介
DMA(Direct Memory Access)—直接存储器存取#xff0c;是单片机的一个外设#xff0c;它的主要功能是用来搬数据#xff0c;但是不需要占用 CPU#xff0c;即在传输数据的时候#xff0c; CPU 可以干其他的事情#xff0c;好像是多线程一样。数据传输支持从外设…1. 简介
DMA(Direct Memory Access)—直接存储器存取是单片机的一个外设它的主要功能是用来搬数据但是不需要占用 CPU即在传输数据的时候 CPU 可以干其他的事情好像是多线程一样。数据传输支持从外设到存储器或者存储器到存储器这里的存储器可以是 SRAM 或者是 FLASH。DMA 控制器包含了 DMA1 和 DMA2其中 DMA1 有 7 个通道 DMA2有5个通道这里的通道可以理解为传输数据的一种管道。要注意的是 DMA2 只存在于大容量的单片机中。
2. DMA功能框图
DMA 控制器独立于内核属于一个单独的外设结构比较简单从编程的角度来看我们只需掌握功能框图中的三部分内容即可具体见图 DMA 框图 DMA 控制器的框图。 如果外设要想通过 DMA 来传输数据必须先给 DMA 控制器发送 DMA 请求 DMA 收到请求信号之后控制器会给外设一个应答信号当外设应答后且 DMA 控制器收到应答信号之后就会启动 DMA 的传输直到传输完毕。 DMA 有 DMA1 和 DMA2 两个控制器 DMA1 有 7 个通道 DMA2 有 5 个通道不同的 DMA 控制器的通道对应着不同的外设请求这决定了我们在软件编程上该怎么设置具体见 DMA 请求映像表 3. DMA通道
DMA 具有 12 个独立可编程的通道其中 DMA1 有 7 个通道 DMA2 有 5 个通道每个通道对应不同的外设的 DMA 请求。虽然每个通道可以接收多个外设的请求但是同一时间只能接收一个不能同时接收多个。
4. DMA传输的数据从哪里来到哪里去
我们知道 DMA 传输数据的方向有三个从外设到存储器从存储器到外设从存储器到存储器。具体的方向 DMA_CCR 位 4 DIR 配置 0 表示从外设到存储器 1 表示从存储器到外设。这里面涉及到的外设地址由 DMA_CPAR 配置存储器地址由 DMA_CMAR 配置。
外设到存储器P2M
当我们使用从外设到存储器传输时以 ADC 采集为例。 DMA 外设寄存器的地址对应的就是 ADC数据寄存器的地址 DMA 存储器的地址就是我们自定义的变量用来接收存储 AD 采集的数据的地址。方向我们设置外设为源地址。
存储器到外设M2P
当我们使用从存储器到外设传输时以串口向电脑端发送数据为例。 DMA 外设寄存器的地址对应的就是串口数据寄存器的地址 DMA 存储器的地址就是我们自定义的变量相当于一个缓冲区用来存储通过串口发送到电脑的数据的地址。方向我们设置外设为目标地址。
存储器到存储器M2M
当我们使用从存储器到存储器传输时以内部 FLASH 向内部 SRAM 复制数据为例。 DMA 外设寄存器的地址对应的就是内部 FLASH我们这里把内部 FALSH 当作一个外设来看的地址 DMA存储器的地址就是我们自定义的变量相当于一个缓冲区用来存储来自内部 FLASH 的数据的地址。方向我们设置外设即内部 FLASH为源地址。跟上面两个不一样的是这里需要把DMA_CCR 位 14 MEM2MEM存储器到存储器模式配置为 1启动 M2M 模式。
5. 什么时候传输完成 数据什么时候传输完成我们可以通过查询标志位或者通过中断的方式来鉴别。每个 DMA 通道在 DMA 传输过半、传输完成和传输错误时都会有相应的标志位如果使能了该类型的中断后则会产生中断。有关各个标志位的详细描述请参考 DMA 中断状态寄存器 DMA_ISR 的详细描述。 传输完成还分两种模式是一次传输还是循环传输一次传输很好理解即是传输一次之后就停止要想再传输的话必须关断 DMA 使能后再重新配置后才能继续传输。循环传输则是一次传输完成之后又恢复第一次传输时的配置循环传输不断的重复。具体的由DMA_CCRx 寄存器的CIRC循环模式位控制
6. DMA初始化结构体
typedef struct
{uint32_t DMA_PeripheralBaseAddr; /*! Specifies the peripheral base address for DMAy Channelx. */uint32_t DMA_MemoryBaseAddr; /*! Specifies the memory base address for DMAy Channelx. */uint32_t DMA_DIR; /*! Specifies if the peripheral is the source or destination.This parameter can be a value of ref DMA_data_transfer_direction */uint32_t DMA_BufferSize; /*! Specifies the buffer size, in data unit, of the specified Channel. The data unit is equal to the configuration set in DMA_PeripheralDataSizeor DMA_MemoryDataSize members depending in the transfer direction. */uint32_t DMA_PeripheralInc; /*! Specifies whether the Peripheral address register is incremented or not.This parameter can be a value of ref DMA_peripheral_incremented_mode */uint32_t DMA_MemoryInc; /*! Specifies whether the memory address register is incremented or not.This parameter can be a value of ref DMA_memory_incremented_mode */uint32_t DMA_PeripheralDataSize; /*! Specifies the Peripheral data width.This parameter can be a value of ref DMA_peripheral_data_size */uint32_t DMA_MemoryDataSize; /*! Specifies the Memory data width.This parameter can be a value of ref DMA_memory_data_size */uint32_t DMA_Mode; /*! Specifies the operation mode of the DMAy Channelx.This parameter can be a value of ref DMA_circular_normal_mode.note: The circular buffer mode cannot be used if the memory-to-memorydata transfer is configured on the selected Channel */uint32_t DMA_Priority; /*! Specifies the software priority for the DMAy Channelx.This parameter can be a value of ref DMA_priority_level */uint32_t DMA_M2M; /*! Specifies if the DMAy Channelx will be used in memory-to-memory transfer.This parameter can be a value of ref DMA_memory_to_memory */
}DMA_InitTypeDef;DMA_PeripheralBaseAddr外设地址设定 DMA_CPAR 寄存器的值一般设置为外设的数据寄存器地址如果是存储器到存储器模式则设置为其中一个存储器地址。 DMA_PeripheralBaseAddr外设地址设定 DMA_CPAR 寄存器的值一般设置为外设的数据寄存器地址如果是存储器到存储器模式则设置为其中一个存储器地址。 DMA_Memory0BaseAddr存储器地址设定 DMA_CMAR 寄存器值一般设置为我们自定义存储区的首地址。 DMA_DIR传输方向选择可选外设到存储器、存储器到外设。它设定 DMA_CCR 寄存器的DIR[1:0] 位的值。这里并没有存储器到存储器的方向选择当使用存储器到存储器时只需要把其中一个存储器当作外设使用即可。 DMA_BufferSize设定待传输数据数目初始化设定 DMA_CNDTR 寄存器的值。 DMA_PeripheralInc如果配置为 DMA_PeripheralInc_Enable使能外设地址自动递增功能它设定 DMA_CCR 寄存器的 PINC 位的值一般外设都是只有一个数据寄存器所以一般不会使能该位。 DMA_MemoryInc如果配置为 DMA_MemoryInc_Enable使能存储器地址自动递增功能它设定 DMA_CCR 寄存器的 MINC 位的值我们自定义的存储区一般都是存放多个数据的所以要使能存储器地址自动递增功能。 DMA_PeripheralDataSize外设数据宽度可选字节 (8 位)、半字 (16 位) 和字 (32 位)它设定 DMA_CCR 寄存器的 PSIZE[1:0] 位的值。 DMA_MemoryDataSize存储器数据宽度可选字节 (8 位)、半字 (16 位) 和字 (32 位)它设定DMA_CCR 寄存器的 MSIZE[1:0] 位的值。当外设和存储器之间传数据时两边的数据宽度应该设置为一致大小。 DMA_Mode DMA 传输模式选择可选一次传输或者循环传输它设定 DMA_CCR 寄存器的CIRC 位的值。例程我们的 ADC 采集是持续循环进行的所以使用循环传输模式。 DMA_Priority软件设置通道的优先级有 4 个可选优先级分别为非常高、高、中和低它设定 DMA_CCR 寄存器的 PL[1:0] 位的值。 DMA 通道优先级只有在多个 DMA 通道同时使用时才有意义如果是单个通道优先级可以随便设置。 DMA_M2M存储器到存储器模式使用存储器到存储器时用到设定 DMA_CCR 的位 14MEN2MEN 即可启动存储器到存储器模式。