/******************************************************************** ********************************************************************/ #include "gd32f30x.h" #include "bsp_battery.h" //#include "bsp_boost.h" //#define EN_HEAT_A_PORT GPIOE //#define EN_HEAT_A_PIN GPIO_PIN_5 //#define EN_HEAT_B_PORT GPIOE //#define EN_HEAT_B_PIN GPIO_PIN_6 //voltage factor:R1 = 110K,R2 = 10K #define V_FACTOR ((110 + 10) / 10.0f / 1000.0f) #define VREF 3298 extern void delay_us(uint32_t us); static void BspBattery_gpio_config(void) { rcu_periph_clock_enable(RCU_GPIOE); rcu_periph_clock_enable(RCU_GPIOC); /* config the GPIO as analog mode */ gpio_init(GPIOC, GPIO_MODE_AIN, GPIO_OSPEED_MAX, GPIO_PIN_4); } static void BspBattery_adc_config(void) { /* enable ADC clock */ rcu_periph_clock_enable(RCU_ADC1); /* config ADC clock */ rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV6); /* ADC mode config */ adc_mode_config(ADC_MODE_FREE); /* ADC data alignment config */ adc_data_alignment_config(ADC1, ADC_DATAALIGN_RIGHT); /* ADC channel length config */ adc_channel_length_config(ADC1, ADC_REGULAR_CHANNEL, 1U); /* ADC trigger config */ adc_external_trigger_source_config(ADC1, ADC_REGULAR_CHANNEL, ADC0_1_2_EXTTRIG_REGULAR_NONE); /* ADC external trigger config */ adc_external_trigger_config(ADC1, ADC_REGULAR_CHANNEL, ENABLE); /* enable ADC interface */ adc_enable(ADC1); delay_us(1000); /* ADC calibration and reset calibration */ adc_calibration_enable(ADC1); } void BspBattery_Init(void) { BspBattery_gpio_config(); BspBattery_adc_config(); } //return battery voltage float BspBattery_GetVbat(void) { return BspBoost_GetVbat()/1000; } //return NTC AD float BspBattery_GetNtc(void) { volatile int timeout; adc_regular_channel_config(ADC1, 0U, ADC_CHANNEL_14, ADC_SAMPLETIME_13POINT5); adc_software_trigger_enable(ADC1, ADC_REGULAR_CHANNEL); /* wait the end of conversion flag */ timeout = 1000; while(!adc_flag_get(ADC1, ADC_FLAG_EOC) && timeout > 0) { timeout--; } /* clear the end of conversion flag */ adc_flag_clear(ADC1, ADC_FLAG_EOC); /* return regular channel sample value */ return (adc_regular_data_read(ADC1)); }