stm32 cubemx TIM1触发DMA+ADC采集多个通道
1)设置定时器TIM1提供触发信号

2)设置ADC接收外部触发信号

3)设置ADC1的DMA

4)注意要点
4.1 外设初始化顺序:
MX_DMA_Init();// 一定在MX_ADC1_Init()之前
MX_TIM1_Init();
MX_ADC1_Init();
4.2 特别注意:在开启TIM1的PWM之后开启ADC-DMA
volatile uint16_t ADCvalue[SAMPLE_NUM]; //存放采样值
HAL_TIM_PWM_Start(&htim_PWM,TIM_CHANNEL_3);//启动指定通道,产生PWM波信号,引脚不输出,仅内部触发ADC采样
//启动定时器、ADC—DMA(特别注意:在开启PWM之后开启ADC-DMA)
HAL_TIM_Base_Start(&htim_PWM);//启动定时器1
HAL_ADC_Start_DMA( &hadc1, (uint32_t *)ADCvalue, sizeof(ADCvalue)/sizeof(ADCvalue[0]) );// 开启ADC-DMA
4.3 重载函数写法
/**
* @brief HAL_ADC_ConvHalfCpltCallback.
* @param hadc: pointer to ADC handle.
* @retval None
*/
void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef* hadc)
{
if(hadc->Instance == ADC1)
{
//采样值处理
}
}
/**
* @brief HAL_ADC_ConvCpltCallback
* @param hadc: pointer to ADC handle.
* @retval None
*/
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
if(hadc->Instance == ADC1)
{
//采样值处理
}
}
4.4 ADC自校正
校准!使用前务必校准!注意hal库函数配合与调用顺序。
一个例子:
/*
功能:开始DMA ADC采样
INPUT:
OUTPUT:
特别注意:在开启PWM之后开启ADC-DMA
*/
void startADC1(void)//开始ADC1
{
HAL_ADC_Stop_DMA( &hadc1);
/* ADC校准 */
HAL_ADCEx_Calibration_Start(&hadc1);
/* 等待校准完成 */
while(hadc1.State !=HAL_ADC_STATE_READY){};
//在开启PWM之后开启ADC-DMA
HAL_ADC_Start_DMA( &hadc1, (uint32_t *)ADCvalue, SAMPLE_NUM_PER_CHANNEL*SAMPLE_CHANNEL_NUM );// 开启ADC-DMA
}

浙公网安备 33010602011771号