136 lines
5.5 KiB
C
136 lines
5.5 KiB
C
#ifndef __DMA_H__
|
||
#define __DMA_H__
|
||
|
||
/**
|
||
* @brief 清除DMA传输完成标志
|
||
* @param {DMA_HandleTypeDef} *DMAX DMA总线句柄
|
||
* @param {uint32_t} CHx DMA通道号
|
||
* @return {*} 操作结果
|
||
* @note: 该宏用于清除DMA总线的传输完成标志。它首先检查DMA总线的传输完成标志是否已置位,如果已置位,则清除该标志。
|
||
*/
|
||
#define DMA_ClEAR_FLAG_TC(DMAX, CHx) \
|
||
do \
|
||
{ \
|
||
if (LL_DMA_IsActiveFlag_TC##CHx(DMAX)) \
|
||
{ \
|
||
LL_DMA_ClearFlag_TC##CHx(DMAX); \
|
||
} \
|
||
} while (__LINE__ == -1)
|
||
|
||
/**
|
||
* @brief 清除DMA传输错误标志
|
||
* @param {DMA_HandleTypeDef} *DMAX DMA总线句柄
|
||
* @param {uint32_t} CHx DMA通道号
|
||
* @return {*} 操作结果
|
||
* @note: 该宏用于清除DMA总线的传输错误标志。它首先检查DMA总线的传输错误标志是否已置位,如果已置位,则清除该标志。
|
||
*/
|
||
#define DMA_ClEAR_FLAG_TE(DMAX, CHx) \
|
||
do \
|
||
{ \
|
||
if (LL_DMA_IsActiveFlag_TE##CHx(DMAX)) \
|
||
{ \
|
||
LL_DMA_ClearFlag_TE##CHx(DMAX); \
|
||
} \
|
||
} while (__LINE__ == -1)
|
||
|
||
/**
|
||
* @file uarts.c
|
||
* @brief This file contains the implementation of DMA_CLEAR_FLAG_TC_CHANNEL macro.
|
||
*/
|
||
|
||
/**
|
||
* @brief Clear the Transfer Complete (TC) flag of a specific DMA channel.
|
||
*
|
||
* @param dma The DMA peripheral.
|
||
* @param channel The DMA channel number.
|
||
*/
|
||
#define DMA_CLEAR_FLAG_TC_CHANNEL(dma, channel) \
|
||
switch (channel) \
|
||
{ \
|
||
case LL_DMA_CHANNEL_1: \
|
||
DMA_ClEAR_FLAG_TC(dma, 1); \
|
||
break; \
|
||
case LL_DMA_CHANNEL_2: \
|
||
DMA_ClEAR_FLAG_TC(dma, 2); \
|
||
break; \
|
||
case LL_DMA_CHANNEL_3: \
|
||
DMA_ClEAR_FLAG_TC(dma, 3); \
|
||
break; \
|
||
case LL_DMA_CHANNEL_4: \
|
||
DMA_ClEAR_FLAG_TC(dma, 4); \
|
||
break; \
|
||
case LL_DMA_CHANNEL_5: \
|
||
DMA_ClEAR_FLAG_TC(dma, 5); \
|
||
break; \
|
||
case LL_DMA_CHANNEL_6: \
|
||
DMA_ClEAR_FLAG_TC(dma, 6); \
|
||
break; \
|
||
case LL_DMA_CHANNEL_7: \
|
||
DMA_ClEAR_FLAG_TC(dma, 7); \
|
||
break; \
|
||
default: \
|
||
break; \
|
||
}
|
||
|
||
/**
|
||
* @brief Clear the Transfer Error (TE) flag for the specified DMA channel.
|
||
*
|
||
* @param dma The DMA peripheral.
|
||
* @param channel The DMA channel number.
|
||
*/
|
||
#define DMA_CLEAR_FLAG_TE_CHANNEL(dma, channel) \
|
||
switch (channel) \
|
||
{ \
|
||
case 1: \
|
||
DMA_ClEAR_FLAG_TE(dma, 1); \
|
||
break; \
|
||
case 2: \
|
||
DMA_ClEAR_FLAG_TE(dma, 2); \
|
||
break; \
|
||
case 3: \
|
||
DMA_ClEAR_FLAG_TE(dma, 3); \
|
||
break; \
|
||
case 4: \
|
||
DMA_ClEAR_FLAG_TE(dma, 4); \
|
||
break; \
|
||
case 5: \
|
||
DMA_ClEAR_FLAG_TE(dma, 5); \
|
||
break; \
|
||
case 6: \
|
||
DMA_ClEAR_FLAG_TE(dma, 6); \
|
||
break; \
|
||
case 7: \
|
||
DMA_ClEAR_FLAG_TE(dma, 7); \
|
||
break; \
|
||
default: \
|
||
break; \
|
||
}
|
||
|
||
/**
|
||
* @brief Clears the flags of a DMA channel
|
||
* @param DMAX DMAx register base
|
||
* @param CHx DMA channel number
|
||
* @param Flag a boolean variable that indicates if the transfer is complete
|
||
* @note This function should be called within the interrupt service routine of the DMA channel
|
||
*/
|
||
#define DMA_ClEAR_FLAG(DMAX, CHx, Flag) \
|
||
do \
|
||
{ \
|
||
if (LL_DMA_IsActiveFlag_TC##CHx(DMAX)) \
|
||
{ \
|
||
LL_DMA_ClearFlag_TC##CHx(DMAX); \
|
||
LL_DMA_ClearFlag_GI##CHx(DMAX); \
|
||
Flag = TRUE; \
|
||
} \
|
||
if (LL_DMA_IsActiveFlag_TE##CHx(DMAX)) \
|
||
{ \
|
||
LL_DMA_ClearFlag_TE##CHx(DMAX); \
|
||
} \
|
||
if (LL_DMA_IsActiveFlag_GI##CHx(DMAX)) \
|
||
{ \
|
||
LL_DMA_ClearFlag_GI##CHx(DMAX); \
|
||
} \
|
||
} while (__LINE__ == -1)
|
||
|
||
#endif // __DMA_H__
|