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单片机】欢迎添加关注!文章转载请注明出处。


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

    关注

    6032

    文章

    44513

    浏览量

    632681
  • STM32
    +关注

    关注

    2265

    文章

    10870

    浏览量

    354682

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

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

收藏 人收藏

    评论

    相关推荐

    STM32项目实战:基于STM32U5的智能大棚温控系统(LVGL),附项目教程/源码

    《智能大棚温控系统_STM32U5》项目完整文档、项目源码,点击下方链接免费领取。项目资料领取https://s.c1ns.cn/F5XyUSTM32项目实战之“智能大棚温控系统
    的头像 发表于 11-13 17:08 307次阅读
    <b class='flag-5'>STM32</b>项目<b class='flag-5'>实战</b>:基于<b class='flag-5'>STM32U5</b>的智能大棚温控系统(LVGL),附项目教程/源码

    STM32项目实战:基于STM32U5的火灾报警系统(LVGL),附项目教程/源码

    《火灾报警系统_STM32U5》项目完整文档、项目源码,点击下方链接免费领取。项目资料领取https://s.c1ns.cn/F5XyUSTM32项目实战之“火灾报警系统”(基于STM32U5
    的头像 发表于 11-13 14:18 361次阅读
    <b class='flag-5'>STM32</b>项目<b class='flag-5'>实战</b>:基于<b class='flag-5'>STM32U5</b>的火灾报警系统(LVGL),附项目教程/源码

    ADS127L11配置ADC使用外部时钟以及FILTER[4:0]都不成功,为什么?

    配置ADC使用外部时钟以及FILTER[4:0]都不成功,spi的时序都是正常的,使用的是4线spi
    发表于 11-13 08:03

    STM32项目实战:基于STM32U5的智能灯光控制系统(LVGL),附项目教程/源码

    《智能灯光控制系统_STM32U5》项目完整文档、项目源码,点击免费领取。项目资料领取:https://s.c1ns.cn/F5XyUSTM32项目实战之“智能灯光控制系统”(基于STM32U
    的头像 发表于 11-07 18:50 459次阅读
    <b class='flag-5'>STM32</b>项目<b class='flag-5'>实战</b>:基于<b class='flag-5'>STM32U5</b>的智能灯光控制系统(LVGL),附项目教程/源码

    ESP-WROOM-02U用esptouch来配置路由器不成功怎么解决?

    我在官网上买了几片 ESP-WROOM-02U模块,用esptouch来配置路由器不成功,是不是需要重新下载ESP-WROOM-02U的固件?
    发表于 07-19 08:28

    STM32H5STM32U5在trustzone上有哪些不同?

    我要做空调的空中升级FOTA的方案,需要加密,对于trustzone功能,采用那款芯片比较合适?STM32H5STM32U5在trustzone上有哪些不同?
    发表于 07-05 07:03

    使用STM32CUBEMX创建一个基于RTOS的工程,互斥量创建不成功的原因?

    使用STM32CUBEMX创建一个基于RTOS的工程,使用了互斥量,但互斥量创建不成功
    发表于 05-15 07:22

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

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

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

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

    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 3954次阅读
    基于<b class='flag-5'>STM32U5</b>片内温度传感器正确测算温度<b class='flag-5'>实战经验</b>分享

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

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

    基于LL库实现STM32U5 LPTIM功能

    有人打算使用STM32U5系列片内LPTIM做低功耗模式唤醒。基于STM32 LL库组织代码,折腾几天后似乎连中断都进不了,想找找是否有现存LL库例程可以参考。
    的头像 发表于 01-07 14:12 1445次阅读
    基于LL库实现<b class='flag-5'>STM32U5</b> LPTIM功能

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

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