參考https://www.cnblogs.com/xingboy/p/10018749.html
用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方式參考http://www.stmcu.org.cn/module/forum/thread-598945-1-1.html
注意!!!ADC配置中,由於時鐘是48MHz,所以ClockPrescaler爲Synchronous clock mode divided by 4,這樣ADC的時鐘爲12MHz(ADC時鐘不能超過14MHz)
cube英文翻譯https://blog.csdn.net/yxiaobo163/article/details/83583375