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的输出通道,方便查看数据正确与否。
从上面测试看,当配置DAC输出为0x300(12-bit),那么16-bit的ADC1的注入组以及规则组的数据应该在0x3000附近是正确的,这边可以实时改变DAC数据,那么ADC结果将跟随DAC数据的变化而变化。
2.2. 复现客户问题
同样的配置,只是在CubeMx选择ADC使用LL库,然后生成代码。
可以看到上面的采样数据是错误的,而且如果改变DAC的输出,ADC通道值也是无规律的不跟随DAC数据而变化。
03原因分析并给出修改方法
3.1. 错误原因分析
经过测试发现,LL库和HAL库在最底层寄存器级别配置中有两个点是不同的,一个是LL库并没有配置ADC的Boost模式,依然保持默认状态,另外一个是LL库没有对ADC的channel preselection进行配置,这将导致ADC看上去在工作,实际上通道是没连接到外部管脚的,因此会产生客户描述的错误。
3.2. 解决方法
当使用ADC的LL库进行配置时候,当前版本的(CubeMx 6.12或者之前版本,CubeH7 V1.11或者之前版本)需要手动增加Boost以及PCSEL的配置,然后再去运行ADC采样程序,这边注意要根据实际情况去修改,本例中使用的是CH18,CH19通道,因此会修改PCSEL为0x000C0000,如果实际中使用其他通道,则需要手动配置相关的数据,让通道能够切换转换。
点击按钮下载《关于STM32H7使用LL库生成ADC代码工作异常问题说明》原文档。点击下载
相关阅读
|