554 lines
24 KiB
C
554 lines
24 KiB
C
/**
|
|
******************************************************************************
|
|
* @brief DMA functions of the firmware library.
|
|
******************************************************************************
|
|
*/
|
|
|
|
|
|
/* Includes ------------------------------------------------------------------*/
|
|
#include "gd32f10x_dma.h"
|
|
#include "gd32f10x_rcc.h"
|
|
|
|
/** @addtogroup GD32F10x_Firmware
|
|
* @{
|
|
*/
|
|
|
|
/** @defgroup DMA
|
|
* @brief DMA driver modules
|
|
* @{
|
|
*/
|
|
|
|
/** @defgroup DMA_Private_Defines
|
|
* @{
|
|
*/
|
|
|
|
/* DMA Reset registers mask */
|
|
#define DMA_REGISTERS_RESET ((uint32_t)0x00000000)
|
|
|
|
/* DMA Channel config registers Masks */
|
|
#define CTLR_CLEAR_MASK ((uint32_t)0xFFFF800F)
|
|
|
|
/* DMA Reset registers mask */
|
|
#define DMA_INT_RESET ((uint32_t)0x00000000)
|
|
|
|
/* DMA2 FLAG mask */
|
|
#define DMA2_FLAG_Mask ((uint32_t)0x10000000)
|
|
|
|
/* DMA1 Channelx interrupt pending bit masks */
|
|
#define DMA1_Channel1_INT_Mask ((uint32_t)(DMA_IFR_GIF1 | DMA_IFR_TCIF1 | DMA_IFR_HTIF1 | DMA_IFR_ERRIF1))
|
|
#define DMA1_Channel2_INT_Mask ((uint32_t)(DMA_IFR_GIF2 | DMA_IFR_TCIF2 | DMA_IFR_HTIF2 | DMA_IFR_ERRIF2))
|
|
#define DMA1_Channel3_INT_Mask ((uint32_t)(DMA_IFR_GIF3 | DMA_IFR_TCIF3 | DMA_IFR_HTIF3 | DMA_IFR_ERRIF3))
|
|
#define DMA1_Channel4_INT_Mask ((uint32_t)(DMA_IFR_GIF4 | DMA_IFR_TCIF4 | DMA_IFR_HTIF4 | DMA_IFR_ERRIF4))
|
|
#define DMA1_Channel5_INT_Mask ((uint32_t)(DMA_IFR_GIF5 | DMA_IFR_TCIF5 | DMA_IFR_HTIF5 | DMA_IFR_ERRIF5))
|
|
#define DMA1_Channel6_INT_Mask ((uint32_t)(DMA_IFR_GIF6 | DMA_IFR_TCIF6 | DMA_IFR_HTIF6 | DMA_IFR_ERRIF6))
|
|
#define DMA1_Channel7_INT_Mask ((uint32_t)(DMA_IFR_GIF7 | DMA_IFR_TCIF7 | DMA_IFR_HTIF7 | DMA_IFR_ERRIF7))
|
|
|
|
/* DMA2 Channelx interrupt pending bit masks */
|
|
#define DMA2_Channel1_INT_Mask ((uint32_t)(DMA_IFR_GIF1 | DMA_IFR_TCIF1 | DMA_IFR_HTIF1 | DMA_IFR_ERRIF1))
|
|
#define DMA2_Channel2_INT_Mask ((uint32_t)(DMA_IFR_GIF2 | DMA_IFR_TCIF2 | DMA_IFR_HTIF2 | DMA_IFR_ERRIF2))
|
|
#define DMA2_Channel3_INT_Mask ((uint32_t)(DMA_IFR_GIF3 | DMA_IFR_TCIF3 | DMA_IFR_HTIF3 | DMA_IFR_ERRIF3))
|
|
#define DMA2_Channel4_INT_Mask ((uint32_t)(DMA_IFR_GIF4 | DMA_IFR_TCIF4 | DMA_IFR_HTIF4 | DMA_IFR_ERRIF4))
|
|
#define DMA2_Channel5_INT_Mask ((uint32_t)(DMA_IFR_GIF5 | DMA_IFR_TCIF5 | DMA_IFR_HTIF5 | DMA_IFR_ERRIF5))
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
|
|
/** @defgroup DMA_Private_Functions
|
|
* @{
|
|
*/
|
|
|
|
/**
|
|
* @brief Deinitialize the DMAy Channelx registers
|
|
* @param DMAy_Channelx: where y:[1,2] to select the DMA , x:[1,7] for DMA1 and x:[1,5] for DMA2 to select the DMA Channel.
|
|
* @retval None
|
|
*/
|
|
void DMA_DeInit(DMA_Channel_TypeDef *DMAy_Channelx)
|
|
{
|
|
/* Disable the selected DMAy Channelx */
|
|
DMAy_Channelx->CTLR &= (uint16_t)(~DMA_CTLR_CHEN);
|
|
|
|
/* Reset DMAy Channelx control register */
|
|
DMAy_Channelx->CTLR = DMA_REGISTERS_RESET;
|
|
|
|
/* Reset DMAy Channelx remaining bytes register */
|
|
DMAy_Channelx->RCNT = DMA_REGISTERS_RESET;
|
|
|
|
/* Reset DMAy Channelx peripheral address register */
|
|
DMAy_Channelx->PBAR = DMA_REGISTERS_RESET;
|
|
|
|
/* Reset DMAy Channelx memory address register */
|
|
DMAy_Channelx->MBAR = DMA_REGISTERS_RESET;
|
|
|
|
if (DMAy_Channelx == DMA1_CHANNEL1) {
|
|
/* Reset interrupt pending bits for DMA1 Channel1 */
|
|
DMA1->ICR |= DMA1_Channel1_INT_Mask;
|
|
} else if (DMAy_Channelx == DMA1_CHANNEL2) {
|
|
/* Reset interrupt pending bits for DMA1 Channel2 */
|
|
DMA1->ICR |= DMA1_Channel2_INT_Mask;
|
|
} else if (DMAy_Channelx == DMA1_CHANNEL3) {
|
|
/* Reset interrupt pending bits for DMA1 Channel3 */
|
|
DMA1->ICR |= DMA1_Channel3_INT_Mask;
|
|
} else if (DMAy_Channelx == DMA1_CHANNEL4) {
|
|
/* Reset interrupt pending bits for DMA1 Channel4 */
|
|
DMA1->ICR |= DMA1_Channel4_INT_Mask;
|
|
} else if (DMAy_Channelx == DMA1_CHANNEL5) {
|
|
/* Reset interrupt pending bits for DMA1 Channel5 */
|
|
DMA1->ICR |= DMA1_Channel5_INT_Mask;
|
|
} else if (DMAy_Channelx == DMA1_CHANNEL6) {
|
|
/* Reset interrupt pending bits for DMA1 Channel6 */
|
|
DMA1->ICR |= DMA1_Channel6_INT_Mask;
|
|
} else if (DMAy_Channelx == DMA1_CHANNEL7) {
|
|
/* Reset interrupt pending bits for DMA1 Channel7 */
|
|
DMA1->ICR |= DMA1_Channel7_INT_Mask;
|
|
} else if (DMAy_Channelx == DMA2_CHANNEL1) {
|
|
/* Reset interrupt pending bits for DMA2 Channel1 */
|
|
DMA2->ICR |= DMA2_Channel1_INT_Mask;
|
|
} else if (DMAy_Channelx == DMA2_CHANNEL2) {
|
|
/* Reset interrupt pending bits for DMA2 Channel2 */
|
|
DMA2->ICR |= DMA2_Channel2_INT_Mask;
|
|
} else if (DMAy_Channelx == DMA2_CHANNEL3) {
|
|
/* Reset interrupt pending bits for DMA2 Channel3 */
|
|
DMA2->ICR |= DMA2_Channel3_INT_Mask;
|
|
} else if (DMAy_Channelx == DMA2_CHANNEL4) {
|
|
/* Reset interrupt pending bits for DMA2 Channel4 */
|
|
DMA2->ICR |= DMA2_Channel4_INT_Mask;
|
|
} else {
|
|
if (DMAy_Channelx == DMA2_CHANNEL5) {
|
|
/* Reset interrupt pending bits for DMA2 Channel5 */
|
|
DMA2->ICR |= DMA2_Channel5_INT_Mask;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* @brief Initialize the DMAy Channelx according to the DMA_InitParaStruct.
|
|
* @param DMAy_Channelx: where y:[1:2] to select the DMA , x:[1,7] for DMA1 and x:[1,5] for DMA2 to select the DMA Channel.
|
|
* @param DMA_InitParaStruct: contain the configuration information for the specified DMA Channel.
|
|
* @retval None
|
|
*/
|
|
void DMA_Init(DMA_Channel_TypeDef *DMAy_Channelx, DMA_InitPara *DMA_InitParaStruct)
|
|
{
|
|
uint32_t temp = 0;
|
|
|
|
/* Get the DMAy_Channelx CCR value */
|
|
temp = DMAy_Channelx->CTLR;
|
|
|
|
/* Clear MEMTOMEM, PRIO, MSIZE, PSIZE, MNAGA, PNAGA, CIRC and DIR bits */
|
|
temp &= CTLR_CLEAR_MASK;
|
|
/* Configure DMAy Channelx: data transfer, data size, priority level and mode */
|
|
/* Set MEMTOMEM, PRIO, MSIZE, PSIZE, MNAGA, PNAGA, CIRC and DIR bits according to DMA_InitParaStruct */
|
|
temp |= DMA_InitParaStruct->DMA_DIR | DMA_InitParaStruct->DMA_Mode |
|
|
DMA_InitParaStruct->DMA_PeripheralInc | DMA_InitParaStruct->DMA_MemoryInc |
|
|
DMA_InitParaStruct->DMA_PeripheralDataSize | DMA_InitParaStruct->DMA_MemoryDataSize |
|
|
DMA_InitParaStruct->DMA_Priority | DMA_InitParaStruct->DMA_MTOM;
|
|
|
|
/* Write to DMAy Channelx CTLR */
|
|
DMAy_Channelx->CTLR = temp;
|
|
|
|
/* Write to DMAy Channelx RCNT */
|
|
DMAy_Channelx->RCNT = DMA_InitParaStruct->DMA_BufferSize;
|
|
|
|
/* Write to DMAy Channelx PBAR */
|
|
DMAy_Channelx->PBAR = DMA_InitParaStruct->DMA_PeripheralBaseAddr;
|
|
|
|
/* Write to DMAy Channelx MBAR */
|
|
DMAy_Channelx->MBAR = DMA_InitParaStruct->DMA_MemoryBaseAddr;
|
|
}
|
|
|
|
/**
|
|
* @brief Set each DMA_InitParaStruct member to its default value.
|
|
* @param DMA_InitParaStruct: The structure pointer to DMA_InitParaStruct will be initialized.
|
|
* @retval None
|
|
*/
|
|
void DMA_ParaInit(DMA_InitPara *DMA_InitParaStruct)
|
|
{
|
|
/* Reset DMA init structure parameters values */
|
|
DMA_InitParaStruct->DMA_PeripheralBaseAddr = DMA_INT_RESET;
|
|
|
|
DMA_InitParaStruct->DMA_MemoryBaseAddr = DMA_INT_RESET;
|
|
|
|
DMA_InitParaStruct->DMA_DIR = DMA_DIR_PERIPHERALSRC;
|
|
|
|
DMA_InitParaStruct->DMA_BufferSize = DMA_INT_RESET;
|
|
|
|
DMA_InitParaStruct->DMA_PeripheralInc = DMA_PERIPHERALINC_DISABLE;
|
|
|
|
DMA_InitParaStruct->DMA_MemoryInc = DMA_MEMORYINC_DISABLE;
|
|
|
|
DMA_InitParaStruct->DMA_PeripheralDataSize = DMA_PERIPHERALDATASIZE_BYTE;
|
|
|
|
DMA_InitParaStruct->DMA_MemoryDataSize = DMA_MEMORYDATASIZE_BYTE;
|
|
|
|
DMA_InitParaStruct->DMA_Mode = DMA_MODE_NORMAL;
|
|
|
|
DMA_InitParaStruct->DMA_Priority = DMA_PRIORITY_LOW;
|
|
|
|
DMA_InitParaStruct->DMA_MTOM = DMA_MEMTOMEM_DISABLE;
|
|
}
|
|
|
|
/**
|
|
* @brief Enable or disable the DMAy Channelx.
|
|
* @param DMAy_Channelx: where y:[1:2] to select the DMA , x:[1,7] for DMA1 and x:[1,5] for DMA2 to select the DMA Channel.
|
|
* @param NewValue: new state of the DMAy Channelx.
|
|
* This parameter can be: ENABLE or DISABLE.
|
|
* @retval None
|
|
*/
|
|
void DMA_Enable(DMA_Channel_TypeDef *DMAy_Channelx, TypeState NewValue)
|
|
{
|
|
if (NewValue != DISABLE) {
|
|
/* Enable the DMAy Channelx */
|
|
DMAy_Channelx->CTLR |= DMA_CTLR_CHEN;
|
|
} else {
|
|
/* Disable the DMAy Channelx */
|
|
DMAy_Channelx->CTLR &= (uint16_t)(~DMA_CTLR_CHEN);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @brief Enable or disable the DMAy Channelx interrupts.
|
|
* @param DMAy_Channelx: where y:[1:2] to select the DMA , x:[1,7] for DMA1 and x:[1,5] for DMA2 to select the DMA Channel.
|
|
* @param DMA_INT: specify the DMA interrupts sources to be enabled or disabled.
|
|
* This parameter can be any combination of the following values:
|
|
* @arg DMA_INT_TC: Transfer complete interrupt mask
|
|
* @arg DMA_INT_HT: Half transfer interrupt mask
|
|
* @arg DMA_INT_ERR: Transfer error interrupt mask
|
|
* @param NewValue: new state of the DMA interrupts.
|
|
* This parameter can be: ENABLE or DISABLE.
|
|
* @retval None
|
|
*/
|
|
void DMA_INTConfig(DMA_Channel_TypeDef *DMAy_Channelx, uint32_t DMA_INT, TypeState NewValue)
|
|
{
|
|
if (NewValue != DISABLE) {
|
|
/* Enable the DMA interrupts */
|
|
DMAy_Channelx->CTLR |= DMA_INT;
|
|
} else {
|
|
/* Disable the DMA interrupts */
|
|
DMAy_Channelx->CTLR &= ~DMA_INT;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @brief Set the number of the remaining counter in the current DMAy Channelx transfer.
|
|
* @param DMAy_Channelx: where y:[1:2] to select the DMA , x:[1,7] for DMA1 and x:[1,5] for DMA2 to select the DMA Channel.
|
|
* @param DataNumber: The number of the remaining counter in the current DMAy Channelx transfer.
|
|
* @retval None.
|
|
*/
|
|
void DMA_SetCurrDataCounter(DMA_Channel_TypeDef *DMAy_Channelx, uint16_t DataNumber)
|
|
{
|
|
/* Write to DMAy Channelx RCNT */
|
|
DMAy_Channelx->RCNT = DataNumber;
|
|
}
|
|
|
|
/**
|
|
* @brief Return the number of remaining counter in the current DMAy Channelx transfer.
|
|
* @param DMAy_Channelx: where y:[1:2] to select the DMA , x:[1,7] for DMA1 and x:[1,5] for DMA2 to select the DMA Channel.
|
|
* @retval The number of remaining counter in the current DMAy Channelx transfer.
|
|
*/
|
|
uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef *DMAy_Channelx)
|
|
{
|
|
/* Return the number of remaining counter for DMAy Channelx */
|
|
return ((uint16_t)(DMAy_Channelx->RCNT));
|
|
}
|
|
|
|
/**
|
|
* @brief Check whether the DMAy Channelx flag is set or not.
|
|
* @param DMAy_FLAG: specifies the flag to check.
|
|
* This parameter can be one of the following values:
|
|
* @arg DMA1_FLAG_GL1: DMA1 Channel1 global flag.
|
|
* @arg DMA1_FLAG_TC1: DMA1 Channel1 transfer complete flag.
|
|
* @arg DMA1_FLAG_HT1: DMA1 Channel1 half transfer flag.
|
|
* @arg DMA1_FLAG_TE1: DMA1 Channel1 transfer error flag.
|
|
* @arg DMA1_FLAG_GL2: DMA1 Channel2 global flag.
|
|
* @arg DMA1_FLAG_TC2: DMA1 Channel2 transfer complete flag.
|
|
* @arg DMA1_FLAG_HT2: DMA1 Channel2 half transfer flag.
|
|
* @arg DMA1_FLAG_TE2: DMA1 Channel2 transfer error flag.
|
|
* @arg DMA1_FLAG_GL3: DMA1 Channel3 global flag.
|
|
* @arg DMA1_FLAG_TC3: DMA1 Channel3 transfer complete flag.
|
|
* @arg DMA1_FLAG_HT3: DMA1 Channel3 half transfer flag.
|
|
* @arg DMA1_FLAG_TE3: DMA1 Channel3 transfer error flag.
|
|
* @arg DMA1_FLAG_GL4: DMA1 Channel4 global flag.
|
|
* @arg DMA1_FLAG_TC4: DMA1 Channel4 transfer complete flag.
|
|
* @arg DMA1_FLAG_HT4: DMA1 Channel4 half transfer flag.
|
|
* @arg DMA1_FLAG_TE4: DMA1 Channel4 transfer error flag.
|
|
* @arg DMA1_FLAG_GL5: DMA1 Channel5 global flag.
|
|
* @arg DMA1_FLAG_TC5: DMA1 Channel5 transfer complete flag.
|
|
* @arg DMA1_FLAG_HT5: DMA1 Channel5 half transfer flag.
|
|
* @arg DMA1_FLAG_TE5: DMA1 Channel5 transfer error flag.
|
|
* @arg DMA1_FLAG_GL6: DMA1 Channel6 global flag.
|
|
* @arg DMA1_FLAG_TC6: DMA1 Channel6 transfer complete flag.
|
|
* @arg DMA1_FLAG_HT6: DMA1 Channel6 half transfer flag.
|
|
* @arg DMA1_FLAG_TE6: DMA1 Channel6 transfer error flag.
|
|
* @arg DMA1_FLAG_GL7: DMA1 Channel7 global flag.
|
|
* @arg DMA1_FLAG_TC7: DMA1 Channel7 transfer complete flag.
|
|
* @arg DMA1_FLAG_HT7: DMA1 Channel7 half transfer flag.
|
|
* @arg DMA1_FLAG_TE7: DMA1 Channel7 transfer error flag.
|
|
* @arg DMA2_FLAG_GL1: DMA2 Channel1 global flag.
|
|
* @arg DMA2_FLAG_TC1: DMA2 Channel1 transfer complete flag.
|
|
* @arg DMA2_FLAG_HT1: DMA2 Channel1 half transfer flag.
|
|
* @arg DMA2_FLAG_TE1: DMA2 Channel1 transfer error flag.
|
|
* @arg DMA2_FLAG_GL2: DMA2 Channel2 global flag.
|
|
* @arg DMA2_FLAG_TC2: DMA2 Channel2 transfer complete flag.
|
|
* @arg DMA2_FLAG_HT2: DMA2 Channel2 half transfer flag.
|
|
* @arg DMA2_FLAG_TE2: DMA2 Channel2 transfer error flag.
|
|
* @arg DMA2_FLAG_GL3: DMA2 Channel3 global flag.
|
|
* @arg DMA2_FLAG_TC3: DMA2 Channel3 transfer complete flag.
|
|
* @arg DMA2_FLAG_HT3: DMA2 Channel3 half transfer flag.
|
|
* @arg DMA2_FLAG_TE3: DMA2 Channel3 transfer error flag.
|
|
* @arg DMA2_FLAG_GL4: DMA2 Channel4 global flag.
|
|
* @arg DMA2_FLAG_TC4: DMA2 Channel4 transfer complete flag.
|
|
* @arg DMA2_FLAG_HT4: DMA2 Channel4 half transfer flag.
|
|
* @arg DMA2_FLAG_TE4: DMA2 Channel4 transfer error flag.
|
|
* @arg DMA2_FLAG_GL5: DMA2 Channel5 global flag.
|
|
* @arg DMA2_FLAG_TC5: DMA2 Channel5 transfer complete flag.
|
|
* @arg DMA2_FLAG_HT5: DMA2 Channel5 half transfer flag.
|
|
* @arg DMA2_FLAG_TE5: DMA2 Channel5 transfer error flag.
|
|
* @retval The new state of DMAy_FLAG (SET or RESET).
|
|
*/
|
|
TypeState DMA_GetBitState(uint32_t DMAy_FLAG)
|
|
{
|
|
uint32_t temp = 0;
|
|
|
|
/* Check the used DMAy */
|
|
if ((DMAy_FLAG & DMA2_FLAG_Mask) != (uint32_t)RESET) {
|
|
/* Get DMA2 ISR register value */
|
|
temp = DMA2->IFR ;
|
|
} else {
|
|
/* Get DMA1 ISR register value */
|
|
temp = DMA1->IFR ;
|
|
}
|
|
|
|
/* Check the status of the DMAy flag */
|
|
if ((temp & DMAy_FLAG) != (uint32_t)RESET) {
|
|
/* DMAy_FLAG is set */
|
|
return SET;
|
|
} else {
|
|
/* DMAy_FLAG is reset */
|
|
return RESET;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @brief Clear the DMAy Channelx's bit flags.
|
|
* @param DMAy_FLAG: specifies the flag to clear.
|
|
* This parameter can be any combination (for the same DMA) of the following values:
|
|
* @arg DMA1_FLAG_GL1: DMA1 Channel1 global flag.
|
|
* @arg DMA1_FLAG_TC1: DMA1 Channel1 transfer complete flag.
|
|
* @arg DMA1_FLAG_HT1: DMA1 Channel1 half transfer flag.
|
|
* @arg DMA1_FLAG_TE1: DMA1 Channel1 transfer error flag.
|
|
* @arg DMA1_FLAG_GL2: DMA1 Channel2 global flag.
|
|
* @arg DMA1_FLAG_TC2: DMA1 Channel2 transfer complete flag.
|
|
* @arg DMA1_FLAG_HT2: DMA1 Channel2 half transfer flag.
|
|
* @arg DMA1_FLAG_TE2: DMA1 Channel2 transfer error flag.
|
|
* @arg DMA1_FLAG_GL3: DMA1 Channel3 global flag.
|
|
* @arg DMA1_FLAG_TC3: DMA1 Channel3 transfer complete flag.
|
|
* @arg DMA1_FLAG_HT3: DMA1 Channel3 half transfer flag.
|
|
* @arg DMA1_FLAG_TE3: DMA1 Channel3 transfer error flag.
|
|
* @arg DMA1_FLAG_GL4: DMA1 Channel4 global flag.
|
|
* @arg DMA1_FLAG_TC4: DMA1 Channel4 transfer complete flag.
|
|
* @arg DMA1_FLAG_HT4: DMA1 Channel4 half transfer flag.
|
|
* @arg DMA1_FLAG_TE4: DMA1 Channel4 transfer error flag.
|
|
* @arg DMA1_FLAG_GL5: DMA1 Channel5 global flag.
|
|
* @arg DMA1_FLAG_TC5: DMA1 Channel5 transfer complete flag.
|
|
* @arg DMA1_FLAG_HT5: DMA1 Channel5 half transfer flag.
|
|
* @arg DMA1_FLAG_TE5: DMA1 Channel5 transfer error flag.
|
|
* @arg DMA1_FLAG_GL6: DMA1 Channel6 global flag.
|
|
* @arg DMA1_FLAG_TC6: DMA1 Channel6 transfer complete flag.
|
|
* @arg DMA1_FLAG_HT6: DMA1 Channel6 half transfer flag.
|
|
* @arg DMA1_FLAG_TE6: DMA1 Channel6 transfer error flag.
|
|
* @arg DMA1_FLAG_GL7: DMA1 Channel7 global flag.
|
|
* @arg DMA1_FLAG_TC7: DMA1 Channel7 transfer complete flag.
|
|
* @arg DMA1_FLAG_HT7: DMA1 Channel7 half transfer flag.
|
|
* @arg DMA1_FLAG_TE7: DMA1 Channel7 transfer error flag.
|
|
* @arg DMA2_FLAG_GL1: DMA2 Channel1 global flag.
|
|
* @arg DMA2_FLAG_TC1: DMA2 Channel1 transfer complete flag.
|
|
* @arg DMA2_FLAG_HT1: DMA2 Channel1 half transfer flag.
|
|
* @arg DMA2_FLAG_TE1: DMA2 Channel1 transfer error flag.
|
|
* @arg DMA2_FLAG_GL2: DMA2 Channel2 global flag.
|
|
* @arg DMA2_FLAG_TC2: DMA2 Channel2 transfer complete flag.
|
|
* @arg DMA2_FLAG_HT2: DMA2 Channel2 half transfer flag.
|
|
* @arg DMA2_FLAG_TE2: DMA2 Channel2 transfer error flag.
|
|
* @arg DMA2_FLAG_GL3: DMA2 Channel3 global flag.
|
|
* @arg DMA2_FLAG_TC3: DMA2 Channel3 transfer complete flag.
|
|
* @arg DMA2_FLAG_HT3: DMA2 Channel3 half transfer flag.
|
|
* @arg DMA2_FLAG_TE3: DMA2 Channel3 transfer error flag.
|
|
* @arg DMA2_FLAG_GL4: DMA2 Channel4 global flag.
|
|
* @arg DMA2_FLAG_TC4: DMA2 Channel4 transfer complete flag.
|
|
* @arg DMA2_FLAG_HT4: DMA2 Channel4 half transfer flag.
|
|
* @arg DMA2_FLAG_TE4: DMA2 Channel4 transfer error flag.
|
|
* @arg DMA2_FLAG_GL5: DMA2 Channel5 global flag.
|
|
* @arg DMA2_FLAG_TC5: DMA2 Channel5 transfer complete flag.
|
|
* @arg DMA2_FLAG_HT5: DMA2 Channel5 half transfer flag.
|
|
* @arg DMA2_FLAG_TE5: DMA2 Channel5 transfer error flag.
|
|
* @retval None
|
|
*/
|
|
void DMA_ClearBitState(uint32_t DMAy_FLAG)
|
|
{
|
|
/* Check the used DMAy */
|
|
if ((DMAy_FLAG & DMA2_FLAG_Mask) != (uint32_t)RESET) {
|
|
/* Clear the selected DMAy flags */
|
|
DMA2->ICR = DMAy_FLAG;
|
|
} else {
|
|
/* Clear the selected DMAy flags */
|
|
DMA1->ICR = DMAy_FLAG;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @brief Check whether the DMAy Channelx interrupt has occurred or not.
|
|
* @param DMAy_INT: specify the DMAy interrupt source to check.
|
|
* This parameter can be one of the following values:
|
|
* @arg DMA1_INT_GL1: DMA1 Channel1 global interrupt.
|
|
* @arg DMA1_INT_TC1: DMA1 Channel1 transfer complete interrupt.
|
|
* @arg DMA1_INT_HT1: DMA1 Channel1 half transfer interrupt.
|
|
* @arg DMA1_INT_TE1: DMA1 Channel1 transfer error interrupt.
|
|
* @arg DMA1_INT_GL2: DMA1 Channel2 global interrupt.
|
|
* @arg DMA1_INT_TC2: DMA1 Channel2 transfer complete interrupt.
|
|
* @arg DMA1_INT_HT2: DMA1 Channel2 half transfer interrupt.
|
|
* @arg DMA1_INT_TE2: DMA1 Channel2 transfer error interrupt.
|
|
* @arg DMA1_INT_GL3: DMA1 Channel3 global interrupt.
|
|
* @arg DMA1_INT_TC3: DMA1 Channel3 transfer complete interrupt.
|
|
* @arg DMA1_INT_HT3: DMA1 Channel3 half transfer interrupt.
|
|
* @arg DMA1_INT_TE3: DMA1 Channel3 transfer error interrupt.
|
|
* @arg DMA1_INT_GL4: DMA1 Channel4 global interrupt.
|
|
* @arg DMA1_INT_TC4: DMA1 Channel4 transfer complete interrupt.
|
|
* @arg DMA1_INT_HT4: DMA1 Channel4 half transfer interrupt.
|
|
* @arg DMA1_INT_TE4: DMA1 Channel4 transfer error interrupt.
|
|
* @arg DMA1_INT_GL5: DMA1 Channel5 global interrupt.
|
|
* @arg DMA1_INT_TC5: DMA1 Channel5 transfer complete interrupt.
|
|
* @arg DMA1_INT_HT5: DMA1 Channel5 half transfer interrupt.
|
|
* @arg DMA1_INT_TE5: DMA1 Channel5 transfer error interrupt.
|
|
* @arg DMA1_INT_GL6: DMA1 Channel6 global interrupt.
|
|
* @arg DMA1_INT_TC6: DMA1 Channel6 transfer complete interrupt.
|
|
* @arg DMA1_INT_HT6: DMA1 Channel6 half transfer interrupt.
|
|
* @arg DMA1_INT_TE6: DMA1 Channel6 transfer error interrupt.
|
|
* @arg DMA1_INT_GL7: DMA1 Channel7 global interrupt.
|
|
* @arg DMA1_INT_TC7: DMA1 Channel7 transfer complete interrupt.
|
|
* @arg DMA1_INT_HT7: DMA1 Channel7 half transfer interrupt.
|
|
* @arg DMA1_INT_TE7: DMA1 Channel7 transfer error interrupt.
|
|
* @arg DMA2_INT_GL1: DMA2 Channel1 global interrupt.
|
|
* @arg DMA2_INT_TC1: DMA2 Channel1 transfer complete interrupt.
|
|
* @arg DMA2_INT_HT1: DMA2 Channel1 half transfer interrupt.
|
|
* @arg DMA2_INT_TE1: DMA2 Channel1 transfer error interrupt.
|
|
* @arg DMA2_INT_GL2: DMA2 Channel2 global interrupt.
|
|
* @arg DMA2_INT_TC2: DMA2 Channel2 transfer complete interrupt.
|
|
* @arg DMA2_INT_HT2: DMA2 Channel2 half transfer interrupt.
|
|
* @arg DMA2_INT_TE2: DMA2 Channel2 transfer error interrupt.
|
|
* @arg DMA2_INT_GL3: DMA2 Channel3 global interrupt.
|
|
* @arg DMA2_INT_TC3: DMA2 Channel3 transfer complete interrupt.
|
|
* @arg DMA2_INT_HT3: DMA2 Channel3 half transfer interrupt.
|
|
* @arg DMA2_INT_TE3: DMA2 Channel3 transfer error interrupt.
|
|
* @arg DMA2_INT_GL4: DMA2 Channel4 global interrupt.
|
|
* @arg DMA2_INT_TC4: DMA2 Channel4 transfer complete interrupt.
|
|
* @arg DMA2_INT_HT4: DMA2 Channel4 half transfer interrupt.
|
|
* @arg DMA2_INT_TE4: DMA2 Channel4 transfer error interrupt.
|
|
* @arg DMA2_INT_GL5: DMA2 Channel5 global interrupt.
|
|
* @arg DMA2_INT_TC5: DMA2 Channel5 transfer complete interrupt.
|
|
* @arg DMA2_INT_HT5: DMA2 Channel5 half transfer interrupt.
|
|
* @arg DMA2_INT_TE5: DMA2 Channel5 transfer error interrupt.
|
|
* @retval The new state of DMAy_IT (SET or RESET).
|
|
*/
|
|
TypeState DMA_GetIntBitState(uint32_t DMAy_INT)
|
|
{
|
|
uint32_t temp = 0;
|
|
|
|
/* Calculate the used DMA */
|
|
if ((DMAy_INT & DMA2_FLAG_Mask) != (uint32_t)RESET) {
|
|
/* Get DMA2 IFR register value */
|
|
temp = DMA2->IFR;
|
|
} else {
|
|
/* Get DMA1 IFR register value */
|
|
temp = DMA1->IFR;
|
|
}
|
|
|
|
/* Check the status of the DMAy interrupt */
|
|
if ((temp & DMAy_INT) != (uint32_t)RESET) {
|
|
/* DMA_INT is set */
|
|
return SET;
|
|
} else {
|
|
/* DMA_INT is reset */
|
|
return RESET;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @brief Clear the DMAy Channelx's interrupt bits.
|
|
* @param DMAy_INT: specify the DMAy interrupt pending bit to clear.
|
|
* This parameter can be any combination (for the same DMA) of the following values:
|
|
* @arg DMA1_INT_GL1: DMA1 Channel1 global interrupt.
|
|
* @arg DMA1_INT_TC1: DMA1 Channel1 transfer complete interrupt.
|
|
* @arg DMA1_INT_HT1: DMA1 Channel1 half transfer interrupt.
|
|
* @arg DMA1_INT_TE1: DMA1 Channel1 transfer error interrupt.
|
|
* @arg DMA1_INT_GL2: DMA1 Channel2 global interrupt.
|
|
* @arg DMA1_INT_TC2: DMA1 Channel2 transfer complete interrupt.
|
|
* @arg DMA1_INT_HT2: DMA1 Channel2 half transfer interrupt.
|
|
* @arg DMA1_INT_TE2: DMA1 Channel2 transfer error interrupt.
|
|
* @arg DMA1_INT_GL3: DMA1 Channel3 global interrupt.
|
|
* @arg DMA1_INT_TC3: DMA1 Channel3 transfer complete interrupt.
|
|
* @arg DMA1_INT_HT3: DMA1 Channel3 half transfer interrupt.
|
|
* @arg DMA1_INT_TE3: DMA1 Channel3 transfer error interrupt.
|
|
* @arg DMA1_INT_GL4: DMA1 Channel4 global interrupt.
|
|
* @arg DMA1_INT_TC4: DMA1 Channel4 transfer complete interrupt.
|
|
* @arg DMA1_INT_HT4: DMA1 Channel4 half transfer interrupt.
|
|
* @arg DMA1_INT_TE4: DMA1 Channel4 transfer error interrupt.
|
|
* @arg DMA1_INT_GL5: DMA1 Channel5 global interrupt.
|
|
* @arg DMA1_INT_TC5: DMA1 Channel5 transfer complete interrupt.
|
|
* @arg DMA1_INT_HT5: DMA1 Channel5 half transfer interrupt.
|
|
* @arg DMA1_INT_TE5: DMA1 Channel5 transfer error interrupt.
|
|
* @arg DMA1_INT_GL6: DMA1 Channel6 global interrupt.
|
|
* @arg DMA1_INT_TC6: DMA1 Channel6 transfer complete interrupt.
|
|
* @arg DMA1_INT_HT6: DMA1 Channel6 half transfer interrupt.
|
|
* @arg DMA1_INT_TE6: DMA1 Channel6 transfer error interrupt.
|
|
* @arg DMA1_INT_GL7: DMA1 Channel7 global interrupt.
|
|
* @arg DMA1_INT_TC7: DMA1 Channel7 transfer complete interrupt.
|
|
* @arg DMA1_INT_HT7: DMA1 Channel7 half transfer interrupt.
|
|
* @arg DMA1_INT_TE7: DMA1 Channel7 transfer error interrupt.
|
|
* @arg DMA2_INT_GL1: DMA2 Channel1 global interrupt.
|
|
* @arg DMA2_INT_TC1: DMA2 Channel1 transfer complete interrupt.
|
|
* @arg DMA2_INT_HT1: DMA2 Channel1 half transfer interrupt.
|
|
* @arg DMA2_INT_TE1: DMA2 Channel1 transfer error interrupt.
|
|
* @arg DMA2_INT_GL2: DMA2 Channel2 global interrupt.
|
|
* @arg DMA2_INT_TC2: DMA2 Channel2 transfer complete interrupt.
|
|
* @arg DMA2_INT_HT2: DMA2 Channel2 half transfer interrupt.
|
|
* @arg DMA2_INT_TE2: DMA2 Channel2 transfer error interrupt.
|
|
* @arg DMA2_INT_GL3: DMA2 Channel3 global interrupt.
|
|
* @arg DMA2_INT_TC3: DMA2 Channel3 transfer complete interrupt.
|
|
* @arg DMA2_INT_HT3: DMA2 Channel3 half transfer interrupt.
|
|
* @arg DMA2_INT_TE3: DMA2 Channel3 transfer error interrupt.
|
|
* @arg DMA2_INT_GL4: DMA2 Channel4 global interrupt.
|
|
* @arg DMA2_INT_TC4: DMA2 Channel4 transfer complete interrupt.
|
|
* @arg DMA2_INT_HT4: DMA2 Channel4 half transfer interrupt.
|
|
* @arg DMA2_INT_TE4: DMA2 Channel4 transfer error interrupt.
|
|
* @arg DMA2_INT_GL5: DMA2 Channel5 global interrupt.
|
|
* @arg DMA2_INT_TC5: DMA2 Channel5 transfer complete interrupt.
|
|
* @arg DMA2_INT_HT5: DMA2 Channel5 half transfer interrupt.
|
|
* @arg DMA2_INT_TE5: DMA2 Channel5 transfer error interrupt.
|
|
* @retval None
|
|
*/
|
|
void DMA_ClearIntBitState(uint32_t DMAy_INT)
|
|
{
|
|
|
|
/* Check the used DMAy */
|
|
if ((DMAy_INT & DMA2_FLAG_Mask) != (uint32_t)RESET) {
|
|
/* Clear the DMA2 interrupt bits */
|
|
DMA2->ICR = DMAy_INT;
|
|
} else {
|
|
/* Clear the DMA1 interrupt bits */
|
|
DMA1->ICR = DMAy_INT;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/**
|
|
* @}
|
|
*/
|