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

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

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

6 z, n$ T9 B; \7 x# q6 }  b0 }& s前言2 F. C( [# j* w
即使同是STM32L4 系列中的子系列,其配置也可能会有微小的变化,需要注意一下。' x) B' Q, O, j5 q& S$ A9 w
( Q! @2 |- ~( Z6 o
问题( H3 M9 X% S6 t, w3 W0 Z( f
某客户在其产品的设计中,使用了STM32L476RGT6。客户在开发过程中,调试程序时发现不管ADC 通道在外部连接的电压如何变化,ADC 通道采样进来的电压始终在0.7V 左右。6 C8 Q# j6 T9 X: f6 E

. h5 k; g& |0 }3 }/ t
5 v/ [7 C, V% Z4 B7 J调研: [( |1 k  P+ {7 w
1.了解问题# \2 H+ n4 i5 c9 l6 m$ 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 底下进行调试。
: S5 n' u+ f9 w; O3 ~在项目配置中,客户已经在Project Options 中将Device 配置成STM32L476RG 了,在“C/C++ Compiler”的Preprocessor页面中的Defined symbols 也已经将STM32L432xx 改成STM32L476xx 了。
+ J5 q. r! `2 O2 P6 l
11.jpg / R, j/ A1 u+ U
12.png & U8 z: O: v, M5 |4 l" U+ Z# h
但是,当编译调试时,发现ADC 通道采样进来的电压不管输入电压如何,始终是在0.7V 左右。$ M4 f6 l3 H4 \' S# L# s" b

- M1 I9 f' N* K  p2.问题分析+ W7 H. K- a3 E
由于程序的采样电压不会随着外部的电压变化而变化,所以怀疑在I/O 配置上会有问题。客户使用STM32L432 的例程,在未做修改的情况下来调试STM32L476,并不能正常工作。我们需要来仔细比对一下STM32L432 和STM32L476 的ADC 通道配置的情况。
5 N6 J* W1 N, U. g1 w4 NSTM32L432 的参考手册为RM0393,而STM32L476 的参考手册为RM0351。通过仔细阅读ADC 和GPIO 两章,可以发现在ADC 输入通道上,STM32L476 与STM32L432 是存在区别的,如下:" }' S0 a+ T' U9 V0 D# H
     · STM32L476
* w: o" S8 b8 U       在ADC 的“16.3.11 Channel selection (SQRx, JSQRx)”有如下注意事项:! b/ P& ~! |7 \/ J" R. M4 |
13.png
/ H: u! t. @0 O/ [      在 GPIO 的“9.3.2 I/O pin alternate function multiplexer and mapping”一节中,附加功能的描述:3 k( U4 l5 i- n3 h8 p! k
14.png ' J* |4 E% [7 J- A
· STM32L432
* ]5 e. A9 M( i- G+ d     在ADC 的“16.4.11 Channel selection (SQRx, JSQRx)”并没有那个注意事项。
  h3 S7 Z- K! ~- a9 f6 }- f. r     在GPIO 的“9.3.2 I/O pin alternate function multiplexer and mapping”一节中,附加功能的描述也不一样:
  Z; T2 F* n" \0 [2 g3 ~' P
99.png ' R5 z$ o1 B% i7 ^5 c
也就是说,相比STM32L432,STM32L476 在ADC 通道的配置需要多配置一个寄存器GPIOx_ASCR。来看一下RM0351 的GPIO 寄存器中对这个寄存器的描述:8 [2 V7 v# d+ L5 K
15.png   f+ N6 b: B3 j5 D- ]$ ^
如果需要将模拟开关连接到ADC 输入,就必须在相应的位写“1”。这个位必须在ADC 转换之前设置。只能连接到ADC 输入的IO 口才进行设置,其他IO 口必须保持复位值。
) I7 D7 F$ j- G( s现在回到STM32L4Cube 库来看这个程序如何对这个寄存器进行设置的。在stm32l4xx_hal_gpio.c 中的void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)函数,有以下一段代码:
, O# R0 b' x+ t" i2 Y) V* X
16.png
6 G$ F- m/ Q% ]9 E首先,这段代码仅对STM32L471、STM32L475、STM32L476、STM32L485 和STM32L486 有效。它的目的是先判断GPIO的模式是否为模拟口,是的话而且是连接到ADC 的话,将相应的GPIOx_ASCR 位写1。来看一下GPIO 的模式定义就知道了:
1 l) C7 \/ j  `6 t' v
17.png
, }% m: C7 k+ D1 ]9 B在此GPIO 模式预定义中,可以看到模拟口分成两种:GPIO_MODE_ANALOG 和GPIO_MODE_ANALOG_ADC_CONTROL。在注释中我们看GPIO_MODE_ANALOG_ADC_CONTROL 是针对ADC 转换的模拟模式。我们将其值放到刚才的那一段代码中去看,就会发现在相应的GPIOx_ASCR 位会进行写1 的情况。1 [+ Y5 ~# q* @' s. i; m7 T! [( D; j
所以,当使用STM32L476 的ADC 转换中,其ADC 输入通道的GPIO 模式配置必须配置为
' d( q3 H8 l" q. KGPIO_MODE_ANALOG_ADC_CONTROL 才可以。如果只是配置成GPIO_MODE_ANALOG,相应的GPIOx_ASCR 没有
4 q7 H8 m7 W, q& v  }置1,模拟开关没有进行连接,就会检测不到引脚上的电压。
+ ^7 n4 C9 A2 U' d# M! |0 G: v1 X' [来看一下STM32L432 的例程,在stm32l4xx_hal_msp.c 中的void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)函数中,) o2 K2 [9 |# M) n" q
GPIO 是这样配置的:' s6 z6 L" v' D& ^3 I
18.png
8 u2 a, ]: L0 g它配置的Mode 是GPIO_MODE_ANALOG,这在STM32L432 没有问题,但是在STM32L476 却是有问题的,必须改正。: t3 y: i3 O  M; ?* [/ ~
19.png
( @9 F2 r" s& q( g' t( E1 I
! Q" g* q: o+ z, C6 P+ V7 T4 n3.问题解决+ o7 A8 V) L; j5 |0 m7 T1 C
将stm32l4xx_hal_msp.c 中的void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)函数中GPIO 配置修改为:% T% W8 _* d* ^& J4 @
20.png
; ~( ?3 H9 q+ P: ?0 s问题解决,ADC 可以正常工作了。  r9 k6 s. R6 Y& t; d
* p& ?7 i5 T2 k. ~* V$ C; f9 N, U9 m

  O; @+ b+ I6 k结论
+ A+ |3 k  c% q# h! W由于STM32L476 和STM32L432 的ADC 通道配置上存在区别,所以STM32L432 的例程并不能直接使用,需要对其GPIO配置进行修改才可以。+ j- K$ D. `" x! O+ B7 I. l

3 i3 n, _, N0 ?' k* U; W! U处理
; b- i9 M5 z2 q- h5 G需要根据STM32L4 相应的具体型号对ADC 输入通道的GPIO 模式进行相应的配置。在此,根据STM32L4 几份参考手册RM0351、RM0392、RM0393、RM0394、RM0395,对现有产品整理如下,以供查阅。
! m. G$ ?# U" O" ]0 H) h: t

5 B$ V3 F# j* P3 C# w' O: h" C' g, f  F6 {. J6 Z+ h" \
9 ]+ [! c0 Q6 [! Y  c2 T
STM32L4系列中ADC通道配置上的区别.pdf (277.15 KB, 下载次数: 135)
收藏 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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版