DMA操作GPIO
1: 创建DMA通道 MemToMem模式
2:由于GPIO控制器是16位 所以选择word(字)传输
3:如果cubeMax可以取消Use FiFO 就取消,取消不了在代码屏蔽
4: 一定要在NVIC找到DMA通道 打开中断
打开中断与不打开中断
uint32_t buf[2] = {0x00000002, 0x00020000};
1:打开中断
HAL_DMA_Start_IT(&hdma_memtomem_dma2_stream0, (uint32_t)buf,(uint32_t)(&GPIOD->BSRR),1);
HAL_Delay(500);
HAL_DMA_Start_IT(&hdma_memtomem_dma2_stream0, (uint32_t)&buf[1],(uint32_t)(&GPIOD->BSRR),1);
HAL_Delay(500);
直接就可以操作,不会有不复制的情况,但会造成中断过多
2:不打开中断
HAL_DMA_Start(&hdma_memtomem_dma2_stream0, (uint32_t)buf,(uint32_t)(&GPIOD->BSRR),1);
HAL_DMA_PollForTransfer(&hdma_memtomem_dma2_stream0,HAL_DMA_HALF_TRANSFER, 2);
HAL_Delay(500);
HAL_DMA_Start(&hdma_memtomem_dma2_stream0, (uint32_t)&buf[1],(uint32_t)(&GPIOD->BSRR),1);
HAL_DMA_PollForTransfer(&hdma_memtomem_dma2_stream0,HAL_DMA_HALF_TRANSFER, 2);
HAL_Delay(500);
这样有问题 只能执行第一次,后面的都不在执行
把PollForTransfer屏蔽掉
用HAL_DMA_Abort(&hdma_memtomem_dma2_stream0)替换就可以传输;
主要是清除标志