Ver Fonte

1. add arm_math for sin/cos function
2. update code to use three shunt current sample(MOS Rs)

Signed-off-by: huhui <huhui@sharkgulf.com>

huhui há 4 anos atrás
pai
commit
3252f20eb2

+ 112 - 59
Applications/bsp/adc.c

@@ -1,32 +1,27 @@
 #include "bsp/adc.h"
 #include "libs/task.h"
 static void _gpio_init(void);
-static void _adc_insert_chan_init(void);
-static void _adc_regular_chan_init(void);
-
+static void _adc0_init(void);
+static void _adc0_insert_chan_init(void);
+static void _adc0_regular_chan_init(void);
+static void _adc1_init(void);
+static void _adc1_insert_chan_init(void);
+static void _adc1_regular_chan_init(void);
+/*
+ADC0 inserted 采集母线电流
+ADC1 inserted 采集三相电流
+每次同时发送母线电流和响应的相电流,通过母线电流给相电流采集的MOS内阻校准
+可以理解为FOC工作在三电阻采样模式下,只是需要不停的校准MOS的内阻
+*/
 void adc_init(void){
 	/* init adc input gpio */
 	_gpio_init();
-    /* enable ADC1 clock */
-    rcu_periph_clock_enable(RCU_ADC0);
     /* config ADC clock */
     rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV4); //APB2 clk 120M, adc clk 30M
-    /* ADC mode config */
-    adc_mode_config(ADC_MODE_FREE); 
-    /* ADC special function config */
-    adc_special_function_config(ADC0, ADC_SCAN_MODE, DISABLE);
-    adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, DISABLE);  
-    /* ADC data alignment config */
-    adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);
-	/* init insert chans*/
-	_adc_insert_chan_init();
-	/* init regular chans*/
-	_adc_regular_chan_init();
-    /* enable ADC interface */
-    adc_enable(ADC0);
-    delay_ms(1);
-    /* ADC calibration and reset calibration */
-    adc_calibration_enable(ADC0);
+
+	_adc0_init();
+
+	_adc1_init();
 
 	nvic_irq_enable(ADC0_1_IRQn, 0, 0);
 }
@@ -38,29 +33,84 @@ static void _gpio_init(void) {
 	gpio_init(GPIOB, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_0|GPIO_PIN_1);
 }
 
-static void _adc_insert_chan_init(void) {
+static void _adc0_init(void) {
+	u32 adc_dev = ADC0;
+    /* enable ADC1 clock */
+    rcu_periph_clock_enable(RCU_ADC0);
+
+    /* ADC mode config,adc0 master, adc1 slave */
+    adc_mode_config(ADC_DAUL_INSERTED_PARALLEL); 
+    /* ADC special function config */
+    adc_special_function_config(adc_dev, ADC_SCAN_MODE, DISABLE);
+    adc_special_function_config(adc_dev, ADC_CONTINUOUS_MODE, DISABLE);  
+    /* ADC data alignment config */
+    adc_data_alignment_config(adc_dev, ADC_DATAALIGN_RIGHT);
+	/* init insert chans*/
+	_adc0_insert_chan_init();
+	/* init regular chans*/
+	_adc0_regular_chan_init();
+    /* enable ADC interface */
+    adc_enable(adc_dev);
+    delay_ms(1);
+    /* ADC calibration and reset calibration */
+    adc_calibration_enable(adc_dev);
+}
+
+static void _adc1_init(void) {
+	u32 adc_dev = ADC1;
+    /* enable ADC1 clock */
+    rcu_periph_clock_enable(RCU_ADC1);
+
+    /* ADC mode config,adc0 master, adc1 slave */
+    adc_mode_config(ADC_DAUL_INSERTED_PARALLEL); 
+    /* ADC special function config */
+    adc_special_function_config(adc_dev, ADC_SCAN_MODE, DISABLE);
+    adc_special_function_config(adc_dev, ADC_CONTINUOUS_MODE, ENABLE);  
+    /* ADC data alignment config */
+    adc_data_alignment_config(adc_dev, ADC_DATAALIGN_RIGHT);
+	/* init insert chans*/
+	_adc1_insert_chan_init();
+	/* init regular chans*/
+	_adc1_regular_chan_init();
+    /* enable ADC interface */
+    adc_enable(adc_dev);
+    delay_ms(1);
+    /* ADC calibration and reset calibration */
+    adc_calibration_enable(adc_dev);
+
+}
 
-	adc_discontinuous_mode_config(ADC0, ADC_INSERTED_CHANNEL, 1); //每次转化一个
+/* ADC0 insert chan sample vbus I */
+static void _adc0_insert_chan_init(void) {
+	u32 adc_dev = ADC0;
+	adc_discontinuous_mode_config(adc_dev, ADC_INSERTED_CHANNEL, 1); //每次转化一个
     /* ADC channel length config */
-    adc_channel_length_config(ADC0, ADC_INSERTED_CHANNEL, 2);
+    adc_channel_length_config(adc_dev, ADC_INSERTED_CHANNEL, 2);
     /* ADC inserted channel config */
-    adc_inserted_channel_config(ADC0, 0, VBUS_I_CHAN, ADC_SAMPLETIME_7POINT5);
-    adc_inserted_channel_config(ADC0, 1, VBUS_I_CHAN, ADC_SAMPLETIME_7POINT5);
+    adc_inserted_channel_config(adc_dev, 0, VBUS_I_CHAN, ADC_SAMPLETIME_7POINT5);
+	adc_inserted_channel_config(adc_dev, 1, VBUS_I_CHAN, ADC_SAMPLETIME_7POINT5);
     /* ADC trigger config */
-    adc_external_trigger_source_config(ADC0, ADC_INSERTED_CHANNEL, ADC0_1_EXTTRIG_INSERTED_T1_CH0); 
-#if 0
-    /* ADC external trigger enable */
-    adc_external_trigger_config(ADC0, ADC_INSERTED_CHANNEL, ENABLE);
-    
-    /* clear the ADC flag */
-    adc_interrupt_flag_clear(ADC0, ADC_INT_FLAG_EOC);
-    adc_interrupt_flag_clear(ADC0, ADC_INT_FLAG_EOIC);
-    /* enable ADC interrupt */
-    adc_interrupt_enable(ADC0, ADC_INT_EOIC);
-#endif
+    adc_external_trigger_source_config(adc_dev, ADC_INSERTED_CHANNEL, ADC0_1_EXTTRIG_INSERTED_T1_CH0); 
+}
+
+/* ADC1 insert chan sample phase I(use two chan, selected by foc) */
+static void _adc1_insert_chan_init(void) {
+	u32 adc_dev = ADC1;
+	adc_discontinuous_mode_config(adc_dev, ADC_INSERTED_CHANNEL, 1); //每次转化一个
+    /* ADC channel length config */
+    adc_channel_length_config(adc_dev, ADC_INSERTED_CHANNEL, 2);
+    /* ADC inserted channel ran config, use ISQ2,ISQ3 */
+	adc1_update_insert_sample_rank(U_PHASE_I_CHAN, V_PHASE_I_CHAN);
+	/* config inserted channel sample time */
+	adc1_update_insert_sample_time(U_PHASE_I_CHAN, ADC_SAMPLETIME_7POINT5);
+	adc1_update_insert_sample_time(V_PHASE_I_CHAN, ADC_SAMPLETIME_7POINT5);
+	adc1_update_insert_sample_time(W_PHASE_I_CHAN, ADC_SAMPLETIME_7POINT5);
+    /* ADC trigger config */
+    adc_external_trigger_source_config(adc_dev, ADC_INSERTED_CHANNEL, ADC0_1_EXTTRIG_INSERTED_T1_CH0); 
 }
 
-static void _adc_regular_chan_init(void) {
+
+static void _adc0_regular_chan_init(void) {
 	adc_discontinuous_mode_config(ADC0, ADC_REGULAR_CHANNEL, 1); //每次转化一个
 	/* ADC channel length config */
 	adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 1);
@@ -68,34 +118,37 @@ static void _adc_regular_chan_init(void) {
 	adc_regular_channel_config(ADC0, 0, MOTOR_TEMP_CHAN, ADC_SAMPLETIME_55POINT5);
 	adc_regular_channel_config(ADC0, 1, HANDLERBAR_CHAN, ADC_SAMPLETIME_55POINT5);
 	adc_regular_channel_config(ADC0, 2, VBUS_V_CHAN, ADC_SAMPLETIME_55POINT5);
-	adc_regular_channel_config(ADC0, 3, W_PHASE_V_CHAN, ADC_SAMPLETIME_55POINT5);
-	adc_regular_channel_config(ADC0, 4, V_PHASE_V_CHAN, ADC_SAMPLETIME_55POINT5);
-	adc_regular_channel_config(ADC0, 5, U_PHASE_V_CHAN, ADC_SAMPLETIME_55POINT5);
-	adc_regular_channel_config(ADC0, 6, W_PHASE_I_CHAN, ADC_SAMPLETIME_55POINT5);
-	adc_regular_channel_config(ADC0, 7, V_PHASE_I_CHAN, ADC_SAMPLETIME_55POINT5);
-	adc_regular_channel_config(ADC0, 8, U_PHASE_I_CHAN, ADC_SAMPLETIME_55POINT5);
 }
 
-s32 adc_sample_insert_chan(void) {
-	adc_interrupt_disable(ADC0, ADC_INT_EOIC);
-	adc_external_trigger_config(ADC0, ADC_INSERTED_CHANNEL, DISABLE);
-	adc_software_trigger_enable(ADC0, 0);
-	while(SET != adc_inserted_data_read(ADC0, 0));
-	return adc_inserted_data_read(ADC0, 0);
+static void _adc1_regular_chan_init(void) {
+	adc_discontinuous_mode_config(ADC1, ADC_REGULAR_CHANNEL, 1); //每次转化一个
+	/* ADC channel length config */
+	adc_channel_length_config(ADC1, ADC_REGULAR_CHANNEL, 1);
+	adc_external_trigger_config(ADC1, ADC_REGULAR_CHANNEL, DISABLE);
+	adc_regular_channel_config(ADC1, 0, W_PHASE_V_CHAN, ADC_SAMPLETIME_55POINT5);
+	adc_regular_channel_config(ADC1, 1, V_PHASE_V_CHAN, ADC_SAMPLETIME_55POINT5);
+	adc_regular_channel_config(ADC1, 2, U_PHASE_V_CHAN, ADC_SAMPLETIME_55POINT5);
 }
 
-void adc_start_insert_chan(void) {
+void adc_start_insert_convert(void) {
     /* ADC external trigger enable */
     adc_external_trigger_config(ADC0, ADC_INSERTED_CHANNEL, ENABLE);
-    
+    adc_external_trigger_config(ADC1, ADC_INSERTED_CHANNEL, ENABLE);
     /* clear the ADC flag */
     adc_interrupt_flag_clear(ADC0, ADC_INT_FLAG_EOC);
     adc_interrupt_flag_clear(ADC0, ADC_INT_FLAG_EOIC);
+    adc_interrupt_flag_clear(ADC1, ADC_INT_FLAG_EOC);
+    adc_interrupt_flag_clear(ADC1, ADC_INT_FLAG_EOIC);	
     /* enable ADC interrupt */
     adc_interrupt_enable(ADC0, ADC_INT_EOIC);
+	adc_interrupt_enable(ADC1, ADC_INT_EOIC);
 }
 
-s32 adc_sample_regular_chan(int chan, int times) {
+s32 adc_sample_regular_channel(int channel, int times) {
+	u32 adc_device = ADC0;
+	if (channel >= W_PHASE_V_CHAN && channel <= U_PHASE_V_CHAN) {
+		adc_device = ADC1;
+	}
 	int value = 0;
 	int count = 0;
 	int min = 0xFFFFF;
@@ -104,14 +157,14 @@ s32 adc_sample_regular_chan(int chan, int times) {
 	while(count < times){
 restart:		
 		start_time = get_mseconds();
-		adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);
-    	while(SET != adc_flag_get(ADC0, ADC_FLAG_EOC)){
+		adc_software_trigger_enable(adc_device, ADC_REGULAR_CHANNEL);
+    	while(SET != adc_flag_get(adc_device, ADC_FLAG_EOC)){
 			if (get_mseconds() - start_time >= 2){
 				goto restart;
 			}
 		};
-    	int one = adc_regular_data_read(ADC0);
-		adc_flag_clear(ADC0, ADC_FLAG_EOC);		
+    	int one = adc_regular_data_read(adc_device);
+		adc_flag_clear(adc_device, ADC_FLAG_EOC);		
 		value += (one & 0xFFF);
 		count ++;
 		if (one > max){
@@ -124,6 +177,6 @@ restart:
 	if (times <= 2) {
 		return value/times;
 	}
-	return (value - min - max)/(times-2);
-	
+	return (value - min - max)/(times-2);	
 }
+

+ 96 - 3
Applications/bsp/adc.h

@@ -3,6 +3,10 @@
 #include "bsp/bsp.h"
 #include "libs/os.h"
 
+/*
+inserted ADC 由timer0 ch3触发,
+注意:adc所有外部触发都是下降沿触发 
+*/
 #define MOTOR_TEMP_CHAN ADC_CHANNEL_0
 #define HANDLERBAR_CHAN ADC_CHANNEL_1 //转把信号
 #define VBUS_V_CHAN 	ADC_CHANNEL_2
@@ -13,10 +17,99 @@
 #define V_PHASE_I_CHAN  ADC_CHANNEL_7
 #define U_PHASE_I_CHAN  ADC_CHANNEL_8
 #define VBUS_I_CHAN     ADC_CHANNEL_9
+#define ISQ2_OFFSET 10
+#define ISO3_OFFSET 15
+#define IL_OFFSET   20
+
+static u32 adc_rank_channels[6] = {
+	V_PHASE_I_CHAN<<ISQ2_OFFSET | U_PHASE_I_CHAN<<ISO3_OFFSET | 1<<IL_OFFSET,
+	U_PHASE_I_CHAN<<ISQ2_OFFSET | V_PHASE_I_CHAN<<ISO3_OFFSET | 1<<IL_OFFSET,
+	W_PHASE_I_CHAN<<ISQ2_OFFSET | V_PHASE_I_CHAN<<ISO3_OFFSET | 1<<IL_OFFSET,
+	V_PHASE_I_CHAN<<ISQ2_OFFSET | W_PHASE_I_CHAN<<ISO3_OFFSET | 1<<IL_OFFSET,
+	U_PHASE_I_CHAN<<ISQ2_OFFSET | W_PHASE_I_CHAN<<ISO3_OFFSET | 1<<IL_OFFSET,
+	W_PHASE_I_CHAN<<ISQ2_OFFSET | U_PHASE_I_CHAN<<ISO3_OFFSET | 1<<IL_OFFSET,
+};
+#define PHASE_I_ADC ADC1
+static u32 volatile * adc_phase_reg1[6] = {
+	&ADC_IDATA2(PHASE_I_ADC),
+	&ADC_IDATA3(PHASE_I_ADC),
+	&ADC_IDATA2(PHASE_I_ADC),
+	&ADC_IDATA3(PHASE_I_ADC),
+	&ADC_IDATA2(PHASE_I_ADC),
+	&ADC_IDATA3(PHASE_I_ADC),
+};
+static u32 volatile * adc_phase_reg2[6] = {
+	&ADC_IDATA3(PHASE_I_ADC),
+	&ADC_IDATA2(PHASE_I_ADC),
+	&ADC_IDATA3(PHASE_I_ADC),
+	&ADC_IDATA2(PHASE_I_ADC),
+	&ADC_IDATA3(PHASE_I_ADC),
+	&ADC_IDATA2(PHASE_I_ADC),
+};
+#define VBUS_I_ADC ADC0
+static u32 volatile * adc_vbus_reg1[6] = {
+	&ADC_IDATA2(VBUS_I_ADC),
+	&ADC_IDATA3(VBUS_I_ADC),
+	&ADC_IDATA2(VBUS_I_ADC),
+	&ADC_IDATA3(VBUS_I_ADC),
+	&ADC_IDATA2(VBUS_I_ADC),
+	&ADC_IDATA3(VBUS_I_ADC),
+};
+static u32 volatile * adc_vbus_reg2[6] = {
+	&ADC_IDATA3(VBUS_I_ADC),
+	&ADC_IDATA2(VBUS_I_ADC),
+	&ADC_IDATA3(VBUS_I_ADC),
+	&ADC_IDATA2(VBUS_I_ADC),
+	&ADC_IDATA3(VBUS_I_ADC),
+	&ADC_IDATA2(VBUS_I_ADC),
+};
+
+void __inline adc_phase_current_read(u8 sector, u32 *v1, u32 *v2) {
+	*v1 = *adc_phase_reg1[sector];
+	*v2 = *adc_phase_reg2[sector];
+}
+
+void __inline adc_vbus_current_read(u8 sector, u32 *v1, u32 *v2) {
+	*v1 = *adc_vbus_reg1[sector];
+	*v2 = *adc_vbus_reg2[sector];
+}
+
+
+void __inline adc_phase_inserted_config(u8 sector) {
+	ADC_ISQ(ADC1) = adc_rank_channels[sector];
+}
+
+
+/* insert len fixed to 2(IL=1), ISQ2 >> ISQ3*/
+static __inline__ void adc1_update_insert_sample_rank(u8 channel1, u8 channel2) {
+    u32 isq;
+        
+    isq = ADC_ISQ(ADC1);
+    isq &= 0xFFF0000;
+    isq |= (channel1 << 10) | (channel2 << 15);
+    ADC_ISQ(ADC1) = isq;
+}
+
+static __inline__ void adc1_update_insert_sample_time(uint8_t adc_channel , uint32_t sample_time)
+{
+    uint32_t sampt;
+    /* ADC sampling time config */  
+    if(adc_channel < 10U){
+        sampt = ADC_SAMPT1(ADC1);
+        sampt &= ~((u32)(ADC_SAMPTX_SPTN << (3U*adc_channel)));
+        sampt |= (u32) sample_time << (3U*adc_channel);
+        ADC_SAMPT1(ADC1) = sampt;
+    }else if(adc_channel < 18U){
+        sampt = ADC_SAMPT0(ADC1);
+        sampt &= ~((u32)(ADC_SAMPTX_SPTN << (3U*(adc_channel-10U))));
+        sampt |= ((u32)sample_time << (3U*(adc_channel-10U)));
+        ADC_SAMPT0(ADC1) = sampt;
+    }
+}
+
 
 void adc_init(void);
-s32 adc_sample_regular_chan(int chan, int times);
-s32 adc_sample_insert_chan(void);
-void adc_start_insert_chan(void);
+s32 adc_sample_regular_channel(int chan, int times);
+void adc_start_insert_convert(void);
 
 #endif /* _ADC_H__ */

+ 3 - 0
Applications/bsp/bsp.c

@@ -1,5 +1,6 @@
 #include "bsp/bsp.h"
 #include "libs/logger.h"
+#include "libs/task.h"
 #include "bsp/uart.h"
 #include "version.h"
 
@@ -9,11 +10,13 @@ static void sys_tick_init(void);
 void bsp_init(void){
 	wdog_enable();
 	sys_tick_init();
+	task_ticks_enable();
 #if LOG_UART==1
 	shark_uart_init(SHARK_UART0);
 #endif
 }
 
+
 static void sys_tick_init(void){
 	/* setup systick timer for 1000Hz interrupts */
 	SysTick_Config(SystemCoreClock / 1000);

+ 2 - 2
Applications/bsp/bsp.h

@@ -49,8 +49,8 @@
 #define MAX_CURRENT      50.0F
 
 #define pwm_timer TIMER0
-#define adc_timer TIMER1
-#define aux_timer TIMER2
+#define adc_timer TIMER0
+#define aux_timer TIMER0
 
 #define USER_ITMER_BRAKE 0
 

+ 17 - 11
Applications/bsp/pwm.c

@@ -111,10 +111,10 @@ static void _init_pwm_timer(void) {
     timer_channel_output_shadow_config(timer,TIMER_CH_2,TIMER_OC_SHADOW_ENABLE);
     
 
-    /* chan3  */
+    /* chan3 trigger adc O3CPRE is alwary active high, adc trigger is falling */
     timer_channel_output_config(timer,TIMER_CH_3,&timer_ocintpara);
-    timer_channel_output_pulse_value_config(timer,TIMER_CH_3,half_period-(TRise + TNoise)>>1);
-    timer_channel_output_mode_config(timer,TIMER_CH_3,TIMER_OC_MODE_PWM1);
+    timer_channel_output_pulse_value_config(timer,TIMER_CH_3,half_period);
+    timer_channel_output_mode_config(timer,TIMER_CH_3,TIMER_OC_MODE_PWM0);
     timer_channel_output_shadow_config(timer,TIMER_CH_3,TIMER_OC_SHADOW_ENABLE);
 
 #if USER_ITMER_BRAKE==1
@@ -131,15 +131,21 @@ static void _init_pwm_timer(void) {
 #else
 	_gpio_brakein_irq_enable();
 #endif
-    /* select the master slave mode */
-    timer_master_slave_mode_config(timer,TIMER_MASTER_SLAVE_MODE_ENABLE);
-    /* slave mode selection: enabled when time2 is enable*/
-    timer_slave_mode_select(timer,TIMER_SLAVE_MODE_EVENT);
-    timer_input_trigger_source_select(timer,TIMER_SMCFG_TRGSEL_ITI2);
-
+	if (pwm_timer != adc_timer){
+    	/* select the master slave mode */
+    	timer_master_slave_mode_config(timer,TIMER_MASTER_SLAVE_MODE_ENABLE);
+    	/* slave mode selection: enabled when time2 is enable*/
+    	timer_slave_mode_select(timer,TIMER_SLAVE_MODE_EVENT);
+    	timer_input_trigger_source_select(timer,TIMER_SMCFG_TRGSEL_ITI2);
+	}else {
+		timer_master_slave_mode_config(timer,TIMER_MASTER_SLAVE_MODE_DISABLE);
+	}
     timer_primary_output_config(timer,ENABLE);
     /* auto-reload preload enable */
     timer_auto_reload_shadow_enable(timer);
+
+	pwm_disable_channel();
+	
     timer_enable(timer);
 }
 
@@ -230,7 +236,7 @@ void pwm_start(void){
 	ch2_update_duty(FOC_PWM_Half_Period);
 	pwm_enable_channel();
 	timer_enable(aux_timer);//this will trige time0/time1
-	adc_start_insert_chan();
+	adc_start_insert_convert();
 }
 
 void pwm_stop(void){
@@ -243,7 +249,7 @@ void pwm_stop(void){
 /*open low side of the mosfet*/
 void pwm_turn_on_low_side(void)
 {  
-	pwm_update_duty(0, 0, 0);
+	pwm_update_duty(0, 0, 0, FOC_PWM_Half_Period);
 	timer_flag_clear(pwm_timer,TIMER_FLAG_CH0);
   	while (timer_flag_get(pwm_timer,TIMER_FLAG_CH0) == RESET );
   	/* Main PWM Output Enable */

+ 3 - 1
Applications/bsp/pwm.h

@@ -15,12 +15,14 @@
 #define ch0_update_duty(duty) 	TIMER_CH0CV(pwm_timer) = (uint32_t)duty
 #define ch1_update_duty(duty) 	TIMER_CH1CV(pwm_timer) = (uint32_t)duty
 #define ch2_update_duty(duty) 	TIMER_CH2CV(pwm_timer) = (uint32_t)duty
+#define update_adc_trigger(time) TIMER_CH3CV(adc_timer) = (uint32_t)time
 
-#define pwm_update_duty(dutyA, dutyB, dutyC) \
+#define pwm_update_duty(dutyA, dutyB, dutyC, time) \
 	do {\
 		ch0_update_duty(dutyA);\
 		ch1_update_duty(dutyB);\
 		ch1_update_duty(dutyC);\
+		update_adc_trigger(time);\
 	}while(0)
 #define update_sample_time(samp1, samp2) do{adc_timer_dma_buf[2] = samp1; adc_timer_dma_buf[0] = samp2;}while(0)
 #define update_distort_chxcv(duty) do {pwm_timer_dma_buf[1] = duty;}while(0)

+ 20 - 4
Applications/foc/foc_api.c

@@ -2,7 +2,6 @@
 #include "libs/task.h"
 #include "bsp/bsp.h"
 #include "bsp/adc.h"
-#include "bsp/dma.h"
 #include "bsp/pwm.h"
 #include "foc/foc_api.h"
 #include "foc/park_clark.h"
@@ -18,7 +17,6 @@ static void foc_defulat_value(void);
 void foc_init(void) {
 	foc_defulat_value();
 	foc_core_init();
-	dma0_init();
 	adc_init();
 	pwm_3phase_init();
 	hall_sensor_init();	
@@ -129,12 +127,30 @@ foc_fault_t foc_stop_motor(void) {
 }
 
 void foc_current_calibrate(void){
+	g_foc.current_samp.adc_offset_a = 0;
+	g_foc.current_samp.adc_offset_b = 0;
+	g_foc.current_samp.adc_offset_c = 0;
+	g_foc.current_samp.adc_offset_ivbus = 0;
+
 	pwm_disable_channel();
+	//foc_pwm_start(false);
+
 	task_udelay(10);
+	
 	phase_current_init(&g_foc.current_samp);
-	phase_current_offset(&g_foc.current_samp);
+	g_foc.current_samp.is_calibrating_offset = true;
+	g_foc.current_samp.sector = SECTOR_5;
+	foc_pwm_start(true);
+	while(g_foc.current_samp.offset_sample_count != 0){};
+	
+	foc_pwm_start(false);
+	task_udelay(100);
+	phase_current_init(&g_foc.current_samp);	
+	g_foc.current_samp.sector = SECTOR_1;
+	foc_pwm_start(true);
+	while(g_foc.current_samp.offset_sample_count != 0){};
+	g_foc.current_samp.is_calibrating_offset = false;
 	foc_pwm_start(false);
-	pwm_enable_channel();
 }
 
 float foc_get_vbus_voltage(void){

+ 7 - 4
Applications/foc/foc_core.c

@@ -170,10 +170,9 @@ void FOC_Fast_Task(motor_foc_t *foc){
 	sample_point = get_phase_sample_point(c_sample, &phase_time, foc->sector);
 	/* 死区补偿 */
 	DeadTime_Compensation(c_sample, &phase_time);
-	/* 更新 TIM1的CCR0-2,生成互补pwm */
-	pwm_update_duty(phase_time.A, phase_time.B, phase_time.C);
-	/* 相电流更新采样点*/
-	update_sample_time(sample_point, sample_point);
+	/* 更新 TIM1的CCR0-2,生成互补pwm, 相电流更新采样点 */
+	pwm_update_duty(phase_time.A, phase_time.B, phase_time.C, sample_point);
+
 	Debug_Log(foc);
 
 	Debug_dq(&sample_dq);
@@ -224,6 +223,10 @@ void foc_pwm_up_handler(void){
 
 
 void mc_phase_current_irq(void) {
+	if (g_foc.current_samp.is_calibrating_offset) {
+		phase_current_offset(&g_foc.current_samp);
+		return;
+	}
 	FOC_Fast_Task(&g_foc);
 }
 

+ 5 - 0
Applications/foc/foc_type.h

@@ -68,12 +68,17 @@ typedef struct current_sample {
 	u32   adc_offset_a;
 	u32   adc_offset_b;
 	u32   adc_offset_c;
+	u32   adc_offset_ivbus;
 	float Ia;
 	float Ib;
 	float Ic;
+	u32   adc_vbus_ia;
+	u32   adc_vbus_ib;
+	u32   adc_vbus_ic;
 	u8    sector;
 	u32   adc_inject_flags;
 	volatile int   offset_sample_count;
+	bool  is_calibrating_offset;
 }current_samp_t;
 
 /*

+ 1 - 1
Applications/foc/gas_sensor.c

@@ -10,7 +10,7 @@ void gas_sensor_init(void){
 }
 
 void gas_sample_voltage(void){
-	u32 vadc = adc_sample_regular_chan(HANDLERBAR_CHAN, 16);
+	u32 vadc = adc_sample_regular_channel(HANDLERBAR_CHAN, 16);
 	_gas.voltage = ((float)vadc)/(65536.0f) * ADC_REFERENCE_VOLTAGE;
 }
 

+ 1 - 1
Applications/foc/ntc_sensor.c

@@ -10,7 +10,7 @@ void ntc_sensor_init(void) {
 }
 
 void ntc_sensor_sample(void){
-		u16 w_temp = adc_sample_regular_chan(MOTOR_TEMP_CHAN, 16);
+		u16 w_temp = adc_sample_regular_channel(MOTOR_TEMP_CHAN, 16);
     w_temp -= ( s32 )(V0_V *65536/ ADC_REFERENCE_VOLTAGE );
     w_temp *= (ADC_REFERENCE_VOLTAGE/dV_dT);
     w_temp = w_temp / 65536 + ( s32 )( T0_C );

+ 75 - 9
Applications/foc/phase_current.c

@@ -2,7 +2,7 @@
 #include "foc_type.h"
 
 #define NB_OFFSET_SAMPLES 32
-#if 0
+
 static float __inline adc_to_current(int adc){
 	int i_adc = (int)adc;
 	if (i_adc > INT16_MAX){
@@ -12,7 +12,6 @@ static float __inline adc_to_current(int adc){
 	}
 	return (i_adc/65535.0f * 3.3f / 1.53f / 0.33f);
 }
-#endif
 
 void phase_current_init(current_samp_t *cs) {
 	cs->offset_sample_count = NB_OFFSET_SAMPLES;
@@ -20,24 +19,91 @@ void phase_current_init(current_samp_t *cs) {
 
 
 void phase_current_offset(current_samp_t *cs) {
-	int samples = cs->offset_sample_count;
-	int values = 0;
-	while(samples-- >= 0) {
-		values += adc_sample_insert_chan();
+	u32 phase_current1, phase_current2;
+	adc_phase_current_read(cs->sector, &phase_current1, &phase_current2);
+
+	if (cs->offset_sample_count > 0) {
+		cs->offset_sample_count--;
+		if (cs->sector == SECTOR_5 && cs->offset_sample_count >= 0) {
+			cs->adc_offset_a += phase_current1;
+			cs->adc_offset_c += phase_current2;
+			if (cs->offset_sample_count == 0) {
+				cs->adc_offset_a = cs->adc_offset_a / NB_OFFSET_SAMPLES;
+				cs->adc_offset_c = cs->adc_offset_c / NB_OFFSET_SAMPLES;
+			}
+		}
+		if (cs->sector == SECTOR_1 && cs->offset_sample_count >= 0) {
+			cs->adc_offset_b += phase_current1;
+			adc_vbus_current_read(cs->sector, &phase_current1, &phase_current2);
+			cs->adc_offset_ivbus += phase_current1;
+			if (cs->offset_sample_count == 0) {
+				cs->adc_offset_b = cs->adc_offset_b / NB_OFFSET_SAMPLES;
+				cs->adc_offset_ivbus = cs->adc_offset_ivbus / NB_OFFSET_SAMPLES;
+			}
+		}
 	}
-	cs->adc_offset_a = cs->adc_offset_b = cs->adc_offset_c = values/cs->offset_sample_count;
+
 }
 
 void phase_current_sample(current_samp_t *cs){
+		u32 phase_current1, phase_current2;
+		adc_phase_current_read(cs->sector, &phase_current1, &phase_current2);
+		if (cs->sector == SECTOR_1 || cs->sector == SECTOR_2) {
+			/* Current on Phase C is not accessible */
+			/* Ia = PhaseAOffset - ADC converted value) */
+			cs->Ib = adc_to_current((int)phase_current1 - (int)cs->adc_offset_b);
+			cs->Ia = adc_to_current((int)phase_current2 - (int)cs->adc_offset_a);
+			cs->Ic = -(cs->Ia + cs->Ib);
+			adc_vbus_current_read(cs->sector, &cs->adc_vbus_ib, &cs->adc_vbus_ia);
+		}else if (cs->sector == SECTOR_3 || cs->sector == SECTOR_4) {
+			/* Current on Phase A is not accessible 	*/
+			/* Ib = PhaseBOffset - ADC converted value) */
+			cs->Ic = adc_to_current((int)phase_current1 - (int)cs->adc_offset_c);
+			cs->Ib = adc_to_current((int)phase_current2 - (int)cs->adc_offset_b);
+			cs->Ia = -(cs->Ib + cs->Ic);
+			adc_vbus_current_read(cs->sector, &cs->adc_vbus_ic, &cs->adc_vbus_ib);
+		}else if (cs->sector == SECTOR_5 || cs->sector == SECTOR_6) {
+			/* Current on Phase B is not accessible 	*/
+			/* Ia = PhaseAOffset - ADC converted value) */
+			cs->Ia = adc_to_current((int)phase_current1 - (int)cs->adc_offset_a);
+			cs->Ic = adc_to_current((int)phase_current2 - (int)cs->adc_offset_c);
+			cs->Ib = -(cs->Ia + cs->Ic);
+			adc_vbus_current_read(cs->sector, &cs->adc_vbus_ia, &cs->adc_vbus_ic);
+		}
+#if 0
+		static int tet_p = 0;
+		if (tet_p++ % 5 == 0) {
+			printf("$%d %d %d;", (int)(cs->Ia * 1000), (int)(cs->Ib*1000), (int)(cs->Ic*1000));
+		}
+#endif	
 
 }
 
 
 u32 get_phase_sample_point(current_samp_t *cs, phase_time_t *time, u8 sector){
-	return 0;
+	u32 low_side_low_duty = FOC_PWM_Half_Period - time->low;	
+	cs->sector = sector;
+	//duty > deadtime + max(Rise time, Noise time)
+	if (low_side_low_duty > (TDead + MAX(TRise, TNoise))) {
+		cs->sector = SECTOR_1;
+		return FOC_PWM_Half_Period - 1;
+	}else {
+		u32 low_side_mid_duty = FOC_PWM_Half_Period - time->midle;
+		u32 delta_duty = low_side_mid_duty - low_side_low_duty;
+		if (delta_duty > low_side_low_duty * 2) {
+			return time->low - TADC;
+		}else {
+			u32 sample_point = time->low + (TDead + MAX(TRise, TNoise));
+			if (sample_point >= FOC_PWM_Half_Period) {
+				sample_point = ( 2u * FOC_PWM_Half_Period ) - sample_point - (uint16_t) 1;		
+			}
+			return sample_point;
+		}
+	}
+
 }
 
 void phase_current_adc_triger(current_samp_t *cs){
-
+	adc_phase_inserted_config(cs->sector);
 }
 

+ 1 - 1
Applications/foc/vbus_sensor.c

@@ -9,7 +9,7 @@ void vbus_sensor_init(void){
 }
 
 void vbus_sample_voltage(void){
-	u32 vadc = adc_sample_regular_chan(VBUS_V_CHAN, 16);
+	u32 vadc = adc_sample_regular_channel(VBUS_V_CHAN, 16);
 
 	_vbus.voltage_avg = ((float)vadc)/(65536.0f) * ADC_REFERENCE_VOLTAGE / VBUS_PARTITIONING_FACTOR;
 }

+ 1 - 0
Applications/libs/os.h

@@ -67,6 +67,7 @@ uint32_t get_timestamp_with_time_zone(int8_t tz);
 
 #define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0]))
 #define min(a,b) (a>b?b:a)
+#define MAX(x, y) ((x)>(y)?(x):(y))
 
 #define delay_us os_udelay
 

+ 2 - 0
Applications/libs/task.h

@@ -28,4 +28,6 @@ void task_add(task_t *task);
 void task_run(void);
 void task_udelay(u32 delay);
 u32 task_ticks_abs(void);
+void task_ticks_enable(void);
+u32 task_ticks_rel(u32 start);
 task_t *task_start(task_func func, u32 delay);

BIN
Applications/math/arm_cortexM4lf_math.lib


+ 3 - 2
Applications/math/fast_math.c

@@ -1,6 +1,7 @@
 #include <math.h>
 #include <string.h>
 #include <stdlib.h>
+#include <arm_math.h>
 #include "math/fast_math.h"
 /*
 生成sin/cos 查找表,(0-90°,间隔0.1°)
@@ -202,8 +203,8 @@ void fast_norm_angle(float *angle) {
 }
 
 void normal_sincosf(float angle, float *sin, float *cos) {
-	*sin = sinf(angle);
-	*cos = cosf(angle);
+	*sin = arm_sin_f32(angle);
+	*cos = arm_cos_f32(angle);
 }
 
 #define LOOKUP_I 0.1f

+ 2 - 0
Applications/math/fast_math.h

@@ -8,7 +8,9 @@
 #define SQRT3                   (1.73205080757f)
 #define SQRT2_BY_SQRT3          (0.8164966f)
 #define M_PI (3.14159265f)
+#ifndef SQ
 #define SQ(x) ((x)*(x))
+#endif
 void fast_sincos(float angle, float *sin, float *cos);
 void fast_norm_angle(float *angle);
 void normal_sincosf(float angle, float *sin, float *cos);

+ 2 - 2
Librarys/CMSIS/GD/GD32F30x/Source/system_gd32f30x.c

@@ -47,14 +47,14 @@
 //#define __SYSTEM_CLOCK_48M_PLL_IRC8M            (uint32_t)(48000000)
 //#define __SYSTEM_CLOCK_72M_PLL_IRC8M            (uint32_t)(72000000)
 //#define __SYSTEM_CLOCK_108M_PLL_IRC8M           (uint32_t)(108000000)
-//#define __SYSTEM_CLOCK_120M_PLL_IRC8M           (uint32_t)(120000000)
+#define __SYSTEM_CLOCK_120M_PLL_IRC8M           (uint32_t)(120000000)
 
 /* use HXTAL(XD series CK_HXTAL = 8M, CL series CK_HXTAL = 25M) */
 //#define __SYSTEM_CLOCK_HXTAL                    (uint32_t)(__HXTAL)
 //#define __SYSTEM_CLOCK_48M_PLL_HXTAL            (uint32_t)(48000000)
 //#define __SYSTEM_CLOCK_72M_PLL_HXTAL            (uint32_t)(72000000)
 //#define __SYSTEM_CLOCK_108M_PLL_HXTAL           (uint32_t)(108000000)
-#define __SYSTEM_CLOCK_120M_PLL_HXTAL           (uint32_t)(120000000)
+//#define __SYSTEM_CLOCK_120M_PLL_HXTAL           (uint32_t)(120000000)
 
 #define SEL_IRC8M       0x00U
 #define SEL_HXTAL       0x01U

+ 61 - 36
Project/MC100.uvoptx

@@ -103,7 +103,7 @@
         <bEvRecOn>1</bEvRecOn>
         <bSchkAxf>0</bSchkAxf>
         <bTchkAxf>0</bTchkAxf>
-        <nTsel>0</nTsel>
+        <nTsel>4</nTsel>
         <sDll></sDll>
         <sDllPa></sDllPa>
         <sDlgDll></sDlgDll>
@@ -114,9 +114,34 @@
         <tDlgDll></tDlgDll>
         <tDlgPa></tDlgPa>
         <tIfile></tIfile>
-        <pMon>BIN\UL2CM3.DLL</pMon>
+        <pMon>Segger\JL2CM3.dll</pMon>
       </DebugOpt>
       <TargetDriverDllRegistry>
+        <SetRegEntry>
+          <Number>0</Number>
+          <Key>ARMRTXEVENTFLAGS</Key>
+          <Name>-L70 -Z18 -C0 -M0 -T1</Name>
+        </SetRegEntry>
+        <SetRegEntry>
+          <Number>0</Number>
+          <Key>DLGTARM</Key>
+          <Name>(1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0)</Name>
+        </SetRegEntry>
+        <SetRegEntry>
+          <Number>0</Number>
+          <Key>ARMDBGFLAGS</Key>
+          <Name></Name>
+        </SetRegEntry>
+        <SetRegEntry>
+          <Number>0</Number>
+          <Key>DLGUARM</Key>
+          <Name></Name>
+        </SetRegEntry>
+        <SetRegEntry>
+          <Number>0</Number>
+          <Key>JL2CM3</Key>
+          <Name>-U81480416 -O78 -S0 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO7 -FD20000000 -FC1000 -FN1 -FF0GD32F30x_HD.FLM -FS08000000 -FL010000 -FP0($$Device:GD32F303CC$Flash\GD32F30x_HD.FLM)</Name>
+        </SetRegEntry>
         <SetRegEntry>
           <Number>0</Number>
           <Key>UL2CM3</Key>
@@ -130,12 +155,12 @@
       <DebugFlag>
         <trace>0</trace>
         <periodic>0</periodic>
-        <aLwin>0</aLwin>
+        <aLwin>1</aLwin>
         <aCover>0</aCover>
         <aSer1>0</aSer1>
         <aSer2>0</aSer2>
         <aPa>0</aPa>
-        <viewmode>0</viewmode>
+        <viewmode>1</viewmode>
         <vrSel>0</vrSel>
         <aSym>0</aSym>
         <aTbox>0</aTbox>
@@ -171,7 +196,7 @@
 
   <Group>
     <GroupName>Application</GroupName>
-    <tvExp>0</tvExp>
+    <tvExp>1</tvExp>
     <tvExpOptDlg>0</tvExpOptDlg>
     <cbSel>0</cbSel>
     <RteFlg>0</RteFlg>
@@ -355,7 +380,7 @@
 
   <Group>
     <GroupName>Math</GroupName>
-    <tvExp>0</tvExp>
+    <tvExp>1</tvExp>
     <tvExpOptDlg>0</tvExpOptDlg>
     <cbSel>0</cbSel>
     <RteFlg>0</RteFlg>
@@ -371,6 +396,18 @@
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>16</FileNumber>
+      <FileType>4</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\Applications\math\arm_cortexM4lf_math.lib</PathWithFileName>
+      <FilenameWithoutPath>arm_cortexM4lf_math.lib</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
   </Group>
 
   <Group>
@@ -381,7 +418,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>16</FileNumber>
+      <FileNumber>17</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -401,7 +438,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>17</FileNumber>
+      <FileNumber>18</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -413,7 +450,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>18</FileNumber>
+      <FileNumber>19</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -425,7 +462,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>19</FileNumber>
+      <FileNumber>20</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -437,7 +474,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>20</FileNumber>
+      <FileNumber>21</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -449,7 +486,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>21</FileNumber>
+      <FileNumber>22</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -461,7 +498,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>22</FileNumber>
+      <FileNumber>23</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -473,7 +510,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>23</FileNumber>
+      <FileNumber>24</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -493,7 +530,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>24</FileNumber>
+      <FileNumber>25</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -505,7 +542,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>25</FileNumber>
+      <FileNumber>26</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -517,7 +554,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>26</FileNumber>
+      <FileNumber>27</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -529,7 +566,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>27</FileNumber>
+      <FileNumber>28</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -541,7 +578,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>28</FileNumber>
+      <FileNumber>29</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -553,7 +590,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>29</FileNumber>
+      <FileNumber>30</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -565,7 +602,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>30</FileNumber>
+      <FileNumber>31</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -577,7 +614,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>31</FileNumber>
+      <FileNumber>32</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -589,7 +626,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>32</FileNumber>
+      <FileNumber>33</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -599,18 +636,6 @@
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
-    <File>
-      <GroupNumber>6</GroupNumber>
-      <FileNumber>33</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\Applications\bsp\dma.c</PathWithFileName>
-      <FilenameWithoutPath>dma.c</FilenameWithoutPath>
-      <RteFlg>0</RteFlg>
-      <bShared>0</bShared>
-    </File>
     <File>
       <GroupNumber>6</GroupNumber>
       <FileNumber>34</FileNumber>
@@ -651,7 +676,7 @@
 
   <Group>
     <GroupName>GD32F30x_Drivers</GroupName>
-    <tvExp>1</tvExp>
+    <tvExp>0</tvExp>
     <tvExpOptDlg>0</tvExpOptDlg>
     <cbSel>0</cbSel>
     <RteFlg>0</RteFlg>

+ 5 - 5
Project/MC100.uvprojx

@@ -468,6 +468,11 @@
               <FileType>1</FileType>
               <FilePath>..\Applications\math\fast_math.c</FilePath>
             </File>
+            <File>
+              <FileName>arm_cortexM4lf_math.lib</FileName>
+              <FileType>4</FileType>
+              <FilePath>..\Applications\math\arm_cortexM4lf_math.lib</FilePath>
+            </File>
           </Files>
         </Group>
         <Group>
@@ -568,11 +573,6 @@
               <FileType>1</FileType>
               <FilePath>..\Applications\bsp\mc_irqs.c</FilePath>
             </File>
-            <File>
-              <FileName>dma.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>..\Applications\bsp\dma.c</FilePath>
-            </File>
             <File>
               <FileName>mc_hall_gpio.c</FileName>
               <FileType>1</FileType>

+ 1 - 1
Project/version.cfg

@@ -1,3 +1,3 @@
 project: MC100
 version: 01
-debug: 0
+debug: 1