DMA控制器

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位置1
void 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
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Paper_Love

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值