你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【实战经验】STM32L4系列中ADC通道配置上的区别

[复制链接]
zero99 发布时间:2017-4-5 17:33
STM32L4 系列中ADC 通道配置上的区别
; |  M2 B' j; i/ F# x
前言; V' T5 v% r- }. A8 D+ B+ q, E
即使同是STM32L4 系列中的子系列,其配置也可能会有微小的变化,需要注意一下。9 a4 S1 M: k2 I6 S
. A2 ]% V9 n) B# k  @: Z( r
问题, i" C$ e7 d) ^9 N& y9 |
某客户在其产品的设计中,使用了STM32L476RGT6。客户在开发过程中,调试程序时发现不管ADC 通道在外部连接的电压如何变化,ADC 通道采样进来的电压始终在0.7V 左右。9 j, F: P6 y  a2 y2 S2 o! o

) i. u& u! ?/ N9 ?6 ?2 [7 Q5 B. V, a: {% Q8 k% ]0 }  y
调研/ r% H: W# j9 D% e0 c* r
1.了解问题6 Q' ~! k8 E% P* E
客户在开发中使用了STM32L4Cube 库STM32Cube_FW_L4_V1.5.0,在STM32L476RG-Nucleo 板子上进行调试。由于STM32Cube_FW_L4_V1.5.0 下的STM32L476RG-Nucleo 并没有ADC 的例程,所以客户工程师将STM32L432KC-Nucleo中的ADC_RegularConversion_Interrupt 例程拷贝到STM32L476RG-Nucleo 底下进行调试。
) H+ E' K' c5 \在项目配置中,客户已经在Project Options 中将Device 配置成STM32L476RG 了,在“C/C++ Compiler”的Preprocessor页面中的Defined symbols 也已经将STM32L432xx 改成STM32L476xx 了。9 R: i( s* P$ G- k5 w3 Q% a  D
11.jpg
; d5 N5 H* \/ r$ J$ k9 l
12.png
0 ^" S$ y( E8 {! j但是,当编译调试时,发现ADC 通道采样进来的电压不管输入电压如何,始终是在0.7V 左右。
, Y  l  h& i( }& y
: ?9 l, `, @$ T$ M1 Q9 b6 C7 X, r+ z2.问题分析
* n0 w8 J5 I$ i9 u2 k由于程序的采样电压不会随着外部的电压变化而变化,所以怀疑在I/O 配置上会有问题。客户使用STM32L432 的例程,在未做修改的情况下来调试STM32L476,并不能正常工作。我们需要来仔细比对一下STM32L432 和STM32L476 的ADC 通道配置的情况。" l- L3 L0 I  k& Z0 a
STM32L432 的参考手册为RM0393,而STM32L476 的参考手册为RM0351。通过仔细阅读ADC 和GPIO 两章,可以发现在ADC 输入通道上,STM32L476 与STM32L432 是存在区别的,如下:
" z$ R" m" L$ }! u% d0 |5 D     · STM32L476
2 X) ?% b5 l& v5 d, I       在ADC 的“16.3.11 Channel selection (SQRx, JSQRx)”有如下注意事项:% T* r: r3 v: p0 H; |* d$ O
13.png   r1 H; R. E7 s. B. C% i
      在 GPIO 的“9.3.2 I/O pin alternate function multiplexer and mapping”一节中,附加功能的描述:
3 a" _6 m1 j1 }5 p& q. ~
14.png + _2 q2 q. F' K: W& f7 Z
· STM32L432% l! g0 O4 \+ @4 x, A) J7 p& p
     在ADC 的“16.4.11 Channel selection (SQRx, JSQRx)”并没有那个注意事项。
' d; h' `$ G0 ]     在GPIO 的“9.3.2 I/O pin alternate function multiplexer and mapping”一节中,附加功能的描述也不一样:
( c* M& R4 g( q
99.png
5 N' {6 Q# t  ]: S4 W0 C也就是说,相比STM32L432,STM32L476 在ADC 通道的配置需要多配置一个寄存器GPIOx_ASCR。来看一下RM0351 的GPIO 寄存器中对这个寄存器的描述:
% H" ?* F! g& b4 j' _8 u0 H: Z
15.png
5 t! a' o) N$ L- y2 Z9 j7 H: ?$ w. s如果需要将模拟开关连接到ADC 输入,就必须在相应的位写“1”。这个位必须在ADC 转换之前设置。只能连接到ADC 输入的IO 口才进行设置,其他IO 口必须保持复位值。
9 c$ n1 c7 ~& v现在回到STM32L4Cube 库来看这个程序如何对这个寄存器进行设置的。在stm32l4xx_hal_gpio.c 中的void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)函数,有以下一段代码:
4 d+ P2 a/ W4 j( ~
16.png 8 G7 u7 w/ o2 y( b; S& |; e
首先,这段代码仅对STM32L471、STM32L475、STM32L476、STM32L485 和STM32L486 有效。它的目的是先判断GPIO的模式是否为模拟口,是的话而且是连接到ADC 的话,将相应的GPIOx_ASCR 位写1。来看一下GPIO 的模式定义就知道了:
2 F) o* ?4 @) }1 O& T" l0 ^2 o
17.png , g; ?1 B9 h; U; X
在此GPIO 模式预定义中,可以看到模拟口分成两种:GPIO_MODE_ANALOG 和GPIO_MODE_ANALOG_ADC_CONTROL。在注释中我们看GPIO_MODE_ANALOG_ADC_CONTROL 是针对ADC 转换的模拟模式。我们将其值放到刚才的那一段代码中去看,就会发现在相应的GPIOx_ASCR 位会进行写1 的情况。
) u+ s- U: I5 i5 X- `. A* z所以,当使用STM32L476 的ADC 转换中,其ADC 输入通道的GPIO 模式配置必须配置为6 i4 n  o" w) X9 E8 }/ ^+ P  i
GPIO_MODE_ANALOG_ADC_CONTROL 才可以。如果只是配置成GPIO_MODE_ANALOG,相应的GPIOx_ASCR 没有
9 d, w/ J% }; B; G, d9 F' |置1,模拟开关没有进行连接,就会检测不到引脚上的电压。. V' @; C% x  X8 Z: a. }- o8 k0 p, g9 D' z
来看一下STM32L432 的例程,在stm32l4xx_hal_msp.c 中的void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)函数中,( s4 E* G* O) N- A  q" P; j
GPIO 是这样配置的:
% A8 b6 j' F9 A+ h$ T
18.png 6 _3 \+ W3 Z6 r" e% k
它配置的Mode 是GPIO_MODE_ANALOG,这在STM32L432 没有问题,但是在STM32L476 却是有问题的,必须改正。/ ?9 J& V: K( p1 w4 v
19.png , U6 b/ @' G& ?3 A2 i+ |
& E% k( o' r1 _% }4 s
3.问题解决6 F) \' q" I+ o) F$ x) e! p. p
将stm32l4xx_hal_msp.c 中的void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)函数中GPIO 配置修改为:
, l/ s9 G2 A2 w7 g
20.png 1 D; T) Z; W- M3 Q6 F- N4 b
问题解决,ADC 可以正常工作了。
: W: E' u. O* f$ V
0 q! m( M$ W4 q! T& q
% G5 m$ E4 e5 C4 U结论3 r$ e% p+ {, C+ l1 p& o$ ?
由于STM32L476 和STM32L432 的ADC 通道配置上存在区别,所以STM32L432 的例程并不能直接使用,需要对其GPIO配置进行修改才可以。
# i; I% \% J, a1 g5 w
2 a- b- d4 K) j3 c. n处理
+ Y) l8 P4 |$ l' J3 m  o需要根据STM32L4 相应的具体型号对ADC 输入通道的GPIO 模式进行相应的配置。在此,根据STM32L4 几份参考手册RM0351、RM0392、RM0393、RM0394、RM0395,对现有产品整理如下,以供查阅。% O' f: ^! k- b5 `/ }( p

$ |& d" _, d% o& p
- h" M) j- e5 Y6 s/ a: p# i6 z4 V
5 w$ d6 s% ?: K% s& P
STM32L4系列中ADC通道配置上的区别.pdf (277.15 KB, 下载次数: 123)
收藏 1 评论2 发布时间:2017-4-5 17:33

举报

2个回答
秋水之下 回答时间:2017-5-22 09:35:54
NICE THANKS 帮助很大谢谢哈,我说嘛,为什么所有通道采集的都是0.7V电压不变
Love_ST 回答时间:2020-12-29 13:21:45
确实是个很容易忽略的问题
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版