Files
CHJ/user/MCU/lhl_dma.c
2026-03-20 21:19:04 +08:00

101 lines
3.0 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "../main/SystemInclude.h"
/* 配置DMAMUXDMA多路复用器 */
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);
}