首页 > 编程知识 正文

dma控制器和设备控制器关系,dma控制器和io控制器

时间:2023-05-03 12:42:35 阅读:194116 作者:1756

DMA控制器 DMA 简介

直接存储器访问 (DMA) 用于在外设与存储器之间以及存储器与存储器之间提供高速数据传
输。可以在无需任何 CPU 操作的情况下通过 DMA 快速移动数据。这样节省的 CPU 资源可
供其它操作使用。
DMA 控制器基于复杂的总线矩阵架构,将功能强大的双 AHB 主总线架构与独立的 FIFO 结
合在一起,优化了系统带宽。
两个 DMA 控制器总共有 16 个数据流(每个控制器 8 个),每一个 DMA 控制器都用于管理
一个或多个外设的存储器访问请求。每个数据流总共可以有多达 8 个通道(或称请求)。每
个通道都有一个仲裁器,用于处理 DMA 请求间的优先级。

DMA_DeInit(DMA1_Stream1); /* 恢复默认配置 */DMA_InitStruct.DMA_Channel = DMA_Channel_4;/* 设置DMA通道 */DMA_InitStruct.DMA_PeripheralBaseAddr =(u32)(&USART3->DR);/* 外设基地址 */DMA_InitStruct.DMA_Memory0BaseAddr = (u32)USART3_RX_BUF;/* 存储器基地址 */DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralToMemory;/* DMA数据传输方向*/DMA_InitStruct.DMA_BufferSize = USART3_LEN;/* buffer数组大小 */DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;/* 外设地址是否增加 */DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;/* 存储器地址是否增加 */DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;/* 存储器数据大小 */DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;/* 存储器数据大小 */DMA_InitStruct.DMA_Mode = DMA_Mode_Normal;DMA_InitStruct.DMA_Mode = DMA_Mode_Circular;/* 初始化DMA配置时,如果正常模式,传输结束后,除非软件重新对数据流编程并重新使能数据流,否则DMA就会停止传输,并且不会再响应任何DMA请求。*/DMA_InitStruct.DMA_Priority = DMA_Priority_Medium;/* 存储器数据大小 */DMA_InitStruct.DMA_FIFOMode = DMA_FIFOMode_Disable;/* FIFO模式 */DMA_InitStruct.DMA_FIFOThreshold = DMA_FIFOThreshold_Full; /* */DMA_InitStruct.DMA_MemoryBurst = DMA_MemoryBurst_Single;/* 存储器突发传输 */DMA_InitStruct.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;/* 外设突发传输 */DMA_Init(DMA1_Stream1, &DMA_InitStruct);/* 初始化DMA */DMA_Cmd(DMA1_Stream1, ENABLE); /* 使能DMA */ DMA模式选择注意事项

注意: 仅在外设到存储器模式下,传输的完成取决于 FIFO 中要传输到存储器的剩余数据。这种情
况不适用于存储器到外设模式。
如果是在非循环模式下配置数据流,传输结束后(即要传输的数据数目达到零),除非软件
重新对数据流编程并重新使能数据流(通过将 DMA_SxCR 寄存器中的 EN 位置 1),否则
DMA 即会停止传输(通过硬件将 DMA_SxCR 寄存器中的 EN 位清零)并且不再响应任何
DMA 请求。

需要使用此函数将DMA_SxCR寄存器EN位置1void DMA_Cmd(DMA_Stream_TypeDef* DMAy_Streamx, FunctionalState NewState)

位 0 EN:数据流使能/读作低电平时数据流就绪标志 (Stream enable / flag stream ready when
read low)
此位由软件置 1 和清零。
0:禁止数据流
1:使能数据流
以下情况下,此位可由硬件清零:
— DMA 传输结束时(准备好配置数据流)
— AHB 主总线出现传输错误时
— 存储器 AHB 端口上的 FIFO 阈值与突发大小不兼容时
此位读作 0 时,软件可以对配置和 FIFO 位寄存器编程。EN 位读作 1 时,禁止向这些寄存
器执行写操作。

注意:将 EN 位置“1”以启动新传输之前,DMA_LISR 或 DMA_HISR 寄存器中与数据流相
对应的事件标志必须清零。

需要使用此函数将DMA_LISR和DMA_HISR寄存器事件标志清零void DMA_ClearITPendingBit(DMA_Stream_TypeDef* DMAy_Streamx, uint32_t DMA_IT)

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。