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

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

[复制链接]
zero99 发布时间:2017-4-5 17:33
STM32L4 系列中ADC 通道配置上的区别

8 f. x, r8 Z' N  ~, s6 P2 L& K前言
# ^6 q" z9 d! Y即使同是STM32L4 系列中的子系列,其配置也可能会有微小的变化,需要注意一下。! s4 l+ r& `. L
+ n. o5 V. g5 q6 h4 x% p
问题
4 r. P: N  f2 H某客户在其产品的设计中,使用了STM32L476RGT6。客户在开发过程中,调试程序时发现不管ADC 通道在外部连接的电压如何变化,ADC 通道采样进来的电压始终在0.7V 左右。
) Y# t$ v- o& m* U6 m4 [; o' n" `. k
: v, o; ^6 C% l# j( d4 \5 ^& ~! U: `/ Z. N5 Y8 G9 L/ X. J/ x/ k5 d
调研4 Q) ~& p) U  D; W& A
1.了解问题8 l/ ^6 A" N6 _
客户在开发中使用了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 底下进行调试。
6 C: o7 v5 I3 i在项目配置中,客户已经在Project Options 中将Device 配置成STM32L476RG 了,在“C/C++ Compiler”的Preprocessor页面中的Defined symbols 也已经将STM32L432xx 改成STM32L476xx 了。
* v& c+ i# w8 ?2 L' n8 p9 F' W
11.jpg
" D. y$ l" l. B, z
12.png ; Y2 o1 Z( r2 t8 g5 X& v- S
但是,当编译调试时,发现ADC 通道采样进来的电压不管输入电压如何,始终是在0.7V 左右。7 a) D1 z. m* [! c4 T
  V- o3 Q2 W3 D
2.问题分析
' U6 T3 S+ i3 D) v% r" i由于程序的采样电压不会随着外部的电压变化而变化,所以怀疑在I/O 配置上会有问题。客户使用STM32L432 的例程,在未做修改的情况下来调试STM32L476,并不能正常工作。我们需要来仔细比对一下STM32L432 和STM32L476 的ADC 通道配置的情况。
! E2 \# G" N1 m3 e  C& X; y) L' uSTM32L432 的参考手册为RM0393,而STM32L476 的参考手册为RM0351。通过仔细阅读ADC 和GPIO 两章,可以发现在ADC 输入通道上,STM32L476 与STM32L432 是存在区别的,如下:
9 X# }# t% B6 m  n( h, l5 N% o     · STM32L4768 X8 n+ w2 N# z, ^) n" @
       在ADC 的“16.3.11 Channel selection (SQRx, JSQRx)”有如下注意事项:" Q7 Y4 y6 }4 R& a, Z$ Q. F
13.png   @9 y* C% G" u% N& Z, Y% S
      在 GPIO 的“9.3.2 I/O pin alternate function multiplexer and mapping”一节中,附加功能的描述:
' {7 t/ X& V: G$ k3 T( I
14.png - c$ O/ N6 w) W; C; F, q# O: t
· STM32L432
, X" \. l( x: d5 \     在ADC 的“16.4.11 Channel selection (SQRx, JSQRx)”并没有那个注意事项。1 z; W- Z$ S7 ]4 q8 D' ^2 B$ G
     在GPIO 的“9.3.2 I/O pin alternate function multiplexer and mapping”一节中,附加功能的描述也不一样:- y/ W  U1 y5 l- [/ z; {
99.png 5 @- {+ ^$ J& D! P9 ?+ ?
也就是说,相比STM32L432,STM32L476 在ADC 通道的配置需要多配置一个寄存器GPIOx_ASCR。来看一下RM0351 的GPIO 寄存器中对这个寄存器的描述:
/ x8 |( r; }1 |2 [. q
15.png
, Z7 `% u. i/ d" m# F# A5 T如果需要将模拟开关连接到ADC 输入,就必须在相应的位写“1”。这个位必须在ADC 转换之前设置。只能连接到ADC 输入的IO 口才进行设置,其他IO 口必须保持复位值。% p. Q3 |' t0 l0 ?2 @: ^" b4 [) J
现在回到STM32L4Cube 库来看这个程序如何对这个寄存器进行设置的。在stm32l4xx_hal_gpio.c 中的void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)函数,有以下一段代码:
  ~0 h  S5 W" }2 q; r
16.png : r2 N+ |- G* u. d
首先,这段代码仅对STM32L471、STM32L475、STM32L476、STM32L485 和STM32L486 有效。它的目的是先判断GPIO的模式是否为模拟口,是的话而且是连接到ADC 的话,将相应的GPIOx_ASCR 位写1。来看一下GPIO 的模式定义就知道了:8 p) x1 T+ T" @4 ^, ], \- l; f2 C
17.png 2 ]5 L; K5 y9 Z0 p; J! ]/ F
在此GPIO 模式预定义中,可以看到模拟口分成两种:GPIO_MODE_ANALOG 和GPIO_MODE_ANALOG_ADC_CONTROL。在注释中我们看GPIO_MODE_ANALOG_ADC_CONTROL 是针对ADC 转换的模拟模式。我们将其值放到刚才的那一段代码中去看,就会发现在相应的GPIOx_ASCR 位会进行写1 的情况。; l+ I# n2 z: p6 l+ ?6 Z) K8 I
所以,当使用STM32L476 的ADC 转换中,其ADC 输入通道的GPIO 模式配置必须配置为+ a2 U6 I' F1 A. J
GPIO_MODE_ANALOG_ADC_CONTROL 才可以。如果只是配置成GPIO_MODE_ANALOG,相应的GPIOx_ASCR 没有
$ z' x4 {5 U/ g# A- L2 T置1,模拟开关没有进行连接,就会检测不到引脚上的电压。
: U/ |" y9 d2 i2 H% A! d5 ~+ R4 G来看一下STM32L432 的例程,在stm32l4xx_hal_msp.c 中的void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)函数中,
+ M0 N& p# @4 i% X- zGPIO 是这样配置的:
/ b- |4 d  t4 g) R& c
18.png & l7 ]5 A' ]* N
它配置的Mode 是GPIO_MODE_ANALOG,这在STM32L432 没有问题,但是在STM32L476 却是有问题的,必须改正。* A7 w6 W2 X2 [# }; t- R9 t
19.png
" C; d( x( d1 W4 v- e, B! t, k4 S& g2 H. a1 K) Q" y
3.问题解决
4 b9 c2 E- B- m& q5 S6 t  Z' `# `将stm32l4xx_hal_msp.c 中的void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)函数中GPIO 配置修改为:0 r! ]0 A- J% B& l  z
20.png * Y& ~8 r4 a9 B2 W' t- ~5 @
问题解决,ADC 可以正常工作了。9 H! A- m! ?# p) j; K

4 ]4 q' R0 e/ G. `
/ N+ u1 Q1 n) z; M% O$ z6 l. r结论
1 K) T  q: \& z3 X  I& E由于STM32L476 和STM32L432 的ADC 通道配置上存在区别,所以STM32L432 的例程并不能直接使用,需要对其GPIO配置进行修改才可以。1 M* j/ ~. |" ~3 q+ c% i; D5 V
$ y: _  \" G8 _
处理. a0 L' {, f2 f
需要根据STM32L4 相应的具体型号对ADC 输入通道的GPIO 模式进行相应的配置。在此,根据STM32L4 几份参考手册RM0351、RM0392、RM0393、RM0394、RM0395,对现有产品整理如下,以供查阅。! R4 d- g7 ?' _6 M

; L3 @4 l0 Z0 p4 T: c3 @( X0 x- c4 ~5 Z& b/ b

4 |" `- U# @8 I5 O* R5 B% C: e 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 手机版