PA7的复用功能是ADC0
看下PA7的 PIN脚功能有哪些:
Default 是PA7 也就是GPIO引脚
Alternat功能有 ADC01_17 也就是可以作为ADC0或者ADC1的 第7个Channel通道
所以针对这个PA7 PIN的功能使能需要做以下工作:
/* enable GPIOA clock */
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_AF);/* 这里AF就是指我需要用Alternate Function的意思,复用的功能的Clock要打开 */
/* enable ADC1 clock */
rcu_periph_clock_enable(RCU_ADC1);
/* config ADC clock */
rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV4);
/* config the GPIO as analog mode */
gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_MAX, GPIO_PIN_7); /* GPIO_MODE_AIN 配置为Analog In mode */
对于PA6的配置就比较简单了
/* enable GPIOA clock */
rcu_periph_clock_enable(RCU_GPIOA);
/* configure PA6 GPIO port */
gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_6);
/* set PA6 output */
gpio_bit_set(GPIOA,GPIO_PIN_6);
中间的配置就不说了,还是比较多:
直说一下最后的计算方式:
/*
* 这个Vref_adc 表示的是1.2V的参考电压,用当前的分辨率测试到的ADC值是这么多 ,
*/
Vref_adc =adc_regular_channel_data_read(ADC0, ADC_CHANNEL_17);
/*
* 这个Pin7_adc 表示的是Vbat/2的参考电压,用当前的分辨率测试到的ADC值是这么多,
* 所以采用比例的方式 1.2V : Vref_adc = Vbat/2 : Pin7_adc
* Vbat /2 = (1.2 * Pin7_adc) / Vref_adc
* Vbat = 1.2 * Pin7_adc * 2 / Vref_adc
*/
Pin7_adc =adc_regular_channel_data_read(ADC1, ADC_CHANNEL_7);
Vbat = 1.2 * Pin7_adc * 2 / Vref_adc
|