STMCU小助手
发布时间:2023-2-18 16:00
|
1. 前言客户使用 ADC 进行序列转换,配置完成后,不调用 Cube 库函数而使用寄存器操作进行ADC 转换,发现无法启动 ADC 转换,且无任何报错。如果只使用一个通道转换 ADC,则可以正常启动 ADC 转换。 ' h0 g' q" i% `5 i3 L. X 2. 现象复现% Z7 J j: c+ _! n% M3 M 使用 CubeMx 配置下面的 ADC 序列转换程序。; J# D8 c) Z* t' S
4 f& X5 X0 B2 e. w 正常的使用 Cube 函数启动 ADC 函数为:HAL_ADCEx_InjectedStart(&hadc1),此种情况下 ADC 可以正常转换,无任何问题;如果客户使用下面的操作进行启动 ADC 转换则出现 ADC 停止采样: ADC1->CR |= 0x01; // ADEN =1# W! e0 }/ G# }: ?8 \% s' a ADC1->CR |= 0x08; // JADSTART = 1 寄存器无报错,而且 JADSTART 一直等于 1,但 ADC 没有启动转换。4 I, n2 `: f: z/ L
如果客户改为只采样一个通道,而不进行多通道序列采样,则上述写法也无任何问题,ADC 可正常转换。2 y* W9 d/ l, i# Y& e7 I, n8 Q 6 ^! o# e$ l+ U9 ?, \7 ? 3. 问题分析与解决3 h) Q1 K% L& O% b0 _ 从 HAL 库中启动 ADC 代码看上去,实际 Cube 库函数做了很多判别,因此我们关心下ADC 启动序列在参考手册中的说明: ( z# Y+ B: Q2 g9 M: |, B 8 ^* P% d4 Z9 x" ^) _) E# p
可以看到 ADEN 置位后需要等待 ADRDY 置 1 后进行 ADC 转换。 6 H' w- Y$ X5 E. c! k; ^ 5 q) m& @5 F/ ]. C0 X8 R
从时序图上也可以看到 ADEN 后,有一个 tsTAB 的时间,此后 ADC 可以转换。客户的配置忽略了这个过程,导致 ADC 进入异常,因此需要增加必要的等待代码。如下所示:/ N$ r G: I3 ]. b4 o/ h ADC1->ISR |= 0x01; // Clear ADRDY" S: E: h R2 I ADC1->CR |= 0x01; // ADEN = 1, a* }5 B8 b- R: b9 i$ y5 p' ^2 o: J while((ADC1->ISR & 0x01) == 0x00) ;// Wait for ADRDY == 1 % I& `9 _3 J# w I1 N ADC1->CR |= 0x08; // JADSTART = 1 & F2 a8 ^/ _8 I 2 ~* z) f' Y* a' d8 V4 b9 f 完整版请查看:附件
STM32H723 的序列 ADC 无法启动转换.pdf
(310.04 KB, 下载次数: 3)
|
【 逢7发帖赢大礼】1、利用CubeMX生成正点原子H7R7开发板的STM32CubeIDE工程
【STM32H735G-DK测评】ADC3+TIMER1+DMA 采样模拟信号
【STM32H735DK测评】Ethernet+lwip DHCP获取IP地址
STM32H743基于CubeMx5.0配置手册
【STM32H735G-DK测评】lvgl移植
【STM32H735G-DK 测评】STM32H735G-DK External Loder 编译和测试
【福利三:逢7发帖赢大礼】使用MPU6050模块、img_dsc、img_btn机制实现一些简单有趣的动画效果
【福利三:逢7发帖赢大礼】使用arc弧形拉条控件控制PWM舵机及使用SPI3接口操作NRF24L01模块进行无线通信
【福利三:逢7发帖赢大礼】调试nucleo-WBA65RI工程测试样板的一些心得
【福利三:逢7发帖赢大礼】lv_timer和BME680实现温度、湿度、气压数据读取
微信公众号
手机版