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