f1的ADC都是12bit的逐级逼近式adc;没用那么多要配置的

左右对齐都是什么,12位的ADC需要2个寄存器来放数据,左对齐就是从最高位开始放,右对齐就是从最低位开始放(我知道这话看不懂,看下面图,上面是右对齐,下面是左对齐)
image-1678874036044
image-1678874052169
一看就右对齐用着方便。

扫描模式:
如果要用多个ADC通道的话,就需要配置这个了,这里我们只用一个通道测电源电压,所以直接disable
想知道各种模式建议自己去看看

连续模式:
打开是连续模式,关闭是间断模式;
如果开启间断模式,每次需要先使用HAL_ADC_Start()(或HAL_ADC_Start_IT(),HAL_ADC_Start_DMA())启动转换,需要使用HAL_ADC_PollForConversion()等待转换完成,HAL_ADC_GetState()获取ADC转换状态(若返回值为HAL_OK说明转换完成),转换完成后使用HAL_ADC_GetValue()读取ADC原始值,读取完成后,使用HAL_ADC_Stop()停止转换,如需再次获取ADC数据,需重复执行上述步骤。
间断模式的好处是省芯片的资源,坏处是经常抛出DMA或中断
如果开启连续模式,只需要使用一次HAL_ADC_Start(),开启转换,ADC会马不停蹄的电压转换成数字量,用户只需要调用HAL_ADC_GetValue(),读取ADC原始值
我们用连续模式

初始化

image-1678877846042
不知道说什么,看图
这样初始化完了就完事了

使用

上面其实已经说过了,HAL_ADC_Start()以后,就可以随时用HAL_ADC_GetValue()获取adc数值了。
因为adc是12位,所以用uint16_t来接收

测试

	HAL_ADC_Start(&hadc1);
    HAL_Delay(100);
	adcdata=HAL_ADC_GetValue(&hadc1);
    printf("\r\nadcdata:%f\r\n",adcdata*3.3/4095);

image-1678883461697
至于为什么要÷4096,因为adc是12位的,那么满量程(1111 1111 1111)就是4095
为什么是1.7而不是3.7左右呢,因为
image-1678884467935
我们分压了
那么再乘上2就是电池电量了,误差是有的,电阻误差那么大,但是我也没啥办法。