
0 1 前言 在客户使用STM32H723以及STM32H743的16-bit的ADC过程中,反馈如果使用HAL库,ADC可以正常采样,运行正常,但如果使用LL库生成的代码则ADC采样结果异常。针对这个问题,在CubeMx V6.12版本下测试,的确发现了客户描述的问题,因此就这个LL库的Bug进行测试说明,使用硬件板Nucleo-H743ZI测试。 0 2 复现客户描述问题 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数据而变化。 0 3 原因分析并给出修改方法 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. 验证程序修改后的结果 |
实战经验 | 关于STM32H745的MC SDK电机控制工程问题的解决办法
【H745I GUI】1.GreenHouse 灯光控制
【Wio Lite AI视觉开发套件】+移植TensorFlow Lite
STM32H745I-DISCO脉冲宽度调制(PWM)
STM32H745I-DISCO串口通信,输入输出
拷打cubemx【002】——自定义还需基于芯片的工程
STM32硬件结构学习
STM32中BOOT的作用
STM32H7的TCM,SRAM等五块内存基础知识
STM32H7的TCM,SRAM等五块内存基础知识