
1. 前言客户使用 ADC 进行序列转换,配置完成后,不调用 Cube 库函数而使用寄存器操作进行ADC 转换,发现无法启动 ADC 转换,且无任何报错。如果只使用一个通道转换 ADC,则可以正常启动 ADC 转换。( }- x3 x# p+ ^ N 6 v7 m$ X6 A& M% a7 [ J# T 3 y+ W0 N" w; D/ i$ \. c3 z 2. 现象复现 使用 CubeMx 配置下面的 ADC 序列转换程序。 8 y6 a% p; Z5 A9 w ![]() 3 \0 u# _1 @* {( ]* A1 M, I" X. g 正常的使用 Cube 函数启动 ADC 函数为:HAL_ADCEx_InjectedStart(&hadc1),此种情况下 ADC 可以正常转换,无任何问题;如果客户使用下面的操作进行启动 ADC 转换则出现 ADC 停止采样:8 n, w# a% M# c4 m, o4 N, o: @3 f# l ADC1->CR |= 0x01; // ADEN =1 ADC1->CR |= 0x08; // JADSTART = 1 寄存器无报错,而且 JADSTART 一直等于 1,但 ADC 没有启动转换。0 A7 w4 Z: w% Q$ Z0 x ![]() 7 v( {5 ?7 K3 T) T9 q 如果客户改为只采样一个通道,而不进行多通道序列采样,则上述写法也无任何问题,ADC 可正常转换。 ( n, Z* g+ t P0 e * c4 c3 t$ d W K- {2 n 3. 问题分析与解决 从 HAL 库中启动 ADC 代码看上去,实际 Cube 库函数做了很多判别,因此我们关心下ADC 启动序列在参考手册中的说明:5 E: T( O4 H, {: [ ![]() / C' x# E: N( y6 c1 ~3 d) O 可以看到 ADEN 置位后需要等待 ADRDY 置 1 后进行 ADC 转换。+ ~- X0 {+ F! x- u& u3 d ![]() 从时序图上也可以看到 ADEN 后,有一个 tsTAB 的时间,此后 ADC 可以转换。客户的配置忽略了这个过程,导致 ADC 进入异常,因此需要增加必要的等待代码。如下所示:& N$ ?9 i' M% C8 g) J5 H1 ` ADC1->ISR |= 0x01; // Clear ADRDY ADC1->CR |= 0x01; // ADEN = 1 while((ADC1->ISR & 0x01) == 0x00) ;// Wait for ADRDY == 1 ADC1->CR |= 0x08; // JADSTART = 1 完整版请查看:附件 ![]() |
实战经验 | 关于STM32H7使用LL库生成ADC代码工作异常问题说明
实战经验 | 关于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等五块内存基础知识