为何STM32H7的ADC数据不变

发布者:GoldenSerenity最新更新时间:2023-09-26 来源: elecfans关键字:STM32H7  ADC 手机看文章 扫描二维码
随时随地手机看文章

有人使用STM32H7系列的ADC模块,定时器触发ADC,数据通过DMA传输到内存。对某通道连续转换几次后求个平均值。他却发现ADC结果虽没有什么问题,但一批数据出来后就纹丝不动了。DMA传输本来设计成的Circular模式,感觉好像工作在Normal模式,结果显然有点不合理。


鉴于这个现象和所用芯片,估计是因为Cache使用方面的原因,客户也的确使能了Cache。具体怎么回事呢?我们一起来看看。


我这边使用H743Nucleo板和ST免费的STM32CubeIDE。STM32H743片内有个Vrefint信号,电压一般在1.2v左右,用它做ADC的输入信号来测试。用LPTIM触发ADC转换,每读到5个数据就求个平均值。

我这里定义了一个6字大小的数组,uint32_t  AdcDataViaDMA [6];前5个位置放实时ADC数据,第6个位置即AdcDataViaDMA [5]存放换算后的最终Vrefint电压平均值,单位是mv。

我们使用STM32CubeMx进行配置。重点看下ADC的配置:[注:ADC是16位的]

039f9790-6289-11ed-8abf-dac502259ad0.png

03edf4a8-6289-11ed-8abf-dac502259ad0.png

生成初始化代码后,添加用户代码。我把数组AdcDataViaDMA【】指定在片内RAM2区域。

__attribute__((section(".AdcDataViaDMA")))   uint32_t AdcDataViaDMA [6];

041ddd8a-6289-11ed-8abf-dac502259ad0.png

0440856a-6289-11ed-8abf-dac502259ad0.png

HAL_ADCEx_Calibration_Start(&hadc3, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED );

HAL_ADC_Start_DMA(&hadc3,(uint32_t*)&AdcDataViaDMA [0], 5);

HAL_LPTIM_PWM_Start(&hlptim2, Period, Pulse);

然后编译调试。同样出现数据纹丝不动的现象。我每次在传输完成中断回调函数里做数据处理。相关处理代码如下图所示:

046aa70a-6289-11ed-8abf-dac502259ad0.png

TIMER不停触发ADC,DMA传输也是循环的,按理数据应该动态改变。即使变化不大,也不至于纹丝不动。【除AdcDataViaDMA [5]外,其它均为AD转换值。】

0495e44c-6289-11ed-8abf-dac502259ad0.png

那是什么原因呢?目前我们是开启了Cache的。

05238356-6289-11ed-8abf-dac502259ad0.png

现在数据的大致流程就是,ADC转换结果出来后,DMA将数据写入SRAM,然后CPU读取SRAM里的数据。因为开启了D-Cache,当CPU针对SRAM做读操作时发生读Allocate,相应内存地址的数据被拷贝一份到Cache里。下次CPU再去相应SRAM地址去读取时,因D-Cache里已经有了一份有效数据,即发生Cache命中事件,CPU就直接从Cache读数据,而不读取SRAM了。

05790998-6289-11ed-8abf-dac502259ad0.png

所以,尽管后面时间里ADC因TIMER不停触发而产生新数据并被DMA传输到SRAM,但CPU除了第一次外总是从D-Cache取数据,导致该数据永远就是第一次读到的数据而不变。

既然这样,我们可以在CPU每次针对SRAM做了读操作后,对D-Cache相应内容做无效处理,迫使CPU每次要取数据时因Cache Miss而发生读Allocate操作并更新Cache数据,进而保证CPU读到跟内存SRAM里一致的Cache数据。

我在DMA完成中断回调函数里加上一句针对D-Cache作无效操作的代码。如下图红线标注的代码。

059720f4-6289-11ed-8abf-dac502259ad0.png

然后进行测试,立即可以看到不断实时变化的数据了。【下图我随机截取的几个结果】

05c01810-6289-11ed-8abf-dac502259ad0.png

不过,请注意这里针对D-Cache相应地址做了无效化处理的代码要放在最前面。你可以将该句试着放在对AdcDataViaDMA [5]赋0语句的后面验证下,看看会有什么现象,要看细致点,不然发现不了问题。顺便提醒,目前所用SRAM区域在没有做MPU配置的情况下,默认为write back加write allocate Cache属性,我在前面贴图时已经圈出来了。有兴趣的话,可以基于上述代码自行进一步探究下,此处就不延伸了。

另外,除了上面的解决办法外,还有就是将上面内存数组所在区域做MPU设置,关闭那部分区域的Cacheable属性。

05e9fbf8-6289-11ed-8abf-dac502259ad0.png

当这样配置后,之前那句针对Cache无效化的代码就不需要了。生成代码进行测试,结果跟预期一致,数据保持实时动态变化,结果也正常。

上面主要就开启D-Cache后,发生了主设备数据读取不一致的问题给出了些解决办法及思路,同时也算是给出些应用提醒,以后碰到类似问题时可以参考。当然,有人或许会说,完全不开启芯片的D-Cache功能也可以解决问题。诚然,但我们需要综合考虑开发便利性和芯片的性能发挥,尽量就问题做些针对性的处理以充分发挥芯片性能。


关键字:STM32H7  ADC 引用地址:为何STM32H7的ADC数据不变

上一篇:基于STM32的OLED舵机菜单显示
下一篇:stm32单片机GPIO端口的特点及应用解析

推荐阅读最新更新时间:2024-11-17 11:44

Teledyne e2v推出12位四通道模数转换器 支持高达6.4GSps转换速率
Teledyne e2v致力于不断提升产品性能,近日更推出了12位四通道模数转换器(ADC)--EV12AQ605。这款最新的信号调理解决方案是该公司热门ADC EV12AQ60的新版本,两者具有几乎相同的功能,但是更低的价格,将吸引批量生产并对成本敏感的应用市场的目光。两者的主要区别是保存在一次可编程(OTP)存储器中交织不匹配校准设置的数量以及支持的温度范围(-40°C至+ 110°C,而EV12AQ600支持-55°C至+125° C)。该系列ADC采用管脚兼容设计,工程师无需更改现有基于EV12AQ600的设计,可以简单快速替换。 EV12AQ605交叉点开关设计,意味着四个处理内核可以独立运行,亦可配合工作,从
[网络通信]
Teledyne e2v推出12位四通道<font color='red'>模数转换器</font> 支持高达6.4GSps转换速率
Maxim 推出采样速率最快的20位SAR ADC
Maxim Integrated功能丰富的SAR ADC集成内部基准缓冲器,设计人员无需牺牲精度、速度或功耗指标即可实现更宽的动态范围。 中国,北京,2014年4月23日。Maxim Integrated Products, Inc. (NASDAQ: MXIM)推出20位、1.6Msps逐次逼近寄存器(SAR)模/数转换器(ADC) MAX11905,使设计人员能够以最低功耗实现业内最高分辨率和最快采样速率。 工程师在高精度数据转换设计中通常会选取Σ-ΔADC。然而,为实现高精度和宽动态范围,此类ADC的功耗通常在100mW以上。而MAX11905 SAR ADC的功耗仅为9mW,降幅达91%。除有效降低功耗外
[模拟电子]
Maxim 推出采样速率最快的20位SAR <font color='red'>ADC</font>
STM32之ADC学习
配置ADC 1、 系统时钟定义: RCC_Configuration(); 包涵: RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMAx, ENABLE); // Enable DMA clock RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADCx , ENABLE); // Enable ADC1 and GPIOC clock 2、 中断源配置: NVIC_Configuration(); 举例: { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_Pri
[单片机]
STM32的ADC产生随机数
因为在做一样东西需要产生随机数,范围在 ,在网上找到一种方法,就是利用ADC悬空引脚产生随机数,所以做了尝试,把尝试的结果分享一下,总的来说,随机效果还算可以。 函数如下: 首先初始化ADC1,然后读取通道4即PA4引脚上的电压值,转换成16位的数字值后取低4位,再赋给8位变量led_mode_value。 将这个led_mode_value变量通过串口送至电脑观察,效果如下: 看来随机效果还算可以,23次取值,取到了8个不同值,这样的随机程度可以接受。 随机数产生过程改进版: 函数如下: 初始化ADC1之后,先取一个低4位的值,然后再取一个16位随机值加到第一个随机4位值上,得到一个
[单片机]
STM32的<font color='red'>ADC</font>产生随机数
STC12C5A60S2的ADC+PWM功能
STC12C5A60S2单片机的A/D转换口在P1口(P1.7-P1.0),有8路10位高速A/D转换器,速度可达到250 KHz(25万次/秒)。脉宽调制(PWM)是一种使用程序来控制波形占空比、周期、相位波形的技术。STC12C5A60S2单片机的PAC模块可以通过程序设定,使其工作于8位PWM模式。 下面是一段将ADC和PWM结合起来应用的程序: /*************************************************************** 时间:2012.12.1 晶振:12MHz 功能描述:AD采集电位器的电压信号,然后信号以PWM信号输出控制LED的亮度(调节电位器)
[单片机]
MAX9635内置ADC的环境光传感器
MAX9635环境光传感器提供I²C数字输出,可理想用于智能手机、笔记本电脑、工业传感器等便携产品。器件工作电流小于1µA,是业内功耗最低的环境光传感器,具有22位超宽动态范围(0.045流明至188,000流明)。   由于能够检测极其微弱的光线,可理想工作在暗色玻璃环境下。   片上光电二极管的光谱响应针对人眼对环境光的响应进行优化,集成红外及紫外线屏蔽。自适应增益电路可自动选择正确的流明范围优化测试(计数值/流明)。   IC设计工作在1.7V至3.6V供电范围,满负荷工作时仅消耗0.65µA电流。器件采用小尺寸2mm x 2mm x 0.6mm OTDFN封装。   关键特性   0.045流明至188,000流
[模拟电子]
具有125kSPS采样率的2通道微功耗12位ADC
    摘要: AD7887是一种可工作在2.7V~5.25V单一电源下的12位ADC,它具有125kSPS的吞吐率。其特点是高速、低功率,并具有多种工作模式供选择,可灵活选择电源管理模式,是目前体积最小的12位ADC。文中介绍了AD7887的功能、原理及应用电路。     关键词: ADC 单/双通道 吞吐率 AD7887 1 概述 AD7887是一种可工作在2.7~5.25V单一电源下的高速、低功率12位ADC,具有125kSPS的吞吐率。其输入端相当于一个采样周期为500ns的单端采样器,任何信号经转换后可以二进制编码形式由输出端输出。AD7887具有单/双通道两种工作模式和灵活的电源管理模式,并可
[应用]
ADC性能提高的建议
虽然ADC看起来非常简单,但它们必须正确使用才能获得最优的性能。ADC具有与简单模拟放大器相同的性能限制,比如有限增益、偏置电压、共模输入电压限制和谐波失真等。ADC的采样特性需要我们更多地考虑时钟抖动和混叠。以下一些指南有助于工程师在设计中充分发挥 ADC 的全部性能。   模拟输入   要认真对待ADC的模拟输入信号,尽量使它保持干净,“无用输入”通常会导致“数字化的无用输出”。模拟信号路径应远离任何快速开关的数字信号线,以防止噪声从这些数字信号线耦合进模拟路径。   虽然简化框图给出的是单端模拟输入,但在高性能ADC上经常使用差分模拟输入。差分驱动ADC可以提供更强的共模噪声抑制性能,由于有更小的片上信号摆幅,因此一般也能
[模拟电子]
<font color='red'>ADC</font>性能提高的建议
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved