Procházet zdrojové kódy

feat(Api_rt_uart):串口抽象测试完成。捕获待测试

CN\zhangkai71 před 2 roky
rodič
revize
56779b3cd7

+ 58 - 42
User project/1.FrameLayer/Source/gd32f30x_it.c

@@ -264,27 +264,29 @@ void TIMER5_IRQHandler(void)
 */
 void DMA1_Channel2_IRQHandler(void)
 {
-    static UWORD uwTempCount = 0;
-    /* Read PC Conmand */
-    if (dma_flag_get(DMA1, DMA_CH2, DMA_INT_FLAG_FTF) != 0)
-    {
-        UART_voCBDoneRead(UART_ERR_OK, 22);
-        DMA_CH2CTL(DMA1) &= ~DMA_CHXCTL_CHEN;
-        //dma_flag_clear(DMA1, DMA_CH2, DMA_INT_FLAG_FTF);
-        DMA_INTC(DMA1) |= DMA_FLAG_ADD(DMA_INT_FLAG_FTF, DMA_CH2);
-        uwTempCount = 22 - DMA_CH2CNT(DMA1);  
-        DMA_CH2CNT(DMA1) = uwTempCount;
-        DMA_CH2CTL(DMA1) |= DMA_CHXCTL_CHEN;
-    }
-    /* RX error */
-    if (dma_flag_get(DMA1, DMA_CH2, DMA_FLAG_ERR) != 0)
-    {
-        DMA_CH2CTL(DMA1) &= ~DMA_CHXCTL_CHEN;
-        //dma_flag_clear(DMA1, DMA_CH2, DMA_FLAG_ERR);
-        DMA_INTC(DMA1) |= DMA_FLAG_ADD(DMA_FLAG_ERR, DMA_CH2); 
-        DMA_CH2CNT(DMA1) = 22;
-        DMA_CH2CTL(DMA1) |= DMA_CHXCTL_CHEN;
-    }
+
+    
+    iRtUart_RxIsr(0);
+//    /* Read PC Conmand */
+//    if (dma_flag_get(DMA1, DMA_CH2, DMA_INT_FLAG_FTF) != 0)
+//    {
+//        UART_voCBDoneRead(UART_ERR_OK, 22);
+//        DMA_CH2CTL(DMA1) &= ~DMA_CHXCTL_CHEN;
+//        //dma_flag_clear(DMA1, DMA_CH2, DMA_INT_FLAG_FTF);
+//        DMA_INTC(DMA1) |= DMA_FLAG_ADD(DMA_INT_FLAG_FTF, DMA_CH2);
+//        uwTempCount = 22 - DMA_CH2CNT(DMA1);  
+//        DMA_CH2CNT(DMA1) = uwTempCount;
+//        DMA_CH2CTL(DMA1) |= DMA_CHXCTL_CHEN;
+//    }
+//    /* RX error */
+//    if (dma_flag_get(DMA1, DMA_CH2, DMA_FLAG_ERR) != 0)
+//    {
+//        DMA_CH2CTL(DMA1) &= ~DMA_CHXCTL_CHEN;
+//        //dma_flag_clear(DMA1, DMA_CH2, DMA_FLAG_ERR);
+//        DMA_INTC(DMA1) |= DMA_FLAG_ADD(DMA_FLAG_ERR, DMA_CH2); 
+//        DMA_CH2CNT(DMA1) = 22;
+//        DMA_CH2CTL(DMA1) |= DMA_CHXCTL_CHEN;
+//    }
 }
 
 
@@ -296,35 +298,49 @@ void DMA1_Channel2_IRQHandler(void)
 */
 void DMA1_Channel4_IRQHandler(void)
 {
+    /* USER CODE BEGIN DMA1_Channel2_3_IRQn 0 */
+
     if (dma_flag_get(DMA1, DMA_CH4, DMA_INT_FLAG_FTF) != 0)
     {
-        if (UART_stParaStatus.bParaStart)
-        {
-            UART_bInsertPendTx = FALSE;           // clear insertBuffer pending
-            UART_stParaStatus.bParaStart = FALSE; // clear parameter status
-        }
-        else
-        {
-            // do nothing
-        }
-        DMA_CH4CTL(DMA1) &= ~DMA_CHXCTL_CHEN;
-        //dma_flag_clear(DMA1, DMA_CH4, DMA_INT_FLAG_FTF);
+        iRtUart_AsyncWriteCompleteIsr(0);
         DMA_INTC(DMA1) |= DMA_FLAG_ADD(DMA_INT_FLAG_FTF, DMA_CH4);
-        UART_stParaStatus.bWriteBusy = FALSE;
     }
-    /*  TX error */
+    // TX error
     if (dma_flag_get(DMA1, DMA_CH4, DMA_FLAG_ERR) != 0)
     {
-        if (UART_stParaStatus.bParaStart)
-        {
-            UART_bInsertPendTx = FALSE;           // clear insertBuffer pending
-            UART_stParaStatus.bParaStart = FALSE; // clear parameter status
-        }
-        DMA_CH4CTL(DMA1) &= ~DMA_CHXCTL_CHEN;
-        //dma_flag_clear(DMA1, DMA_CH4, DMA_FLAG_ERR);
+        iRtUart_AsyncWriteErrorIsr(0);
         DMA_INTC(DMA1) |= DMA_FLAG_ADD(DMA_FLAG_ERR, DMA_CH4); 
-        UART_stParaStatus.bWriteBusy = FALSE;
     }
+  
+//    if (dma_flag_get(DMA1, DMA_CH4, DMA_INT_FLAG_FTF) != 0)
+//    {
+//        if (UART_stParaStatus.bParaStart)
+//        {
+//            UART_bInsertPendTx = FALSE;           // clear insertBuffer pending
+//            UART_stParaStatus.bParaStart = FALSE; // clear parameter status
+//        }
+//        else
+//        {
+//            // do nothing
+//        }
+//        DMA_CH4CTL(DMA1) &= ~DMA_CHXCTL_CHEN;
+//        //dma_flag_clear(DMA1, DMA_CH4, DMA_INT_FLAG_FTF);
+//        DMA_INTC(DMA1) |= DMA_FLAG_ADD(DMA_INT_FLAG_FTF, DMA_CH4);
+//        UART_stParaStatus.bWriteBusy = FALSE;
+//    }
+//    /*  TX error */
+//    if (dma_flag_get(DMA1, DMA_CH4, DMA_FLAG_ERR) != 0)
+//    {
+//        if (UART_stParaStatus.bParaStart)
+//        {
+//            UART_bInsertPendTx = FALSE;           // clear insertBuffer pending
+//            UART_stParaStatus.bParaStart = FALSE; // clear parameter status
+//        }
+//        DMA_CH4CTL(DMA1) &= ~DMA_CHXCTL_CHEN;
+//        //dma_flag_clear(DMA1, DMA_CH4, DMA_FLAG_ERR);
+//        DMA_INTC(DMA1) |= DMA_FLAG_ADD(DMA_FLAG_ERR, DMA_CH4); 
+//        UART_stParaStatus.bWriteBusy = FALSE;
+//    }
 }
 /*!
     \brief      

+ 3 - 1
User project/1.FrameLayer/Source/main.c

@@ -118,7 +118,9 @@ int main(void) /* parasoft-suppress GJB5369-4_2_1_10 "mismatch" */
             sysfsm_stFlg.blCtrlMdVarClcOvrFlg = TRUE;
         }
         CanRx_Process();
+        ReadFrame_Poll2();
         uart_voMainDec();
+
         TimingTaskLoopServer();
 
         if(cp_stFlg.SpiOffsetFirstSetFinishFlg == TRUE && switch_flg.SysRun_Flag == FALSE && cp_stFlg.SpiOffsetFirstSetFlg==0 && FSM2nd_Run_state.state == Exit)
@@ -659,7 +661,7 @@ void mn_voSoftwareInit(void)
     adc_voSampleInit();
     adc_voSampleCoef(&adc_stCof);
     /* UART init */
-    uart_voApplInit();
+//    uart_voApplInit();
     uart_voMonitorInit();
 }
 

+ 2 - 2
User project/1.FrameLayer/Source/sys_task.c

@@ -1,4 +1,4 @@
-#include "uart_monitor_appl.h"
+#include "uart_monitor.h"
 #include "sys_task.h"
 #include "CodePara.h"
 #include "STLmain.h"
@@ -12,7 +12,7 @@ void SysTask1Ms()
     clas_ubSystickFlg = 1; 
     stl_voSystickProc();
     /* UART Timeout */
-    UART_voApplTimer();
+    uart_voApplTimer();
 
 }
 

+ 3 - 3
User project/1.FrameLayer/Source/tbc.c

@@ -50,7 +50,7 @@ UWORD timer1cnt;
 void tbc_voUpIsr(void)
 {
     /* Uart Monitor */
-    UART_voAppMonitor();
+    uart_voAppMonitor();
     timer1cnt = TIMER_CNT(TIMER1);
     /* Motor Position Cal */
     if( cp_stFlg.ThetaGetModelSelect == ANG_RESOLVER )
@@ -108,8 +108,8 @@ void tbc_voDownIsr(void)
     }
     alm_stIn.uwIPMTempCe = adc_stUpOut.PCBTemp;
     alm_stIn.uwIdcOffset = adc_stCof.uwIdcOffset;
-    alm_stIn.swDrumSpdAbsNowRpm = uart_swDrumSpdAbsNowRpm;
-    alm_stIn.swDrumSpdAbsPreRpm = uart_swDrumSpdAbsPreRpm;
+//    alm_stIn.swDrumSpdAbsNowRpm = uart_swDrumSpdAbsNowRpm;
+//    alm_stIn.swDrumSpdAbsPreRpm = uart_swDrumSpdAbsPreRpm;
     alm_stIn.blSpiThetaFltFlg = spi_stResolverOut.blSpiThetaFltFlg;
     alm_voDetecTBC(&alm_stIn, &alm_stDetectTbcCoef);
     

+ 0 - 141
User project/2.MotorDrive/Include/uart_appl.h

@@ -1,141 +0,0 @@
-/************************************************************************
- Project:             Welling Motor Control Paltform
- Filename:            uart_appl.h
- Partner Filename:    uart_appl.c
- Description:         The header file of uart_appl.c
- Complier:            IAR Embedded Workbench for ARM 7.80.4
- CPU TYPE :           GD32F30x
-*************************************************************************
- Copyright (c) 2018 Welling Motor Technology(Shanghai) Co. Ltd.
- All rights reserved.
-*************************************************************************
-*************************************************************************
- Revising History (ECL of this file):
-
-************************************************************************/
-
-/************************************************************************
- Beginning of File, do not put anything above here except notes
- Compiler Directives
-************************************************************************/
-#ifndef UART_APPL_H
-#define UART_APPL_H
-/************************************************************************
- Compiler Directives (N/A)
-*************************************************************************/
-#ifdef _UART_APPL_C_
-#define _UART_APPL_C_EXT
-#else
-#define _UART_APPL_C_EXT extern
-#endif
-/************************************************************************
- Definitions & Macros
-*************************************************************************/
-#define UART_ACK_BUFFER_SIZE    24
-#define UART_HOST_TIMEOUT_COUNT 6000 // Timeout == 6sec
-#define UART_ACK_BUFFER_DEFAULT                                                      \
-    {                                                                                \
-        0xB2, 0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 \
-    } // Default value of UART_ACK_BUFFER
-/************************************************************************
- TypeDefs & Structure defines (N/A)
-*************************************************************************/
-
-/************************************************************************
- Exported Variables
-*************************************************************************/
-#ifdef _UART_APPL_C_
-//******************************* Data Interface ***************************************************
-_UART_APPL_C_EXT BOOL uart_commandEN =
-    FALSE; // LittleSwan protocol stipulates that when the correct Ping commmand(motorNum !=0) is received then other command can be reponsed.
-_UART_APPL_C_EXT BOOL       uart_FCTcommandEN = FALSE; // ly180403
-_UART_APPL_C_EXT FlagStatus uart_blDrumTestOkFlg = RESET;
-_UART_APPL_C_EXT UWORD      uart_uwDrumTestEn = 0;
-_UART_APPL_C_EXT FlagStatus uart_blTimeoutFlg = RESET;   // when Ping command receied, enable timeout count.
-_UART_APPL_C_EXT UWORD      uart_uwTimeoutCnts = 0;      // reset timeout counter everytime any commmand received.
-_UART_APPL_C_EXT SWORD      uart_swDrumSpdAbsNowRpm = 0; // present effected drum speed command mirror
-_UART_APPL_C_EXT SWORD      uart_swDrumSpdAbsPreRpm = 0; // previous effected drum speed commmand mirror
-//----------- ACK(response) value Interface ------------
-_UART_APPL_C_EXT SWORD uart_swDrumSpdNowRpm = 0; // present effected drum speed command
-_UART_APPL_C_EXT SWORD uart_swDrumSpdPreRpm = 0; // previous effected drum speed commmand
-_UART_APPL_C_EXT UWORD uart_uwSoftwareVer = 0x0000;
-_UART_APPL_C_EXT UBYTE uart_ubMotorID = 0x00;
-_UART_APPL_C_EXT UBYTE uart_ubMotorTemp = 0x00;
-_UART_APPL_C_EXT SBYTE uart_sbIPMtemp = 0x00;
-_UART_APPL_C_EXT UWORD uart_uwFaultCode = 0x0000;
-_UART_APPL_C_EXT SWORD uart_swDrumSpdRpm = -100;
-_UART_APPL_C_EXT SBYTE uart_sbPhaseUCurrentA = 0;
-_UART_APPL_C_EXT UWORD uart_uwBusVoltageV = 310;
-//----------- Command value Interface ------------
-_UART_APPL_C_EXT SWORD uart_swDrumSpdCmdRpm = 0;
-_UART_APPL_C_EXT SWORD uart_swDrumSpdCmdPreRpm = 0;
-_UART_APPL_C_EXT UBYTE uart_ubAckBuffer[UART_ACK_BUFFER_SIZE] = UART_ACK_BUFFER_DEFAULT;
-_UART_APPL_C_EXT UBYTE uart_ubData1 = 0; // Reserved
-_UART_APPL_C_EXT UBYTE uart_ubPlatform = 0x00;
-_UART_APPL_C_EXT UWORD uart_uwLoadTested = 0;
-_UART_APPL_C_EXT UWORD uart_uwLoadDef = 0;
-_UART_APPL_C_EXT UWORD *uart_ptuwLoad = &uart_uwLoadDef;
-_UART_APPL_C_EXT UWORD  uart_uwACCtimeTs = 10;
-_UART_APPL_C_EXT UWORD  uart_uwACCtimePreTs = 10;
-_UART_APPL_C_EXT SWORD  uart_swDrumACCRpmps = 130;
-_UART_APPL_C_EXT SWORD  uart_swMotorACCRpmps = 1500;
-_UART_APPL_C_EXT BOOL   uart_bCommOvrTmFlg = FALSE;
-_UART_APPL_C_EXT SWORD  uart_swMotorStopCnt = 0;
-
-_UART_APPL_C_EXT UWORD uart_uwFTbsHz = 4000;
-_UART_APPL_C_EXT SLONG uart_slSpdRefRpm = 0;
-_UART_APPL_C_EXT SWORD uart_swTorqRefNm = 0;
-#else
-_UART_APPL_C_EXT BOOL uart_commandEN; // LittleSwan protocol stipulates that when the correct Ping commmand(motorNum !=0) is received then other
-                                      // command can be reponsed.
-_UART_APPL_C_EXT FlagStatus uart_blDrumTestOkFlg;
-_UART_APPL_C_EXT UBYTE      uart_ubPlatform;
-_UART_APPL_C_EXT UWORD      uart_uwLoadTested;
-_UART_APPL_C_EXT UWORD      uart_uwLoadDef;
-_UART_APPL_C_EXT UWORD *    uart_ptuwLoad;
-_UART_APPL_C_EXT SWORD      uart_swDrumSpdAbsNowRpm;
-_UART_APPL_C_EXT SWORD      uart_swDrumSpdAbsPreRpm;
-_UART_APPL_C_EXT UWORD      uart_uwDrumTestEn;
-_UART_APPL_C_EXT UWORD      uart_uwACCtimeTs;
-_UART_APPL_C_EXT UWORD      uart_uwACCtimePreTs;
-_UART_APPL_C_EXT FlagStatus uart_blTimeoutFlg;
-_UART_APPL_C_EXT UWORD      uart_uwTimeoutCnts;
-_UART_APPL_C_EXT BOOL       uart_bCommOvrTmFlg;
-_UART_APPL_C_EXT SWORD      uart_swMotorStopCnt;
-_UART_APPL_C_EXT SWORD      uart_swDrumSpdNowRpm; // present effected drum speed command
-_UART_APPL_C_EXT SWORD      uart_swDrumSpdPreRpm; // previous effected drum speed commmand
-_UART_APPL_C_EXT UWORD      uart_uwSoftwareVer;
-_UART_APPL_C_EXT UBYTE      uart_ubMotorID;
-_UART_APPL_C_EXT UBYTE      uart_ubMotorTemp;
-_UART_APPL_C_EXT SBYTE      uart_sbIPMtemp;
-_UART_APPL_C_EXT UWORD      uart_uwFaultCode;
-_UART_APPL_C_EXT SWORD      uart_swDrumSpdRpm;
-_UART_APPL_C_EXT SBYTE      uart_sbPhaseUCurrentA;
-_UART_APPL_C_EXT UWORD      uart_uwBusVoltageV;
-_UART_APPL_C_EXT SWORD      uart_swDrumSpdCmdRpm;
-_UART_APPL_C_EXT UBYTE      uart_ubAckBuffer[UART_ACK_BUFFER_SIZE];
-_UART_APPL_C_EXT UBYTE      uart_ubData1;
-_UART_APPL_C_EXT SWORD      uart_swDrumACCRpmps;  // 0821
-_UART_APPL_C_EXT SWORD      uart_swMotorACCRpmps; // 0821
-_UART_APPL_C_EXT UWORD      uart_uwFTbsHz;
-_UART_APPL_C_EXT SLONG      uart_slSpdRefRpm;
-_UART_APPL_C_EXT SWORD      uart_swTorqRefNm;
-_UART_APPL_C_EXT SWORD      uart_swDrumSpdCmdPreRpm;
-#endif
-//------------------------------------------------------------------------
-
-/************************************************************************
- Exported Function Call Prototypes
-*************************************************************************/
-#ifdef _UART_APPL_C_
-_UART_APPL_C_EXT BOOL  uart_bSwanDecoder(UBYTE *ptubBuffer, UWORD Num, UBYTE **ptptubACKbuffer, UWORD *ACKnum);
-_UART_APPL_C_EXT UWORD uart_uwCRCCcitt(const UBYTE ptubBuf[], UWORD length);
-#else
-_UART_APPL_C_EXT BOOL  uart_bSwanDecoder(UBYTE *ptubBuffer, UWORD Num, UBYTE **ptptubACKbuffer, UWORD *ACKnum);
-_UART_APPL_C_EXT UWORD uart_uwCRCCcitt(const UBYTE ptubBuf[], UWORD length);
-#endif
-#endif
-/*>>>>>>>>>>>>>>>>>>>>>>>> End of Header File Inclusion Protection <<<<<<<<<<<<<<<<<<<<<<<*/
-/****************************************************************************************
-End of this File (EOF).     Do not put anything after this line.
-****************************************************************************************/

+ 0 - 165
User project/2.MotorDrive/Include/uart_driver.h

@@ -1,165 +0,0 @@
-
-/************************************************************************
- Project:             Welling Motor Control Paltform
- Filename:            uart_driver.h
- Partner Filename:    uart_driver.c
- Description:         The header file of uart_driver.c
- Complier:            IAR Embedded Workbench for ARM 8.40.2, IAR Systems.
- CPU TYPE :           GD32F30x
-*************************************************************************
- Copyright (c) 2022 Welling Motor Technology(Shanghai) Co. Ltd.
- All rights reserved.
-*************************************************************************
-*************************************************************************
-Revising History (ECL of this file):
-
-************************************************************************/
-/************************************************************************
- Beginning of File, do not put anything above here except notes
- Compiler Directives
-************************************************************************/
-#ifndef UART_DRIVER_H
-#define UART_DRIVER_H
-/************************************************************************
- Compiler Directives (N/A)
-*************************************************************************/
-#ifdef _UART_DRIVER_C_
-#define _UART_DRIVER_EXT
-#else
-#define _UART_DRIVER_EXT extern
-#endif
-/************************************************************************
- Definitions & Macros
-*************************************************************************/
-#define UART_RX_BUFFER_SIZE 24 // max receive bufffer length
-#define UART_DRIVER_READ_DEFAULT  \
-    {                             \
-        FALSE, 0, {NULL, 0}, NULL \
-    }
-#define UART_DRIVER_WRITE_DEFAULT \
-    {                             \
-        FALSE, {NULL, 0}, NULL    \
-    }
-#define UART_MONITOR_ADDRESS_DEFAULT       \
-    {                                      \
-        NULL, NULL, NULL, NULL, NULL, NULL \
-    } // default monitor address(ms)
-/************************************************************************
- TypeDefs & Structure defines (N/A)
-*************************************************************************/
-/* UART error type */
-typedef enum UART_ERR
-{
-    UART_ERR_OK,          // no error
-    UART_ERR_BUSY,        // Read or Write process is in busy.
-    UART_ERR_NO_BUFFER,   // no buffer room for data received
-    UART_ERR_TIMEOUT,     // timeout when read
-    UART_ERR_UNKNOWN_CMD, // no define command
-    UART_ERR_INVALID_CMD, // not in use
-    UART_ERR_CANCEL,      // not in use
-    UART_ERR_PARA         // provide function with invalid argument
-} UART_ERR_Type;
-
-/* callback function type definitions */
-typedef void (*UART_CB_ERR)(UART_ERR_Type);
-typedef void (*UART_CB_DONE_READ)(UART_ERR_Type, ULONG);
-typedef void (*UART_CB_DONE_WRITE)(UART_ERR_Type);
-
-typedef struct DataBuff
-{
-    UBYTE *pBuf;
-    ULONG  NumBytes;
-} UART_DataBuff_Type;
-/* data structure used for Read */
-typedef struct READ
-{
-    BOOL               m_ReadBusy; // reading flag
-    ULONG              m_BuffSize; // max of RX buffer length
-    UART_DataBuff_Type m_DataBuff;
-    UART_CB_DONE_READ  m_fpDone; // read callback function
-} UART_READ_Type;
-
-typedef struct WRITE
-{
-    BOOL               m_WriteBusy; // writing flag
-    UART_DataBuff_Type m_DataBuff;
-    UART_CB_DONE_WRITE m_fpDone; // read callback function
-} UART_WRITE_Type;
-
-/************************************************************************
- Exported Variables
-*************************************************************************/
-#ifdef _UART_DRIVER_C_
-_UART_DRIVER_EXT UART_READ_Type  uart_stRead = UART_DRIVER_READ_DEFAULT;
-_UART_DRIVER_EXT UART_WRITE_Type uart_stWrite = UART_DRIVER_WRITE_DEFAULT;
-_UART_DRIVER_EXT UBYTE           uart_ubReadBuffer2[UART_RX_BUFFER_SIZE];
-_UART_DRIVER_EXT UBYTE *uart_pReadBuffer2 = uart_ubReadBuffer2;
-_UART_DRIVER_EXT UWORD *              uart_pMonAddr[6] = UART_MONITOR_ADDRESS_DEFAULT; // the address of the variable which user want to monitor.
-_UART_DRIVER_EXT volatile UART_CB_ERR uart_fpError = NULL;
-_UART_DRIVER_EXT volatile UWORD       uart_uwDataNum2 = 0;
-_UART_DRIVER_EXT UWORD                uart_uwDummy = 0;
-_UART_DRIVER_EXT BOOL                 uart_bFrameStartFlag = FALSE;
-_UART_DRIVER_EXT BOOL                 uart_blCommErrFlag = FALSE;
-_UART_DRIVER_EXT UBYTE                uart_ubFrameType = 0x00;
-_UART_DRIVER_EXT UBYTE                uart_ubFrameLength = 0;
-_UART_DRIVER_EXT UWORD                uart_uwReceivedNum = 0;
-#else
-_UART_DRIVER_EXT UART_READ_Type  uart_stRead;
-_UART_DRIVER_EXT UART_WRITE_Type uart_stWrite;
-_UART_DRIVER_EXT UBYTE           uart_ubReadBuffer2[UART_RX_BUFFER_SIZE];
-_UART_DRIVER_EXT UBYTE *uart_pReadBuffer2;
-_UART_DRIVER_EXT UWORD *              uart_pMonAddr[6]; // the address of the variable which user want to monitor.
-_UART_DRIVER_EXT volatile UART_CB_ERR uart_fpError;
-_UART_DRIVER_EXT volatile UWORD       uart_uwDataNum2;
-_UART_DRIVER_EXT UWORD                uart_uwDummy;
-_UART_DRIVER_EXT BOOL                 uart_bFrameStartFlag;
-_UART_DRIVER_EXT BOOL                 uart_blCommErrFlag;
-_UART_DRIVER_EXT UBYTE                uart_ubFrameType;
-_UART_DRIVER_EXT UBYTE                uart_ubFrameLength;
-_UART_DRIVER_EXT UWORD                uart_uwReceivedNum;
-#endif
-/************************************************************************
- RAM ALLOCATION (N/A)
-*************************************************************************/
-
-/************************************************************************
- Exported Function Call Prototypes
-*************************************************************************/
-#ifdef _UART_DRIVER_C_
-_UART_DRIVER_EXT static void uart_voCBSwanError(UART_ERR_Type _err);
-_UART_DRIVER_EXT void uart_voApplInit(void);
-_UART_DRIVER_EXT void uart_voReadPoll2(ULONG _NumBytes, UBYTE *_Buffer, UART_CB_DONE_READ _fpCBDone);
-_UART_DRIVER_EXT void uart_voWritePoll2(ULONG _NumBytes, const UBYTE *_Buffer);
-_UART_DRIVER_EXT void uart_voApplMain(void);
-_UART_DRIVER_EXT void uart_voReadFramePoll2(void);
-_UART_DRIVER_EXT void uart_voWriteFramePoll2(void);
-_UART_DRIVER_EXT void uart_voCancelReadPoll2(void);
-_UART_DRIVER_EXT static void uart_voCBDoneRead2(UART_ERR_Type _err, ULONG _NumBytes);
-_UART_DRIVER_EXT void uart_voMonitorInit(void);
-#else
-_UART_DRIVER_EXT void uart_voCBSwanError(UART_ERR_Type _err);
-_UART_DRIVER_EXT void uart_voApplInit(void);
-_UART_DRIVER_EXT void uart_voReadPoll2(ULONG _NumBytes, UBYTE *_Buffer, UART_CB_DONE_READ _fpCBDone);
-_UART_DRIVER_EXT void uart_voApplMain(void);
-_UART_DRIVER_EXT void uart_voReadFramePoll2(void);
-_UART_DRIVER_EXT void uart_voWriteFramePoll2(void);
-_UART_DRIVER_EXT void uart_voCancelReadPoll2(void);
-_UART_DRIVER_EXT void uart_voWritePoll2(ULONG _NumBytes, const UBYTE *_Buffer);
-_UART_DRIVER_EXT void uart_voMonitorInit(void);
-#endif
-/************************************************************************
- Local Function Call Prototypes (N/A)
-*************************************************************************/
-
-/************************************************************************
- Flag Define (N/A)
-*************************************************************************/
-#endif
-
-/************************************************************************
- Copyright (c) 2022 Welling Motor Technology(Shanghai) Co. Ltd.
- All rights reserved.
-*************************************************************************
- End of this File (EOF)!
- Do not put anything after this part!
-*************************************************************************/

+ 261 - 0
User project/2.MotorDrive/Include/uart_monitor.h

@@ -0,0 +1,261 @@
+#ifndef _UART_MONITOR_H_
+#define _UART_MONITOR_H_
+
+#ifdef _UART_MONITOR_C_
+#define _UART_MONITOR_EXT
+#else
+#define _UART_MONITOR_EXT extern
+#endif
+
+#include "typedefine.h"
+
+/* ========================================================================== */
+/* ========================== Definitions & Macros ========================== */
+/* ========================================================================== */
+
+#define UART_DEF_TIMEOUT_MS 1000
+#define UART_DEF_CMD_LEN    0
+
+#define INSERT_BUFFER_SIZE       16
+#define INSERT_BUFFER_HEADER_LEN 7
+#define UART_CMD_LENGTH          22
+#define TX_BUFFER_SIZE           150
+#define RX_BUFFER_SIZE           24
+#define MSG_QUEUE_SIZE           10
+#define PARA_TABLE_SIZE          22
+#define PARA_BUFFER_SIZE         40
+#define LOW_WORD(var)            ((UWORD *)(&var)) /* little-endian on arm */
+#define HIGH_WORD(var)           ((UWORD *)(&var) + 1)
+
+/* ------------------------ data monitor application ------------------------ */
+
+#define CHANNEL_NUM 6 /* 使用的通道数 */
+#define CHANNEL_1   2 /* 每通道占2字节 */
+#define CHANNEL_2   4
+#define CHANNEL_3   6
+#define CHANNEL_4   8
+#define CHANNEL_5   10
+#define CHANNEL_6   12
+
+#define TEMP_BUFFER_LEN CHANNEL_6
+
+#if TEMP_BUFFER_LEN == CHANNEL_6
+#define S_FRAME_SIZE 124
+#elif TEMP_BUFFER_LEN == CHANNEL_5
+#define S_FRAME_SIZE 104
+#elif TEMP_BUFFER_LEN == CHANNEL_4
+#define S_FRAME_SIZE 84
+#elif TEMP_BUFFER_LEN == CHANNEL_3
+#define S_FRAME_SIZE 64
+#else
+#error Must Specify Channel Num
+#endif
+
+/* ---------------- Define USART Driver configuration objects --------------- */
+
+#define UART_APPL_CONFIG_DEFAULT                   \
+    {                                              \
+        UART_MODE_LEN, 1000, UART_CMD_LENGTH, NULL \
+    }
+#define UART_MsgQ_CONFIG_DEFAULT                       \
+    {                                                  \
+        UART_stMsgQueue, UART_stMsgQueue, FALSE, FALSE \
+    }
+#define UART_DRIVER_CONFIG_DEFAULT                                 \
+    {                                                              \
+        UART_MODE_LEN, UART_DEF_TIMEOUT_MS, UART_DEF_CMD_LEN, NULL \
+    }
+
+/* ========================================================================== */
+/* ====================== TypeDefs & Structure Defines ====================== */
+/* ========================================================================== */
+
+/* ---------------------------- USART error type ---------------------------- */
+
+typedef enum UART_ERR
+{
+    UART_ERR_OK,          /* No error */
+    UART_ERR_BUSY,        /* Read or Write process is in busy. */
+    UART_ERR_NO_BUFFER,   /* No buffer room for data received */
+    UART_ERR_TIMEOUT,     /* Timeout when read */
+    UART_ERR_UNKNOWN_CMD, /* Not in use */
+    UART_ERR_INVALID_CMD, /* Not in use */
+    UART_ERR_CANCEL,      /* Not in use */
+    UART_ERR_PARA         /* Provide function with invalid argument */
+} UART_ERR_Type;
+
+/* -------------------------- USART work mode type -------------------------- */
+
+typedef enum UART_WorkMode
+{
+    UART_MODE_TIME, /* Time interval framing mode */
+    UART_MODE_LEN,  /* Fixed length framing mode */
+    UART_MODE_CHAR  /* Fixed chars framing mode */
+} UART_WorkMode_Type;
+
+/* ------------------- Callback function type definitions ------------------- */
+
+typedef void (*CB_ERR)(UART_ERR_Type);
+typedef void (*CB_DONE_READ)(UART_ERR_Type, ULONG);
+typedef void (*CB_DONE_WRITE)(UART_ERR_Type);
+
+/* ------------------------- HAL configuration type ------------------------- */
+
+typedef struct UART_CONFIG
+{
+    UART_WorkMode_Type enWorkMode;
+    UWORD              uwTimeout; // unit:count
+    UBYTE              ubLength;  // unit:bytes
+    UBYTE             *pChar;
+} UART_CONFIG_Type;
+
+/*1. When enWorkMode=USART_MODE_TIME, uwTimeout indicates time-interval between frames.
+  2. When enWorkMode=USART_MODE_LEN, uwTimeout indicates timeout value, ubLength indicates command frame length, pChar is NULL.
+  3. When enWorkMode=USART_MODE_CHAR,uwTimeout indicates timeout value, ubLength indicates valid length in char-array pointed by pChar.   */
+
+typedef enum MsgType
+{
+    UART_NULL        = 0, // NULL message will not be processed
+    UART_SEND_STATUS = 1, // send out Application status
+    UART_SEND_PARA   = 2  // send out Parameter value
+} UART_MsgType;
+
+typedef struct MSG
+{
+    UART_MsgType enType;
+    UBYTE       *pBuf;
+    UWORD        uwNumBytes;
+} UART_MSG;
+
+typedef struct MsgQNode
+{
+    UART_MSG         stMsg;
+    struct MsgQNode *pNext;
+} UART_MsgQNodeType;
+
+typedef struct MsgQType
+{
+    UART_MsgQNodeType *pSave;
+    UART_MsgQNodeType *pUse;
+    BOOL               bValid;
+    BOOL               bHandling;
+} UART_MsgQType;
+typedef struct ParaData
+{
+    BOOL bParaStart;
+    BOOL bWriteBusy;
+} UART_ParaData_Flag;
+
+typedef struct DataBuff
+{
+    UBYTE *pBuf;
+    ULONG  NumBytes;
+} DataBuff_Type;
+/* data structure used for Read */
+typedef struct READ
+{
+    BOOL          m_ReadBusy;
+    ULONG         m_BuffSize;
+    DataBuff_Type m_DataBuff;
+    CB_DONE_READ  m_fpDone;
+} READ_Type;
+static READ_Type USART_Read = {FALSE, 0, {NULL, 0}, NULL};
+typedef struct WRITE
+{
+    BOOL          m_WriteBusy;
+    DataBuff_Type m_DataBuff;
+    CB_DONE_WRITE m_fpDone;
+} WRITE_Type;
+static WRITE_Type USART_Write = {FALSE, {NULL, 0}, NULL};
+/************************************************************************
+ Exported Variables:
+*************************************************************************/
+#ifdef _UART_MONITOR_C_
+_UART_MONITOR_EXT UWORD                     placeholder[4]                      = {0xFFFF};
+_UART_MONITOR_EXT ULONG                     dummy32                             = 0x00000000;
+_UART_MONITOR_EXT UBYTE                     UART_ubParaBuffer[PARA_BUFFER_SIZE] = {0};
+_UART_MONITOR_EXT UBYTE                     UART_ubReadBuffer[RX_BUFFER_SIZE];
+_UART_MONITOR_EXT UBYTE                    *uart_pReadBuffer                    = UART_ubReadBuffer;
+_UART_MONITOR_EXT UBYTE                     UART_ubWriteBuffer1[TX_BUFFER_SIZE] = {0x55, 0xAA, 0x55, 0xAA};
+_UART_MONITOR_EXT UBYTE                     UART_ubWriteBuffer2[TX_BUFFER_SIZE] = {0x55, 0xAA, 0x55, 0xAA};
+_UART_MONITOR_EXT UBYTE                    *UART_pWriteBuffer                   = UART_ubWriteBuffer1;
+_UART_MONITOR_EXT UWORD                     UART_uwWriteIndex                   = 4;
+_UART_MONITOR_EXT                           UWORD volatile UART_uwRxNum         = 0;
+_UART_MONITOR_EXT UART_CONFIG_Type          UART_stConfigLEN                    = UART_APPL_CONFIG_DEFAULT;
+_UART_MONITOR_EXT BOOL                      UART_bMonSwitch                     = FALSE; // control monitor function whether of not write data out.
+_UART_MONITOR_EXT UWORD                    *UART_pMonAddr[6];                            // the address of the variable which user want to monitor.
+_UART_MONITOR_EXT UBYTE                     UART_ubInsertBuf[INSERT_BUFFER_SIZE] = {0x55, 0xAA, 0x55,
+                                                                                    0xFF}; // the data in insertBuffer will be inserted into writeBuffer when enabled
+_UART_MONITOR_EXT volatile BOOL             UART_bInsertPendTx = FALSE; // flag indicate whether insert buffer is pending to be transmitted.
+_UART_MONITOR_EXT UART_ParaData_Flag        UART_stParaStatus  = {FALSE};
+_UART_MONITOR_EXT UART_MsgQNodeType         UART_stMsgQueue[MSG_QUEUE_SIZE]; // message queue
+_UART_MONITOR_EXT UART_MsgQType             UART_stMsgQ       = UART_MsgQ_CONFIG_DEFAULT;
+_UART_MONITOR_EXT volatile UART_CONFIG_Type UART_Config       = UART_DRIVER_CONFIG_DEFAULT; // define configure object and assign default value.
+_UART_MONITOR_EXT UWORD                     UART_uwTimeoutCtr = 0;
+_UART_MONITOR_EXT volatile CB_ERR           UART_fpError      = NULL;
+UBYTE                                       uart_ReadBuffer2[RX_BUFFER_SIZE]; // cancel static just for debug
+static UBYTE                               *uart_pReadBuffer2 = uart_ReadBuffer2;
+UWORD volatile uart_DataNum2                                  = 0;
+UWORD                   dummy                                 = 0;
+BOOL                    uart_frameStartFlag                   = FALSE;
+BOOL                    UART_blCommErrFlag                    = FALSE;
+UBYTE                   uart_frameType                        = 0x00;
+UBYTE                   uart_frameLength                      = 0;
+UWORD                   uart_receivedNum                      = 0;
+_UART_MONITOR_EXT SWORD uart_slSpdRefRpm                      = 0;
+_UART_MONITOR_EXT SWORD uart_swTorqRefNm                      = 0;
+#else
+_UART_MONITOR_EXT UBYTE             *UART_pWriteBuffer;
+_UART_MONITOR_EXT volatile BOOL      UART_bInsertPendTx;
+_UART_MONITOR_EXT BOOL               UART_bMonSwitch ;
+_UART_MONITOR_EXT UART_ParaData_Flag UART_stParaStatus;
+_UART_MONITOR_EXT SWORD              uart_slSpdRefRpm;
+_UART_MONITOR_EXT SWORD              uart_swTorqRefNm;
+#endif
+/************************************************************************
+ Local Variables:
+*************************************************************************/
+
+/************************************************************************
+ Ram Allocation:
+*************************************************************************/
+
+/************************************************************************
+ Exported Function Call Prototypes:
+*************************************************************************/
+_UART_MONITOR_EXT void     uart_voMonitorInit(void);
+_UART_MONITOR_EXT void     uart_voMainDec(void);    // used in main.c for checking RxData and insertQueue
+_UART_MONITOR_EXT void     uart_voAppMonitor(void); // used to send monitor data out
+_UART_MONITOR_EXT void     uart_voApplTimer(void);
+_UART_MONITOR_EXT UART_MSG UART_stMsgFetched;
+_UART_MONITOR_EXT void     uart_voDriTimer(void);
+_UART_MONITOR_EXT void     ReadFrame_Poll2();
+
+_UART_MONITOR_EXT void uart_voSwanInit(void);
+_UART_MONITOR_EXT void uart_voApplMain(void);
+void                   uart_TxCompleteCallback();
+void                   uart_TxErrorCallback();
+/************************************************************************
+ Local Function Call Prototypes:
+*************************************************************************/
+void  uart_voHandleParaCmd(void);
+void  uart_voDecode(void);
+void  CBError_monitor(UART_ERR_Type _err);
+void  uart_voCBDoneRead(UART_ERR_Type _err, ULONG _NumBytes);
+UBYTE uart_ubCheckXOR(UBYTE *Buf, UBYTE CNT);
+void  uart_voPostMsg(UART_MSG _msg);
+void  uart_Read_Poll2(ULONG _NumBytes, UBYTE *_Buffer, CB_DONE_READ _fpCBDone);
+void  CBDoneRead2(UART_ERR_Type _err, ULONG _NumBytes);
+
+void CBError_Swan(UART_ERR_Type _err);
+void uart_Write_Poll2(ULONG _NumBytes, const UBYTE *_Buffer);
+void HAL_CancelRead_Poll2(void);
+BOOL SwanDecoder(UBYTE *ptubBuffer, UWORD Num, UBYTE **ptptubACKbuffer, UWORD *ACKnum);
+#endif
+/************************************************************************
+ Copyright (c) 2019 Welling Motor Technology(Shanghai) Co. Ltd.
+ All rights reserved.
+*************************************************************************
+ End of this File (EOF)!
+ Do not put anything after this part!
+*************************************************************************/

+ 0 - 261
User project/2.MotorDrive/Include/uart_monitor_appl.h

@@ -1,261 +0,0 @@
-/************************************************************************
- Project:
- Filename:            uart_appl.h
- Partner Filename:    N/A
- Description:
- Complier:            IAR Embedded Workbench for ARM 8.40.2, IAR Systems.
- CPU TYPE :           GD32F30x
-*************************************************************************
- Copyright (c) 2022 Welling Motor Technology(Shanghai) Co. Ltd.
- All rights reserved.
-*************************************************************************
-*************************************************************************
- Revising History (ECL of this file):
-M0_20170410, by liyue, create this file;
-************************************************************************/
-/************************************************************************
- Beginning of File, do not put anything above here except notes
- Compiler Directives
-************************************************************************/
-#ifndef UART_MONITOR_APPL_H
-#define UART_MONITOR_APPL_H
-
-#include "typedefine.h"
-#include "uart_driver.h"
-/************************************************************************
- Compiler Directives (N/A)
-*************************************************************************/
-#ifdef _UART_MONITOR_APPL_C_
-#define _UART_MONITOR_APPL_EXT
-#else
-#define _UART_MONITOR_APPL_EXT extern
-#endif
-/************************************************************************
- Definitions & Macros
-*************************************************************************/
-#define INSERT_BUFFER_SIZE       16
-#define INSERT_BUFFER_HEADER_LEN 7
-#define ONE_SECOND_COUNT         1000
-
-#define CMD_LENGTH     22
-#define TX_BUFFER_SIZE 150
-#define RX_BUFFER_SIZE 24
-
-#define MSG_QUEUE_SIZE 10
-
-#define PARA_TABLE_SIZE  22
-#define PARA_BUFFER_SIZE 40
-#define LOW_WORD(var)    ((UWORD *)(&(var))) // little-endian
-#define HIGH_WORD(var)   ((UWORD *)(&(var)) + 1)
-/************** data monitor application ***************/
-/*******************************************************/
-/*   Channel Number       Time(sample+DMA/sample)(us)  */
-
-/*        3                   6.4/4.8	               */
-/*        4                   7.6/5.9                  */
-/*        5                   8.9/7.3                  */
-/*        6                  10.1/8.6                  */
-
-/*******************************************************/
-/*       TBC             Channels Selection           */
-
-/*       5.3k                 3/4/5/6                  */
-/*       8k                   3/4/5/6                  */
-/*       12k                  3/4                      */
-
-/*******************************************************/
-
-#define CHANNEL_NUM 6 // channel number
-#define CHANNEL_1   2 // 1 channel  correspond to  2 bytes
-#define CHANNEL_2   4
-#define CHANNEL_3   6
-#define CHANNEL_4   8
-#define CHANNEL_5   10
-#define CHANNEL_6   12
-
-#define TEMP_BUFFER_LEN CHANNEL_5 // temp buffer length is based on the choice of channel number.
-
-#if TEMP_BUFFER_LEN == CHANNEL_6
-#define S_FRAME_SIZE 124
-#elif TEMP_BUFFER_LEN == CHANNEL_5
-#define S_FRAME_SIZE 104
-#elif TEMP_BUFFER_LEN == CHANNEL_4
-#define S_FRAME_SIZE 84
-#elif TEMP_BUFFER_LEN == CHANNEL_3
-#define S_FRAME_SIZE 64
-#else
-// do nothing!
-#endif
-
-#define UART_DEF_TIMEOUT_MS 1000 // default timeout const(ms)
-#define UART_DEF_CMD_LEN    0    // default command frame length
-//*** define USART Driver configuration objects  ***
-// **length-mode configuration object**
-#define UART_APPL_CONFIG_DEFAULT                             \
-    {                                                        \
-        UART_MODE_LEN, UART_DEF_TIMEOUT_MS, CMD_LENGTH, NULL \
-    }
-#define UART_MsgQ_CONFIG_DEFAULT                       \
-    {                                                  \
-        UART_stMsgQueue, UART_stMsgQueue, FALSE, FALSE \
-    }
-/************************************************************************
- TypeDefs & Structure defines (N/A)
-*************************************************************************/
-
-/* USART work mode type */
-typedef enum UART_WorkMode
-{
-    UART_MODE_TIME, // time interval framing mode
-    UART_MODE_LEN,  // fixed length framing mode
-    UART_MODE_CHAR  // fixed chars framing mode
-} UART_WorkMode_Type;
-typedef struct UART_CONFIG
-{
-    UART_WorkMode_Type enWorkMode;
-    UWORD              uwTimeout; // unit:count
-    UBYTE              ubLength;  // unit:bytes
-    UBYTE *            pChar;
-} UART_CONFIG_Type;
-
-typedef enum MsgType
-{
-    UART_NULL = 0,        // NULL message will not be processed
-    UART_SEND_STATUS = 1, // send out Application status
-    UART_SEND_PARA = 2    // send out Parameter value
-} UART_MsgType;
-
-typedef struct MSG
-{
-    UART_MsgType enType;
-    UBYTE *      pBuf;
-    UWORD        uwNumBytes;
-} UART_MSG;
-
-typedef struct MsgQNode
-{
-    UART_MSG         stMsg;
-    struct MsgQNode *pNext;
-} UART_MsgQNodeType;
-
-typedef struct MsgQType
-{
-    UART_MsgQNodeType *pSave;
-    UART_MsgQNodeType *pUse;
-    BOOL               bValid;
-    BOOL               bHandling;
-} UART_MsgQType;
-typedef struct ParaData
-{
-    BOOL bParaStart;
-    BOOL bWriteBusy;
-} UART_ParaData_Flag;
-/************************************************************************
- Exported Variables
-*************************************************************************/
-#ifdef _UART_MONITOR_APPL_C_
-_UART_MONITOR_APPL_EXT UWORD placeholder[4] = {0xFFFF};
-_UART_MONITOR_APPL_EXT ULONG dummy32 = 0x00000000;
-_UART_MONITOR_APPL_EXT UWORD dummy16 = 0x0000;
-/* parabuffer contains parameter response frame payload */
-_UART_MONITOR_APPL_EXT UBYTE UART_ubParaBuffer[PARA_BUFFER_SIZE] = {0};
-/* define Read Buffer and its pointer */
-_UART_MONITOR_APPL_EXT UBYTE UART_ubReadBuffer[RX_BUFFER_SIZE];
-/* define Write dual Buffer and its pointers */
-_UART_MONITOR_APPL_EXT UBYTE UART_ubWriteBuffer1[TX_BUFFER_SIZE] = {0x55, 0xAA, 0x55, 0xAA};
-_UART_MONITOR_APPL_EXT UBYTE UART_ubWriteBuffer2[TX_BUFFER_SIZE] = {0x55, 0xAA, 0x55, 0xAA};
-_UART_MONITOR_APPL_EXT UBYTE *UART_pWriteBuffer = UART_ubWriteBuffer1;
-_UART_MONITOR_APPL_EXT UWORD  UART_uwWriteIndex = 4;
-
-/* data bytes recieved in a Read */
-_UART_MONITOR_APPL_EXT                  UWORD volatile UART_uwRxNum = 0;
-_UART_MONITOR_APPL_EXT UWORD            writeDenyCount = 0; // HAL_Write request deny count(because of S_ERR_BUSY), this value mainly used for debug.
-_UART_MONITOR_APPL_EXT UART_CONFIG_Type UART_stConfigLEN = UART_APPL_CONFIG_DEFAULT;
-_UART_MONITOR_APPL_EXT BOOL             UART_bMonSwitch = FALSE; // control monitor function whether of not write data out.
-_UART_MONITOR_APPL_EXT UWORD *UART_pMonAddr[6];                  // the address of the variable which user want to monitor.
-
-//*** define insert buffer ***
-_UART_MONITOR_APPL_EXT UBYTE              UART_ubInsertBuf[100] = {0x55, 0xAA, 0x55,
-                                                      0xFF}; // the data in insertBuffer will be inserted into writeBuffer when enabled
-_UART_MONITOR_APPL_EXT volatile BOOL      UART_bInsertPendTx = FALSE;     // flag indicate whether insert buffer is pending to be transmitted.
-_UART_MONITOR_APPL_EXT UART_ParaData_Flag UART_stParaStatus = {FALSE};
-_UART_MONITOR_APPL_EXT UART_MsgQNodeType  UART_stMsgQueue[MSG_QUEUE_SIZE]; // message queue
-_UART_MONITOR_APPL_EXT UART_MsgQType      UART_stMsgQ = UART_MsgQ_CONFIG_DEFAULT;
-#else
-_UART_MONITOR_APPL_EXT UWORD placeholder[4];
-_UART_MONITOR_APPL_EXT ULONG dummy32;
-_UART_MONITOR_APPL_EXT UWORD dummy16;
-_UART_MONITOR_APPL_EXT UBYTE UART_ubParaBuffer[PARA_BUFFER_SIZE];
-_UART_MONITOR_APPL_EXT UBYTE UART_ubReadBuffer[RX_BUFFER_SIZE];
-
-/* define Write dual Buffer and its pointers */
-_UART_MONITOR_APPL_EXT UBYTE UART_ubWriteBuffer1[TX_BUFFER_SIZE];
-_UART_MONITOR_APPL_EXT UBYTE UART_ubWriteBuffer2[TX_BUFFER_SIZE];
-_UART_MONITOR_APPL_EXT UBYTE *UART_pWriteBuffer;
-_UART_MONITOR_APPL_EXT UWORD  UART_uwWriteIndex;
-
-/* data bytes recieved in a Read */
-_UART_MONITOR_APPL_EXT                  UWORD volatile UART_uwRxNum;
-_UART_MONITOR_APPL_EXT UWORD            writeDenyCount; // HAL_Write request deny count(because of S_ERR_BUSY), this value mainly used for debug.
-_UART_MONITOR_APPL_EXT UART_CONFIG_Type UART_stConfigLEN;
-_UART_MONITOR_APPL_EXT BOOL             UART_bMonSwitch; // control monitor function whether of not write data out.
-_UART_MONITOR_APPL_EXT UWORD *UART_pMonAddr[6];          // the address of the variable which user want to monitor.
-
-//*** define insert buffer ***
-_UART_MONITOR_APPL_EXT UBYTE              UART_ubInsertBuf[100]; // the data in insertBuffer will be inserted into writeBuffer when enabled
-_UART_MONITOR_APPL_EXT volatile BOOL      UART_bInsertPendTx;
-_UART_MONITOR_APPL_EXT UART_ParaData_Flag UART_stParaStatus;
-_UART_MONITOR_APPL_EXT UART_MsgQNodeType  UART_stMsgQueue[MSG_QUEUE_SIZE];
-#endif
-/************************************************************************
- RAM ALLOCATION (N/A)
-*************************************************************************/
-
-/************************************************************************
- Exported Function Call Prototypes
-*************************************************************************/
-#ifdef _UART_MONITOR_APPL_C_
-_UART_MONITOR_APPL_EXT void uart_voMainDec(void);    // used in main.c for checking RxData and insertQueue
-_UART_MONITOR_APPL_EXT void UART_voAppMonitor(void); // used to send monitor data out
-_UART_MONITOR_APPL_EXT void UART_voApplTimer(void);
-_UART_MONITOR_APPL_EXT static void CBError_monitor(UART_ERR_Type _err);
-/* handle parameter related command*/
-_UART_MONITOR_APPL_EXT static void UART_voHandleParaCmd(void);
-//*** command decoder function ***
-_UART_MONITOR_APPL_EXT static void UART_voDecode(void);
-//*** Callback called when error occurs. ***
-_UART_MONITOR_APPL_EXT void CBError(UART_ERR_Type _err);
-//*** Callback called when some data received. ***
-_UART_MONITOR_APPL_EXT void UART_voCBDoneRead(UART_ERR_Type _err, ULONG _NumBytes);
-_UART_MONITOR_APPL_EXT static UBYTE UART_ubCheckXOR(const UBYTE Buf[], UBYTE CNT);
-_UART_MONITOR_APPL_EXT UART_MSG UART_stMsgFetched;             // message fetched from msgQueue
-_UART_MONITOR_APPL_EXT void UART_voInitMsgQueue(void);     // MsgQueue initialization
-_UART_MONITOR_APPL_EXT static void UART_voPostMsg(UART_MSG _msg); // post message
-_UART_MONITOR_APPL_EXT static void UART_voHandleMsg(void);        // handle msg according to msg type
-#else
-_UART_MONITOR_APPL_EXT void uart_voMainDec(void);    // used in main.c for checking RxData and insertQueue
-_UART_MONITOR_APPL_EXT void UART_voAppMonitor(void); // used to send monitor data out
-_UART_MONITOR_APPL_EXT void UART_voApplTimer(void);
-//*** Callback called when error occurs. ***
-_UART_MONITOR_APPL_EXT void CBError(UART_ERR_Type _err);
-//*** Callback called when some data received. ***
-_UART_MONITOR_APPL_EXT void UART_voCBDoneRead(UART_ERR_Type _err, ULONG _NumBytes);
-_UART_MONITOR_APPL_EXT UART_MSG UART_stMsgFetched;             // message fetched from msgQueue
-_UART_MONITOR_APPL_EXT void UART_voInitMsgQueue(void);     // MsgQueue initialization
-#endif
-/************************************************************************
- Local Function Call Prototypes (N/A)
-*************************************************************************/
-
-/************************************************************************
- Flag Define (N/A)
-*************************************************************************/
-#endif
-
-/************************************************************************
- Copyright (c) 2022 Welling Motor Technology(Shanghai) Co. Ltd.
- All rights reserved.
-*************************************************************************
- End of this File (EOF)!
- Do not put anything after this part!
-*************************************************************************/

+ 6 - 6
User project/2.MotorDrive/Source/alarm.c

@@ -683,12 +683,12 @@ void alm_voDetecTBS(const ALM_IN *in, const ALM_DETECTBS_COF *coef)
         /*=======================================================================
         Communication over time
         =======================================================================*/
-        if (uart_bCommOvrTmFlg)
-        {
-            alm_unAction.bit.PWMOff = 1;
-            // alm_unAction.bit.ThrPhsShrt = TRUE;
-            alm_unCode.bit.CommOvrTm = 1;
-        }
+//        if (uart_bCommOvrTmFlg)
+//        {
+//            alm_unAction.bit.PWMOff = 1;
+//            // alm_unAction.bit.ThrPhsShrt = TRUE;
+//            alm_unCode.bit.CommOvrTm = 1;
+//        }
         alm_pvt_blTbsFirstFlg = FALSE;
     }
 }

+ 831 - 0
User project/2.MotorDrive/Source/uart_monitor.c

@@ -0,0 +1,831 @@
+/************************************************************************
+ Project:             Welling FAN Motor Developing platform
+ Filename:            uart_monitor.c
+ Partner Filename:    uart_monitor.h
+ Description:         Partner file of uart_monitor.h
+ Complier:            IAR Embedded Workbench for ARM 7.80, IAR Systems.
+ CPU TYPE :           ST32F0xx
+*************************************************************************
+ Copyright (c) 2019 Welling Motor Technology(Shanghai) Co. Ltd.
+ All rights reserved.
+*************************************************************************
+*************************************************************************
+Revising History (ECL of this file):
+20191225, by cyf, create this file;
+************************************************************************/
+
+/************************************************************************
+ Beginning of File, do not put anything above here except notes
+ Compiler Directives:
+*************************************************************************/
+#ifndef _UART_MONITOR_C_
+    #define _UART_MONITOR_C_
+#endif
+/************************************************************************
+ Included File:
+*************************************************************************/
+#include "uart_monitor.h"
+#include "api.h"
+#include "board_config.h"
+
+/************************************************************************
+ Exported Functions:
+*************************************************************************/
+ULONG TempPara1=11;
+ULONG TempPara2=22;
+ULONG TempPara3=33;
+ULONG TempPara4=44;
+
+/*--------------------------------------------------------------------------------
+                         Parameter group (R/W)
+--------------------------------------------------------------------------------*/
+UWORD* UART_pParaTable[PARA_TABLE_SIZE]=	
+{
+	HIGH_WORD(dummy32)  	,	//  000	     P-00(Reserve) Never use!!
+	LOW_WORD(dummy32)    	,	//  001	     P-00(Reserve) Never use!!
+/*--------------------------------------------------------------------------------
+                32-bits parameters (signed or unsigned)
+--------------------------------------------------------------------------------*/	
+	//--------P01----------
+	HIGH_WORD(TempPara1)  	,	//  002	     P-01(high word)
+	LOW_WORD(TempPara1)  	,	//  003	     P-01(low  word)
+	//--------P02----------
+	HIGH_WORD(TempPara2)  	,	//  004	     P-02(high word)
+	LOW_WORD(TempPara2)  	,	//  005      P-02(low  word)
+	//--------P03----------
+	HIGH_WORD(TempPara3)  	,	//  006	     P-03(high word)
+	LOW_WORD(TempPara3)  	,	//  007	     P-03(low  word)
+	//--------P04----------
+	HIGH_WORD(TempPara4)  	,	//  008	     P-04(high word)
+	LOW_WORD(TempPara4)  	,	//  009	     P-04(low  word)
+	//--------P05----------
+	HIGH_WORD(dummy32)  	,	//  010      P-05(high word)
+	LOW_WORD(dummy32) ,	//  011	     P-05(low  word)
+	//--------P06----------
+	HIGH_WORD(dummy32)  	,	//  012	     P-06(high word)
+	LOW_WORD(dummy32)  	,	//  013	     P-06(low  word)
+/*--------------------------------------------------------------------------------
+              16-bits parameters (signed or unsigned)
+--------------------------------------------------------------------------------*/
+	//--------P07----------
+	&placeholder[0]  	        ,	//  014	     Don't change!
+	LOW_WORD(dummy32)  	,	//  015	     P-07(one word)
+	//--------P08----------
+	&placeholder[1]  	,	//  016	     Don't change!
+	LOW_WORD(dummy32)  	,	//  017	     P-08(one word)
+	//--------P09----------
+	&placeholder[2]  	,	//  018	     Don't change!
+	LOW_WORD(dummy32)  	,	//  019	     P-09(one word)        
+	//--------P10----------
+	&placeholder[3]  	,	//  020	     Don't change!
+	LOW_WORD(dummy32)    //  021	     P-10(one word)
+};
+/*************************************************************** 
+ Function: uart_voMonitorInit
+ Description: Initialize hardware
+ Call by: hwsetup;
+ Input Variables: N/A
+ Output/Return Variables: N/A
+ Subroutine Call: ...;
+ Reference: N/A
+****************************************************************/
+void uart_voMonitorInit(void)
+{
+    UBYTE i = 0;
+    UART_fpError = (CB_ERR)CBError_monitor;      // Store CallBack function pointers  
+    uart_Read_Poll2(RX_BUFFER_SIZE,uart_pReadBuffer,uart_voCBDoneRead);
+    //--- insert stack initialization ---
+    for(i=0;i<MSG_QUEUE_SIZE;i++) 
+    {
+       	UART_stMsgQueue[i].stMsg.enType = UART_NULL;
+       	if(i==(MSG_QUEUE_SIZE-1)) 
+        {
+            UART_stMsgQueue[i].pNext = &UART_stMsgQueue[0];
+        }
+       	else
+        {
+            UART_stMsgQueue[i].pNext = &UART_stMsgQueue[i+1];
+        }
+    }	
+    UART_Config = UART_stConfigLEN;       	             
+}
+/*************************************************************** 
+ Function
+ Description: 
+ Call by: main;
+ Input Variables: N/A
+ Output/Return Variables: N/A
+ Subroutine Call: ...;
+ Reference: N/A
+****************************************************************/
+void CBDoneRead2(UART_ERR_Type _err, ULONG _NumBytes)
+{
+    switch(_err)
+    {
+        case UART_ERR_OK:
+            uart_DataNum2 = _NumBytes;		// copy received data number
+            break;
+        case UART_ERR_TIMEOUT:
+            break;
+
+        default:
+             uart_Read_Poll2(RX_BUFFER_SIZE,uart_pReadBuffer2,CBDoneRead2);//ly add           
+            break;
+    }
+}
+
+/*************************************************************** 
+ Function
+ Description: Query flag ,then callback decode function
+ Call by: main;
+ Input Variables: N/A
+ Output/Return Variables: N/A
+ Subroutine Call: ...;
+ Reference: N/A
+****************************************************************/
+void uart_voMainDec(void)
+{ 	
+    if(UART_uwRxNum)	
+    {	
+        uart_voDecode();
+        UART_uwRxNum = 0;	 // clear UART_uwRxNum for the next read !!                 	          
+        uart_Read_Poll2(RX_BUFFER_SIZE,uart_pReadBuffer,uart_voCBDoneRead);
+    }
+}
+/*************************************************************** 
+ Function
+ Description: decode instruction
+ Call by: UART_voMainDec();
+ Input Variables: N/A
+ Output/Return Variables: N/A
+ Subroutine Call: ...;
+ Reference: N/A
+****************************************************************/
+void uart_voDecode(void)
+{ 
+    UWORD i;	
+    UBYTE temp_ubCheckCode;
+    ULONG temp_ulAddr[CHANNEL_NUM];
+    UART_MSG twmp_stMesg;	
+    //---------------------- Serial-X application -----------------------------
+    if(UART_uwRxNum == UART_CMD_LENGTH)
+    {	
+        temp_ubCheckCode = uart_ubCheckXOR(UART_ubReadBuffer,UART_CMD_LENGTH-1);	        
+        if(temp_ubCheckCode == UART_ubReadBuffer[UART_CMD_LENGTH-1])	
+        {	                    
+            //++++++++++++++++++++ decode monitor address ++++++++++++++++++++++++
+            if((UART_ubReadBuffer[0]==0x11)&&(UART_ubReadBuffer[1]==0x00))
+            {	
+                if(UART_ubReadBuffer[UART_CMD_LENGTH-2])
+                {
+                    UART_bMonSwitch = TRUE; 
+                }
+                else                        
+                {
+                    UART_bMonSwitch = FALSE;
+                }
+                if(UART_bMonSwitch)// *Application Specific*
+                {
+                    temp_ulAddr[0] = 0x20000000 + ((ULONG)UART_ubReadBuffer[2]  << 16) + ((ULONG)UART_ubReadBuffer[3]  << 8) + ((ULONG)UART_ubReadBuffer[4] );
+                    temp_ulAddr[1] = 0x20000000 + ((ULONG)UART_ubReadBuffer[5]  << 16) + ((ULONG)UART_ubReadBuffer[6]  << 8) + ((ULONG)UART_ubReadBuffer[7] );
+                    temp_ulAddr[2] = 0x20000000 + ((ULONG)UART_ubReadBuffer[8]  << 16) + ((ULONG)UART_ubReadBuffer[9]  << 8) + ((ULONG)UART_ubReadBuffer[10]);
+                    temp_ulAddr[3] = 0x20000000 + ((ULONG)UART_ubReadBuffer[11] << 16) + ((ULONG)UART_ubReadBuffer[12] << 8) + ((ULONG)UART_ubReadBuffer[13]);
+                    temp_ulAddr[4] = 0x20000000 + ((ULONG)UART_ubReadBuffer[14] << 16) + ((ULONG)UART_ubReadBuffer[15] << 8) + ((ULONG)UART_ubReadBuffer[16]);
+                    temp_ulAddr[5] = 0x20000000 + ((ULONG)UART_ubReadBuffer[17] << 16) + ((ULONG)UART_ubReadBuffer[18] << 8) + ((ULONG)UART_ubReadBuffer[19]);           
+                    /* handle address */
+                    for(i=0; i<CHANNEL_NUM; i++)// *Application Specific*
+                    {
+                        if(temp_ulAddr[i] >= 0x20000000 && temp_ulAddr[i] <= HW_RAM_END_ADDRESS) // STM32F03x SRAM range                
+                        {  
+                            UART_pMonAddr[i] = (unsigned short *)(temp_ulAddr[i]&0xfffffffe);   
+                        }					  
+                    }       			
+                }
+                else
+                {
+                    UART_uwWriteIndex = 4;	// restore initial WriterBufferIndex 
+                }	
+                return;
+            }		          		
+            //++++++++++++++++++++ decode R/W Parameter command ++++++++++++++++++++++++
+            if((UART_ubReadBuffer[0]==0x11)&&(UART_ubReadBuffer[1]==0x10))
+            {
+                uart_voHandleParaCmd();
+                return;		
+            }			
+            //++++++++++++++++++++ decode drying machine command ++++++++++++++++++++++++
+            if((UART_ubReadBuffer[0]==0x02)&&(UART_ubReadBuffer[1]==0x01))
+            {
+                if(UART_ubReadBuffer[2] == 0x11)	// query command
+                {                    
+                    twmp_stMesg.enType = UART_SEND_STATUS;
+                    twmp_stMesg.pBuf = NULL;
+                    twmp_stMesg.uwNumBytes =0;
+                    uart_voPostMsg(twmp_stMesg);
+                }                 
+                return;
+            }		    				
+        }				
+    }	
+}
+/*************************************************************** 
+ Function
+ Description: callback called when error occurs
+ Call by: ;
+ Input Variables: N/A
+ Output/Return Variables: N/A
+ Subroutine Call: ...;
+ Reference: N/A
+****************************************************************/
+void CBError_monitor(UART_ERR_Type _err)
+{
+    // switch (_err)
+    // {
+    //     case UART_ERR_TIMEOUT:
+    //         DMA1_Channel3->CCR &= (uint16_t)(~DMA_CCR_EN);
+    //         DMA1->IFCR = DMA_ISR_GIF3;
+    //         DMA1_Channel3->CNDTR = 22;
+    //         DMA1_Channel3->CCR |= DMA_CCR_EN;
+    //         break;
+    //     case UART_ERR_NO_BUFFER:
+    //         break;
+    //     default:
+    //         break;
+    // }
+}
+/*************************************************************** 
+ Function
+ Description: Callback called when some data received.
+ Call by: ;
+ Input Variables: N/A
+ Output/Return Variables: N/A
+ Subroutine Call: ...;
+ Reference: N/A
+****************************************************************/
+void uart_voCBDoneRead(UART_ERR_Type _err, ULONG _NumBytes)
+{
+    switch(_err)
+    {
+        case UART_ERR_OK:
+            UART_uwRxNum = _NumBytes;	// copy received data number
+            break; 		 	
+        case UART_ERR_TIMEOUT:
+            break; 			
+        default:  			         
+            break;
+    }
+}
+/*************************************************************** 
+ Function
+ Description: used to send monitor data out
+ Call by: tbc_voIsr();
+ Input Variables: N/A
+ Output/Return Variables: N/A
+ Subroutine Call: ...;
+ Reference: N/A
+****************************************************************/
+void uart_voAppMonitor(void)
+{
+    if(UART_bMonSwitch) 
+    {    
+        UBYTE temp_ubBuf[TEMP_BUFFER_LEN];
+        UBYTE i;	     
+    //------ load monitor channels data (general) --------//   
+        for(i=0;i<(TEMP_BUFFER_LEN>>1);i++)	 // less than half of TEMP_BUFFER_LEN
+        {
+            temp_ubBuf[i*2]   = (*UART_pMonAddr[i])>>8;	    //Data.hi
+            temp_ubBuf[i*2+1] = (*UART_pMonAddr[i])&0xff;	//Data.lo	
+        }    
+    //------ loading data from tempBuffer to Writebuffer and send out when Writebuffer is full -------//    
+        for(i = 0; i < TEMP_BUFFER_LEN; i++)
+        {
+            UART_pWriteBuffer[UART_uwWriteIndex] = temp_ubBuf[i];	// write latest data//data adrress      
+            if(UART_uwWriteIndex == (S_FRAME_SIZE-1))	//if full, start Write_Async
+            {
+                if(!UART_stParaStatus.bWriteBusy)
+                {                 
+                    UART_stParaStatus.bWriteBusy = TRUE;                                    
+                    if((UART_bInsertPendTx==TRUE)&&(UART_pWriteBuffer == UART_ubWriteBuffer2))	// send writeBuffer and insertBuffer
+                    {                                             
+                        UART_stParaStatus.bParaStart = TRUE; 
+                        iUart_WriteAsync(0, UART_pWriteBuffer, S_FRAME_SIZE+16, uart_TxCompleteCallback, uart_TxErrorCallback);
+                    }
+                    else
+                    {                     
+                        UART_stParaStatus.bParaStart = FALSE; 
+                        iUart_WriteAsync(0, UART_pWriteBuffer, S_FRAME_SIZE, uart_TxCompleteCallback, uart_TxErrorCallback);
+                    }             
+                    if(UART_pWriteBuffer == UART_ubWriteBuffer1) 
+                    {
+                        UART_pWriteBuffer = UART_ubWriteBuffer2;               
+                    }	//dual buffer swap.
+                    else 
+                    {                             
+                        UART_pWriteBuffer = UART_ubWriteBuffer1;
+                    }                                        
+                    //initialize UART_uwWriteIndex
+                    UART_uwWriteIndex = 4;  // utilize later 60bytes of 64bytes of write-frame               
+                }
+                else
+                {
+                    UART_uwWriteIndex = 4; 
+                }           		         			
+            }
+            else 
+            {
+                UART_uwWriteIndex++;    
+            }  //index increase to next write position          
+        }        
+    }
+}
+/*************************************************************** 
+ Function
+ Description: post message
+ Call by: main;
+ Input Variables: N/A
+ Output/Return Variables: N/A
+ Subroutine Call: ...;
+ Reference: N/A
+****************************************************************/
+void uart_voPostMsg(UART_MSG _msg)
+{
+    if((UART_stMsgQ.pSave == UART_stMsgQ.pUse)&&(UART_stMsgQ.bValid == TRUE))
+    {
+        return;// if UART_stMsgQueue is full, just return  
+    }   
+    UART_stMsgQ.pSave->stMsg = _msg;
+    UART_stMsgQ.pSave = UART_stMsgQ.pSave->pNext;    
+    UART_stMsgQ.bValid = TRUE;  
+}
+/*************************************************************** 
+ Function
+ Description: handle parameter related command
+ Call by: UART_voDecode;
+ Input Variables: N/A
+ Output/Return Variables: N/A
+ Subroutine Call: ...;
+ Reference: N/A
+****************************************************************/
+void uart_voHandleParaCmd(void)
+{
+    UWORD i;
+    UWORD temp_uwIndex;
+    UWORD temp_HiWord,temp_LowWord;    
+    UART_MSG temp_stMsg;   
+    if(UART_ubReadBuffer[2] == 0x01)  // Read parameters command
+    {		
+        for(i=2;i<PARA_TABLE_SIZE;i+=2)
+        {
+            //----- check 16bits data's sign ------
+            if(i>=14)
+            {
+                if(*UART_pParaTable[i+1]&0x8000)
+                {
+                    *UART_pParaTable[i] = 0xFFFF;
+                }	// if data16<0
+                else 
+                {
+                    *UART_pParaTable[i] = 0x0000;
+                }
+            }
+            // ----- load value (little-endian)-----
+            UART_ubParaBuffer[i*2-4] = (UBYTE)((*UART_pParaTable[i])>>8);    
+            UART_ubParaBuffer[i*2-3] = (UBYTE)((*UART_pParaTable[i])&0x00FF);  
+            UART_ubParaBuffer[i*2-2] = (UBYTE)((*UART_pParaTable[i+1])>>8);   
+            UART_ubParaBuffer[i*2-1] = (UBYTE)((*UART_pParaTable[i+1])&0x00FF); 
+        }		
+        temp_stMsg.enType = UART_SEND_PARA;
+        temp_stMsg.pBuf = UART_ubParaBuffer;
+        temp_stMsg.uwNumBytes = PARA_BUFFER_SIZE ;
+        uart_voPostMsg(temp_stMsg);        // post message
+    }
+    if(UART_ubReadBuffer[2] == 0x02)  // Write Parameters command
+    {
+        temp_uwIndex = UART_ubReadBuffer[3];
+        temp_HiWord = ((UWORD)UART_ubReadBuffer[4]<<8) + ((UWORD)UART_ubReadBuffer[5]);
+        temp_LowWord = ((UWORD)UART_ubReadBuffer[6]<<8) +((UWORD)UART_ubReadBuffer[7]);
+        *UART_pParaTable[temp_uwIndex] = temp_HiWord;
+        *UART_pParaTable[temp_uwIndex+1] = temp_LowWord;
+    }
+}
+/*************************************************************** 
+ Function
+ Description: Query if there is a message in msgQueue
+ Call by: SysTick_Handler;
+ Input Variables: N/A
+ Output/Return Variables: N/A
+ Subroutine Call: ...;
+ Reference: N/A
+****************************************************************/
+void uart_voApplTimer(void)
+{
+    UBYTE i = 0;
+    if(UART_stMsgQ.bValid)       // if there is a message in msgQueue
+    {  
+    //------------- fetch message ---------------//
+        if(UART_stMsgQ.bHandling == FALSE) // if there isn't any MSG under handling.
+        {
+            if(UART_stMsgQ.pUse != UART_stMsgQ.pSave)
+            {
+                UART_stMsgFetched = UART_stMsgQ.pUse->stMsg;// fetch message
+                UART_stMsgQ.pUse = UART_stMsgQ.pUse->pNext;	// shift to next UART_stMsgQueue position            
+                UART_stMsgQ.bHandling = TRUE; 	        //set bMsgHandling flag, prevent from fetching new msg from UART_stMsgQueue.
+            }
+            else
+            {
+                UART_stMsgQ.bValid = FALSE;		// invalid UART_stMsgQueue(all message has been handled, prevent from calling UART_voHandleMsg again)
+                return;
+            }		
+        }
+    //--------------------------------------------   
+        if(UART_bInsertPendTx)
+        {
+            return;// if insertBuffer is pending to be transmitted, just return to wait
+        }       
+        //------------  process message --------------//
+        switch(UART_stMsgFetched.enType)				
+        {			
+            case UART_NULL:		        // invalid message
+                break;		
+            case UART_SEND_PARA:	        
+            {		
+                if((UART_stMsgFetched.uwNumBytes==0)||(UART_stMsgFetched.pBuf==NULL))
+                { 
+                    UART_stMsgQ.bHandling = FALSE;	// fetched message has been processed over(invalid message)
+                    return; 
+                }          
+                UART_ubInsertBuf[4] = 0x11;	// parameter response frame header	
+                UART_ubInsertBuf[5] = 0x10;
+            }
+                break;
+            case UART_SEND_STATUS:
+            {	
+                if((UART_stMsgFetched.uwNumBytes==0)||(UART_stMsgFetched.pBuf==NULL))
+                { 
+                    UART_stMsgQ.bHandling = FALSE;	// fetched message has been processed over(invalid message)
+                    return; 
+                }        
+                UART_ubInsertBuf[4]=0x02;	// application status response header	
+                UART_ubInsertBuf[5]=0x01;
+            }	
+                break;			
+        }	     
+        if(UART_stMsgFetched.uwNumBytes  > (INSERT_BUFFER_SIZE-INSERT_BUFFER_HEADER_LEN))	
+        {					
+            UART_ubInsertBuf[INSERT_BUFFER_HEADER_LEN-1] = 0xFF;	
+            UART_stMsgFetched.uwNumBytes -= (INSERT_BUFFER_SIZE-INSERT_BUFFER_HEADER_LEN);// bytes left to be sent out in modbus response.			
+            for(i=0;i<(INSERT_BUFFER_SIZE-INSERT_BUFFER_HEADER_LEN);i++)
+            {
+                UART_ubInsertBuf[INSERT_BUFFER_HEADER_LEN+i] = *UART_stMsgFetched.pBuf;
+                UART_stMsgFetched.pBuf++; 
+            }      
+        }
+        else
+        {
+            UART_ubInsertBuf[INSERT_BUFFER_HEADER_LEN-1] = UART_stMsgFetched.uwNumBytes;				
+            for(i=0;i<UART_stMsgFetched.uwNumBytes;i++)
+            {
+                UART_ubInsertBuf[INSERT_BUFFER_HEADER_LEN+i] = *UART_stMsgFetched.pBuf;
+                UART_stMsgFetched.pBuf++; 
+            }               
+            UART_stMsgQ.bHandling = FALSE;// fetched message has been processed over(new message can be fetched)
+        }   
+        UART_bInsertPendTx = TRUE;        // insertBuffer is pending to be transmitted     
+        //----------- transmit message -------------//
+        if(UART_bMonSwitch)//--- Load data in insertBuffer to WriteBuffer2 ---	 
+        {     
+            for(i=0;i<INSERT_BUFFER_SIZE;i++)
+            {          
+                UART_ubWriteBuffer2[S_FRAME_SIZE+i] = UART_ubInsertBuf[i];
+            }                     
+        } 
+        else
+        {
+            UART_stParaStatus.bParaStart = TRUE;
+            iUart_WriteAsync(0, UART_ubInsertBuf, 16, uart_TxCompleteCallback, uart_TxErrorCallback);
+        }        
+    }
+}
+/*************************************************************** 
+ Function
+ Description: XOR check when receive data.
+ Call by: main;
+ Input Variables: N/A
+ Output/Return Variables: N/A
+ Subroutine Call: ...;
+ Reference: N/A
+****************************************************************/
+UBYTE uart_ubCheckXOR(UBYTE* Buf, UBYTE CNT)
+{
+    UWORD temp_Xor = 0;
+    UWORD i;
+    for(i=0;i<CNT; i++)
+    {
+        temp_Xor ^= Buf[i];
+    }
+    return temp_Xor; 
+}
+/*************************************************************** 
+ Function
+ Description: Reconfigure when the data received incomletely in 1s
+ Call by: SysTick_Handler;
+ Input Variables: N/A
+ Output/Return Variables: N/A
+ Subroutine Call: ...;
+ Reference: N/A
+****************************************************************/
+void uart_voDriTimer(void)
+{
+    // if(DMA1_Channel3->CNDTR != 22)
+    // {
+    //     ++UART_uwTimeoutCtr;
+    //     if(UART_uwTimeoutCtr == UART_Config.uwTimeout)	// Timeout match
+    //     {
+    //         UART_uwTimeoutCtr = 0;
+    //         UART_fpError(UART_ERR_TIMEOUT);
+    //     }
+    // }
+    // else
+    // {
+    //     UART_uwTimeoutCtr = 0;
+    // }
+}
+/***************************************************************  
+ Function: 
+ Description: 
+ Call by: 
+ Input Variables: 
+ Output/Return Variables: 
+ Subroutine Call: 
+ Reference: N/A
+****************************************************************/
+void uart_Read_Poll2(ULONG _NumBytes,UBYTE* _Buffer,CB_DONE_READ _fpCBDone)
+{
+	UBYTE i;
+	UBYTE* pBuffer = _Buffer;
+	//---clear receive data buffer!---
+	for(i=0;i<_NumBytes;i++)
+	{
+		*pBuffer = 0;
+		pBuffer++;
+	}		
+	//---Set busy flag---
+	USART_Read.m_ReadBusy = TRUE;		// clear ReadBusy flag		
+	//---setup Read object---	
+	USART_Read.m_BuffSize = _NumBytes;	
+	USART_Read.m_DataBuff.pBuf = _Buffer;
+	USART_Read.m_fpDone = _fpCBDone;
+	USART_Read.m_DataBuff.NumBytes = 0;	
+} 
+/***************************************************************  
+ Function: 
+ Description: 
+ Call by: 
+ Input Variables: 
+ Output/Return Variables: 
+ Subroutine Call: 
+ Reference: N/A
+****************************************************************/
+void ReadFrame_Poll2(void)
+{
+	UBYTE tempRxData;
+    CB_DONE_READ CBTemp;
+	if(NULL == USART_Read.m_DataBuff.pBuf)
+    {
+        return;
+    }
+    while (iUart_Available(0))
+    {	
+        iUart_Read(0, &tempRxData, 1);		// save register data
+        UART_blCommErrFlag = FALSE;
+        if(uart_frameStartFlag == FALSE)		// if the frame header has not been detected.
+        {
+            if(tempRxData != 0x11)
+            {
+                return;
+            }	// 0xB2 is LittleSwan CMD frame header byte.
+            else // frame header detected
+            {							
+                if(USART_Read.m_DataBuff.NumBytes==0)	// ready to save data
+                {
+                    uart_frameStartFlag = TRUE;
+                    uart_receivedNum = 0;
+                }
+                else	// not ready to save data 
+                {
+                    return;	// just return (wait until ready)
+                }
+            }
+        }
+        //------------------------ cmd frameheader 0xB2 has been detected -----------------------
+        uart_receivedNum++;
+        uart_frameLength = 22;	
+        if(uart_receivedNum == uart_frameLength)
+        {
+            uart_receivedNum =0;
+            uart_frameStartFlag = FALSE;
+        }
+        if(UART_blCommErrFlag == FALSE)	
+        {
+            if(USART_Read.m_BuffSize > USART_Read.m_DataBuff.NumBytes) 
+            {
+                if(USART_Read.m_DataBuff.pBuf != NULL)
+                {
+                    *USART_Read.m_DataBuff.pBuf =  tempRxData;
+                    USART_Read.m_DataBuff.pBuf++;
+                    USART_Read.m_DataBuff.NumBytes++;
+                }  		 
+                if(USART_Read.m_DataBuff.NumBytes  == uart_frameLength)
+                {                       
+                    USART_Read.m_DataBuff.pBuf = NULL;	
+                    USART_Read.m_BuffSize = 0;
+                    CBTemp = USART_Read.m_fpDone;
+                    USART_Read.m_fpDone = NULL;                          
+                    USART_Read.m_ReadBusy = FALSE;		// clear ReadBusy flag !      
+                    if(CBTemp != NULL)
+                    {	
+                        CBTemp(UART_ERR_OK, uart_frameLength);
+                    }
+                    uart_frameLength = 0;
+                }	 
+            }
+        }
+    }
+}
+
+/*************************************************************** 
+ Function:
+ Description: 
+ Call by: main;
+ Input Variables: N/A
+ Output/Return Variables: N/A
+ Subroutine Call: ...;
+ Reference: N/A
+****************************************************************/
+void uart_voSwanInit(void)
+{   	
+    UART_fpError = (CB_ERR)CBError_Swan;    	           
+    UART_Config = UART_stConfigLEN;           	           
+    uart_Read_Poll2(RX_BUFFER_SIZE,uart_pReadBuffer2,CBDoneRead2);	// use poll method for littleswan receiving.
+}
+/*************************************************************** 
+ Function
+ Description: 
+ Call by: main;
+ Input Variables: N/A
+ Output/Return Variables: N/A
+ Subroutine Call: ...;
+ Reference: N/A
+****************************************************************/
+void CBError_Swan(UART_ERR_Type _err)
+{
+  switch (_err)
+  {
+    case UART_ERR_TIMEOUT:
+        uart_DataNum2 = 0;		// clear s_DataNum2 for the next read !!
+        uart_Read_Poll2(RX_BUFFER_SIZE,uart_pReadBuffer2,CBDoneRead2);
+      break;
+    case UART_ERR_NO_BUFFER:
+      break;
+    case UART_ERR_UNKNOWN_CMD:
+        uart_DataNum2 = 0;		// clear s_DataNum2 for the next read !!
+        uart_Read_Poll2(RX_BUFFER_SIZE,uart_pReadBuffer2,CBDoneRead2);
+      break;
+  }
+}
+/***************************************************************  
+ Function: 
+ Description: 
+ Call by: 
+ Input Variables: 
+ Output/Return Variables: 
+ Subroutine Call: 
+ Reference: N/A
+****************************************************************/
+//void WriteFrame_Poll2(void)
+//{   
+//    BOOL WriteOverFlag = FALSE;
+//    if(NULL== USART_Write.m_DataBuff.pBuf)
+//    {
+//        return;
+//    }    	
+//	if(USART_Write.m_DataBuff.NumBytes != 0)
+//	{
+//        USART1->TDR = *USART_Write.m_DataBuff.pBuf;
+//		USART_Write.m_DataBuff.pBuf++;
+//		USART_Write.m_DataBuff.NumBytes--;
+//    	if(0 == USART_Write.m_DataBuff.NumBytes)
+//        {
+//    		WriteOverFlag = TRUE;                    				
+//        }
+//	}
+//	if(TRUE == WriteOverFlag)
+//	{
+//        //disable TXEIE(bit7)
+//        USART1->CR1 &= ~0x00000080;     
+//		WriteOverFlag = FALSE;
+//		USART_Write.m_DataBuff.pBuf =NULL;
+//		USART_Write.m_WriteBusy = FALSE;	
+//	}
+//}
+/***************************************************************  
+ Function: 
+ Description: 
+ Call by: 
+ Input Variables: 
+ Output/Return Variables: 
+ Subroutine Call: 
+ Reference: N/A
+****************************************************************/
+void HAL_CancelRead_Poll2(void)
+{
+	USART_Read.m_BuffSize = 0;	
+	uart_receivedNum =0;
+	uart_frameLength =0;
+	uart_frameType = 0x00;
+	uart_frameStartFlag = FALSE;
+    UART_fpError(UART_ERR_TIMEOUT);
+}
+/*************************************************************** 
+ Function
+ Description: 
+ Call by: main;
+ Input Variables: N/A
+ Output/Return Variables: N/A
+ Subroutine Call: ...;
+ Reference: N/A
+****************************************************************/
+// void uart_voApplMain(void)
+// {
+// 	UBYTE* pBuffer = NULL;		
+// 	UWORD numBytes = 0;		   
+// 	if(uart_DataNum2)	
+//     {	           
+//         if(SwanDecoder(uart_pReadBuffer2, uart_DataNum2, &pBuffer, &numBytes))
+//         {
+//             uart_Write_Poll2(numBytes, pBuffer);
+//         }         
+//         uart_DataNum2 = 0;		
+//         uart_Read_Poll2(RX_BUFFER_SIZE,uart_pReadBuffer2,CBDoneRead2);
+// 	} 
+// }
+/***************************************************************  
+ Function: 
+ Description: 
+ Call by: 
+ Input Variables: 
+ Output/Return Variables: 
+ Subroutine Call: 
+ Reference: N/A
+****************************************************************/
+// void uart_Write_Poll2(ULONG _NumBytes,const UBYTE* _Buffer)
+// {
+// 	if(USART_Write.m_WriteBusy == TRUE)
+// 	{
+// 		return;
+// 	}
+// 	USART_Write.m_WriteBusy = TRUE;
+// 	USART_Write.m_DataBuff.pBuf = (UBYTE*)_Buffer;
+// 	USART_Write.m_DataBuff.NumBytes = _NumBytes;    
+//     //enable TXEIE(bit7)
+//     USART1->CR1 |= 0x00000080;
+// }
+
+void uart_TxCompleteCallback()
+{
+    if( UART_stParaStatus.bParaStart)
+    {         
+        UART_bInsertPendTx = FALSE;  // clear insertBuffer pending
+        UART_stParaStatus.bParaStart = FALSE; //clear parameter status                          
+    }
+    else
+    {
+        //do nothing   
+    }
+    UART_stParaStatus.bWriteBusy = FALSE;    
+}
+
+void uart_TxErrorCallback()
+{
+    if( UART_stParaStatus.bParaStart)
+    {         
+        UART_bInsertPendTx = FALSE;  // clear insertBuffer pending
+        UART_stParaStatus.bParaStart = FALSE; //clear parameter status       
+    }
+    UART_stParaStatus.bWriteBusy = FALSE;
+}
+/************************************************************************
+  Local Functions:
+*************************************************************************/
+
+#ifdef _UART_MONITOR_C_
+    #undef _UART_MONITOR_C_
+#endif
+/************************************************************************
+ Copyright (c) 2019 Welling Motor Technology(Shanghai) Co. Ltd.
+ All rights reserved.
+*************************************************************************
+ End of this File (EOF)!
+ Do not put anything after this part!
+*************************************************************************/
+

+ 2 - 2
User project/4.BasicHardwSoftwLayer/1.BasicHardwLayer/Include/board_config.h

@@ -24,8 +24,8 @@
 
 /* ---------------------------------- 系统RAM --------------------------------- */
 
-#define HW_RAM_START_ADDRESS 0x20001fffUL
-#define HW_RAM_END_ADDRESS   0x20001fffUL
+#define HW_RAM_START_ADDRESS 0x20000000UL
+#define HW_RAM_END_ADDRESS   0x20017fffUL
 
 /* ---------------------------------- MCU Frequency ---------------------------------- */
 

+ 21 - 21
User project/4.BasicHardwSoftwLayer/1.BasicHardwLayer/Source/hwsetup.c

@@ -453,7 +453,7 @@ void hw_voInitDMA(void)
     
     dma_init_struct.periph_addr  = (uint32_t)(&USART_DATA(UART3));
     dma_init_struct.periph_inc   = DMA_PERIPH_INCREASE_DISABLE;
-    dma_init_struct.memory_addr  = (uint32_t)(UART_pWriteBuffer);
+    dma_init_struct.memory_addr  = (uint32_t)(0x20000000);
     dma_init_struct.memory_inc   = DMA_MEMORY_INCREASE_ENABLE;
     dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;
     dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;  
@@ -467,26 +467,26 @@ void hw_voInitDMA(void)
     /* enable DMA1 channel4 */
     //dma_channel_enable(DMA1, DMA_CH4);
     
-    /*=======================================================================
-                             DMA1 Ch2 for UART3 receive
-    =======================================================================*/
-    dma_deinit(DMA1, DMA_CH2); 
-    
-    dma_init_struct.periph_addr  = (uint32_t)(&USART_DATA(UART3));
-    dma_init_struct.periph_inc   = DMA_PERIPH_INCREASE_DISABLE;
-    dma_init_struct.memory_addr  = (uint32_t)(UART_ubReadBuffer);
-    dma_init_struct.memory_inc   = DMA_MEMORY_INCREASE_ENABLE;
-    dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;
-    dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;  
-    dma_init_struct.direction    = DMA_PERIPHERAL_TO_MEMORY;
-    dma_init_struct.number       = 22;
-    dma_init_struct.priority     = DMA_PRIORITY_HIGH;
-    dma_init(DMA1, DMA_CH2, &dma_init_struct);
-    
-    dma_circulation_disable(DMA1, DMA_CH2);
-
-    /* enable DMA1 channel2 */
-    dma_channel_enable(DMA1, DMA_CH2);
+//    /*=======================================================================
+//                             DMA1 Ch2 for UART3 receive
+//    =======================================================================*/
+//    dma_deinit(DMA1, DMA_CH2); 
+//    
+//    dma_init_struct.periph_addr  = (uint32_t)(&USART_DATA(UART3));
+//    dma_init_struct.periph_inc   = DMA_PERIPH_INCREASE_DISABLE;
+//    dma_init_struct.memory_addr  = (uint32_t)(UART_ubReadBuffer);
+//    dma_init_struct.memory_inc   = DMA_MEMORY_INCREASE_ENABLE;
+//    dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;
+//    dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;  
+//    dma_init_struct.direction    = DMA_PERIPHERAL_TO_MEMORY;
+//    dma_init_struct.number       = 22;
+//    dma_init_struct.priority     = DMA_PRIORITY_HIGH;
+//    dma_init(DMA1, DMA_CH2, &dma_init_struct);
+//    
+//    dma_circulation_disable(DMA1, DMA_CH2);
+//
+//    /* enable DMA1 channel2 */
+//    dma_channel_enable(DMA1, DMA_CH2);
 }
 
 /*************************************************************************

+ 4 - 5
User project/4.BasicHardwSoftwLayer/2.BasicSoftwLayer/Include/user.h

@@ -530,8 +530,9 @@ Update Time
 #include "alignstartup.h"
 #include "switchhall.h"
 #else
-#include <stdlib.h>
-#include "gd32F30x.h"
+
+//#include <stdlib.h>
+//#include "gd32F30x.h"
 #include "CodePara.h"
 #include "classB.h"
 #include "hwsetup.h"
@@ -553,8 +554,6 @@ Update Time
 #include "torqobs.h"
 #include "obs.h"
 #include "dbc.h"
-#include "uart_appl.h"
-#include "uart_driver.h"
 #include "flxwkn.h"
 #include "pwm.h"
 #include "brake.h"
@@ -562,7 +561,7 @@ Update Time
 #include "pwrlim.h"
 #include "bootloader.h"
 #include "brake.h"
-#include "uart_monitor_appl.h"
+#include "uart_monitor.h"
 #include "macroequ.h"
 #include "alignstartup.h"
 #include "switchhall.h"

+ 1 - 1
User project/5.Api_rt/api_rt.c

@@ -5,7 +5,7 @@ void iRt_Init()
     iRtGpio_Init();
     iRtTimer_Init();
     iRtCap_Init();
-//    iRtUart_Init();
+    iRtUart_Init();
     iRtPwm_Init();
     iRtAdc_Init();
 }

+ 1 - 1
User project/5.Api_rt/api_rt.h

@@ -4,7 +4,7 @@
 #include "board_config.h"
 #include "api_rt_gpio.h"
 #include "api_rt_cap.h"
-//#include "api_rt_uart.h"
+#include "api_rt_uart.h"
 #include "api_rt_timer.h"
 #include "api_rt_pwm.h"
 #include "api_rt_adc.h"

+ 214 - 0
User project/5.Api_rt/api_rt_uart.c

@@ -0,0 +1,214 @@
+#include "api_uart.h"
+#include "api_rt_uart.h"
+#include "api_rt_dbg.h"
+#include "board_config.h"
+#include "gd32f30x.h"
+
+ApiRtUart_Handle Uarts[1];
+
+uint8_t rxBuffer[UART_BUFFER_LENGTH];
+uint8_t txBuffer[UART_BUFFER_LENGTH];
+
+void iRtUart_Init()
+{
+    Uarts[0].UartBase         = UART3;
+    Uarts[0].DmaBase          = DMA1;
+    Uarts[0].DmaChannelBase   = DMA_CH4;
+//    Uarts[0].TxDmaChannelBase = DMA1_Channel2;
+    Uarts[0].Status           = ApiUart_Idle;
+    Uarts[0].RxBuffer         = rxBuffer;
+    Uarts[0].TxBuffer         = txBuffer;
+    Uarts[0].RxBufferHead     = 0;
+    Uarts[0].RxBufferTail     = 0;
+    Uarts[0].TxBufferCount    = 0;
+
+    Uarts[0].AsyncWriteCompleteCallback = 0;
+    Uarts[0].AsyncReadCompleteCallback  = 0;
+    Uarts[0].AsyncWriteErrorCallback    = 0;
+    Uarts[0].AsyncReadErrorCallback     = 0;
+
+    Uarts[0].AsyncReadCount = 0;
+    Uarts[0].AsyncReadAddr  = 0;
+    
+    /*=======================================================================
+                             DMA1 Ch2 for UART3 receive
+    =======================================================================*/
+    dma_deinit(DMA1, DMA_CH2); 
+    dma_parameter_struct dma_init_struct;
+    
+    dma_init_struct.periph_addr  = (uint32_t)(&USART_DATA(UART3));
+    dma_init_struct.periph_inc   = DMA_PERIPH_INCREASE_DISABLE;
+    dma_init_struct.memory_addr  = (uint32_t)(rxBuffer);
+    dma_init_struct.memory_inc   = DMA_MEMORY_INCREASE_ENABLE;
+    dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;
+    dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;  
+    dma_init_struct.direction    = DMA_PERIPHERAL_TO_MEMORY;
+    dma_init_struct.number       = 22;
+    dma_init_struct.priority     = DMA_PRIORITY_HIGH;
+    dma_init(DMA1, DMA_CH2, &dma_init_struct);
+    
+    dma_circulation_disable(DMA1, DMA_CH2);
+
+    /* enable DMA1 channel2 */
+    dma_channel_enable(DMA1, DMA_CH2);
+}
+
+void iUart_Open(uint8_t devIndex, uint32_t baudrate)
+{
+    USART_BAUD(Uarts[devIndex].UartBase)=(HW_MCU_CLOCK_HZ / baudrate);
+    USART_CTL0(Uarts[devIndex].UartBase) |= 0x00000001;
+//    Uarts[devIndex].UartBase->BRR = (HW_MCU_CLOCK_HZ / baudrate);
+//    Uarts[devIndex].UartBase->CR1 |= 0x00000001;
+}
+
+void iUart_Close(uint8_t devIndex)
+{
+    USART_CTL0(Uarts[devIndex].UartBase) &= ~(0x00000001UL);
+//    Uarts[devIndex].UartBase->CR1 &= ~(0x00000001UL);
+}
+
+ApiUart_Status iUart_GetStatus(uint8_t devIndex)
+{
+    return ApiUart_Idle;
+}
+
+int16_t iUart_Available(uint8_t devIndex)
+{
+    return (Uarts[devIndex].RxBufferTail + UART_BUFFER_LENGTH - Uarts[devIndex].RxBufferHead) % UART_BUFFER_LENGTH;
+}
+
+int16_t iUart_GetWriteBufferSpace(uint8_t devIndex)
+{
+    return UART_BUFFER_LENGTH;
+}
+
+int16_t iUart_Read(uint8_t devIndex, uint8_t *data, int16_t count)
+{
+    int16_t readCount = 0;
+//    data[readCount] = Uarts[devIndex].RxBuffer[Uarts[devIndex].RxBufferHead];
+    if ((Uarts[devIndex].Status & ApiUart_ReadBusy) == 0)
+    {
+        while (Uarts[devIndex].RxBufferHead != Uarts[devIndex].RxBufferTail && readCount < count)
+        {
+            data[readCount] = Uarts[devIndex].RxBuffer[Uarts[devIndex].RxBufferHead];
+            Uarts[devIndex].RxBufferHead += 1;
+            Uarts[devIndex].RxBufferHead %= UART_BUFFER_LENGTH;
+            readCount++;
+        }
+    }
+    return readCount;
+}
+
+int16_t iUart_Write(uint8_t devIndex, uint8_t *data, int16_t count)
+{
+    int16_t writeCount = 0;
+    if ((Uarts[devIndex].Status & ApiUart_WriteBusy) == 0)
+    {
+        while (writeCount < count)
+        {
+            USART_DATA(Uarts[devIndex].UartBase) = data[writeCount];
+            while ((USART_STAT0(Uarts[devIndex].UartBase) & 0x80) == 0)
+            {
+                ;
+            }
+//            Uarts[devIndex].UartBase->TDR = data[writeCount];
+//            while ((Uarts[devIndex].UartBase->ISR & 0x80) == 0)
+//            {
+//                ;
+//            }
+        }
+    }
+    return writeCount;
+}
+
+void iUart_ReadAsync(uint8_t devIndex, uint8_t *data, uint8_t count, void (*cplt)(uint8_t *data, int16_t count), void (*error)())
+{
+    if ((Uarts[devIndex].Status & ApiUart_ReadBusy) == 0)
+    {
+        Uarts[devIndex].Status |= ApiUart_ReadBusy;
+        Uarts[devIndex].AsyncReadCount    = count;
+        Uarts[devIndex].AsyncReadAddr     = data;
+        Uarts[devIndex].AsyncReadCompleteCallback = cplt;
+        Uarts[devIndex].AsyncReadErrorCallback    = error;
+    }
+}
+
+void iUart_WriteAsync(uint8_t devIndex, uint8_t *data, uint8_t count, void (*cplt)(), void (*error)())
+{
+    if ((Uarts[devIndex].Status & ApiUart_WriteBusy) == 0)
+    {
+        Uarts[devIndex].Status |= ApiUart_WriteBusy;
+        Uarts[devIndex].AsyncWriteCompleteCallback      = cplt;
+        Uarts[devIndex].AsyncWriteErrorCallback         = error;
+        DMA_CHMADDR(Uarts[devIndex].DmaBase,Uarts[devIndex].DmaChannelBase)= (uint32_t)data;
+        DMA_CHCNT(Uarts[devIndex].DmaBase,Uarts[devIndex].DmaChannelBase)= count;
+        USART_STAT0(Uarts[devIndex].UartBase) &= ~ USART_STAT0_TC;
+        DMA_CHCTL(Uarts[devIndex].DmaBase,Uarts[devIndex].DmaChannelBase)|= 0x00000001;
+//        Uarts[devIndex].TxDmaChannelBase->CMAR  = (uint32_t)data;
+//        Uarts[devIndex].TxDmaChannelBase->CNDTR = count;
+//        Uarts[devIndex].UartBase->ICR = UART_CLEAR_TCF;
+//        Uarts[devIndex].TxDmaChannelBase->CCR |= 0x00000001;
+    }
+}
+
+void iRtUart_RxIsr(uint8_t devIndex)
+{  
+    static uint16_t uwTempCount = 0;
+    if (dma_flag_get(DMA1, DMA_CH2, DMA_INT_FLAG_FTF) != 0)
+    {
+        Uarts[0].RxBufferTail = 22;
+        Uarts[0].RxBufferHead = 0;
+        DMA_CH2CTL(DMA1) &= ~DMA_CHXCTL_CHEN;
+        //dma_flag_clear(DMA1, DMA_CH2, DMA_INT_FLAG_FTF);
+        DMA_INTC(DMA1) |= DMA_FLAG_ADD(DMA_INT_FLAG_FTF, DMA_CH2);
+        uwTempCount = 22 - DMA_CH2CNT(DMA1);  
+        DMA_CH2CNT(DMA1) = uwTempCount;
+        DMA_CH2CTL(DMA1) |= DMA_CHXCTL_CHEN;
+    }
+    /* RX error */
+    if (dma_flag_get(DMA1, DMA_CH2, DMA_FLAG_ERR) != 0)
+    {
+        DMA_CH2CTL(DMA1) &= ~DMA_CHXCTL_CHEN;
+        //dma_flag_clear(DMA1, DMA_CH2, DMA_FLAG_ERR);
+        DMA_INTC(DMA1) |= DMA_FLAG_ADD(DMA_FLAG_ERR, DMA_CH2); 
+        DMA_CH2CNT(DMA1) = 22;
+        DMA_CH2CTL(DMA1) |= DMA_CHXCTL_CHEN;
+    }
+    
+    if (Uarts[0].AsyncReadCount > 0 && iUart_Available(0) >= Uarts[0].AsyncReadCount)
+    {
+        iUart_Read(0, Uarts[0].AsyncReadAddr, Uarts[0].AsyncReadCount);
+        if (Uarts[0].AsyncReadCompleteCallback != 0)
+        {
+            Uarts[0].AsyncReadCompleteCallback(Uarts[0].AsyncReadAddr, Uarts[0].AsyncReadCount);
+        }
+        Uarts[0].AsyncReadCount = 0;
+        Uarts[0].Status &= ~ApiUart_ReadBusy;
+    }
+}
+
+void iRtUart_AsyncWriteCompleteIsr(uint8_t devIndex)
+{
+    DMA_CHCTL(Uarts[devIndex].DmaBase,Uarts[devIndex].DmaChannelBase)&= ~0x00000001;
+    USART_STAT0(Uarts[devIndex].UartBase) &= ~ USART_STAT0_TC;
+//    Uarts[0].TxDmaChannelBase->CCR &= (uint16_t)(~DMA_CCR_EN);
+//    Uarts[0].UartBase->ICR = UART_CLEAR_TCF;
+    Uarts[devIndex].Status &= ~ApiUart_WriteBusy;
+    if (Uarts[devIndex].AsyncWriteCompleteCallback != 0)
+    {
+        Uarts[devIndex].AsyncWriteCompleteCallback(); 
+    }
+}
+
+void iRtUart_AsyncWriteErrorIsr(uint8_t devIndex)
+{
+    DMA_CHCTL(Uarts[devIndex].DmaBase,Uarts[devIndex].DmaChannelBase)&= ~0x00000001;
+    USART_STAT0(Uarts[devIndex].UartBase) &= ~ USART_STAT0_TC;
+//    Uarts[0].TxDmaChannelBase->CCR &= (uint16_t)(~DMA_CCR_EN);
+//    Uarts[0].UartBase->ICR = UART_CLEAR_TCF;
+    Uarts[devIndex].Status &= ~ApiUart_WriteBusy;
+    if (Uarts[devIndex].AsyncWriteErrorCallback != 0)
+    {
+        Uarts[devIndex].AsyncWriteErrorCallback();
+    }
+}

+ 41 - 0
User project/5.Api_rt/api_rt_uart.h

@@ -0,0 +1,41 @@
+#ifndef _API_RT_UART_H_
+#define _API_RT_UART_H_
+
+#include <stdint.h>
+#include "api_rt_common.h"
+#include "gd32f30x.h"
+#include "api_uart.h"
+
+#define UART_BUFFER_LENGTH      64
+
+typedef struct
+{
+    uint32_t UartBase;
+//    uint32_t TxDmaChannelBase;
+    uint32_t DmaBase;
+    dma_channel_enum DmaChannelBase;
+    ApiUart_Status Status;
+    uint8_t *RxBuffer;
+    uint16_t RxBufferHead;
+    uint16_t RxBufferTail;
+    uint8_t *TxBuffer;
+    uint16_t TxBufferCount;
+
+    void (*AsyncWriteCompleteCallback)();
+    void (*AsyncWriteErrorCallback)();
+    void (*AsyncReadCompleteCallback)(uint8_t *data, int16_t count);
+    void (*AsyncReadErrorCallback)();
+
+    int16_t AsyncReadCount;
+    uint8_t *AsyncReadAddr;
+} ApiRtUart_Handle;
+
+extern ApiRtUart_Handle Uarts[1];
+
+void iRtUart_Init();
+
+void iRtUart_RxIsr(uint8_t devIndex);
+void iRtUart_AsyncWriteCompleteIsr(uint8_t devIndex);
+void iRtUart_AsyncWriteErrorIsr(uint8_t devIndex);
+
+#endif

+ 10 - 16
WLMCP.ewp

@@ -2541,13 +2541,7 @@
                     <name>$PROJ_DIR$\User project\2.MotorDrive\Include\torqobs.h</name>
                 </file>
                 <file>
-                    <name>$PROJ_DIR$\User project\2.MotorDrive\Include\uart_appl.h</name>
-                </file>
-                <file>
-                    <name>$PROJ_DIR$\User project\2.MotorDrive\Include\uart_driver.h</name>
-                </file>
-                <file>
-                    <name>$PROJ_DIR$\User project\2.MotorDrive\Include\uart_monitor_appl.h</name>
+                    <name>$PROJ_DIR$\User project\2.MotorDrive\Include\uart_monitor.h</name>
                 </file>
             </group>
             <group>
@@ -2596,15 +2590,6 @@
                     <file>
                         <name>$PROJ_DIR$\User project\2.MotorDrive\Source\packed\torqobs.c</name>
                     </file>
-                    <file>
-                        <name>$PROJ_DIR$\User project\2.MotorDrive\Source\packed\uart_appl.c</name>
-                    </file>
-                    <file>
-                        <name>$PROJ_DIR$\User project\2.MotorDrive\Source\packed\uart_driver.c</name>
-                    </file>
-                    <file>
-                        <name>$PROJ_DIR$\User project\2.MotorDrive\Source\packed\uart_monitor_appl.c</name>
-                    </file>
                 </group>
                 <file>
                     <name>$PROJ_DIR$\User project\2.MotorDrive\Source\adc.c</name>
@@ -2621,6 +2606,9 @@
                 <file>
                     <name>$PROJ_DIR$\User project\2.MotorDrive\Source\spdctrmode.c</name>
                 </file>
+                <file>
+                    <name>$PROJ_DIR$\User project\2.MotorDrive\Source\uart_monitor.c</name>
+                </file>
             </group>
         </group>
         <group>
@@ -2871,6 +2859,12 @@
             <file>
                 <name>$PROJ_DIR$\User project\5.Api_rt\api_rt_timer.h</name>
             </file>
+            <file>
+                <name>$PROJ_DIR$\User project\5.Api_rt\api_rt_uart.c</name>
+            </file>
+            <file>
+                <name>$PROJ_DIR$\User project\5.Api_rt\api_rt_uart.h</name>
+            </file>
         </group>
         <group>
             <name>api</name>