2026-03-20 21:16:58 +08:00
|
|
|
|
#include "../main/SystemInclude.h"
|
|
|
|
|
|
|
2026-03-20 21:19:53 +08:00
|
|
|
|
/**------------------------------------------------------------------------
|
|
|
|
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> DMAMUX<EFBFBD><EFBFBD>DMA <EFBFBD><EFBFBD>·<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* @param channel: DMA ͨ<EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD><EFBFBD><EFBFBD> DMA_CHANNEL_0
|
|
|
|
|
|
* @param source: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> REQUEST_SOURCE_ADC0
|
|
|
|
|
|
* @note <EFBFBD>ú<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD> DMA ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD> DMAMUX ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Periodic_Trigger<EFBFBD><EFBFBD>Ĭ<EFBFBD>Ͻ<EFBFBD><EFBFBD>á<EFBFBD>
|
|
|
|
|
|
* @example DMA_DMAMUX_CFG(DMA_CHANNEL_0, REQUEST_SOURCE_ADC0);
|
|
|
|
|
|
**/
|
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:53 +08:00
|
|
|
|
/*-=====================================================================================================
|
|
|
|
|
|
//DMA<4D>жϻص<CFBB>
|
|
|
|
|
|
-=====================================================================================================*/
|
2026-03-20 21:16:58 +08:00
|
|
|
|
|
2026-03-20 21:19:04 +08:00
|
|
|
|
static dma_callbacks_t dma_callbacks[4] = {NULL};
|
|
|
|
|
|
|
2026-03-20 21:19:53 +08:00
|
|
|
|
/**------------------------------------------------------------------------
|
|
|
|
|
|
* @brief ע<EFBFBD><EFBFBD> DMA ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϻص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* @param dmachannel: DMA ͨ<EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD><EFBFBD><EFBFBD> DMA_CHANNEL_0
|
|
|
|
|
|
* @param dma_half_irq_callback: <EFBFBD>봫<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɻص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD>루<EFBFBD><EFBFBD>Ϊ NULL<EFBFBD><EFBFBD>
|
|
|
|
|
|
* @param dma_major_irq_callback: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɻص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD>루<EFBFBD><EFBFBD>Ϊ NULL<EFBFBD><EFBFBD>
|
|
|
|
|
|
* @note <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD>ʹ<EFBFBD>ܶ<EFBFBD>Ӧ<EFBFBD><EFBFBD> NVIC <EFBFBD>жϣ<EFBFBD>
|
|
|
|
|
|
* - CH0 ʹ<EFBFBD><EFBFBD> DMA1_CH0_IRQn
|
|
|
|
|
|
* - CH1 ʹ<EFBFBD><EFBFBD> DMA1_CH1_IRQn
|
|
|
|
|
|
* - CH2/CH3 ʹ<EFBFBD><EFBFBD> DMA1_CH2_CH3_IRQn
|
|
|
|
|
|
* @example DMA_register_irq_callback(DMA_CHANNEL_0, my_half_cb, my_major_cb);
|
|
|
|
|
|
**/
|
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:53 +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:53 +08:00
|
|
|
|
/**------------------------------------------------------------------------
|
|
|
|
|
|
* @brief DMA1 ͨ<EFBFBD><EFBFBD> 0 <EFBFBD>жϷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* @note <EFBFBD>ж<EFBFBD><EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><EFBFBD>봫<EFBFBD><EFBFBD>/<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD>Ӧ<EFBFBD>ص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD>ᣩ<EFBFBD><EFBFBD>
|
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD> 0 <EFBFBD><EFBFBD><EFBFBD>жϱ<EFBFBD>־<EFBFBD><EFBFBD>
|
|
|
|
|
|
**/
|
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:53 +08:00
|
|
|
|
/**------------------------------------------------------------------------
|
|
|
|
|
|
* @brief DMA1 ͨ<EFBFBD><EFBFBD> 1 <EFBFBD>жϷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* @note <EFBFBD>ж<EFBFBD><EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><EFBFBD>봫<EFBFBD><EFBFBD>/<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD>Ӧ<EFBFBD>ص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD>ᣩ<EFBFBD><EFBFBD>
|
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD> 1 <EFBFBD><EFBFBD><EFBFBD>жϱ<EFBFBD>־<EFBFBD><EFBFBD>
|
|
|
|
|
|
**/
|
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:53 +08:00
|
|
|
|
/**------------------------------------------------------------------------
|
|
|
|
|
|
* @brief DMA1 ͨ<EFBFBD><EFBFBD> 2 <EFBFBD><EFBFBD> 3 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* @note <EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD> 2 <EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD> 3 <EFBFBD><EFBFBD><EFBFBD>жϱ<EFBFBD>־<EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>
|
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD>Ӧͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD><EFBFBD>Ļص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϱ<EFBFBD>־<EFBFBD><EFBFBD>
|
|
|
|
|
|
**/
|
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);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|