- 1、本文档共12页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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?? 10240vu8 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)