注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

小哲

从今以后,你会是所有幸福的理由!

 
 
 

日志

 
 

STM32 DMA理解(二)  

2012-01-10 16:20:46|  分类: ARM7-STM32 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

DMA 首先,初始化,要了解触发源,也可通过软件编程设置具体的时间,具体条件来触发DMA数据传输,DMA的触发源是事件(1)、首先开启时钟

    RCC_APBPeriphClockCmd(RCC_APBPeriph_DMA1,ENABLE);//开启DMA时钟

结构体(DMA_InitTypeDef)说明

  PeripheralBaseAddr:外设地址 CPAR

  MemoryBaseAddr: 存储器地址 CMAR

  DIR:        传输方向(从外设读/从存储器读)

  BufferSize:     传输数量

  PeripheralInc:    外设地址增量模式(传完一个数后地址是否+1

  MemoryInc:     存储器地址增量模式

  PeripheralDataSize: 外设数据宽度(Byte / Half Word / Word

  MemoryDataSize:  存储器数据宽度

  Mode:        循环/正常

  Priority:       优先级

  M2M:        存储器到存储器模式

 

DMA_DeInit(DMA_Channel1);

默认初始化配置

DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base;

DMA_PeripheralBaseAddr是给DMA一个起始地址,在程序中如果这个是内存模式,这给的是一个定义的一个数组的指针,如buffer;其中USART1_DR_Base是自己定义的一个地址,这个地址的定义就是USART1_DR这个寄存器的地址。

需要注意的是,这个地址的定义,是由两部分组成的,基准地址+偏移地址,在此过程中,基准地址=0x4001 3800 而偏移地址=0x04,所以最终地址为:0x4001 3804

DMA_InitStructure.DMA_MemoryBaseAddr = (u32)Send_Buffer;

这个同样也是一个地址变量,这个地址的存放要发送的数据的

DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;

设置DMA的传输方向,这个可以是双向传输,也可以是单向传输,在库文件中有这样的定义;指定该外设是DMA的源还是目的地
    DMA_DIR_PeripheralDST
:该外设是DMA的目的地(要接受的设备地址)
    DMA_DIR_PeripheralSRC
:该外设是DMA的源(及要传输的数据)

 

DMA_InitStructure.DMA_BufferSize = Send_BufferSize;

这句话时设置DMA在传输时缓冲区的长度,一般需要给此缓冲区定义一个存储区,这个参数的单位有三种类型:ByteHalfWordWord,其中有:
    Byte
8
    HalfWord
16
    Word
32

DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

设置DMA的外设递增模式,如果是设置成SPI模式,则读取数据的时候会向下一个地址移位在这里因为我们的外设是USART,则这个外设的地址始终是USART1_DR_Base,不需要进行自加即递增模式。

DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

这句是设置DMA的内存递增模式,当需要访问多个内存参数时,需要使用这个

DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;

设置DMA在访问外设时操作的数据长度为Byte

DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;

设置DMA在访问内存时操作的数据长度为Byte

DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;

设置DMA模式,这里是普通模式,即传输完成后就关闭了DMA,还有循环模式,后面说明。

DMA_InitStructure.DMA_Priority = DMA_Priority_High;

设置DMA的优先级别:可以分为4级:VeryHighHigh,Medium,Low.

DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

设置DMA2个内存中的变量互相访问的

DMA_Init(DMA_Channel1,&DMA_InitStructure);

前面那些都是对DMA结构体成员的设置,在次再统一对DMA整个模块做一次初始化,使得DMA各成员与上面的参数一致。

DMA_Cmd(DMA_Channel1,ENABLE);

使能DMA传输。

 

  评论这张
 
阅读(6045)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017