1. 前言客户使用 ADC 进行序列转换,配置完成后,不调用 Cube 库函数而使用寄存器操作进行ADC 转换,发现无法启动 ADC 转换,且无任何报错。如果只使用一个通道转换 ADC,则可以正常启动 ADC 转换。: z3 ~0 h, s* c' x: w' _1 ?9 Q 2. 现象复现 使用 CubeMx 配置下面的 ADC 序列转换程序。1 \' _6 \0 i) F- c, v) z! O : c. Y- Y8 J) F$ ~ 9 c: }0 ]9 W" t; W# [5 M5 J, { , E" F- Y8 g. h7 j: f5 w 正常的使用 Cube 函数启动 ADC 函数为:HAL_ADCEx_InjectedStart(&hadc1),此种情况下 ADC 可以正常转换,无任何问题;如果客户使用下面的操作进行启动 ADC 转换则出现 ADC 停止采样:9 x, L0 K* V- o7 W/ H5 } ADC1->CR |= 0x01; // ADEN =1 ADC1->CR |= 0x08; // JADSTART = 1( c- B( i- ]' ?5 `4 O! f; n! q 寄存器无报错,而且 JADSTART 一直等于 1,但 ADC 没有启动转换。 0 L F+ b& G6 R3 @& j , t8 n& e' y9 `6 G 如果客户改为只采样一个通道,而不进行多通道序列采样,则上述写法也无任何问题,ADC 可正常转换。5 |5 _% J: e1 ]5 x; d9 ^ + n* ~, V* u+ [% C* L. c 3. 问题分析与解决 从 HAL 库中启动 ADC 代码看上去,实际 Cube 库函数做了很多判别,因此我们关心下ADC 启动序列在参考手册中的说明:) D9 t; s% F+ M- g; ^: ^% ], D$ t+ F . Q- p6 S% a) r- Q W1 J. H. ]& P3 @# t. I$ `- D 可以看到 ADEN 置位后需要等待 ADRDY 置 1 后进行 ADC 转换。 G2 o) K4 \+ t$ l3 z/ u( U 从时序图上也可以看到 ADEN 后,有一个 tsTAB 的时间,此后 ADC 可以转换。客户的配置忽略了这个过程,导致 ADC 进入异常,因此需要增加必要的等待代码。如下所示:, U$ k; x$ G& N$ l+ Q( | ADC1->ISR |= 0x01; // Clear ADRDY0 U" |& h3 X* {2 [6 d+ p ADC1->CR |= 0x01; // ADEN = 1 while((ADC1->ISR & 0x01) == 0x00) ;// Wait for ADRDY == 1 ) `" o! ]' E) l; N ADC1->CR |= 0x08; // JADSTART = 1& V) T* K, l- T2 N 8 P6 U* l- E6 t' m$ t% ` 完整版请查看:附件 |
【经验分享】STM32_H7_ADC
STM32H7R/S高性能MCU:安全性,大存储和优异图显赋能更多应用创新
Stm32H7XX GCC下分散加载实现
【银杏科技ARM+FPGA双核心应用】STM32H7系列10——ADC
DIY-STM32H750核心板
[nucleo-H7A3ZI-Q]1-点亮一个皮皮灯
DIY-STM32H743核心板
【银杏科技ARM+FPGA双核心应用】STM32H7系列57——MDK_FLM
1月10日有奖直播 | 基于STM32 的CODESYS智能自动化解决方案
STM32的CAN FD位定时设置注意事项