0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

实战经验 | STM32U5 ADC 自校准不成功的问题分析

STM32单片机 来源:未知 2023-12-10 16:45 次阅读

wKgZomV1e7qAZlHJAAHUHXdxAL4922.gif

关键词:STM32U5,ADC

目录预览

1、引言

2、问题

3、问题解决

4、小结

01

引言

很多 STM32 系列中的 ADC 都带有自校准的功能。它提供了一个自动校准的过程,用于驱动包括 ADC 上电/掉电序列在内的所有校准动作。在这个过程中,ADC 计算出一个校准因子,并在内部应用到此 ADC 模块,直到下一次 ADC 掉电。在执行任何 ADC 操作之前必须校准,以消除芯片之间 ADC 结果的偏差。

02

问题

2.1. 问题详情

客户使用 STM32U575ZIT6Q 验证 ADC4 时,使用 STM32CubeMX 配置后生成工程项目。因为使用 ADC 进行采样转换前,必须要做 ADC 的自校准。于是在 main 函数中加入自校准代码,如图 1 所示。

wKgZomV1e7qAY1wgAABT0CW0xu8134.jpg

图1.代码:ADC 自校准

然而,在运行代码的情况下,发现 PC 指针最后跑到这个 Calibration Error 的Error_Handler()里。也就是说,执行自校准失败了!

再检查进入 Error_Handler()发生的问题,发现在执行HAL_ADCEx_Calibration_Start()时陷在了下面这个 Loop 当中,如图 2 所示。

wKgZomV1e7qATXCCAACJk9sCAkM641.jpg

图2.代码:等待 ADC 自校准完成

也就是说,ADCAL 位被置 1 后,始终没有被硬件清 0,代表自校准始终不成功。

2.2. 问题分析

查看 STM32U5 的参考手册 RM0456 中关于自校准的描述。考虑到校准没有成功,那么应该看看是不是自校准需要哪些条件,而这些条件并没有成立。

于是,在 ADC 章节中的 Calibration 小节找到了这么一段话,如图 3 所示。

wKgZomV1e7uAdIIgAACWubvvays217.jpg

图3.ADC 自校准要求条件

也就是说,在初始化自校准之前,需要保证 3 个条件:

1) ADC 的电压调整器已经使能并正常工作(ADVREGEN = 1 且 LDORDY =1)

2) ADC 没有打开(ADEN=0)

3) 自动掉电模式没有使能(AUTOFF = 0)

回到刚才等待 ADC 自校准完成的代码,当指针停留到这边时,在线调试检查各个标志位情况,发现 ADVREGEN=1,ADEN=0,AUTOFF=0,LDORDY=0。所以,可以肯定的是就是 LDORDY 不为 1,也就是说 ADC 的电压调整器还没有准备好,导致了自校准无法成功并退出。

在 STM32U5 中,引入了一个新的 ADC 特性,叫 ADC 电压调整器(ADC voltageregulator)。在使用 ADC 之前,这个电压调整器必须被使能并且能够稳定工作。可以通过将 ADC_CR 寄存器中的 ADVREGEN 位置 1 来使能它,然后必须要等这个电压调整器的启动时间之后,才可以正常启动自校准或者使用 ADC。这个 LDO 有没有准备好,可以通过 ADC_ISR 寄存器中的 LDORDY 这个位来判断。LDORDY=1 才代表了 LDO 已经准备好了。

回到客户的问题,可以知道即使 ADVREGEN 置 1 了,LDORDY 始终没有置起来,电压调整器没有启动工作,难道是 ADC 的这个电压调整器坏掉了?

别急,想到电源的问题,还不能忘了参考手册的另一个章节 :电源控制 PWR。翻到PWR 这一章,先要考虑到,与 ADC 相关的电源为 VDDA,所以要重点查看 VDDA 的内容。找到 Independent analog peripherals supply 这一小节,可以看以下关键的句子,如图 4。

wKgZomV1e7uAZofaAAG5GJGPf38431.jpg

图4.独立的模拟外设供电

从图中黄色高亮的文字,我们可以了解到,STM32U5 的 VDDA 在控制上还跟其他系列不一样,它有一个开关来选择是否隔离。芯片复位后,VDDA 提供的 ADC 和模拟开关控制在逻辑和电气上是隔离的,因此不可用。一旦 VDDA 电源存在,就必须在使用模拟外设之前,通过在 PWR_SVMCR 寄存器中将 ASV 置位来消除隔离。也就是说,要想使用ADC,必须先将 ASV 置位来消除隔离。

在 PWR_SVMCR 寄存器的解释中,也可以看到 ASV 位的描述中要求将此位强制置 1才可以使用模拟外设,如图 5。

wKgZomV1e7uAQJKdAAC6z9jcInY958.jpg

图5.ASV 位描述

ASV 的配置是没有在 STM32CubeMX 中进行配置的,所以需要在后期添加。所以,很可能就是因为没有将 ASV 置位以使能 VDDA,导致 ADC 外设被隔离,并没有得到供电,所以 ADC 的电压调整器不可能正常工作,LDORDY 也不可能为 1。

03

问题解决

在工程项目中搜索 ASV,可以找到两个 API,如图 6。

wKgZomV1e7uAe3w2AADPvGnknRw460.jpg

图6.VDDA 使能或禁用 API

也就是说,我们需要先将 HAL_PWREx_EnableVddA()添加到代码中。因为其属于MSP 硬件配置,所以将其加到 HAL_MspInit()函数,如图 7 所示。

wKgZomV1e7uACC1ZAACpY3G4lvA520.jpg

图7.修改过的 HAL_MspInit()函数

再重新编译,然后执行指令代码,就可以看到 ADC 的自校准可以正常完成,PC 指针已经可以正常跑到自校准后面的代码了。

04

小结

在 STM32U5 中,为了更好地控制功耗,ADC 中加入电压调整器和 VDDA 隔离功能。这与以往的 STM32 有所不同,需要注意一下。使用 ADC 等模拟外设前,需要注意将PWR_SVMCR 寄存器中将 ASV 置位来消除隔离。

其实不仅仅是 VDDA 可以隔离,VDDIO2 也是可以的,通过 PWR_SVMCR 寄存器的IO2SV 位进行控制。

如果仔细看过 STM32U5 的 ADC 例程,可以看到 HAL_MspInit()的内容是这么写的,如图 8 所示。

wKgZomV1e7yAZ9XYAAC98ziGubc031.jpg

图8.例程的 HAL_MspInit()函数

可以看到,在 MSP 初始化里,不仅使能了 VDDA,还使能了 VDDIO2。所以要使用VDDIO2 相关 I/O 的,也需要注意一下。

wKgZomV1e7yACjBNAAHiBpzEGaQ725.png

完整内容请点击“阅读原文”下载原文档。


原文标题:实战经验 | STM32U5 ADC 自校准不成功的问题分析

文章出处:【微信公众号:STM32单片机】欢迎添加关注!文章转载请注明出处。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6002

    文章

    43990

    浏览量

    620957
  • STM32
    +关注

    关注

    2240

    文章

    10675

    浏览量

    348872

原文标题:实战经验 | STM32U5 ADC 自校准不成功的问题分析

文章出处:【微信号:STM32_STM8_MCU,微信公众号:STM32单片机】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    STM32F103 USB枚举不成功的原因?

    (NVIC_VectTab_FLASH,0x8800),但此时USB便枚举不成功,此时其他中断是正常的;但若把APP起始地址改为0X8000000不使用IAP进行跳转则枚举没有问题.我比较怀疑中断向量这块的设置是不是还有问题,跪求高手帮忙看看.我使用的MCU为STM32F
    发表于 04-29 06:29

    STM32在中断中OSFlagPost不成功是为什么?

    STM32在中断中OSFlagPost不成功,是为什么?
    发表于 04-23 07:44

    STM32F103RGT6位带操作不成功的原因?

    各位大神,我是一个入门级的超级菜鸟,遇到一个问题: 为啥子我同样的位带操作在STM32F103C8T6上操作成功,但是在STM32F103RGT6位带操作不成功
    发表于 04-19 06:32

    STM32F407VGT6刷了一次程序,再刷的时候不成功,为什么?

    STM32F407VGT6刷了一次程序,再刷的时候不成功 帮我看看什么原因,谢谢大佬了
    发表于 03-29 06:55

    STM32U5,STM32WB及STM32L4开发板,哪个开发板拥有较多数量的ADC?

    请问,我现在需要开发一个项目,在这个项目中需要使用较多数量的传感器(至少8个),这些传感器需要进行信号采集,现在在使用STM32U5,STM32WB及STM32L4芯片的开发板中,哪些开发板拥有较多数量的
    发表于 03-20 08:01

    STM32U5开发板ADC校准超时怎么解决?

    使用的代码就是官方的例程,我把官方的Cubemx文件另存为另一个工程之后,重新生成代码(这样做是为了保证硬件配置是一致的)。调用HAL_ADCEx_Calibration_Start进行ADC校准的时候超时。同一个板子用例程就很快完成了
    发表于 03-18 07:36

    基于STM32U5片内温度传感器正确测算温度实战经验分享

    STM32 在内部都集成了一个温度传感器,STM32U5 也不例外。这个位于晶圆上的温度传感器虽然不太适合用来测量外部环境的温度,但是用于监控晶圆上的温度还是挺好的,以防止芯片过温运行。
    的头像 发表于 02-22 17:27 2216次阅读
    基于<b class='flag-5'>STM32U5</b>片内温度传感器正确测算温度<b class='flag-5'>实战经验</b>分享

    盘点那些硬件+项目学习套件:STM32U5单片机开发板及入门常见问题解答

    型号STM32学习感兴趣的朋友可以了解。基本上有了STM32U5经验,再去学习STM32G0/F1/F4核心,就会上手很快。STM32U5
    发表于 02-19 16:59

    初始化AD7190的时候想进行内部零电位和内部满量程校准,但是都不成功怎么解决?

    初始化AD7190的时候想进行内部零电位和内部满量程校准,但是都不成功。 基本配置程序如下 initAD7190 () {u8 发送Data[4] /0,0,0} 无效; resetAD7190
    发表于 12-04 06:27

    navicat导入SQL文件不成功

    Navicat是一款功能强大的数据库管理工具,可以帮助用户轻松管理和操作数据库。然而,有时用户在导入SQL文件时可能会遇到问题,导致导入不成功。本文将详细介绍导入SQL文件不成功的原因和解
    的头像 发表于 11-21 11:01 3289次阅读

    STM32U5系列使用LPBAM进行功耗优化

    STM32U5 系列微控制器基于具有 Arm® TrustZone®和 FPU 的高性能 Arm®32 位 Cortex®-M33 CPU。此类产品均采用新型结构制造,得益于其高度灵活性和高级外设集
    发表于 09-08 06:54

    STM32U5 HexaSPI总线连接PSRAM的PCB布线规则

    本文介绍在使用 STM32U5 的 HexaSPI(HSPI)总线连接 PSRAM 外设时,做 PCB 布线上需要注意的一些技术要求。
    发表于 09-07 08:20

    STM32U5带OEM Key保护的RDP降级

    STM32U5 在芯片生命周期管理方面在 STM32L5 的基础做了进一步的改进,引入了OEM Key 机制,使得 RDP 的级别状态转换能够通过 OEM 设置的 password 进行保护,一方面
    发表于 09-07 06:38

    Arm TrustZone特性面向STM32L5STM32U5系列

    在 IoT(物联网)应用中,设备很容易受到通过互联网实施的恶意入侵。因此,保护设备和信息并使可信区域和不可信区域彼此隔离,这些安全主题就非常的重要。STM32L5STM32U5 系列器件(本文
    发表于 09-07 06:28

    请问STM32U5的USB如何在STM32CubeMX上直接配置?

    STM32U5的USB配置不能和STM32G0B1那样直接在STM32CubeMX上直接配置什么类了吗
    发表于 08-07 06:10