《DMA配置的一些知识》
DMA的模式:
- Normal模式(不循环模式):当一次DMA数据传输完后,停止DMA传送 ,也就是只传输一次。
- Circular模式(循环模式):传输完成后又重新开始继续传输,不断循环永不停止(一般用于处理循环缓冲区和连续的数据传输(如ADC的扫描模式))。
当开启循环模式之后,数据传输的数目变为0时,将会自动地恢复成配置通道时设置的初值,DMA操作将会继续进行。
data width:数据宽度
byte:字节,通用8位,与u8相同
word:字长,与硬件的位数相同,STM32是32位,所以对应是u32
Half Word:半个字长,所以对应是u16
一、ADC单通道+轮询模式
ADC单通道+单次转换模式(只转换一次)+不扫描模式(只有一个通道)
int main()
{
// 初始化ADC
MX_ADC1_Init();
/* 开启 ADC自动校准 */
if (HAL_ADCEx_Calibration_Start(&hadc1, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED) != HAL_OK)
{
Error_Handler();
}
while (1)
{
/* The ADC1 starts collecting the voltage of the supercapacitor */
HAL_ADC_Start(&hadc1);
if (HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK)
{
adcValue = HAL_ADC_GetValue(&hadc1);
supercapV = (uint32_t) adcValue * 3300 / 0xFFFF;
}
HAL_ADC_Stop(&hadc1);
}
}
二、ADC单通道+中断
uint16_t ADC_Values;
int main()
{
// 初始化ADC
MX_ADC1_Init();
// 开启ADC自动校准
if (HAL_ADCEx_Calibration_Start(&hadc1, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED) != HAL_OK)
{
Error_Handler();
}
//开启ADC使能中断
HAL_ADC_Start_IT(&hadc1);
while (1)
{