Răsfoiți Sursa

feat(api_rt_cap): 添加捕获抽象层,待测试

CN\zhangkai71 2 ani în urmă
părinte
comite
63bf70e71f
39 a modificat fișierele cu 488 adăugiri și 199 ștergeri
  1. 0 1
      User project/1.FrameLayer/Source/FSM_1st.c
  2. 26 2
      User project/1.FrameLayer/Source/TimeTask_Event.c
  3. 8 0
      User project/1.FrameLayer/Source/app.c
  4. 48 47
      User project/1.FrameLayer/Source/gd32f30x_it.c
  5. 2 1
      User project/1.FrameLayer/Source/main.c
  6. 2 1
      User project/1.FrameLayer/Source/tbc.c
  7. 1 1
      User project/1.FrameLayer/Source/tbs.c
  8. 0 1
      User project/2.MotorDrive/Source/adc.c
  9. 1 11
      User project/2.MotorDrive/Source/pwm.c
  10. 1 1
      User project/2.MotorDrive/Source/spdctrFSM.c
  11. 0 1
      User project/2.MotorDrive/Source/spdctrmode.c
  12. 0 44
      User project/3.BasicFunction/Include/FuncLayerAPI.h
  13. 27 0
      User project/3.BasicFunction/Include/InputCapture.h
  14. 0 1
      User project/3.BasicFunction/Include/bikelight.h
  15. 15 12
      User project/3.BasicFunction/Source/Cadence.c
  16. 48 0
      User project/3.BasicFunction/Source/InputCapture.c
  17. 0 2
      User project/3.BasicFunction/Source/Temp.c
  18. 1 2
      User project/3.BasicFunction/Source/bikebrake.c
  19. 0 2
      User project/3.BasicFunction/Source/bikelight.c
  20. 7 8
      User project/3.BasicFunction/Source/bikespeed.c
  21. 0 2
      User project/3.BasicFunction/Source/bikethrottle.c
  22. 1 1
      User project/3.BasicFunction/Source/can.c
  23. 1 1
      User project/3.BasicFunction/Source/canAppl.c
  24. 39 43
      User project/3.BasicFunction/Source/torquesensor.c
  25. 20 1
      User project/4.BasicHardwSoftwLayer/1.BasicHardwLayer/Include/board_config.h
  26. 1 1
      User project/4.BasicHardwSoftwLayer/1.BasicHardwLayer/Include/hwsetup.h
  27. 0 1
      User project/4.BasicHardwSoftwLayer/1.BasicHardwLayer/Source/hwsetup.c
  28. 1 0
      User project/5.Api_rt/api_rt.c
  29. 1 0
      User project/5.Api_rt/api_rt.h
  30. 6 0
      User project/5.Api_rt/api_rt_adc.c
  31. 184 0
      User project/5.Api_rt/api_rt_cap.c
  32. 21 0
      User project/5.Api_rt/api_rt_cap.h
  33. 1 0
      User project/5.Api_rt/api_rt_gpio.c
  34. 1 1
      User project/5.Api_rt/api_rt_gpio.h
  35. 1 3
      User project/5.Api_rt/api_rt_pwm.c
  36. 2 2
      User project/5.Api_rt/api_rt_pwm.h
  37. 7 1
      User project/5.Api_rt/api_rt_timer.c
  38. 3 2
      User project/5.Api_rt/api_rt_timer.h
  39. 11 2
      WLMCP.ewp

+ 0 - 1
User project/1.FrameLayer/Source/FSM_1st.c

@@ -16,7 +16,6 @@
 #include "user.h"
 #include "FSM_1st.h"
 #include "FSM_2nd.h"
-#include "FuncLayerAPI.h"
 #include "power.h"
 #include "canAppl.h"
 /******************************

+ 26 - 2
User project/1.FrameLayer/Source/TimeTask_Event.c

@@ -16,11 +16,13 @@
 #include "TimeTask_Event.h"
 #include "AssistCurve.h"
 #include "FSM_1st.h"
-#include "FuncLayerAPI.h"
 #include "can.h"
 #include "canAppl.h"
 #include "gd32f30x.h"
 #include "syspar.h"
+#include "torquesensor.h"
+#include "bikelight.h"
+#include "bikethrottle.h"
 #include "user.h"
 #include "STLmain.h"
 #include "api_rt.h"
@@ -250,11 +252,33 @@ void  Event_1ms(void) /* parasoft-suppress METRICS-28 "本项目圈复杂度无
 
 }
 
-
+UWORD testcapset=0;
 void Event_5ms(void)
 {
     /* Upper Computer Info Update */
     Can_voMC_Run_5ms();  
+    if(testcapset==1)
+    {
+        iCap_SetEdgeType(0, CAP_CH(2), ApiCap_FallingEdge);
+    }
+    else if (testcapset==2)  
+    {
+        iCap_SetEdgeType(0, CAP_CH(2), ApiCap_RisingEdge);
+    }
+    else if(testcapset==3)
+    {
+        iCap_SetEdgeType(0, CAP_CH(3), ApiCap_FallingEdge);
+    }
+    else if (testcapset==4)  
+    {
+        iCap_SetEdgeType(0, CAP_CH(3), ApiCap_RisingEdge);
+    }
+    else
+    {
+    
+    }
+      
+   
 }
 
 void Event_10ms(void)

+ 8 - 0
User project/1.FrameLayer/Source/app.c

@@ -4,6 +4,7 @@
 #include "tbs.h"
 #include "sys_task.h"
 #include "TimeTask_Event.h"
+#include "InputCapture.h"
 
 void PeripheralInit();
 void PeripheralStart();
@@ -83,6 +84,13 @@ void PeripheralInit()
 //    iTimer_EnableAutoReload(HW_SYSTICK_TIMER);
     iTimer_BindInterrupt(HW_SYSTICK_TIMER, SysTask1Ms);
     iTimer_EnableInterrupt(HW_SYSTICK_TIMER);
+    
+    iCap_BindDeviceInterrupt(0,IC_CountMaxISR);
+    iCap_BindChannelInterrupt(0,CAP_CH(2),IC_CadenceISR);
+    iCap_BindChannelInterrupt(0,CAP_CH(3),IC_BikeSpdISR);
+    iCap_EnableDeviceInterrupt(0);
+    iCap_EnableChannelInterrupt(0,CAP_CH(2));
+    iCap_EnableChannelInterrupt(0,CAP_CH(3));
 }
 
 void PeripheralStart()

+ 48 - 47
User project/1.FrameLayer/Source/gd32f30x_it.c

@@ -177,55 +177,56 @@ void TIMER0_UP_TIMER9_IRQHandler(void)
 */
 void TIMER1_IRQHandler(void)
 {
-    UWORD uwIntSource = 0;
     /* MCU self check count */
     clasB_uwTIM1Cnt++;
-
-    if (timer_interrupt_flag_get(TIMER1, TIMER_INT_FLAG_UP) != 0)
-    {
-        if(switch_flg.SysCoef_Flag == TRUE)
-        {
-            uwIntSource = 1;
-            cadence_voCadenceCal(uwIntSource);
-            bikespeed_voBikeSpeedCal(uwIntSource);
-        }
-        timer_interrupt_flag_clear(TIMER1, TIMER_INT_FLAG_UP);
-    }
-    else if (timer_interrupt_flag_get(TIMER1, TIMER_INT_FLAG_CH2) != 0)
-    {
-        if(switch_flg.SysCoef_Flag == TRUE)
-        {
-            uwIntSource = 2;        
-            cadence_voCadenceCal(uwIntSource);
-            /* Select rising or falling edge trigger */ 
-            if(gpio_input_bit_get(GPIOB, GPIO_PIN_10) != 0)
-            {
-               /* reset the CH2P and CH2NP bits */
-               TIMER_CHCTL2(TIMER1) &= ~(uint32_t)(TIMER_CHCTL2_CH2P|TIMER_CHCTL2_CH2NP);
-               TIMER_CHCTL2(TIMER1) |= (uint32_t)((uint32_t)(TIMER_IC_POLARITY_FALLING) << 8U);
-            }
-            else
-            {
-               /* reset the CH2P and CH2NP bits */
-               TIMER_CHCTL2(TIMER1) &= ~(uint32_t)(TIMER_CHCTL2_CH2P|TIMER_CHCTL2_CH2NP);
-               TIMER_CHCTL2(TIMER1) |= (uint32_t)((uint32_t)(TIMER_IC_POLARITY_RISING) << 8U);       
-            }
-        }      
-        timer_interrupt_flag_clear(TIMER1, TIMER_INT_FLAG_CH2);
-    }
-    else if (timer_interrupt_flag_get(TIMER1, TIMER_INT_FLAG_CH3) != 0)
-    {
-        if(switch_flg.SysCoef_Flag == TRUE)
-        {
-            uwIntSource = 3;
-            bikespeed_voBikeSpeedCal(uwIntSource);
-        }
-        timer_interrupt_flag_clear(TIMER1, TIMER_INT_FLAG_CH3);
-    }
-    else
-    {
-    	//do noting
-    }
+    
+    iRtCap_Isr(0);
+//    UWORD uwIntSource = 0;
+//    if (timer_interrupt_flag_get(TIMER1, TIMER_INT_FLAG_UP) != 0)
+//    {
+//        if(switch_flg.SysCoef_Flag == TRUE)
+//        {
+//            uwIntSource = 1;
+//            cadence_voCadenceCal(uwIntSource);
+//            bikespeed_voBikeSpeedCal(uwIntSource);
+//        }
+//        timer_interrupt_flag_clear(TIMER1, TIMER_INT_FLAG_UP);
+//    }
+//    else if (timer_interrupt_flag_get(TIMER1, TIMER_INT_FLAG_CH2) != 0)
+//    {
+//        if(switch_flg.SysCoef_Flag == TRUE)
+//        {
+//            uwIntSource = 2;        
+//            cadence_voCadenceCal(uwIntSource);
+//            /* Select rising or falling edge trigger */ 
+//            if(gpio_input_bit_get(GPIOB, GPIO_PIN_10) != 0)
+//            {
+//               /* reset the CH2P and CH2NP bits */
+//               TIMER_CHCTL2(TIMER1) &= ~(uint32_t)(TIMER_CHCTL2_CH2P|TIMER_CHCTL2_CH2NP);
+//               TIMER_CHCTL2(TIMER1) |= (uint32_t)((uint32_t)(TIMER_IC_POLARITY_FALLING) << 8U);
+//            }
+//            else
+//            {
+//               /* reset the CH2P and CH2NP bits */
+//               TIMER_CHCTL2(TIMER1) &= ~(uint32_t)(TIMER_CHCTL2_CH2P|TIMER_CHCTL2_CH2NP);
+//               TIMER_CHCTL2(TIMER1) |= (uint32_t)((uint32_t)(TIMER_IC_POLARITY_RISING) << 8U);       
+//            }
+//        }      
+//        timer_interrupt_flag_clear(TIMER1, TIMER_INT_FLAG_CH2);
+//    }
+//    else if (timer_interrupt_flag_get(TIMER1, TIMER_INT_FLAG_CH3) != 0)
+//    {
+//        if(switch_flg.SysCoef_Flag == TRUE)
+//        {
+//            uwIntSource = 3;
+//            bikespeed_voBikeSpeedCal(uwIntSource);
+//        }
+//        timer_interrupt_flag_clear(TIMER1, TIMER_INT_FLAG_CH3);
+//    }
+//    else
+//    {
+//    	//do noting
+//    }
 }
 /*!
     \brief      

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

@@ -26,11 +26,12 @@
 #include "TimeTask_Event.h"
 #include "FSM_1st.h"
 #include "FSM_2nd.h"
-#include "FuncLayerAPI.h"
 #include "can.h"
 #include "cmdgennew.h"
 #include "canAppl.h"
 #include "flash_master.h"
+#include "torquesensor.h"
+#include "power.h"
 #include "STLmain.h"
 /************************************************************************
  Exported Functions:

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

@@ -46,11 +46,12 @@ Revising History (ECL of this file):
  Subroutine Call: ...;
  Reference: N/A
 ****************************************************************/
+UWORD timer1cnt;
 void tbc_voUpIsr(void)
 {
     /* Uart Monitor */
     UART_voAppMonitor();
-
+    timer1cnt = TIMER_CNT(TIMER1);
     /* Motor Position Cal */
     if( cp_stFlg.ThetaGetModelSelect == ANG_RESOLVER )
     {

+ 1 - 1
User project/1.FrameLayer/Source/tbs.c

@@ -41,7 +41,7 @@ Revising History (ECL of this file):
 void tbs_voIsr(void)
 {
     /* Alarm detect */
-//    alm_voDetecTBS(&alm_stIn, &alm_stDetectTbsCoef);
+    alm_voDetecTBS(&alm_stIn, &alm_stDetectTbsCoef);
 
     /* 1st FSM */
     FSM1st_Sys_state.Tbs_hook();

+ 0 - 1
User project/2.MotorDrive/Source/adc.c

@@ -67,7 +67,6 @@ void adc_voCalibration(ADC_COF *cof, ADC_DOWN_OUT *out1, ADC_UP_OUT *out2)
                 if (out1->uwADCCalibCt < (1 << ADC_CALIB_INDEX))
                 {
                     out1->ulIdcRegSum += iAdc_GetResultPointer(2)[HW_ADC_IDC_CH];
-
                     out1->ulIaRegSum += iAdc_GetResultPointer(1)[HW_ADC_IA_CH];
                     out1->ulIbRegSum += iAdc_GetResultPointer(1)[HW_ADC_IB_CH];
                     out1->ulIcRegSum += iAdc_GetResultPointer(1)[HW_ADC_IC_CH];

+ 1 - 11
User project/2.MotorDrive/Source/pwm.c

@@ -163,15 +163,13 @@ void pwm_voGenCoef(PWM_COF_IN *in, PWM_CALC_COF *coef)
  Subroutine Call: N/A;
  Reference: N/A;
 ************************************************************************/
-static UWORD testkjsahfjkahj,testkjsahfjkahj1;
-static SWORD swOvmT1, swOvmT2;
 void pwm_voGen(PWM_GEN_IN *in, const PWM_CALC_COF *coef, PWM_GEN_OUT *out) /* parasoft-suppress METRICS-28 "本项目圈复杂度无法更改,后续避免" */
 { /* parasoft-suppress GJB5369-4_2_2_2 "本项目函数行数无法更改,后续应避免" */
     SLONG slL1, slL2, slL3;
     SLONG slKsvpwm;
     SLONG slX, slY, slZ;
     SWORD swT1, swT2;
-    
+    SWORD swOvmT1, swOvmT2;  
     UWORD uwSector;
     SWORD swUaPu, swUbPu, swUcPu;
     SWORD swPWMPRD1, swPWMPRD2, swPWMPRD3;
@@ -546,8 +544,6 @@ void pwm_voGen(PWM_GEN_IN *in, const PWM_CALC_COF *coef, PWM_GEN_OUT *out) /* pa
         swPWMPRD22 = swPWMPRD2;
         swPWMPRD32 = swPWMPRD3;
         /* comparision value correction when two vectors are both too short*/
-      testkjsahfjkahj1=0;
-      testkjsahfjkahj=0;
         if ((swOvmT1 + swOvmT2) < (pwm_pvt_swMin_Double_Cur_Smpl_Pu << 1))
         {
 
@@ -555,14 +551,12 @@ void pwm_voGen(PWM_GEN_IN *in, const PWM_CALC_COF *coef, PWM_GEN_OUT *out) /* pa
             {
                 swPWMPRD31 = swPWMPRD2 - pwm_pvt_swMin_Cur_Smpl_Ct;
                 swPWMPRD32 = (swPWMPRD3 << 1) - swPWMPRD31;
-                testkjsahfjkahj1=1;
                 
             }
             if ((swOvmT2 - pwm_pvt_swMin_Double_Cur_Smpl_Pu) < 0)
             {
                 swPWMPRD11 = swPWMPRD2 + pwm_pvt_swMin_Cur_Smpl_Ct;
                 swPWMPRD12 = (swPWMPRD1 << 1) - swPWMPRD11;
-                testkjsahfjkahj=2;
             }
         }
         else
@@ -583,13 +577,11 @@ void pwm_voGen(PWM_GEN_IN *in, const PWM_CALC_COF *coef, PWM_GEN_OUT *out) /* pa
                     swPWMPRD32 = swPWMPRD3;
                     swPWMPRD22 = (SWORD)coef->uwHPWMPd;
                     swPWMPRD21 = (swPWMPRD2 << 1) - swPWMPRD22;
-                    testkjsahfjkahj=3;
                 }
                 else
                 {
                     swPWMPRD21 = swPWMPRD1 - pwm_pvt_swMin_Cur_Smpl_Ct;
                     swPWMPRD22 = (swPWMPRD2 << 1) - swPWMPRD21;
-                    testkjsahfjkahj=4;
                     
                 }
             }
@@ -607,13 +599,11 @@ void pwm_voGen(PWM_GEN_IN *in, const PWM_CALC_COF *coef, PWM_GEN_OUT *out) /* pa
                     swPWMPRD21 = (swPWMPRD2 << 1) - swPWMPRD22;
                     swPWMPRD31 = 0;
                     swPWMPRD32 = (swPWMPRD3 << 1) - swPWMPRD31;
-                    testkjsahfjkahj=5;
                 }
                 else
                 {
                     swPWMPRD21 = swPWMPRD3 + pwm_pvt_swMin_Cur_Smpl_Ct;
                     swPWMPRD22 = (swPWMPRD2 << 1) - swPWMPRD21;
-                    testkjsahfjkahj=6;
                 }
             }
             else

+ 1 - 1
User project/2.MotorDrive/Source/spdctrFSM.c

@@ -32,7 +32,7 @@ Include File
 #include "switchhall.h"
 #include "spi_master.h"
 #include "cmdgennew.h"
-#include "FuncLayerAPI.h"
+#include "power.h"
 /************************************************************************
  Constant Table:
 ************************************************************************/

+ 0 - 1
User project/2.MotorDrive/Source/spdctrmode.c

@@ -27,7 +27,6 @@ Revising History (ECL of this file):
 *************************************************************************/
 #include "syspar.h"
 #include "user.h"
-#include "FuncLayerAPI.h"
 #include "AssistCurve.h"
 #include "cmdgennew.h"
 #include "CodePara.h"

+ 0 - 44
User project/3.BasicFunction/Include/FuncLayerAPI.h

@@ -1,44 +0,0 @@
-/**
- * @file FuncLayerAPI.h
- * @author Wang, Zhiyu(wangzy49@midea.com)
- * @brief  API of Function Layer which is uesd in Application Layer
- * @version 0.1
- * @date 2021-10-09
- *
- * @copyright Copyright (c) 2021
- *
- */
-#ifndef FUNCLAYERAPI_H
-#define FUNCLAYERAPI_H
-
-/************************************************************************
- Beginning of File, do not put anything above here except notes
- Compiler Directives:
-*************************************************************************/
-#include "bikespeed.h"
-#include "Cadence.h"
-#include "torquesensor.h"
-#include "power.h"
-#include "bikebrake.h"
-#include "bikethrottle.h"
-#include "display.h"
-#include "bikelight.h"
-#include "Temp.h"
-#include "AssistCurve.h"
-/****************************************
- *
- *          Definitions & Macros
- *
- ****************************************/
-
-
-
-
-
-/***************************************
- *
- *          Function  api
- *
- ***************************************/
-
-#endif

+ 27 - 0
User project/3.BasicFunction/Include/InputCapture.h

@@ -0,0 +1,27 @@
+/**
+ * @file sys_task.h
+ * @author Xiao Lifan (xiaolf6@midea.com)
+ * @brief 控制系统任务调度
+ * @version 0.1
+ * @date 2023-05-24
+ *
+ * @copyright Copyright (c) 2023
+ *
+ */
+
+#ifndef _INPUTCAPTURE_H_
+#define _INPUTCAPTURE_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif // __cplusplus
+
+void IC_CountMaxISR(void);
+void IC_CadenceISR(void);
+void IC_BikeSpdISR(void);
+
+#ifdef __cplusplus
+}
+#endif // __cplusplus
+
+#endif

+ 0 - 1
User project/3.BasicFunction/Include/bikelight.h

@@ -29,7 +29,6 @@
 
 //---------------------------------------
 /* 前灯控制IO on/off */
-
 #define IO_FORWARDLED_ON()             iGpio_Write(HW_GPIO_FLIG_EN_PIN,ApiGpio_HighLevel)//PC15
 #define IO_FORWARDLED_OFF()            iGpio_Write(HW_GPIO_FLIG_EN_PIN,ApiGpio_LowLevel) //PC15
 #define IO_FORWARDLED_12V_ENABLE()     iGpio_Write(HW_GPIO_FLIG_6V_12V_EN_PIN,ApiGpio_HighLevel)//PC13

+ 15 - 12
User project/3.BasicFunction/Source/Cadence.c

@@ -16,7 +16,6 @@
 #include "syspar.h"
 #include "Cadence.h"
 #include "CodePara.h"
-#include "hwsetup.h"
 #include "api_rt.h"
 #ifdef RUN_ARCH_SIM
 #include "test_user.h"
@@ -94,7 +93,7 @@ static void cadence_voCadenceIdle(UWORD source)
             cadence_stFreGetOut.uwCaputureNumCnt = 1;
             cadence_stFreGetOut.cadence_fsm = CADENCE_HFreWork;
             cadence_stFreGetOut.uwForwardCnt = 0;
-            cadence_stFreGetOut.uwCaputure1Cnt = (UWORD)TIMER1_CAP_CANDANCE;
+            cadence_stFreGetOut.uwCaputure1Cnt = (UWORD)iCap_GetCaptureValue(0, CAP_CH(2));
             cad_pvt_ulCadFreqPu = 1 * CADENCESPEED_KMPERH2FREQPU;
             cadence_stFreGetOut.uwFrequencyPu =  (UWORD)cad_pvt_ulCadFreqPu;
             cadence_stFreGetOut.uwLPFFrequencyPu = (cadence_stFreGetOut.uwLPFFrequencyPu * cadence_stFreGetCof.uwCadenceLPFgain +
@@ -113,6 +112,8 @@ static void cadence_voCadenceIdle(UWORD source)
  Reference: N/A
 ****************************************************************/
 static ULONG ulCaputureCntErr = 0,ulCaputureCntErrLast = 0;
+UWORD testcadc;
+
 static void cadence_voCadenceHighFrequencyWork(UWORD source)
 {
     if (source == 1 && cadence_stFreGetOut.uwCaputureNumCnt == 1)
@@ -120,20 +121,22 @@ static void cadence_voCadenceHighFrequencyWork(UWORD source)
         cadence_stFreGetOut.uwCaputureOverflowCnt++;
         if (timer_interrupt_flag_get(TIMER1, TIMER_INT_FLAG_CH2) != 0)
         {
-            cadence_stFreGetOut.uwCaputure2Cnt =(UWORD)TIMER1_CAP_CANDANCE;
+            cadence_stFreGetOut.uwCaputure2Cnt =(UWORD)iCap_GetCaptureValue(0, CAP_CH(2));
             if(cadence_stFreGetOut.uwCaputure2Cnt > 9000) // TIMER1 half Period 
             {
                 cadence_stFreGetOut.uwOverflowfirst= 1;
+                testcadc=1;
             }
             else
             {
                 cadence_stFreGetOut.uwOverflowfirst= 2;
+                testcadc=2;
             }   
             ulCaputureCntErrLast = ulCaputureCntErr;
             if(cadence_stFreGetOut.uwOverflowfirst == 1)
             {
                 cadence_stFreGetOut.uwCaputureOverflowCnt -=1;
-                ulCaputureCntErr = ((ULONG)cadence_stFreGetOut.uwCaputureOverflowCnt * TIM1CLK_KHZ * cadence_stFreGetCof.uwTimerUnit) + cadence_stFreGetOut.uwCaputure2Cnt 
+                ulCaputureCntErr = ((ULONG)cadence_stFreGetOut.uwCaputureOverflowCnt * HW_TIM1CLK_KHZ * cadence_stFreGetCof.uwTimerUnit) + cadence_stFreGetOut.uwCaputure2Cnt 
                                     -cadence_stFreGetOut.uwCaputure1Cnt;
                 cadence_stFreGetOut.uwCaputureOverflowCnt = 1; 
                 cadence_stFreGetOut.uwOverflowfirst = 0;
@@ -141,14 +144,14 @@ static void cadence_voCadenceHighFrequencyWork(UWORD source)
             }
             else
             {
-                ulCaputureCntErr = ((ULONG)cadence_stFreGetOut.uwCaputureOverflowCnt * TIM1CLK_KHZ * cadence_stFreGetCof.uwTimerUnit) + cadence_stFreGetOut.uwCaputure2Cnt 
+                ulCaputureCntErr = ((ULONG)cadence_stFreGetOut.uwCaputureOverflowCnt * HW_TIM1CLK_KHZ * cadence_stFreGetCof.uwTimerUnit) + cadence_stFreGetOut.uwCaputure2Cnt 
                                     -cadence_stFreGetOut.uwCaputure1Cnt;
                 cadence_stFreGetOut.uwCaputureOverflowCnt = 0;
                 cadence_stFreGetOut.uwOverflowfirst = 0;
             }
 
             /* Cadence Freq Cal */
-            cad_pvt_ulCadFreqPu = (ULONG)(((UQWORD)TIM1CLK_KHZ * 1000 << 20) / ((((UQWORD)ulCaputureCntErr + (UQWORD)ulCaputureCntErrLast)>>1)* cadence_stFreGetCof.uwNumbersPulses * FBASE));
+            cad_pvt_ulCadFreqPu = (ULONG)(((UQWORD)HW_TIM1CLK_KHZ * 1000 << 20) / ((((UQWORD)ulCaputureCntErr + (UQWORD)ulCaputureCntErrLast)>>1)* cadence_stFreGetCof.uwNumbersPulses * FBASE));
 
             cadence_stFreGetOut.uwCaputureNumCnt = 1;
             cadence_stFreGetOut.uwCaputure1Cnt = cadence_stFreGetOut.uwCaputure2Cnt; 
@@ -165,14 +168,15 @@ static void cadence_voCadenceHighFrequencyWork(UWORD source)
         if (cadence_stFreGetOut.uwCaputureNumCnt == 0)
         {
             cadence_stFreGetOut.uwCaputureNumCnt = 1;
-            cadence_stFreGetOut.uwCaputure1Cnt = (UWORD)TIMER1_CAP_CANDANCE;  
+            cadence_stFreGetOut.uwCaputure1Cnt = (UWORD)iCap_GetCaptureValue(0, CAP_CH(2));  
         }
         else if (cadence_stFreGetOut.uwCaputureNumCnt == 1)
         {
+            testcadc=0;
             cadence_stFreGetOut.uwForwardCnt++;
             cadence_stFreGetOut.uwCaputureNumCnt = 2;
 
-            cadence_stFreGetOut.uwCaputure2Cnt = (UWORD)TIMER1_CAP_CANDANCE;
+            cadence_stFreGetOut.uwCaputure2Cnt = (UWORD)iCap_GetCaptureValue(0, CAP_CH(2));
 
             ulCaputureCntErrLast = ulCaputureCntErr;
 
@@ -181,7 +185,7 @@ static void cadence_voCadenceHighFrequencyWork(UWORD source)
             cadence_stFreGetOut.uwCaputureOverflowCnt = 0;
 
             /* Cadence Freq Cal */
-            cad_pvt_ulCadFreqPu = (ULONG)(((UQWORD)TIM1CLK_KHZ * 1000 << 20) / ((((UQWORD)ulCaputureCntErr + (UQWORD)ulCaputureCntErrLast)>>1)* cadence_stFreGetCof.uwNumbersPulses * FBASE));
+            cad_pvt_ulCadFreqPu = (ULONG)(((UQWORD)HW_TIM1CLK_KHZ * 1000 << 20) / ((((UQWORD)ulCaputureCntErr + (UQWORD)ulCaputureCntErrLast)>>1)* cadence_stFreGetCof.uwNumbersPulses * FBASE));
 
             cadence_stFreGetOut.uwCaputureNumCnt = 1;
             cadence_stFreGetOut.uwCaputure1Cnt = cadence_stFreGetOut.uwCaputure2Cnt; 
@@ -264,7 +268,7 @@ static void cadence_voCadenceBackword(UWORD source)
         cadence_stFreGetOut.uwCaputureNumCnt = 1;
         cadence_stFreGetOut.uwFreqPercent = 0;
         cadence_stFreGetOut.cadence_fsm = CADENCE_HFreWork;
-        cadence_stFreGetOut.uwCaputure1Cnt = (UWORD)TIMER1_CAP_CANDANCE;
+        cadence_stFreGetOut.uwCaputure1Cnt = (UWORD)iCap_GetCaptureValue(0, CAP_CH(2));
         cad_pvt_ulCadFreqPu = 1 * CADENCESPEED_KMPERH2FREQPU;
         cadence_stFreGetOut.uwFrequencyPu = (UWORD)cad_pvt_ulCadFreqPu;  
         cadence_stFreGetOut.uwLPFFrequencyPu = (cadence_stFreGetOut.uwLPFFrequencyPu * cadence_stFreGetCof.uwCadenceLPFgain +
@@ -283,7 +287,7 @@ static void cadence_voCadenceBackword(UWORD source)
 ****************************************************************/
 static void cadence_voCadenceDir(void)
 {
-    if (iGpio_Read(HW_GPIO_CadDir_PIN) == 0)
+    if (iGpio_Read(HW_GPIO_CADDIR_PIN) == 0)
     {
         cadence_stFreGetOut.cadence_dir = CADENCE_DIR_FORWARD;
     }
@@ -368,7 +372,6 @@ void cadence_voCadenceCal(UWORD source)
         break;
     }
 }
-
 /*************************************************************************
  End of this File (EOF)!
  Do not put anything after this part!

+ 48 - 0
User project/3.BasicFunction/Source/InputCapture.c

@@ -0,0 +1,48 @@
+#include "InputCapture.h"
+#include "bikespeed.h"
+#include "Cadence.h"
+#include "Api_rt.h"
+#include "FSM_1st.h"
+
+void IC_CountMaxISR(void)
+{
+    if(switch_flg.SysCoef_Flag == TRUE)
+    {
+        UWORD uwIntSource = 1;
+        cadence_voCadenceCal(uwIntSource);
+        bikespeed_voBikeSpeedCal(uwIntSource);
+    }
+}
+
+void IC_CadenceISR(void)
+{
+    if(switch_flg.SysCoef_Flag == TRUE)
+    {
+        UWORD uwIntSource = 2;        
+        cadence_voCadenceCal(uwIntSource);
+        
+        /* Select rising or falling edge trigger */ 
+        if(iGpio_Read(HW_GPIO_CADENCE_PIN) != 0)
+        {
+           /* reset the CH2P and CH2NP bits */
+//           TIMER_CHCTL2(TIMER1) &= ~(uint32_t)(TIMER_CHCTL2_CH2P|TIMER_CHCTL2_CH2NP);
+//           TIMER_CHCTL2(TIMER1) |= (uint32_t)((uint32_t)(TIMER_IC_POLARITY_FALLING) << 8U);
+           iCap_SetEdgeType(0, CAP_CH(2), ApiCap_FallingEdge);
+        }
+        else
+        {
+           /* reset the CH2P and CH2NP bits */
+//           TIMER_CHCTL2(TIMER1) &= ~(uint32_t)(TIMER_CHCTL2_CH2P|TIMER_CHCTL2_CH2NP);
+//           TIMER_CHCTL2(TIMER1) |= (uint32_t)((uint32_t)(TIMER_IC_POLARITY_RISING) << 8U);  
+           iCap_SetEdgeType(0, CAP_CH(2), ApiCap_RisingEdge);
+        }
+    }
+}
+void IC_BikeSpdISR(void)
+{
+    if(switch_flg.SysCoef_Flag == TRUE)
+    {
+        UWORD uwIntSource = 3;
+        bikespeed_voBikeSpeedCal(uwIntSource);
+    }
+}

+ 0 - 2
User project/3.BasicFunction/Source/Temp.c

@@ -15,8 +15,6 @@
 *************************************************************************/
 #include "typedefine.h"
 #include "Temp.h"
-#include "user.h"
-
 
 /******************************
  *

+ 1 - 2
User project/3.BasicFunction/Source/bikebrake.c

@@ -13,10 +13,9 @@
  Beginning of File, do not put anything above here except notes
  Compiler Directives:
 *************************************************************************/
-//#include "typedefine.h"
+
 #include "bikebrake.h"
 #include "api_rt.h"
-//#include "hwsetup.h"
 
 #ifdef RUN_ARCH_SIM
 #include "test_user.h"

+ 0 - 2
User project/3.BasicFunction/Source/bikelight.c

@@ -16,9 +16,7 @@
 *************************************************************************/
 #include "syspar.h"
 #include "typedefine.h"
-#include "mathtool.h"
 #include "bikelight.h"
-#include "hwsetup.h"
 #include "power.h"
 #include "CodePara.h"
 #include "adc.h"

+ 7 - 8
User project/3.BasicFunction/Source/bikespeed.c

@@ -16,8 +16,7 @@
 #include "syspar.h"
 #include "bikespeed.h"
 #include "CodePara.h"
-#include "hwsetup.h"
-
+#include "api_rt.h"
 #ifdef RUN_ARCH_SIM
 #include "test_user.h"
 #endif
@@ -100,7 +99,7 @@ static void bikespeed_voBikeSpeedIdle(UWORD source)
             bikespeed_stFreGetOut.bikespeed_fsm = BIKESPEED_WORK;
             bikespeed_pvt_FreqPu = 1 * BIKESPEED_KMPERH2FREQPU ;
             bikespeed_stFreGetOut.uwFrequencyPu =  (UWORD)bikespeed_pvt_FreqPu;  
-            bikespeed_stFreGetOut.uwCaputure1Cnt = (UWORD)TIMER1_CAP_BIKESPD;
+            bikespeed_stFreGetOut.uwCaputure1Cnt = (UWORD)iCap_GetCaptureValue(0, CAP_CH(3));
         }
     }
 }
@@ -122,7 +121,7 @@ static void bikespeed_voBikeSpeedWork(UWORD source)
         bikespeed_stFreGetOut.uwCaputureOverflowCnt++;
         if (timer_interrupt_flag_get(TIMER1, TIMER_INT_FLAG_CH3) != 0)
         {
-            bikespeed_stFreGetOut.uwCaputure2Cnt =(UWORD)TIMER1_CAP_BIKESPD;
+            bikespeed_stFreGetOut.uwCaputure2Cnt =(UWORD)iCap_GetCaptureValue(0, CAP_CH(3));
             if(bikespeed_stFreGetOut.uwCaputure2Cnt > 9000) // TIMER1 half Period 
             {
                 bikespeed_stFreGetOut.uwOverflowfirst= 1;
@@ -135,7 +134,7 @@ static void bikespeed_voBikeSpeedWork(UWORD source)
             if(bikespeed_stFreGetOut.uwOverflowfirst == 1)
             {
                 bikespeed_stFreGetOut.uwCaputureOverflowCnt -=1;
-                ulCaputureCntErr = ((ULONG)bikespeed_stFreGetOut.uwCaputureOverflowCnt * TIM1CLK_KHZ * bikespeed_stFreGetCof.uwTimerUnit) + bikespeed_stFreGetOut.uwCaputure2Cnt 
+                ulCaputureCntErr = ((ULONG)bikespeed_stFreGetOut.uwCaputureOverflowCnt * HW_TIM1CLK_KHZ * bikespeed_stFreGetCof.uwTimerUnit) + bikespeed_stFreGetOut.uwCaputure2Cnt 
                                     -bikespeed_stFreGetOut.uwCaputure1Cnt;
                 bikespeed_stFreGetOut.uwCaputureOverflowCnt = 1; 
                 bikespeed_stFreGetOut.uwOverflowfirst = 0;
@@ -143,7 +142,7 @@ static void bikespeed_voBikeSpeedWork(UWORD source)
             }
             else
             {
-                ulCaputureCntErr = ((ULONG)bikespeed_stFreGetOut.uwCaputureOverflowCnt * TIM1CLK_KHZ * bikespeed_stFreGetCof.uwTimerUnit) + bikespeed_stFreGetOut.uwCaputure2Cnt 
+                ulCaputureCntErr = ((ULONG)bikespeed_stFreGetOut.uwCaputureOverflowCnt * HW_TIM1CLK_KHZ * bikespeed_stFreGetCof.uwTimerUnit) + bikespeed_stFreGetOut.uwCaputure2Cnt 
                                     -bikespeed_stFreGetOut.uwCaputure1Cnt;
                 bikespeed_stFreGetOut.uwCaputureOverflowCnt = 0;
                 bikespeed_stFreGetOut.uwOverflowfirst = 0;
@@ -166,12 +165,12 @@ static void bikespeed_voBikeSpeedWork(UWORD source)
         if (bikespeed_stFreGetOut.uwCaputureNumCnt == 0)
         {
             bikespeed_stFreGetOut.uwCaputureNumCnt = 1;
-            bikespeed_stFreGetOut.uwCaputure1Cnt = (UWORD)TIMER1_CAP_BIKESPD;
+            bikespeed_stFreGetOut.uwCaputure1Cnt = (UWORD)iCap_GetCaptureValue(0, CAP_CH(3));
         }
         else if (bikespeed_stFreGetOut.uwCaputureNumCnt == 1)
         {
             bikespeed_stFreGetOut.uwCaputureNumCnt = 2;
-            bikespeed_stFreGetOut.uwCaputure2Cnt = (UWORD)TIMER1_CAP_BIKESPD;
+            bikespeed_stFreGetOut.uwCaputure2Cnt = (UWORD)iCap_GetCaptureValue(0, CAP_CH(3));
 
             ulCaputureCntErr = (ULONG)(((UQWORD)bikespeed_stFreGetOut.uwCaputureOverflowCnt * (720 * bikespeed_stFreGetCof.uwTimerUnit))+ bikespeed_stFreGetOut.uwCaputure2Cnt
                                 - bikespeed_stFreGetOut.uwCaputure1Cnt);

+ 0 - 2
User project/3.BasicFunction/Source/bikethrottle.c

@@ -16,9 +16,7 @@
 #include "syspar.h"
 #include "typedefine.h"
 #include "mathtool.h"
-#include "hwsetup.h"
 #include "bikethrottle.h"
-#include "api.h"
 #include "api_rt.h"
 /******************************
  *

+ 1 - 1
User project/3.BasicFunction/Source/can.c

@@ -27,13 +27,13 @@ Revising History (ECL of this file):
 #include "stdlib.h"
 #include "string.h"
 #include "gd32f30x.h"
-#include "FuncLayerAPI.h"
 #include "can.h"
 #include "canAppl.h"
 #include "CodePara.h"
 #include "flash_master.h"
 #include "i2c_master.h"
 #include "power.h"
+#include "torquesensor.h"
 #include "api.h"
 #include "api_rt.h"
 static const ULONG Crc32Table[256] = {

+ 1 - 1
User project/3.BasicFunction/Source/canAppl.c

@@ -10,7 +10,6 @@
  */
 #include "canAppl.h"
 #include "CodePara.h"
-#include "FuncLayerAPI.h"
 #include "adc.h"
 #include "alarm.h"
 #include "can.h"
@@ -21,6 +20,7 @@
 #include "AssistCurve.h"
 #include "hwsetup.h"
 #include "spi_master.h"
+#include "torquesensor.h"
 #include "user.h"
 #include "FSM_2nd.h"
 /******************************

+ 39 - 43
User project/3.BasicFunction/Source/torquesensor.c

@@ -17,11 +17,8 @@
 #include "typedefine.h"
 #include "mathtool.h"
 #include "torquesensor.h"
-#include "hwsetup.h"
 #include "CodePara.h"
 #include "canAppl.h"
-#include "FuncLayerAPI.h"
-#include "api.h"
 #include "api_rt.h"
 /******************************
  *
@@ -74,7 +71,6 @@ static volatile SLONG TorqSencitiveCof[TORQ_OFFSET_NUM-1]= {
   0,0,0,0,0,0
 };
 static UWORD TorSensor_uwDMAReg = 0;
-static POLY_COEF TorqSencitiveCoef = TORQUESENSITIVE_COF_DEFAULT;
 /******************************
  *
  * Extern  Parameter
@@ -284,46 +280,46 @@ void torsensor_voTorSensorInit(void)
 /*************************************************************************
  Local Functions (N/A)
 *************************************************************************/
-static BOOL tstDynCalibflg= TRUE;
-static UWORD tstTorqOffset,tstSensitiveset,TorqValue,TorqValuePu, TorqReg;
-static SWORD tstTorqTemp,tstTorqTemp111,tstSencitiveOrig;
-void torsensor_voCadenceCnt(void)
-{
-  if (((cadence_stFreGetCof.uwNumbersPulses>>1)-1) != tsttorqCadCnt)
-  {
-      tsttorqCadCnt++;
-  }
-  else
-  {
-      tsttorqCadCnt = 0;
-      tsttorqMin = 4096;
-  }
-}
+//static BOOL tstDynCalibflg= TRUE;
+//static UWORD tstTorqOffset,tstSensitiveset,TorqValue,TorqValuePu, TorqReg;
+//static SWORD tstTorqTemp,tstTorqTemp111,tstSencitiveOrig;
+//void torsensor_voCadenceCnt(void)
+//{
+//  if (((cadence_stFreGetCof.uwNumbersPulses>>1)-1) != tsttorqCadCnt)
+//  {
+//      tsttorqCadCnt++;
+//  }
+//  else
+//  {
+//      tsttorqCadCnt = 0;
+//      tsttorqMin = 4096;
+//  }
+//}
 
-void torsensor_voDynamicOffset(void)
-{
-   if(cadence_stFreGetOut.uwLPFFrequencyPu != 0)
-   {
-     tstDynCalibflg = TRUE;
-     if(tsttorqMin > iAdc_GetResultPointer(0)[HW_ADC_TORQ_CH])
-     {
-        tsttorqMin = iAdc_GetResultPointer(0)[HW_ADC_TORQ_CH];
-     }
-     if(tsttorqCadCnt == ((cadence_stFreGetCof.uwNumbersPulses>>1) -1))
-     {       
-        tstdynOffset = tsttorqMin;
-     }
-   }
-   else
-   {
-     if( tstDynCalibflg == TRUE && TorqValuePu <= 500)
-     {
-        tstdynOffset = iAdc_GetResultPointer(0)[HW_ADC_TORQ_CH];
-        tstDynCalibflg = FALSE;
-     }
-   }
-   mth_voLPFilter((SWORD)tstdynOffset, &tst_dynOffsetLpf);
-}
+//void torsensor_voDynamicOffset(void)
+//{
+//   if(cadence_stFreGetOut.uwLPFFrequencyPu != 0)
+//   {
+//     tstDynCalibflg = TRUE;
+//     if(tsttorqMin > iAdc_GetResultPointer(0)[HW_ADC_TORQ_CH])
+//     {
+//        tsttorqMin = iAdc_GetResultPointer(0)[HW_ADC_TORQ_CH];
+//     }
+//     if(tsttorqCadCnt == ((cadence_stFreGetCof.uwNumbersPulses>>1) -1))
+//     {       
+//        tstdynOffset = tsttorqMin;
+//     }
+//   }
+//   else
+//   {
+//     if( tstDynCalibflg == TRUE && TorqValuePu <= 500)
+//     {
+//        tstdynOffset = iAdc_GetResultPointer(0)[HW_ADC_TORQ_CH];
+//        tstDynCalibflg = FALSE;
+//     }
+//   }
+//   mth_voLPFilter((SWORD)tstdynOffset, &tst_dynOffsetLpf);
+//}
 
 
 //static void torsensor_voTorADCwithTemp(void)

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

@@ -27,9 +27,27 @@
 #define HW_RAM_START_ADDRESS 0x20001fffUL
 #define HW_RAM_END_ADDRESS   0x20001fffUL
 
+/* ---------------------------------- MCU Frequency ---------------------------------- */
+
+#define HW_CLK_CORE_KHZ 72000
+#define HW_CLK_AHB_KHZ  72000
+#define HW_CLK_APB1_KHZ 36000
+#define HW_CLK_APB2_KHZ 72000
+#define HW_CLK_TIM0_KHZ 72000
+#define HW_CLK_PWM_KHZ  72000
+#define HW_CLK_ADC_KHZ  36000
+
 /* ---------------------------------- 系统时钟 ---------------------------------- */
 
 #define HW_MCU_CLOCK_HZ 72000000UL
+#define HW_CORECLK_KHZ HW_CLK_CORE_KHZ // Internal Clock
+#define HW_AHBCLK_KHZ  HW_CLK_AHB_KHZ  // AHB Clock
+#define HW_APB1CLK_KHZ HW_CLK_APB1_KHZ // APB1 Clock
+#define HW_APB2CLK_KHZ HW_CLK_APB2_KHZ // APB2 Clock
+#define HW_TIM0CLK_KHZ HW_CLK_TIM0_KHZ // TIM0 Clock
+#define HW_TIM1CLK_KHZ HW_CLK_TIM0_KHZ /100
+#define HW_TIM2CLK_KHZ HW_CLK_TIM0_KHZ 
+#define HW_TIM5CLK_KHZ HW_CLK_TIM0_KHZ / 2 
 
 /* --------------------------------- 电力系统参数 --------------------------------- */
 
@@ -113,7 +131,8 @@
 #define HW_GPIO_CANRX_PIN                  11 ///> GPIOB  PIN8 
 #define HW_GPIO_CANSTB_PIN                 12 ///> GPIOA  PIN12 
 #define HW_GPIO_I2CWP_PIN                  13 ///> GPIOC  PIN12 
-#define HW_GPIO_CadDir_PIN                 14 ///> GPIOB  PIN2
+#define HW_GPIO_CADDIR_PIN                 14 ///> GPIOB  PIN2
+#define HW_GPIO_CADENCE_PIN                15 ///> GPIOB  PIN10
 
 /* TIMER */
 #define HW_TIMER_CANDANCE_PIN             0  ///> TIMER1  CH2

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

@@ -94,7 +94,7 @@
 //#define IO_POWER_STATE  (GPIO_ISTAT(GPIOC) & 0x0001)
 /* TIMER1 capture value */
 #define TIMER1_CAP_BIKESPD  TIMER_CH3CV(TIMER1)
-#define TIMER1_CAP_CANDANCE  TIMER_CH2CV(TIMER1)
+//#define TIMER1_CAP_CANDANCE  TIMER_CH2CV(TIMER1)
 /************************************************************************
  TypeDefs & Structure defines (N/A)
 ************************************************************************/

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

@@ -25,7 +25,6 @@
 *************************************************************************/
 #include "syspar.h"
 #include "user.h"
-#include "FuncLayerAPI.h"
 #include "can.h"
 #include "api_rt.h"
 /************************************************************************

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

@@ -4,6 +4,7 @@ void iRt_Init()
 {
     iRtGpio_Init();
     iRtTimer_Init();
+    iRtCap_Init();
 //    iRtUart_Init();
     iRtPwm_Init();
     iRtAdc_Init();

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

@@ -3,6 +3,7 @@
 #include "api_board_support.h"
 #include "board_config.h"
 #include "api_rt_gpio.h"
+#include "api_rt_cap.h"
 //#include "api_rt_uart.h"
 #include "api_rt_timer.h"
 #include "api_rt_pwm.h"

+ 6 - 0
User project/5.Api_rt/api_rt_adc.c

@@ -4,6 +4,9 @@
 
 ApiRtAdc_Handle Adcs[3];
 
+/* ========================================================================== */
+/* ============================ Api RT Functions ============================ */
+/* ========================================================================== */
 
 void iRtAdc_Init(void)
 {
@@ -40,6 +43,9 @@ void iRtAdc_CompleteIsr(uint8_t devIndex)
         Adcs[devIndex].CompleteISR.Action();
     }
 }
+/* ========================================================================== */
+/* ============================== API Functions ============================= */
+/* ========================================================================== */
 
 uint16_t iAdc_GetResult(uint8_t devIndex, uint8_t channelIndex)
 {

+ 184 - 0
User project/5.Api_rt/api_rt_cap.c

@@ -0,0 +1,184 @@
+#include "api_rt_cap.h"
+#include "api_rt_dbg.h"
+
+#include "board_config.h"
+#include "gd32f30x.h"
+
+ApiRtCap_Handle Caps[1];
+
+
+/* ========================================================================== */
+/* ============================ Api RT Functions ============================ */
+/* ========================================================================== */
+void iRtCap_Init(void)
+{
+    Caps[0].CapBase = TIMER1;
+
+    Caps[0].CountMaxISR.Enable = 0;
+    Caps[0].CountMaxISR.Action = 0;
+
+    for (int i = 0; i < 4; i++)
+    {
+        Caps[0].ChannelISR[i].Enable = 0;
+        Caps[0].ChannelISR[i].Action = 0;
+    }
+}
+
+void iRtCap_Isr(uint8_t devIndex)
+{   
+    uint32_t base = Caps[devIndex].CapBase;
+    if (TIMER_INTF(base) & 0x01)
+    {
+        if (Caps[devIndex].CountMaxISR.Enable && Caps[devIndex].CountMaxISR.Action != 0)
+        {
+            Caps[devIndex].CountMaxISR.Action();
+        }
+        TIMER_INTF(base) &= ~0x01;
+    }
+
+    for (int i = 0; i < 4; i++)
+    {
+        if (TIMER_INTF(base) & (0x01 << (i + 1)))
+        {
+            if (Caps[devIndex].ChannelISR[i].Enable && Caps[devIndex].ChannelISR[i].Action != 0)
+            {
+                Caps[devIndex].ChannelISR[i].Action();
+            }
+            TIMER_INTF(base) &= ~(0x01 << (i + 1));
+        }
+        
+    }
+}
+
+
+/* ========================================================================== */
+/* ============================== API Functions ============================= */
+/* ========================================================================== */
+
+uint32_t iCap_GetClock(uint8_t devIndex)
+{
+    return HW_TIM_CLOCK_HZ;
+}
+
+void iCap_SetEdgeType(uint8_t devIndex, uint8_t channelIndex, ApiCap_EdgeType edge)
+{
+    uint32_t base = Caps[devIndex].CapBase;
+
+    uint32_t data = 0x00;
+    uint32_t mask = 0x0F;
+
+    switch (edge)
+    {
+    case ApiCap_NoneEdge:
+        data = 0x00;
+        break;
+    case ApiCap_RisingEdge:
+        data = 0x01;
+        break;
+    case ApiCap_FallingEdge:
+        data = 0x03;
+        break;
+    case ApiCap_BothEdge:
+        data = 0x0B;
+        break;
+    default:
+        break;
+    }
+
+    data = data << (channelIndex * 4);
+    mask = mask << (channelIndex * 4);
+    
+    TIMER_CHCTL2(base) &= ~mask;
+    TIMER_CHCTL2(base) |= data;
+}
+
+void iCap_Enable(uint8_t devIndex)
+{
+    uint32_t base = Caps[devIndex].CapBase;
+    TIMER_CTL0(base)|= ((uint32_t)0x01);
+}
+
+void iCap_Disable(uint8_t devIndex)
+{
+    uint32_t base = Caps[devIndex].CapBase;
+    TIMER_CTL0(base) &= ~((uint32_t)0x01);
+}
+
+void iCap_SetPeriod(uint8_t devIndex, uint32_t prd)
+{
+    uint32_t base = Caps[devIndex].CapBase;
+
+    TIMER_CAR(base) = prd;
+}
+
+uint32_t iCap_GetPeriod(uint8_t devIndex)
+{
+    return TIMER_CAR(Caps[devIndex].CapBase);
+}
+
+uint32_t iCap_GetCaptureValue(uint8_t devIndex, uint8_t channelIndex)
+{
+    uint32_t base = Caps[devIndex].CapBase;
+
+    uint32_t value = 0;
+    switch (channelIndex)
+    {
+    case 0:
+        value = TIMER_CH0CV(base);
+        break;
+    case 1:
+        value = TIMER_CH1CV(base);
+        break;
+    case 2:
+        value = TIMER_CH2CV(base);
+        break;
+    case 3:
+        value = TIMER_CH3CV(base);
+        break;
+    default:
+        break;
+    }
+    return value;
+}
+    
+
+void iCap_EnableCaptureReset(uint8_t devIndex, uint8_t channelIndex)
+{
+
+}
+
+void iCap_DisableCaptureReset(uint8_t devIndex, uint8_t channelIndex)
+{
+
+}
+
+void iCap_EnableDeviceInterrupt(uint8_t devIndex)
+{
+    Caps[devIndex].CountMaxISR.Enable = 1;
+}
+
+void iCap_DisableDeviceInterrupt(uint8_t devIndex)
+{
+    Caps[devIndex].CountMaxISR.Enable = 0;
+}
+
+void iCap_BindDeviceInterrupt(uint8_t devIndex, void (*action)())
+{
+    Caps[devIndex].CountMaxISR.Action = action;
+}
+
+void iCap_EnableChannelInterrupt(uint8_t devIndex, uint8_t channelIndex)
+{
+    Caps[devIndex].ChannelISR[channelIndex].Enable = 1;
+}
+
+void iCap_DisableChannelInterrupt(uint8_t devIndex, uint8_t channelIndex)
+{
+    Caps[devIndex].ChannelISR[channelIndex].Enable = 0;
+}
+
+void iCap_BindChannelInterrupt(uint8_t devIndex, uint8_t channelIndex, void (*action)())
+{
+    Caps[devIndex].ChannelISR[channelIndex].Action = action;
+}
+

+ 21 - 0
User project/5.Api_rt/api_rt_cap.h

@@ -0,0 +1,21 @@
+#ifndef _API_RT_CAP_H_
+#define _API_RT_CAP_H_
+
+#include "api_cap.h"
+#include <stdint.h>
+#include "api_rt_common.h"
+#include "gd32f30x.h"
+
+typedef struct 
+{
+    uint32_t            CapBase;
+    ApiRt_Interrupt CountMaxISR;
+    ApiRt_Interrupt ChannelISR[4];
+} ApiRtCap_Handle;
+
+extern ApiRtCap_Handle Caps[1];
+
+void iRtCap_Init(void);
+void iRtCap_Isr(uint8_t devIndex);
+
+#endif

+ 1 - 0
User project/5.Api_rt/api_rt_gpio.c

@@ -17,6 +17,7 @@ Gpio_Handle const Gpios[GPIO_PIN_COUNT] = {
     [12] = {.GpioBase = GPIOA, .Index = 12},
     [13] = {.GpioBase = GPIOC, .Index = 12},
     [14] = {.GpioBase = GPIOB, .Index = 2},
+    [15] = {.GpioBase = GPIOB, .Index = 10},
 };
 
 void iRtGpio_Init()

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

@@ -8,7 +8,7 @@
 extern "C" {
 #endif // __cplusplus
 
-#define GPIO_PIN_COUNT 15
+#define GPIO_PIN_COUNT 16
 
 typedef struct
 {

+ 1 - 3
User project/5.Api_rt/api_rt_pwm.c

@@ -43,6 +43,7 @@ void iRtPwm_Init()
 #endif
 
 }
+
 void iRtPwm_CountZeroIsr(uint8_t devIndex)
 {
     if (Pwms[devIndex].CountZeroISR.Enable)
@@ -111,9 +112,6 @@ void iRtPwm_SyncSamplingAdcIsr(uint8_t devIndex)
   
     if (ADC_STAT(ADC0) & ADC_INT_FLAG_EOIC)
     {         
-//            adc_uwRdsonUReg = ADC_IDATA0(ADC0);
-//            adc_uwRdsonVReg = ADC_IDATA1(ADC0);
-//            adc_uwRdsonWReg = ADC_IDATA2(ADC0);
         Adcs[1].Results[HW_ADC_IA_CH] = ADC_IDATA0(ADC0);
         Adcs[1].Results[HW_ADC_IB_CH] = ADC_IDATA1(ADC0);
         Adcs[1].Results[HW_ADC_IC_CH] = ADC_IDATA2(ADC0);  

+ 2 - 2
User project/5.Api_rt/api_rt_pwm.h

@@ -1,5 +1,5 @@
-#ifndef _API_PWM_LOW_H_
-#define _API_PWM_LOW_H_
+#ifndef _API_RT_PWM_H_
+#define _API_RT_PWM_H_
 
 #include <stdint.h>
 #include "api_pwm.h"

+ 7 - 1
User project/5.Api_rt/api_rt_timer.c

@@ -1,12 +1,14 @@
 #include "api_timer.h"
 #include "api_rt_timer.h"
 #include "api_rt_dbg.h"
-
 #include "board_config.h"
 #include "gd32f30x.h"
 #include "classB.h"
 
 ApiRtTimer_Handle Timers[GENERAL_TIMER_COUNT + 1];
+/* ========================================================================== */
+/* ============================== API RT Functions ============================= */
+/* ========================================================================== */
 
 void iRtTimer_Init()
 {
@@ -36,6 +38,10 @@ void iRtTimer_Isr(uint8_t devIndex)
     }
 }
 
+/* ========================================================================== */
+/* ============================== API Functions ============================= */
+/* ========================================================================== */
+
 uint32_t iTimer_GetClock(uint8_t devIndex)
 {
     if (devIndex < SYSTEM_TICK_TIMER_INDEX)

+ 3 - 2
User project/5.Api_rt/api_rt_timer.h

@@ -1,6 +1,7 @@
-#ifndef _API_TIMER_LOW_H_
-#define _API_TIMER_LOW_H_
+#ifndef _API_RT_TIMER_H_
+#define _API_RT_TIMER_H_
 
+#include "api_timer.h"
 #include <stdint.h>
 #include "api_rt_common.h"
 #include "gd32f30x.h"

+ 11 - 2
WLMCP.ewp

@@ -2661,10 +2661,10 @@
                     <name>$PROJ_DIR$\User project\3.BasicFunction\Include\flash_master.h</name>
                 </file>
                 <file>
-                    <name>$PROJ_DIR$\User project\3.BasicFunction\Include\FuncLayerAPI.h</name>
+                    <name>$PROJ_DIR$\User project\3.BasicFunction\Include\i2c_master.h</name>
                 </file>
                 <file>
-                    <name>$PROJ_DIR$\User project\3.BasicFunction\Include\i2c_master.h</name>
+                    <name>$PROJ_DIR$\User project\3.BasicFunction\Include\InputCapture.h</name>
                 </file>
                 <file>
                     <name>$PROJ_DIR$\User project\3.BasicFunction\Include\power.h</name>
@@ -2720,6 +2720,9 @@
                 <file>
                     <name>$PROJ_DIR$\User project\3.BasicFunction\Source\i2c_master.c</name>
                 </file>
+                <file>
+                    <name>$PROJ_DIR$\User project\3.BasicFunction\Source\InputCapture.c</name>
+                </file>
                 <file>
                     <name>$PROJ_DIR$\User project\3.BasicFunction\Source\power.c</name>
                 </file>
@@ -2838,6 +2841,12 @@
             <file>
                 <name>$PROJ_DIR$\User project\5.Api_rt\api_rt_adc.h</name>
             </file>
+            <file>
+                <name>$PROJ_DIR$\User project\5.Api_rt\api_rt_cap.c</name>
+            </file>
+            <file>
+                <name>$PROJ_DIR$\User project\5.Api_rt\api_rt_cap.h</name>
+            </file>
             <file>
                 <name>$PROJ_DIR$\User project\5.Api_rt\api_rt_dbg.c</name>
             </file>