单片机
返回首页

STM32 DMA->内存到内存

2017-09-16 来源:eefocus

基于STM32 F401 Discovery板:

DMA2在AHB1总线上



步骤一:使能DMA


  1. #define DMA_STREAM_CLOCK         RCC_AHB1Periph_DMA2   

  2.   RCC_AHB1PeriphClockCmd(DMA_STREAM_CLOCK, ENABLE);  

步骤二:reset DMA Stream register:


  1. /* Reset DMA Stream registers (for debug purpose) */  

  2.   DMA_DeInit(DMA_STREAM);  

步骤三:


  1. /* Check if the DMA Stream is disabled before enabling it. 

  2.      Note that this step is useful when the same Stream is used multiple times: 

  3.      enabled, then disabled then re-enabled... In this case, the DMA Stream disable 

  4.      will be effective only at the end of the ongoing data transfer and it will  

  5.      not be possible to re-configure it before making sure that the Enable bit  

  6.      has been cleared by hardware. If the Stream is used only once, this step might  

  7.      be bypassed. */  

  8.   while (DMA_GetCmdStatus(DMA_STREAM) != DISABLE)  

  9.   {  

  10.   }  

步骤四:初始化DMA 结构体


  1. /* Configure DMA Stream */  

  2.   DMA_InitStructure.DMA_Channel = DMA_CHANNEL;    

  3.   DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SRC_Const_Buffer;  

  4.   DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)DST_Buffer;  

  5.   DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToMemory;  

  6.   DMA_InitStructure.DMA_BufferSize = (uint32_t)BUFFER_SIZE;  

  7.   DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;  

  8.   DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  

  9.   DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;  

  10.   DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;  

  11.   DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;  

  12.   DMA_InitStructure.DMA_Priority = DMA_Priority_High;  

  13.   DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;           

  14.   DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;  

  15.   DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;  

  16.   DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;  

  17.   DMA_Init(DMA_STREAM, &DMA_InitStructure);  


其中:
DMA_PeripheralBaseAddr--》外设地址,可以选择USART,I2C,ADC等

DMA_Memory0BaseAddr-》memory地址,用于外设和内存的数据传输

DMA_DIR -》传送方向,分别有外设到内存,内存到外设,内存到内存

DMA_BufferSize -》传输的buffer size

DMA_PeripheralInc -》外设地址是否自加

DMA_MemoryInc -》内存地址是否自加

DMA_PeripheralDataSize -》外设每个data的size,分别有1byte,半字,全字

DMA_MemoryDataSize -》内存的每个data的size,如上

DMA_Mode -》DMA mode,分别是传输完了是否循环还是正常

步骤四:DMA使能中断:


  1. DMA_ITConfig(DMA_STREAM, DMA_IT_TC, ENABLE);  

其中DMA有发送完成中断,完成一半中断,和错误中断等


步骤五:开始传输


  1. /* DMA Stream enable */  

  2.   DMA_Cmd(DMA_STREAM, ENABLE);  



进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 红外线探测报警器

  • 短波AM发射器电路设计图

  • 使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

  • 用NE555制作定时器

  • 如何调制IC555振荡器

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章