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
}

 

posted @ 2023-03-30 14:00  辛河  阅读(33)  评论(0)    收藏  举报