二、整理CubeMX配置ADC实现几种方式AD转换
(注 : 以STM32F429为例)
1. 轮询方式
HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc); //轮询模式,需放在循环中不断开启
uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef* hadc) //获取转换结果
HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout) /* 此函数只用于轮询模式,用于等待转换完成 */
HAL_StatusTypeDef HAL_ADC_Stop(ADC_HandleTypeDef* hadc); //停止转换
(1)配置CumeMX,如下图,选择规则通道,设置好AD转换的模式,不扫描,连续转换。
(2)编程实现
2. 中断方式
HAL_StatusTypeDef HAL_ADC_Start_IT(ADC_HandleTypeDef* hadc);//中断模式 HAL_StatusTypeDef HAL_ADC_Stop_IT(ADC_HandleTypeDef* hadc); void HAL_ADC_IRQHandler(ADC_HandleTypeDef* hadc);//中断
(1)配置CubuMX,在轮询的基础上,把中断勾选中,如图:
(2)编程实现:
编写中断回调函数,在里面设置一个标志位。
主循环中判断此标志位,注意需要调用 HAL_ADC_Start_IT。
3、DMA方式多通道转换
HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length);//DMA模式 HAL_StatusTypeDef HAL_ADC_Stop_DMA(ADC_HandleTypeDef* hadc);
(1)CubeMX配置,勾选多个通道,然后配置ADC,使能连续转换和扫描模式,使能DMA请求,配置Rank,如下图:
(2)编程实现:
注: 如果没有转换,要注意时钟问题。
4. 定时器触发+ADC中断实现单通道AD采集
(1)首先要了解,ADC要好几种触发方式,如下,这里我采用TIM8的事件更新来触发AD转换。
#define ADC_EXTERNALTRIGCONV_T1_CC1 0x00000000U #define ADC_EXTERNALTRIGCONV_T1_CC2 ((uint32_t)ADC_CR2_EXTSEL_0) #define ADC_EXTERNALTRIGCONV_T1_CC3 ((uint32_t)ADC_CR2_EXTSEL_1) #define ADC_EXTERNALTRIGCONV_T2_CC2 ((uint32_t)(ADC_CR2_EXTSEL_1 | ADC_CR2_EXTSEL_0)) #define ADC_EXTERNALTRIGCONV_T2_CC3 ((uint32_t)ADC_CR2_EXTSEL_2) #define ADC_EXTERNALTRIGCONV_T2_CC4 ((uint32_t)(ADC_CR2_EXTSEL_2 | ADC_CR2_EXTSEL_0)) #define ADC_EXTERNALTRIGCONV_T2_TRGO ((uint32_t)(ADC_CR2_EXTSEL_2 | ADC_CR2_EXTSEL_1)) #define ADC_EXTERNALTRIGCONV_T3_CC1 ((uint32_t)(ADC_CR2_EXTSEL_2 | ADC_CR2_EXTSEL_1 | ADC_CR2_EXTSEL_0)) #define ADC_EXTERNALTRIGCONV_T3_TRGO ((uint32_t)ADC_CR2_EXTSEL_3) #define ADC_EXTERNALTRIGCONV_T4_CC4 ((uint32_t)(ADC_CR2_EXTSEL_3 | ADC_CR2_EXTSEL_0)) #define ADC_EXTERNALTRIGCONV_T5_CC1 ((uint32_t)(ADC_CR2_EXTSEL_3 | ADC_CR2_EXTSEL_1)) #define ADC_EXTERNALTRIGCONV_T5_CC2 ((uint32_t)(ADC_CR2_EXTSEL_3 | ADC_CR2_EXTSEL_1 | ADC_CR2_EXTSEL_0)) #define ADC_EXTERNALTRIGCONV_T5_CC3 ((uint32_t)(ADC_CR2_EXTSEL_3 | ADC_CR2_EXTSEL_2)) #define ADC_EXTERNALTRIGCONV_T8_CC1 ((uint32_t)(ADC_CR2_EXTSEL_3 | ADC_CR2_EXTSEL_2 | ADC_CR2_EXTSEL_0)) #define ADC_EXTERNALTRIGCONV_T8_TRGO ((uint32_t)(ADC_CR2_EXTSEL_3 | ADC_CR2_EXTSEL_2 | ADC_CR2_EXTSEL_1)) #define ADC_EXTERNALTRIGCONV_Ext_IT11 ((uint32_t)ADC_CR2_EXTSEL) #define ADC_SOFTWARE_START ((uint32_t)ADC_CR2_EXTSEL + 1U)
(2)CubeMX配置TIM8与ADC1:
TIM8配置为1Hz,即1S触发一次AD转换。
ADC1配置如下:别忘了开启中断
(3)代码实现:实现的效果是1S打印一次AD转换的结果
1 //首先调用 2 HAL_ADC_Start_IT(&hadc1); 3 HAL_TIM_Base_Start(&htim8); 4 5 //编写AD转换完成处理函数 6 void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* AdcHandle) 7 { 8 printf("%d\r\n",HAL_ADC_GetValue(&hadc1)); 9 }