
01、前言
在客户使用STM32H723以及STM32H743的16-bit的ADC过程中,反馈如果使用HAL库,ADC可以正常采样,运行正常,但如果使用LL库生成的代码则ADC采样结果异常。针对这个问题,在CubeMx V6.12版本下测试,的确发现了客户描述的问题,因此就这个LL库的Bug进行测试说明,使用硬件板Nucleo-H743ZI测试。
02、复现客户描述问题
2.1. 使用CubeMx对ADC进行配置
使用CubeMx对ADC进行配置,这边使用模拟功能复用方式,让PA4,PA5分别做为ADC的输入通道同时也做为DAC的输出通道,方便查看数据正确与否。
▲ 图1. CubeMx配置ADC以及DAC
▲ 图2. 先用HAL库生成代码
▲ 图3. 加入初始化代码
▲ 图4. 循环中加入测试读取ADC数值的代码
▲ 图5. 测试ADC采样结果
从上面测试看,当配置DAC输出为0x300(12-bit),那么16-bit的ADC1的注入组以及规则组的数据应该在0x3000附近是正确的,这边可以实时改变DAC数据,那么ADC结果将跟随DAC数据的变化而变化。
2.2. 复现客户问题
同样的配置,只是在CubeMx选择ADC使用LL库,然后生成代码。
▲ 图6. 选择ADC的LL库
▲ 图7. 测试ADC采样结果
可以看到上面的采样数据是错误的,而且如果改变DAC的输出,ADC通道值也是无规律的不跟随DAC数据而变化。
03、原因分析并给出修改方法
3.1. 错误原因分析
经过测试发现,LL库和HAL库在最底层寄存器级别配置中有两个点是不同的,一个是LL库并没有配置ADC的Boost模式,依然保持默认状态,另外一个是LL库没有对ADC的channel preselection进行配置,这将导致ADC看上去在工作,实际上通道是没连接到外部管脚的,因此会产生客户描述的错误。
▲ 图8. ADC CR寄存器Boost说明
▲ 图9. ADC通道预选择说明
▲ 图10. ADC PCSE寄存器说明
▲ 图11. 两种库配置运行后的对比结果
3.2. 解决方法
当使用ADC的LL库进行配置时候,当前版本的(CubeMx 6.12或者之前版本,CubeH7 V1.11或者之前版本)需要手动增加Boost以及PCSEL的配置,然后再去运行ADC采样程序,这边注意要根据实际情况去修改,本例中使用的是CH18,CH19通道,因此会修改PCSEL为0x000C0000,如果实际中使用其他通道,则需要手动配置相关的数据,让通道能够切换转换。
▲ 图12. 手动加入Boost以及通道选择
▲ 图13. 验证程序修改后的结果
来源:STM32
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。