ADC-DMA采样步骤如下:
1.准备工作
定义宏量和存储采样值的全局变量:
//采样值数组的元素个数,这里是10个
#define ADC_CONVERTED_DATA_BUFFER_SIZE ((uint32_t) 10)
//采样值数组全局声明
static uint16_t aADCxConvertedData[ADC_CONVERTED_DATA_BUFFER_SIZE];
/* ADC handle 声明,设置ADC用 */
ADC_HandleTypeDef AdcHandle;
/* ADC channel configuration 结构体声明 */
ADC_ChannelConfTypeDef sConfig;
2.在main函数中完成的步骤
step1:初始化ADC和DMA外设
AdcHandle.Instance = ADCx;
if (HAL_ADC_DeInit(&AdcHandle) != HAL_OK)
{
/* ADC de-initialization Error */
Error_Handler();
}
AdcHandle.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2; /* Synchronous clock mode, input ADC clock with prscaler 2 */
AdcHandle.Init.Resolution = ADC_RESOLUTION_12B; /* 12-bit resolution for converted data */
AdcHandle.Init.DataAlign = ADC_DATAALIGN_RIGHT; /* Right-alignment for converted data */
AdcHandle.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD; /* Sequencer disabled (ADC conversion on only 1 channel: channel set on rank 1) */
AdcHandle.Init.EOCSelection = ADC_EOC_SINGLE_CONV; /* EOC flag picked-up to indicate conversion end */
AdcHandle.Init.LowPowerAutoPowerOff = DISABLE;
AdcHandle.Init.LowPowerAutoWait = DISABLE; /* Auto-delayed conversion feature disabled */
AdcHandle.Init.ContinuousConvMode = ENABLE; /* Continuous mode enabled (automatic conversion restart after each conversion) */
AdcHandle.Init.DiscontinuousConvMode = DISABLE; /* Parameter discarded because sequencer is disabled */
AdcHandle.Init.ExternalTrigConv = ADC_SOFTWARE_START; /* Software start to trig the 1st conversion manually, without external event */
AdcHandle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; /* Parameter discarded because software trigger chosen */
AdcHandle.Init.DMAContinuousRequests = ENABLE; /* ADC DMA continuous request to match with DMA circular mode */
AdcHandle.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN; /* DR register is overwritten with the last conversion result in case of overrun */
AdcHandle.Init.SamplingTimeCommon = ADC_SAMPLETIME_1CYCLE_5;
/* Initialize ADC peripheral according to the passed parameters */
if (HAL_ADC_Init(&AdcHandle) != HAL_OK)
{
Error_Handler();
}
step2:ADC校正
if (HAL_ADCEx_Calibration_Start(&AdcHandle) != HAL_OK)
{
Error_Handler();
}
step3:DMA通道配置
sConfig.Channel = ADCx_CHANNEL; /* Channel to be converted */
sConfig.Rank = ADC_RANK_CHANNEL_NUMBER;
if (HAL_ADC_ConfigChannel(&AdcHandle, &sConfig) != HAL_OK)
{
Error_Handler();
}
step4:开启DMA模式下的ADC转换
if (HAL_ADC_Start_DMA(&AdcHandle,
(uint32_t *)aADCxConvertedData,
ADC_CONVERTED_DATA_BUFFER_SIZE
) != HAL_OK)
{
Error_Handler();
}
step5:进入主循环
/* Infinite Loop */
while (1)
{
// USER CODE
}
在主循环里,我们不用关心ADC是如何将数据经过DMA传给内存变量的,只要在需要时读取内存变量即可。
3.说明
以上只是说明了ADC-DMA采样传输的配置过程,代码也只是起到示例说明作用。在实际项目中,我们还要根据具体的硬件、IDE和算法等进行调整修改。