【指导】手把手教你:使用HAL库实现STM32的ADC-DMA读取

目录

1.CUBEMx设置

1.1新建工程

1.2芯片配置

1.2.1时钟配置

 1.2.2系统调试配置

 1.3 ADC配置

1.3.1 Parameter Settings配置

 1.3.2DMA Settings配置

1.4工程配置

 2.程序完善

2.1完善main函数

 2.2调试

3.总结


1.CUBEMx设置

1.1新建工程

1.2芯片配置

1.2.1时钟配置

 在1处输入72按回车,系统会自动将其他的时钟调整为相对应的配置。

 1.2.2系统调试配置

为了使生成的程序可以进行在线调试,重新点击1处的Pinout&Configuration,点击SYS,在Debug处点击Serial Wire。

 1.3 ADC配置

此处我们将14路ADC1内的14路ADC都进行AD采集并进行配置。此处我们先点击Analog下面的ADC1,然后将IN0~IN14前面的√全部点上,代表我们启用了前14路输入。

1.3.1 Parameter Settings配置

这里是ADC的最主要的配置部分,我们这里一项一项的进行详细说明:

(1)Data Alignment—>Right alignment                 此项选择右对齐,保持不变。

(2)Scan Conversion Mode—>Enable                 此项选择扫描模式使能,代表对15路ADC输入分别扫描,如果不使能,其将会只读取一个输入的值。

(3)Continuous Conversion Mode —>Enable        此项选择连续扫描模式,表示将连续不断的对ADC的值进行转换。如果此项不使能,将会只采集一次就会停止,直到下一次使能才继续进行一次ADC转换。

(4)Discontinuous Conversion Mode—>Disable        此项和第三项是重复的。

(5)Number of Conversion—->15                此处有多少路输入就选择多少,而且只有在此处选择数字之后下面才会出来15个不同的通道。而且此处应该是在进入ADC1中第一个需要操作的步骤,否则(2)(3)是灰色的,无法选择使能。

 (6)在出现的15个Rank中,分别配置每一路,例如Rank1配置为Channel 0,采样时间55.5Cycles; Rank2配置为Channel 1,采样时间同样为55.5Cycles。此处的注意事项是,如果你不对每一路进行检查配置,可能出现好多Rank同时采集一个Channel,从而导致AD的采集数据的错误。

 1.3.2DMA Settings配置

选择DMA Settings选项卡,点击Add,选择ADC1,然后将Mode修改为Circular,Memory地址增加,Data Width选择Half Word。配置完成。

 其他的UserConstant GPIO Settings可以不用动。

1.4工程配置

选择最上面的Project Manager的Project,首先对新建的工程命名为ModbusSlave,将Application Structure更改为Basic,最后将开发工具改成自己的开发工具,我这里用的是KEIL,这里选择MDK。

 然后选择Code Generator,在这个界面将Generator peripheral initalization as a pair of '.c/.h' files per peripheral前面勾选上。

 最后生成代码:

 2.程序完善

2.1完善main函数

在main.c函数汇总增加AdcBuf数组,然后在初始化ADC后,启动ADC校正和HAL_ADC_Start——DMA启动DMA就大功告成了。

 程序代码如下:

int main(void)
{
  /* USER CODE BEGIN 1 */
	uint16_t AdcBuf[15]={0};
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_ADC1_Init();
  /* USER CODE BEGIN 2 */
	HAL_ADCEx_Calibration_Start(&hadc1);
	HAL_ADC_Start_DMA(&hadc1, (uint32_t *)AdcBuf, 15);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */
}

 2.2调试

程序编译下载后,点开调试界面,将AdcBuf加入到监控界面,可以看到显示的数据。 

 在调试中,我是将第11路输入2.5V左右的电压,我们可以看一下此处的数据是0x0C1E转换成十进制为3102

\frac{3102}{4096}*3.3=2.499

3.总结

在HAL库进行ADC的DMA数据采集非常容易,但是有一些细节部分需要注意,尤其是我标注红色地方,是我自己踩得坑。

物联沃分享整理
物联沃-IOTWORD物联网 » 【指导】手把手教你:使用HAL库实现STM32的ADC-DMA读取

发表评论