(模式:连续模式 非扫描模式) 使能ADC全局中断 参考视频
【STM32】超简单的开发方法-基础篇(ADC模数转换)
https://player.bilibili.com/player.html?aid=715022775
参考文章:https://blog.csdn.net/as480133937/article/details/99627062
设置定时 可以看我这篇文章 配置玩定时器之后
配置ADC 使能ADC中断
基本函数:
? HAL_ADC_Start_IT(&hadcx); ? ? ?
? HAL_ADC_Stop_IT()
? HAL_ADC_GetValue()
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
程序:
uint16_t AD_Value;
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC3_Init();
MX_TIM2_Init();
MX_USART1_UART_Init();
HAL_TIM_Base_Start_IT(&htim2);
HAL_ADCEx_Calibration_Start(&hadc3);
while (1) {}}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
HAL_ADC_Start_IT(&hadc3);
}
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
HAL_ADC_Stop_IT(&hadc3);
HAL_TIM_Base_Stop_IT(&htim2);
AD_Value=HAL_ADC_GetValue(&hadc3);
printf("ADC1 Reading : %d \r\n",AD_Value);
printf("电压:%.4f V \r\n",(AD_Value*3.3/4096));
HAL_TIM_Base_Start_IT(&htim2);
}
int fputc(int ch, FILE *f){
HAL_UART_Transmit (&huart1,(uint8_t *)&ch,1,0xffff);
return ch;
}
基本方法就是 让定时器去计时,到时间后,开启ADC中断去获取,然后在ADC中断里面关闭ADC,TIM,处理完后再跳出,启动定时器,再由定时器循环驱动ADC中断 这样子就不会碰到超时时间的问题了,因为他是转换完了才进的ADC中断,然后再关闭,由定时器决定他开。
|