STM32之DMA彻底研究.doc

  1. 1、本文档共12页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
STM32之DMA彻底研究

stm32之DMA彻底研究? 在做实验之前,首先必须明白什么是DMA,DMA的作用又体现在哪里。 DMA,即直接内存存储,在一些数据的传输中,采用DMA方式,从而将CPU解放出来。让CPU有足够的时间处理其他的事情。 stm32使用DMA的相关操作: 1、DMA的配置 要配置的有DMA传输通道选择,传输的成员和方向、普通模式还是循环模式等等。 void DMA_Configuration(void) { ??? DMA_InitTypeDef DMA_InitStructure; ????//DMA设置: ??? //设置DMA源:内存地址串口数据寄存器地址 ??? //方向:内存--外设 ??? //每次传输位:8bit ??? //传输大小DMA_BufferSize=SENDBUFF_SIZE ??? //地址自增模式:外设地址不增,内存地址自增1 ??? //DMA模式:一次传输,非循环 ??? //优先级:中 ??? DMA_DeInit(DMA1_Channel4);//串口1的DMA传输通道是通道4 ??? DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base; ??? DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff; ??? DMA_InitStructure.DMA_DIR =?DMA_DIR_PeripheralDST; 外设作为DMA的目的端 ??? DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE;//传输大小 ??? DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;//外设地址不增加 ??? DMA_InitStructure.DMA_MemoryInc =?DMA_MemoryInc_Enable;//内存地址自增1 ??? DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; ??? DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; ??? DMA_InitStructure.DMA_Mode =?DMA_Mode_Circular; ??? //DMA_Mode_Normal(只传送一次),?DMA_Mode_Circular (不停地传送) ??? DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//(DMA传送优先级为中等) ??? DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; ??? DMA_Init(DMA1_Channel4, DMA_InitStructure); } 注: 1、传输通道:通过查表,串口1的发送对应的是DMA的通道4,所以此处选择通道4. 2、DMA传输方式: (1) DMA_Mode_Normal,正常模式,当一次DMA数据传输完后,停止DMA传送,对于上例而言,就是DMA_PeripheralDataSize_Byte个字节的传送完成后,就停止传送。 (2)?DMA_Mode_Circular 循环模式,当传输完一次后,重新接着传送,永不停息。 2、外设的DMA方式设置 将串口1设置成DMA模式: USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE); 3、待传输数据的定义和初始化 #define SENDBUFF_SIZE?? 10240 vu8 SendBuff[SENDBUFF_SIZE]; ??? for(i=0;iSENDBUFF_SIZE;i++) ??? { ??????? SendBuff[i] = i%10+0; ??? } 4、开始DMA传输(使能对应的DMA通道) DMA_Cmd(DMA1_Channel4, ENABLE); 5、DMA传输的完成 ?while(DMA_GetFlagStatus(DMA1_FLAG_TC4) == RESET) ?{ ?????? LED_1_REV;????? //LED翻转 ???????Delay();??????? //浪费时间 ?} 当传输完成后,就会跳出上面的死循环。 /****************************************************************************** * 本文件实现串口发送功

文档评论(0)

kakaxi + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档