这是本文档旧的修订版!
银杏科技有限公司旗下技术文档发布平台 | |||
技术支持电话 | 0379-69926675-801 | ||
技术支持邮件 | Gingko@vip.163.com | ||
技术论坛 | http://www.eeschool.org | ||
版本 | 日期 | 作者 | 修改内容 |
---|---|---|---|
V1.0 | 2020-07-04 | gingko | 初次建立 |
int main(void) { int i; /* MCU 配置*/ /* 重置所有外围设备,初始化Flash接口和Systick */ HAL_Init(); /* 配置系统时钟 */ SystemClock_Config(); /*初始化所有已配置的外围设备 */ MX_GPIO_Init(); dma.initialize(); //测试DMA,测试成功蓝色灯闪烁,测试失败,红色灯闪烁 //初始化DMA2 hdma_memtomem_dma2_stream0.Instance = DMA2_Stream0; hdma_memtomem_dma2_stream0.Init.Channel = DMA_CHANNEL_0;//通道0 hdma_memtomem_dma2_stream0.Init.Direction = DMA_MEMORY_TO_MEMORY; //传输方向,存储器到存储器 hdma_memtomem_dma2_stream0.Init.PeriphInc = DMA_PINC_ENABLE; //外设增量模式 hdma_memtomem_dma2_stream0.Init.MemInc = DMA_MINC_ENABLE;//存储器增量模式 hdma_memtomem_dma2_stream0.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; //外设数据大小 hdma_memtomem_dma2_stream0.Init.Mode = DMA_NORMAL; //正常模式 hdma_memtomem_dma2_stream0.Init.Priority = DMA_PRIORITY_HIGH; //DMA优先级:高 hdma_memtomem_dma2_stream0.Init.FIFOMode = DMA_FIFOMODE_ENABLE; //FIFO模式开启 hdma_memtomem_dma2_stream0.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; //FIFO阈值完整配置 hdma_memtomem_dma2_stream0.Init.MemBurst = DMA_MBURST_SINGLE; //存储器突发模式:单次传输 hdma_memtomem_dma2_stream0.Init.PeriphBurst = DMA_PBURST_SINGLE; //外设触发模式:单次传输 if(HAL_DMA_Init(&hdma_memtomem_dma2_stream0) != HAL_OK) //初始化DMA { while(1); } /* 开始DMA传输 */ HAL_DMA_Start(&hdma_memtomem_dma2_stream0,(unsigned long int)src_buffer,(unsigned long int)dst_buffer,(unsigned long int)BUFFER_SIZE); while(__HAL_DMA_GET_FLAG(&hdma_memtomem_dma2_stream0,DMA_FLAG_TCIF0_4) == SET); for(i = 0;i < BUFFER_SIZE;i++){ if(dst_buffer[i] != src_buffer[i]){ //测试失败,红灯闪烁 while(1){ HAL_Delay(500); LED_RED_ON; HAL_Delay(500); LED_RED_OFF; } } } //测试成功,蓝灯闪烁 while (1) { HAL_Delay(500); LED_BLUE_ON; HAL_Delay(500); LED_BLUE_OFF; } }
DMA_T dma = { .initialize = initialize }; DMA_HandleTypeDef hdma_memtomem_dma2_stream0; static int initialize(void) { _HAL_RCC_DMA2_CLK_ENABLE(); //使能时钟 return 0; }
HAL_StatusTypeDef HAL_DMA_Start(DMA_HandleTypeDef *hdma,uint32_t SrcAddress,uint32_t DstAddress,uint32_t DataLength) { HAL_StatusTypeDef status = HAL_OK; assert_param(IS_DMA_BUFFER_SIZE(DataLength)); /* 检查参数 */ _HAL_LOCK(hdma); /* 进程锁定 */ if(HAL_DMA_STATE_READY == hdma->State) { hdma->State = HAL_DMA_STATE_BUSY; /* 更改DMA外设状态 */ hdma->ErrorCode = HAL_DMA_ERROR_NONE; /* 初始化错误代码 */ /* 配置源,目标地址和数据长度 */ DMA_SetConfig(hdma, SrcAddress, DstAddress, DataLength); _HAL_DMA_ENABLE(hdma); /* 使能外围设备 */ } else { _HAL_UNLOCK(hdma); /* 进程解锁 */ status = HAL_BUSY; /* 返回错误状态 */ } return status; }
_HAL_DMA_GET_FLAG(&hdma_memtomem_dma2_stream0,DMA_FLAG_TCIF0_4