/* * memcpy_dma.c * * Created on: Oct 1, 2019 * Author: abody */ #include #include namespace f4ll_cpp { MemcpyDma::MemcpyDma(DMA_TypeDef *dma, uint32_t stream) : DmaHelper(dma, stream), m_busy(false) { LL_DMA_EnableIT_TC(dma, stream); } void* MemcpyDma::Copy(void *dst, void const *src, size_t length) { while(m_busy); LL_DMA_SetM2MSrcAddress(GetDma(), GetStream(), (uint32_t)src); LL_DMA_SetM2MDstAddress(GetDma(), GetStream(), (uint32_t)dst); LL_DMA_SetDataLength(GetDma(), GetStream(), (length+3)/4 ); m_busy = true; LL_DMA_EnableStream(GetDma(), GetStream()); return dst; } void MemcpyDma::HandleDmaIrq(void) { if(*GetIsReg() & GetTcMask()) { // DMA transfer complete *GetIfcReg() = GetTcMask(); LL_DMA_DisableStream(GetDma(), GetStream()); m_busy = false; } } } // f4ll_cpp