ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

STM32H743+CubeMX-ADC+DMA采样三路模拟量(并行),没过采样。

2021-07-06 20:31:40  阅读:572  来源: 互联网

标签:采样 DMA 内存 CubeMX ADC3 STM32H743 ADC


文章目录


相关笔记:
STM32H743-梳理ADC模数转换器在CubeMX上的配置
STM32H743+CubeMX-使用ADC模数转换器读取CPU的温度(串行方式)

一、前言


在实际项目上,ADC采样必须与DMA组合使用,实现并行采样。这里的“并行采样”并不是多个通道同时采样,而是ADC控制器一边采样,CPU一边干其他非常重要的活。当CPU在需要ADC采样的数据时,通过cache获取内存里模拟量的值即可。

这个笔记实现ADC3+DMA采样三路模拟量,分别是ADC_IN9, Vrefint Channel(MCU内部), Temperature Sensor Channel(MCU内部).

系统框图如下(从右到左):

  1. ADC3采样各个通道的模拟量,每当采样完成时,让DMA将采样的数据存放到内存RAM_D3里(声明一个全局数组ADC3_Data[3])。
  2. 每隔300ms,CPU通过cache获取全局变量ADC_Data[0] ~ ADC_Data[2]一共3个模拟量。
    在这里插入图片描述

STM32工程:

链接:https://pan.baidu.com/s/1KbbWJ7K4SgKxjOns4iLOPA
提取码:kexw

二、CubeMX


2.1、RCC,SYS,Clock Configuration

这三项的设置跟笔记一样:
STM32H743+CubeMX-使用ADC模数转换器读取CPU的温度(串行方式)

2.2、CORTEX_M7(cache与MPU)

DMA不能访问DTCM内存,所以要开辟RAM_D3内存,让DMA有地方放数据。基于这个目的,需要开启Cortex_M7的cache与MPU功能。
在这里插入图片描述

2.3、ADC3 Mode and Configuration

在这里插入图片描述

2.4、DMA Settings

在这里插入图片描述

2.5、Parameter Settings

各个参数的说明,参考笔记:STM32H743-梳理ADC模数转换器在CubeMX上的配置
在这里插入图片描述

2.6、GPIO settings

只有ADC3_IN9是外部通道,所以只有一个GPIO口。
在这里插入图片描述
最后生成代码:
在这里插入图片描述

三、Keil


将全局数组ADC_Data[4]定义到内存RAM_D3域。参考笔记:STM32H743+CubeMX-将变量定义到指定内存(Keil软件)

3、1、Target

让Keil只管理DTCM内存,不要管理其他内存。
在这里插入图片描述

2.2、Linker

从ST官方手册RM0433可以查到,STM32H743的Flash首地址是0x08000000,DTCM(紧密耦合内存)的首地址是0x20000000。
在这里插入图片描述
.sct文件,最开始跟Target配置的ROM与RAM一一对应的。接下来,我们需要增加.sct的内存。
在这里插入图片描述
在.sct文件添加其他内存的描述。
在这里插入图片描述

; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x08000000 0x00200000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00200000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
   .ANY (+XO)
  }
  RW_IRAM1 0x20000000 0x00020000  {  ; RW data
   .ANY (+RW +ZI)
  }
  
  RW_IRAM4 0x38000000 0x00010000  {  ; RW data - 64KB SRAM4(0x38000000)
   *(.RAM_D3)
  }
  
}

接着,一定要Rebuild整个工程,不然会报错。。
在这里插入图片描述
在这里插入图片描述

四、代码


4.1、adc.c

在函数MX_ADC3_Init():
在这里插入图片描述

4.2、main.c

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、硬件接线


只有ADC3_IN9是外部通道,为了方便测试,ADC3_IN9连接3.3V。

六、DEBUG


6.1、Debug(printf)Viewer

从printf的信息看到,Vrefint的值是正确的。ADC3_IN9与DC3.3V连接,所以它的值非常接近3.3V。
在这里插入图片描述
在这里插入图片描述

6.2、观察全局变量

实时观察全局变量。
在这里插入图片描述

七、细节补充


7.1、在HAL_ADCEx_Calibration_Start()之前添加HAL_Delay

有一些网友说,在某些板子上电时,电容正在充电,最好在HAL_ADCEx_Calibration_Start()之前延时一会会,等待电容充满电,板子的3.3V电源网络稳定后再执行HAL_ADCEx_Calibration_Start()。
在这里插入图片描述

标签:采样,DMA,内存,CubeMX,ADC3,STM32H743,ADC
来源: https://blog.csdn.net/wallace89/article/details/118528619

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有