请选择 进入手机版 | 继续访问电脑版

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

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

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

9 u) @, |0 z$ q, \前言
- g: @8 v9 N% y即使同是STM32L4 系列中的子系列,其配置也可能会有微小的变化,需要注意一下。
( P2 T1 l; g/ X1 A3 a' {, G& t8 a7 s5 k
问题
( S/ g' M2 G  s) y某客户在其产品的设计中,使用了STM32L476RGT6。客户在开发过程中,调试程序时发现不管ADC 通道在外部连接的电压如何变化,ADC 通道采样进来的电压始终在0.7V 左右。
! u! k, x9 X2 q: e! Z! W& R: O& D) n/ m1 z: |: m8 I! A- C/ T: ]& L0 @
, h' ~: ~# ^/ g9 V9 I' N
调研
) p9 p) K6 k' ~+ W% u2 K* U1.了解问题' ~3 ]& m2 I4 h) T2 f" {
客户在开发中使用了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 底下进行调试。
7 z8 @5 p, Z6 V+ r+ u9 t在项目配置中,客户已经在Project Options 中将Device 配置成STM32L476RG 了,在“C/C++ Compiler”的Preprocessor页面中的Defined symbols 也已经将STM32L432xx 改成STM32L476xx 了。
: q$ Y) R: \& Z3 z. B
11.jpg 4 b1 e$ [3 n9 f5 Q4 j
12.png # ~5 u, B6 F( A+ x, T5 ~
但是,当编译调试时,发现ADC 通道采样进来的电压不管输入电压如何,始终是在0.7V 左右。
" ^( R( a' p" w: i' \) [
! X; B3 [) W9 ~) o' D* ^. n2.问题分析
% K& Q' A$ a3 f( ~7 H- z' ?& J由于程序的采样电压不会随着外部的电压变化而变化,所以怀疑在I/O 配置上会有问题。客户使用STM32L432 的例程,在未做修改的情况下来调试STM32L476,并不能正常工作。我们需要来仔细比对一下STM32L432 和STM32L476 的ADC 通道配置的情况。
/ D2 ?7 R3 x/ j4 V8 ~6 ]STM32L432 的参考手册为RM0393,而STM32L476 的参考手册为RM0351。通过仔细阅读ADC 和GPIO 两章,可以发现在ADC 输入通道上,STM32L476 与STM32L432 是存在区别的,如下:
+ Z6 J, g  Y- ^* G  `3 r. Z3 q     · STM32L476: O" |" C- U% W+ u7 I7 B
       在ADC 的“16.3.11 Channel selection (SQRx, JSQRx)”有如下注意事项:# I1 A- U- F2 Y0 r
13.png ; ^0 t3 F# x" {* W4 {! S6 ?) ]
      在 GPIO 的“9.3.2 I/O pin alternate function multiplexer and mapping”一节中,附加功能的描述:
! F7 i% H9 g1 v* e9 R4 b
14.png 5 t3 ~, J( ^+ X: h9 l  }3 M3 b
· STM32L432
, b: \' y2 ?! I8 D5 A* N     在ADC 的“16.4.11 Channel selection (SQRx, JSQRx)”并没有那个注意事项。3 ]8 L  H3 e9 I- R! n& f6 W' C4 s
     在GPIO 的“9.3.2 I/O pin alternate function multiplexer and mapping”一节中,附加功能的描述也不一样:" z8 W5 J. Y( ?2 t& r1 M9 }
99.png
5 ]. }( Z* l  L1 [. @也就是说,相比STM32L432,STM32L476 在ADC 通道的配置需要多配置一个寄存器GPIOx_ASCR。来看一下RM0351 的GPIO 寄存器中对这个寄存器的描述:; a+ m% y( ^4 |$ d% v  c% s
15.png 0 ^" K$ ?. o+ K$ B9 q5 }
如果需要将模拟开关连接到ADC 输入,就必须在相应的位写“1”。这个位必须在ADC 转换之前设置。只能连接到ADC 输入的IO 口才进行设置,其他IO 口必须保持复位值。
/ v; I! t! _8 H现在回到STM32L4Cube 库来看这个程序如何对这个寄存器进行设置的。在stm32l4xx_hal_gpio.c 中的void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)函数,有以下一段代码:
, @3 q7 h2 c+ d& p1 c) Z# ~
16.png
: `8 D$ y. X8 @: s5 }. P首先,这段代码仅对STM32L471、STM32L475、STM32L476、STM32L485 和STM32L486 有效。它的目的是先判断GPIO的模式是否为模拟口,是的话而且是连接到ADC 的话,将相应的GPIOx_ASCR 位写1。来看一下GPIO 的模式定义就知道了:* m# y; y2 d* G& M% V( J
17.png * E, \. x7 [& w1 ?- V
在此GPIO 模式预定义中,可以看到模拟口分成两种:GPIO_MODE_ANALOG 和GPIO_MODE_ANALOG_ADC_CONTROL。在注释中我们看GPIO_MODE_ANALOG_ADC_CONTROL 是针对ADC 转换的模拟模式。我们将其值放到刚才的那一段代码中去看,就会发现在相应的GPIOx_ASCR 位会进行写1 的情况。9 [6 L2 k: i1 ]. k0 T
所以,当使用STM32L476 的ADC 转换中,其ADC 输入通道的GPIO 模式配置必须配置为
6 v( f1 m% B7 }" `& A: cGPIO_MODE_ANALOG_ADC_CONTROL 才可以。如果只是配置成GPIO_MODE_ANALOG,相应的GPIOx_ASCR 没有7 u( c& |& O9 d% |. l+ m
置1,模拟开关没有进行连接,就会检测不到引脚上的电压。( L' Q+ Q+ y! e4 l; @& ~& M" _  s
来看一下STM32L432 的例程,在stm32l4xx_hal_msp.c 中的void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)函数中,8 [# V7 q/ U" k/ Q; B0 c2 T5 A, }4 |
GPIO 是这样配置的:
1 Y! z, {) `; J; ]( j2 {+ M2 Z3 {
18.png
9 O2 B+ S# n4 k+ i2 Y/ A它配置的Mode 是GPIO_MODE_ANALOG,这在STM32L432 没有问题,但是在STM32L476 却是有问题的,必须改正。; S% r# _$ {2 r8 T
19.png & K5 X: e+ t) L8 Z3 p9 ?: n
8 _1 z' a4 y6 ]- a: m! M
3.问题解决1 V5 h. f5 Q9 H4 z; S
将stm32l4xx_hal_msp.c 中的void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)函数中GPIO 配置修改为:
7 G7 A8 s2 m+ {3 K5 G" Q
20.png ; ~) k. _) X/ ~( {# D
问题解决,ADC 可以正常工作了。4 U/ A- D+ N6 N8 Y( K
- {! c5 i7 K' y

( Z, c( n4 i' i4 ?: ?8 ~' a结论
- u' }! ^) J4 V6 z* |# G$ F由于STM32L476 和STM32L432 的ADC 通道配置上存在区别,所以STM32L432 的例程并不能直接使用,需要对其GPIO配置进行修改才可以。
. a9 A3 |! w3 g
+ v2 Y& F4 M/ ^& W5 s4 {8 n' p! }处理) |( ]: [+ ~: a- T1 ~; s! \3 I! O. p
需要根据STM32L4 相应的具体型号对ADC 输入通道的GPIO 模式进行相应的配置。在此,根据STM32L4 几份参考手册RM0351、RM0392、RM0393、RM0394、RM0395,对现有产品整理如下,以供查阅。
+ _4 j6 E0 R4 m$ w

0 a) H$ l( d. E$ K/ n+ v& X& {$ W2 A# v0 L7 h- \+ w& [5 _
& [. K" y( F: N* [8 i3 @
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 手机版