参考www.cnblogs.com/xingboy/p/1…
用DMA采集单路电压总是出错,就用了定时器和中断的方式
开启定时器HAL_TIM_Base_Start_IT(&htim17);//timer
10ms定时器中断到了,开启电压采集,进行电压判断(注意这是上一次采集的电压,所以会有10ms延时)
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//10ms
{
uint32_t ad_temp;
if (htim->Instance == htim17.Instance)
{
/* Toggle LED */
HAL_ADC_Start_IT(&hadc);
if(ADC_num < 2048)
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
else HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
}
AD采集完成中断,停止AD采集,停止定时器,获取电压值,开启定时器
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
HAL_ADC_Stop_IT(hadc);
HAL_TIM_Base_Stop_IT(&htim17);
ADC_num = HAL_ADC_GetValue(hadc);
HAL_TIM_Base_Start_IT(&htim17);
}
多通道DMA方式参考www.stmcu.org.cn/module/foru…
注意!!!ADC配置中,由于时钟是48MHz,所以ClockPrescaler为Synchronous clock mode divided by 4,这样ADC的时钟为12MHz(ADC时钟不能超过14MHz)
cube英文翻译blog.csdn.net/yxiaobo163/…