From ae079c1fc5d990ba55714d4b3a51b19f96edaec4 Mon Sep 17 00:00:00 2001
From: WXK <287788329@qq.com>
Date: 星期四, 24 四月 2025 16:01:43 +0800
Subject: [PATCH] 改为中断来低电平触发发送当前扫描数据,3s内扫描不到的会退出,串口来55 AA 75 70 64 61 74 65,进入升级模式

---
 01_SDK/modules/hal/panchip/panplat/pan1070/bsp/peripheral/src/pan_hal_dmac.c |   78 +++++++++++++++++++++++++--------------
 1 files changed, 50 insertions(+), 28 deletions(-)

diff --git a/01_SDK/modules/hal/panchip/panplat/pan1070/bsp/peripheral/src/pan_hal_dmac.c b/01_SDK/modules/hal/panchip/panplat/pan1070/bsp/peripheral/src/pan_hal_dmac.c
index 8ed6e84..b182c57 100644
--- a/01_SDK/modules/hal/panchip/panplat/pan1070/bsp/peripheral/src/pan_hal_dmac.c
+++ b/01_SDK/modules/hal/panchip/panplat/pan1070/bsp/peripheral/src/pan_hal_dmac.c
@@ -19,8 +19,8 @@
     .TransferType    = DMAC_TransferType_Per2Mem,
     // Destination config (Memory)
     .AddrChangeDst   = DMAC_AddrChange_Increment,
-    .BurstLenDst     = DMAC_BurstLen_4,
-    .DataWidthDst    = DMAC_DataWidth_32,
+    .BurstLenDst     = DMAC_BurstLen_8,
+    .DataWidthDst    = DMAC_DataWidth_8,
     .HandshakeDst    = DMAC_Handshake_Default,
     // Source config (Peripheral)
     .AddrChangeSrc   = DMAC_AddrChange_NoChange,
@@ -103,11 +103,10 @@
     /*set tx dma channel control&config register*/
     .AddrChangeDst   = DMAC_AddrChange_NoChange,
     .AddrChangeSrc   = DMAC_AddrChange_Increment,
-    .BurstLenDst     = DMAC_BurstLen_4,
-    .BurstLenSrc     = DMAC_BurstLen_4,
+    .BurstLenDst     = DMAC_BurstLen_1,
+    .BurstLenSrc     = DMAC_BurstLen_1,
     .DataWidthDst    = DMAC_DataWidth_8,
-    // .DataWidthDst    = DMAC_DataWidth_16,
-    .DataWidthSrc    = DMAC_DataWidth_32,
+    .DataWidthSrc    = DMAC_DataWidth_8,
     .TransferType    = DMAC_TransferType_Mem2Per,
     .FlowControl     = DMAC_FlowControl_DMA,
     .HandshakeDst    = DMAC_Handshake_Hardware,
@@ -121,11 +120,10 @@
     /*set tx dma channel control&config register*/
     .AddrChangeDst   = DMAC_AddrChange_NoChange,
     .AddrChangeSrc   = DMAC_AddrChange_Increment,
-    .BurstLenDst     = DMAC_BurstLen_4,
-    .BurstLenSrc     = DMAC_BurstLen_4,
-    //.DataWidthDst    = DMAC_DataWidth_8,
+    .BurstLenDst     = DMAC_BurstLen_1,
+    .BurstLenSrc     = DMAC_BurstLen_1,
     .DataWidthDst    = DMAC_DataWidth_16,
-    .DataWidthSrc    = DMAC_DataWidth_32,
+    .DataWidthSrc    = DMAC_DataWidth_16,
     .TransferType    = DMAC_TransferType_Mem2Per,
     .FlowControl     = DMAC_FlowControl_DMA,
     .HandshakeDst    = DMAC_Handshake_Hardware,
@@ -143,8 +141,7 @@
     .AddrChangeSrc   = DMAC_AddrChange_NoChange,
     .BurstLenDst     = DMAC_BurstLen_4,
     .BurstLenSrc     = DMAC_BurstLen_4,
-    //.DataWidthDst    = DMAC_DataWidth_8,
-    .DataWidthDst    = DMAC_DataWidth_32,
+    .DataWidthDst    = DMAC_DataWidth_8,
     .DataWidthSrc    = DMAC_DataWidth_8,
     .TransferType    = DMAC_TransferType_Per2Mem,
     .FlowControl     = DMAC_FlowControl_DMA,
@@ -180,44 +177,61 @@
     NVIC_EnableIRQ(DMA_IRQn);
 }
 
-void DMA_IRQHandler(void)
+__WEAK void DMA_IRQHandlerOverlay(void)
 {
+    int16_t remaind_cnt;
+
     /* Handle DMA Transfer Complete Interrupt */
     if (DMAC_CombinedIntStatus(DMA, DMAC_FLAG_MASK_TFR))
     {
-        for (int i = 0; i < 3; i++)
+        for (int i = 0; i < DMAC_CHANNEL_NUMS; i++)
         {
             if (DMAC_IntFlag(DMA, i, DMAC_FLAG_INDEX_TFR))
             {
-                DMAC_Channel_Array[i].XferFlag = true;
                 DMAC_ClrIntFlag(DMA, i, DMAC_FLAG_INDEX_TFR);
-
-//                DMAC_Channel_Array[i].StopFlag =true;
-                /* Release DMA Rx channel */
-                DMAC_ReleaseChannel(DMA, i);
 
                 switch (DMAC_Channel_Array[i].PeriMode)
                 {
                 case DMAC_Peri_UART:
-                    if (DMAC_Channel_Array[i].CallbackUart != NULL)
+                    DMAC_Channel_Array[i].XferCount += DMAC_GetXferredBlockCount(DMA, i);
+                    remaind_cnt = DMAC_Channel_Array[i].XferSize - DMAC_Channel_Array[i].XferCount;
+                    if (remaind_cnt > 0)
                     {
-                        DMAC_Channel_Array[i].CallbackUart(UART_CB_FLAG_DMA, (uint8_t *)DMAC_Channel_Array[i].pBuffPtr,
-                                                           DMAC_Channel_Array[i].XferSize);
+                        if (remaind_cnt < 1024)
+                        {
+                            DMAC_ContinueChannel(DMA, i, remaind_cnt);
+                        }
+                        else
+                        {
+                            DMAC_ContinueChannel(DMA, i, 1023);
+                        }
+                    }
+                    else
+                    {
+                        if (DMAC_Channel_Array[i].CallbackUart != NULL)
+                        {
+                            if (DMAC_Channel_Array[i].ConfigTmp.TransferType == DMAC_TransferType_Per2Mem)
+                            {
+                                ((HAL_UART_HandleTypeDef*)DMAC_Channel_Array[i].periph)->isRxBusy = false;
+                            }
+                            else if (DMAC_Channel_Array[i].ConfigTmp.TransferType == DMAC_TransferType_Mem2Per)
+                            {
+                                ((HAL_UART_HandleTypeDef*)DMAC_Channel_Array[i].periph)->isTxBusy = false;
+                            }
+                            DMAC_Channel_Array[i].CallbackUart(UART_CB_FLAG_DMA, (uint8_t *)DMAC_Channel_Array[i].pBuffPtr,
+                                                               DMAC_Channel_Array[i].XferCount);
+                        }
                     }
                     break;
                 case DMAC_Peri_I2C:
+                    DMAC_ReleaseChannel(DMA, i);
                     if (DMAC_Channel_Array[i].CallbackI2c != NULL)
                     {
                         DMAC_Channel_Array[i].CallbackI2c(I2C_CB_FLAG_DMA, (uint8_t *)DMAC_Channel_Array[i].pBuffPtr,
                                                           DMAC_Channel_Array[i].XferSize);
                     }
-                case DMAC_Peri_ADC:
-                    if (DMAC_Channel_Array[i].CallbackAdc!= NULL)
-                    {
-                        DMAC_Channel_Array[i].CallbackAdc(ADC_CB_FLAG_DMA, DMAC_Channel_Array[i].pBuffPtr,
-                                                          DMAC_Channel_Array[i].XferSize);
-                    }
                 case DMAC_Peri_SPI:
+                    DMAC_ReleaseChannel(DMA, i);
                     if (DMAC_Channel_Array[i].CallbackSpi!= NULL)
                     {
                         DMAC_Channel_Array[i].CallbackSpi(SPI_CB_FLAG_DMA, (uint16_t *)DMAC_Channel_Array[i].pBuffPtr,
@@ -285,3 +299,11 @@
     }
 }
 
+void DMA_IRQHandler(void)
+{
+    PAN_IO_TIMING_TRACK_LEVEL(CONFIG_TRACK_PIN_DMA_IRQ, 1);
+
+    DMA_IRQHandlerOverlay();
+
+    PAN_IO_TIMING_TRACK_LEVEL(CONFIG_TRACK_PIN_DMA_IRQ, 0);
+}

--
Gitblit v1.9.3