#include "../main/SystemInclude.h" /* 配置DMAMUX(DMA多路复用器) */ 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); } /**------------------------------------------------------------------------ * @brief 中断回调函数注册 * @note * @param * @example: **/ static dma_callbacks_t dma_callbacks[4] = {NULL}; 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) { //获取 EXTI 线对应的 IRQ 号 case DMA_CHANNEL_0: NVIC_EnableIRQ(DMA1_CH0_IRQn); break; case DMA_CHANNEL_1: NVIC_EnableIRQ(DMA1_CH1_IRQn); break; case DMA_CHANNEL_2: case DMA_CHANNEL_3: NVIC_EnableIRQ(DMA1_CH2_CH3_IRQn); break; default: break; // 不支持的通道 } } 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); } 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); } 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); }