mirror of
https://gitee.com/Lyon1998/pikapython.git
synced 2025-01-15 17:02:53 +08:00
97 lines
2.3 KiB
C
97 lines
2.3 KiB
C
/*
|
|
* Copyright 2021 MindMotion Microelectronics Co., Ltd.
|
|
* All rights reserved.
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
|
|
#include "hal_dma.h"
|
|
|
|
/* clear all the interrupt enables and disable the dma channel. */
|
|
uint32_t DMA_InitChannel(DMA_Type * DMAx, uint32_t channel, DMA_Channel_Init_Type * init)
|
|
{
|
|
uint32_t ccr = 0u;
|
|
|
|
if ( (init->XferMode == DMA_XferMode_MemoryToPeriph)
|
|
|| (init->XferMode == DMA_XferMode_MemoryToPeriphBurst) )
|
|
{
|
|
ccr |= DMA_CCR_DIR_MASK;
|
|
}
|
|
|
|
if ( (init->XferMode == DMA_XferMode_PeriphToMemoryBurst)
|
|
|| (init->XferMode == DMA_XferMode_MemoryToPeriphBurst) )
|
|
{
|
|
ccr |= DMA_CCR_MEM2MEM_MASK;
|
|
}
|
|
|
|
if (init->ReloadMode == DMA_ReloadMode_AutoReload)
|
|
{
|
|
ccr |= DMA_CCR_ARE_MASK;
|
|
}
|
|
else if (init->ReloadMode == DMA_ReloadMode_AutoReloadContinuous)
|
|
{
|
|
ccr |= (DMA_CCR_ARE_MASK | DMA_CCR_CIRC_MASK);
|
|
}
|
|
|
|
ccr |= DMA_CCR_PINC(init->PeriphAddrIncMode)
|
|
| DMA_CCR_MINC(init->MemAddrIncMode)
|
|
| DMA_CCR_PSIZE(init->XferWidth)
|
|
| DMA_CCR_MSIZE(init->XferWidth)
|
|
| DMA_CCR_PL(init->Priority)
|
|
;
|
|
|
|
DMAx->CH[channel].CCR = ccr;
|
|
DMAx->CH[channel].CNDTR = init->XferCount;
|
|
DMAx->CH[channel].CPAR = init->PeriphAddr;
|
|
DMAx->CH[channel].CMAR = init->MemAddr;
|
|
|
|
return 0u;
|
|
}
|
|
|
|
void DMA_EnableChannelInterrupts(DMA_Type * DMAx, uint32_t channel, uint32_t interrupts, bool enable)
|
|
{
|
|
if (enable)
|
|
{
|
|
DMAx->CH[channel].CCR |= (interrupts & 0xEu);
|
|
}
|
|
else
|
|
{
|
|
DMAx->CH[channel].CCR &= ~(interrupts & 0xEu);
|
|
}
|
|
}
|
|
|
|
uint32_t DMA_GetChannelInterruptStatus(DMA_Type * DMAx, uint32_t channel)
|
|
{
|
|
return (DMAx->ISR >> (channel * 4u)) & 0xFu;
|
|
}
|
|
|
|
void DMA_ClearChannelInterruptStatus(DMA_Type * DMAx, uint32_t channel, uint32_t interrupts)
|
|
{
|
|
DMAx->IFCR = ( (interrupts & 0xFu) << (channel * 4u) );
|
|
}
|
|
|
|
void DMA_EnableChannel(DMA_Type * DMAx, uint32_t channel, bool enable)
|
|
{
|
|
if (enable)
|
|
{
|
|
DMAx->CH[channel].CCR |= DMA_CCR_EN_MASK;
|
|
}
|
|
else
|
|
{
|
|
DMAx->CH[channel].CCR &= ~DMA_CCR_EN_MASK;
|
|
}
|
|
}
|
|
|
|
void DMA_EnableBurstMode(DMA_Type * DMAx, uint32_t channel, bool enable)
|
|
{
|
|
if (enable)
|
|
{
|
|
DMAx->CH[channel].CCR |= DMA_CCR_BURSTEN_MASK;
|
|
}
|
|
else
|
|
{
|
|
DMAx->CH[channel].CCR &= ~DMA_CCR_BURSTEN_MASK;
|
|
}
|
|
}
|
|
/* EOF. */
|