当前位置:   article > 正文

手把手教你,通过HAL库实现STM32的ADC的DMA读取_hal adc dma

hal 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就大功告成了。

 程序代码如下:

  1. int main(void)
  2. {
  3. /* USER CODE BEGIN 1 */
  4. uint16_t AdcBuf[15]={0};
  5. /* USER CODE END 1 */
  6. /* MCU Configuration--------------------------------------------------------*/
  7. /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  8. HAL_Init();
  9. /* USER CODE BEGIN Init */
  10. /* USER CODE END Init */
  11. /* Configure the system clock */
  12. SystemClock_Config();
  13. /* USER CODE BEGIN SysInit */
  14. /* USER CODE END SysInit */
  15. /* Initialize all configured peripherals */
  16. MX_GPIO_Init();
  17. MX_DMA_Init();
  18. MX_ADC1_Init();
  19. /* USER CODE BEGIN 2 */
  20. HAL_ADCEx_Calibration_Start(&hadc1);
  21. HAL_ADC_Start_DMA(&hadc1, (uint32_t *)AdcBuf, 15);
  22. /* USER CODE END 2 */
  23. /* Infinite loop */
  24. /* USER CODE BEGIN WHILE */
  25. while (1)
  26. {
  27. /* USER CODE END WHILE */
  28. /* USER CODE BEGIN 3 */
  29. }
  30. /* USER CODE END 3 */
  31. }

 2.2调试

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

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

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

3.总结

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/753050
推荐阅读
相关标签
  

闽ICP备14008679号