配置ADC1双通道采样
STM32CubeMX配置
1. 配置GPIO为ADC模式
以PC0和PC1为例,是ADC1的通道10和通道11,如下图:
2.ADC1参数配置
进入ADC1的【Parameter Settings】
① ADCs_Common_Settings
Mode | Independent mode ADC1工作在独立模式
②ADC_Settings
Data Alignment | Right alignment 数据向右边对齐
Scan Conversion Mode | Enabled ADC工作在扫描模式(多通道)
Continuous Conversion Mode | Enabled
Discontinuous Conversion Mode | disabled ADC模数转换工作在连续模式。
③ADCs_Regular_ConversionMode(规则通道转换模式)
Enable Regular Conversions | Enable 使能规则通道转换模式
Number of Conversion | 2 ADC转换的通道数量
④Rank
Channel | Channel 10 ADC转换通道
Sampling Time | 1.5Cycles ADC转换时间
1)先设置规则转换通道的转换通道数为2,【Scan Conversion Mode】扫描模式自动Enable。
2)Rank 1 设置为Channel 10,Sampling Time设置为1.5 Cycles. Rank 2 设置为Channel 11,Sampling Time设置为1.5 Cycles.
3)根据需要使能【Continuous Conversion Mode】连续模式,开启后自动会转换,不需要转换后再次开启。此次开启该功能。
3.添加并设置DMA
①点开DMA设置界面
②添加DMA
③选择ADC1
④DMA模式选择为循环模式
4.ADC1时钟配置
此次用外部 8M 晶振当时钟源,经过上图的倍频分频设置,ADC1的时钟源为12M.
配置完生成代码后,修改和调用函数
1.ADC实验例程
uint16_t usADCBuf[2];
int main(void)
{
/* Run the ADC calibration */
if (HAL_ADCEx_Calibration_Start(&hadc1) != HAL_OK)
{
/* Calibration Error */
Error_Handler();
}
/* Start ADC conversion on regular group with transfer by DMA */
if (HAL_ADC_Start_DMA(&hadc1, (uint32_t *)usADCBuf, 2) != HAL_OK)
{
/* Start Error */
Error_Handler();
}
while(1)
{
printf("Channel 10 ADC value is %d", usADCBuf[0]);
printf("Channel 11 ADC value is %d", usADCBuf[1]);
HAL_Delay(1000);
}
}
2.关闭DMA中断(看情况)
在调用时发现,DMA传输完成后会进入中断,可能是由于usADCBuf[2]size为2小,导致太频繁进入中断,所以我在STM32CubeMX生成的DMA初始化代码里,将DMA初始化内容屏蔽
/**
* Enable DMA controller clock
*/
static void MX_DMA_Init(void)
{
/* DMA controller clock enable */
__HAL_RCC_DMA1_CLK_ENABLE();
/* DMA interrupt init */
#if 0 //ADC DMA interrupt close
/* DMA1_Channel1_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
#endif
}