Files
CHJ/user/MCU/lhl_dma.c

101 lines
3.0 KiB
C
Raw Normal View History

2026-03-20 21:16:58 +08:00
#include "../main/SystemInclude.h"
2026-03-20 21:19:04 +08:00
/* <20><><EFBFBD><EFBFBD>DMAMUX<55><58>DMA<4D><41>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
2026-03-20 21:16:58 +08:00
void DMA_DMAMUX_CFG(DMA_CHANNEL_t channel,DMAMUX_REQ_SRC_t source)
{
DMAMUX_InitTypeDef DMAMUX_InitStructure;
DMAMUX_InitStructure.DMA_Channel = channel;
DMAMUX_InitStructure.Request_Source = source;
DMAMUX_InitStructure.Periodic_Trigger = DISABLE;
DMAMUX_InitStructure.Cmd = ENABLE;
LHL_DMAMUX_Init(&DMAMUX_InitStructure);
}
2026-03-20 21:19:04 +08:00
2026-03-20 21:16:58 +08:00
/**------------------------------------------------------------------------
2026-03-20 21:19:04 +08:00
* @brief <EFBFBD>жϻص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD>
* @note
* @param
* @example:
**/
static dma_callbacks_t dma_callbacks[4] = {NULL};
2026-03-20 21:16:58 +08:00
void DMA_register_irq_callback(DMA_CHANNEL_t dmachannel, dma_half_irq_callback_t dma_half_irq_callback ,dma_major_irq_callback_t dma_major_irq_callback)
{
dma_callbacks[dmachannel].half_callback = dma_half_irq_callback;
dma_callbacks[dmachannel].major_callback = dma_major_irq_callback;
switch (dmachannel) { //<2F><>ȡ EXTI <20>߶<EFBFBD>Ӧ<EFBFBD><D3A6> IRQ <20><>
case DMA_CHANNEL_0: NVIC_EnableIRQ(DMA1_CH0_IRQn); break;
2026-03-20 21:19:04 +08:00
case DMA_CHANNEL_1: NVIC_EnableIRQ(DMA1_CH1_IRQn); break;
2026-03-20 21:16:58 +08:00
case DMA_CHANNEL_2:
case DMA_CHANNEL_3:
NVIC_EnableIRQ(DMA1_CH2_CH3_IRQn); break;
default: break; // <20><>֧<EFBFBD>ֵ<EFBFBD>ͨ<EFBFBD><CDA8>
}
}
2026-03-20 21:19:04 +08:00
2026-03-20 21:16:58 +08:00
void DMA1_CH0_IRQHandler(void)
{
if(LHL_DMA_GetPending(DMA_CHANNEL_0) == DMA_IT_HALF) {
if(dma_callbacks[DMA_CHANNEL_0].half_callback != NULL) {
dma_callbacks[DMA_CHANNEL_0].half_callback();
}
} else if(LHL_DMA_GetPending(DMA_CHANNEL_0) == DMA_IT_MAJOR) {
if(dma_callbacks[DMA_CHANNEL_0].major_callback != NULL) {
dma_callbacks[DMA_CHANNEL_0].major_callback();
}
}
LHL_DMA_ClearPending(DMA_CHANNEL_0);
}
2026-03-20 21:19:04 +08:00
2026-03-20 21:16:58 +08:00
void DMA1_CH1_IRQHandler(void)//
{
if(LHL_DMA_GetPending(DMA_CHANNEL_1) == DMA_IT_HALF) {
if(dma_callbacks[DMA_CHANNEL_1].half_callback != NULL) {
dma_callbacks[DMA_CHANNEL_1].half_callback();
}
} else if(LHL_DMA_GetPending(DMA_CHANNEL_1) == DMA_IT_MAJOR) {
if(dma_callbacks[DMA_CHANNEL_1].major_callback != NULL) {
dma_callbacks[DMA_CHANNEL_1].major_callback();
}
}
LHL_DMA_ClearPending(DMA_CHANNEL_1);
}
2026-03-20 21:19:04 +08:00
2026-03-20 21:16:58 +08:00
void DMA1_CH2_3_IRQHandler(void)
{
if(LHL_DMA_GetPending(DMA_CHANNEL_2) == DMA_IT_HALF) {
if(dma_callbacks[DMA_CHANNEL_2].half_callback != NULL) {
dma_callbacks[DMA_CHANNEL_2].half_callback();
}
} else if(LHL_DMA_GetPending(DMA_CHANNEL_2) == DMA_IT_MAJOR) {
if(dma_callbacks[DMA_CHANNEL_2].major_callback != NULL) {
dma_callbacks[DMA_CHANNEL_2].major_callback();
}
}
if(LHL_DMA_GetPending(DMA_CHANNEL_3) == DMA_IT_HALF) {
if(dma_callbacks[DMA_CHANNEL_3].half_callback != NULL) {
dma_callbacks[DMA_CHANNEL_3].half_callback();
}
} else if(LHL_DMA_GetPending(DMA_CHANNEL_3) == DMA_IT_MAJOR) {
if(dma_callbacks[DMA_CHANNEL_3].major_callback != NULL) {
dma_callbacks[DMA_CHANNEL_3].major_callback();
}
}
LHL_DMA_ClearPending(DMA_CHANNEL_2);
LHL_DMA_ClearPending(DMA_CHANNEL_3);
}