发新帖我要提问
12
返回列表
打印
[应用相关]

stm32 再来学习DMA

[复制链接]
楼主: hanzhen654
手机看帖
扫描二维码
随时随地手机跟帖
21
hanzhen654|  楼主 | 2018-10-31 20:58 | 只看该作者 回帖奖励 |倒序浏览
DMA_MemoryInc:如果配置为 DMA_MemoryInc_Enable,使能存储器地址自动
递增功能,它设定 DMA_CCR 寄存器的 MINC 位的值;我们自定义的存储区一般
都是存放多个数据的,所以要使能存储器地址自动递增功能。

使用特权

评论回复
22
hanzhen654|  楼主 | 2018-10-31 20:59 | 只看该作者
DMA_PeripheralDataSize:外设数据宽度,可选字节(8 位)、半字(16 位)和字(32
位),它设定 DMA_CCR 寄存器的 PSIZE[1:0]位的值。

使用特权

评论回复
23
hanzhen654|  楼主 | 2018-10-31 21:02 | 只看该作者
DMA_MemoryDataSize:存储器数据宽度,可选字节(8 位)、半字(16 位)和字(32
位),它设定 DMA_CCR 寄存器的 MSIZE[1:0]位的值。当外设和存储器之间传数
据时,两边的数据宽度应该设置为一致大小。

使用特权

评论回复
24
hanzhen654|  楼主 | 2018-10-31 21:02 | 只看该作者
DMA_Mode: DMA 传输 模式选 择, 可选 一次传 输或 者循 环传输 ,它 设 定
DMA_CCR 寄存器的 CIRC 位的值。例程我们的 ADC 采集是持续循环进行的,所
以使用循环传输模式。

使用特权

评论回复
25
hanzhen654|  楼主 | 2018-10-31 21:02 | 只看该作者
DMA_Priority:软件设置通道的优先级,有 4 个可选优先级分别为非常高、高、
中和低,它设定 DMA_CCR 寄存器的 PL[1:0]位的值。 DMA 通道优先级只有在多
个 DMA 通道同时使用时才有意义,如果是单个通道,优先级可以随便设置。

使用特权

评论回复
26
hanzhen654|  楼主 | 2018-10-31 21:02 | 只看该作者
DMA_M2M : 存 储 器 到 存 储 器 模 式 , 使 用 存 储 器 到 存 储 器 时 用 到 , 设 定
DMA_CCR 的位 14 MEN2MEN 即可启动存储器到存储器模式

使用特权

评论回复
27
hanzhen654|  楼主 | 2018-10-31 21:04 | 只看该作者
存储器到存储器模式可以实现数据在两个内存的快速拷贝。我们先定义
一个静态的源数据,存放在内部 FLASH,然后使用 DMA 传输把源数据拷贝到目标地址上
(内部 SRAM),最后对比源数据和目标地址的数据,看看是否传输准确。

使用特权

评论回复
28
hanzhen654|  楼主 | 2018-10-31 21:06 | 只看该作者
DMA 初始化
void DMA_Config(void)
{
          DMA_InitTypeDef DMA_InitStructure;
       
                // 开启DMA时钟
                RCC_AHBPeriphClockCmd(DMA_CLOCK, ENABLE);
                // 源数据地址
    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)aSRC_Const_Buffer;
                // 目标地址
                DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)aDST_Buffer;
                // 方向:外设到存储器(这里的外设是内部的FLASH)       
                DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
                // 传输大小       
                DMA_InitStructure.DMA_BufferSize = BUFFER_SIZE;
                // 外设(内部的FLASH)地址递增            
                DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;
                // 内存地址递增
                DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
                // 外设数据单位       
                DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
                // 内存数据单位
                DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;         
                // DMA模式,一次或者循环模式
                DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ;
                //DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;  
                // 优先级:高       
                DMA_InitStructure.DMA_Priority = DMA_Priority_High;
                // 使能内存到内存的传输
                DMA_InitStructure.DMA_M2M = DMA_M2M_Enable;
                // 配置DMA通道                  
                DMA_Init(DMA_CHANNEL, &DMA_InitStructure);
    //清除DMA数据流传输完成标志位
    DMA_ClearFlag(DMA_FLAG_TC);
                // 使能DMA
                DMA_Cmd(DMA_CHANNEL,ENABLE);
}

使用特权

评论回复
29
hanzhen654|  楼主 | 2018-10-31 21:07 | 只看该作者
/* 等待DMA传输完成 */
  while(DMA_GetFlagStatus(DMA_FLAG_TC)==RESET)
  {
   
  }   

使用特权

评论回复
30
hanzhen654|  楼主 | 2018-10-31 21:07 | 只看该作者
/* 比较源数据与传输后数据 */
  TransferStatus=Buffercmp(aSRC_Const_Buffer, aDST_Buffer, BUFFER_SIZE);

使用特权

评论回复
31
hanzhen654|  楼主 | 2018-10-31 21:08 | 只看该作者

/**
  * 判断指定长度的两个数据源是否完全相等,
  * 如果完全相等返回1,只要其中一对数据不相等返回0
  */
uint8_t Buffercmp(const uint32_t* pBuffer,
                  uint32_t* pBuffer1, uint16_t BufferLength)
{
  /* 数据长度递减 */
  while(BufferLength--)
  {
    /* 判断两个数据源是否对应相等 */
    if(*pBuffer != *pBuffer1)
    {
      /* 对应数据源不相等马上退出函数,并返回0 */
      return 0;
    }
    /* 递增两个数据源的地址指针 */
    pBuffer++;
    pBuffer1++;
  }
  /* 完成判断并且对应数据相对 */
  return 1;  
}

使用特权

评论回复
32
hanzhen654|  楼主 | 2018-10-31 21:08 | 只看该作者
/* 判断源数据与传输后数据比较结果*/
  if(TransferStatus==0)  
  {
    /* 源数据与传输后数据不相等时RGB彩色灯显示红色 */
    LED_RED;
  }
  else
  {
    /* 源数据与传输后数据相等时RGB彩色灯显示蓝色 */
    LED_BLUE;
  }

使用特权

评论回复
33
hanzhen654|  楼主 | 2018-10-31 21:09 | 只看该作者
数据一致时会出现蓝色LED

使用特权

评论回复
34
hanzhen654|  楼主 | 2018-10-31 21:10 | 只看该作者
源数据与传输后数据不相等时RGB彩色灯显示红色

使用特权

评论回复
35
huangcunxiake| | 2018-10-31 21:51 | 只看该作者
DMA看起码挺复杂的。

使用特权

评论回复
36
musich| | 2018-11-1 00:10 | 只看该作者
写的不错, 支持一个.

使用特权

评论回复
37
labasi| | 2018-11-6 14:39 | 只看该作者
目前还没有用过dma啊

使用特权

评论回复
38
wakayi| | 2018-11-6 15:10 | 只看该作者
感觉如果dma处理不好的话总会出问题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则