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

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

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

/ D7 k6 v# o  l- r. U前言5 q6 s$ }& m: X. z4 @; R' `+ K
即使同是STM32L4 系列中的子系列,其配置也可能会有微小的变化,需要注意一下。
/ _& p5 s% [8 \3 E" w6 H9 e6 H2 e5 F! N* I7 o' `
问题$ P3 L  O7 q3 z
某客户在其产品的设计中,使用了STM32L476RGT6。客户在开发过程中,调试程序时发现不管ADC 通道在外部连接的电压如何变化,ADC 通道采样进来的电压始终在0.7V 左右。
8 o% X" M" Y" f% r5 x9 q3 c& S& E
. ?, F& K0 V2 E! J. Z2 @! p4 s1 V4 n0 m1 p4 G, w' D
调研
9 `2 S1 P3 O9 a( W* N& y1.了解问题
, D( ~6 _, k- }! D5 h客户在开发中使用了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 底下进行调试。
' t. u9 q* B+ J  a在项目配置中,客户已经在Project Options 中将Device 配置成STM32L476RG 了,在“C/C++ Compiler”的Preprocessor页面中的Defined symbols 也已经将STM32L432xx 改成STM32L476xx 了。& S$ T+ o% W7 g2 ~( q
11.jpg   c, M1 W8 Q9 j1 ^
12.png ( e' B; g6 Q) C( Z' ?* X
但是,当编译调试时,发现ADC 通道采样进来的电压不管输入电压如何,始终是在0.7V 左右。2 k# w/ E3 F' t9 `6 S

, q4 R; V  J+ J/ |9 n% \. W5 i. I2.问题分析
0 s: _3 e  y4 Z( ]由于程序的采样电压不会随着外部的电压变化而变化,所以怀疑在I/O 配置上会有问题。客户使用STM32L432 的例程,在未做修改的情况下来调试STM32L476,并不能正常工作。我们需要来仔细比对一下STM32L432 和STM32L476 的ADC 通道配置的情况。% r0 ]7 q/ \! c9 ]
STM32L432 的参考手册为RM0393,而STM32L476 的参考手册为RM0351。通过仔细阅读ADC 和GPIO 两章,可以发现在ADC 输入通道上,STM32L476 与STM32L432 是存在区别的,如下:
  }  P: _( b7 M% J     · STM32L476
( k- B" q& W8 k4 q) c2 y2 J/ W       在ADC 的“16.3.11 Channel selection (SQRx, JSQRx)”有如下注意事项:4 A! ~; g6 r! e2 ?0 f: O1 {
13.png
9 L$ G" B* N8 v0 W      在 GPIO 的“9.3.2 I/O pin alternate function multiplexer and mapping”一节中,附加功能的描述:0 [1 f; D* _# H$ U! y
14.png
* s9 f0 C; [) K# ?· STM32L432
4 l% X! }, z% J/ Q+ k) P- _$ }     在ADC 的“16.4.11 Channel selection (SQRx, JSQRx)”并没有那个注意事项。/ U9 ^* B+ l  h; r
     在GPIO 的“9.3.2 I/O pin alternate function multiplexer and mapping”一节中,附加功能的描述也不一样:' G$ f0 v; q5 z6 d) E( L9 J3 n
99.png & [) Q: T4 |  i0 _0 c
也就是说,相比STM32L432,STM32L476 在ADC 通道的配置需要多配置一个寄存器GPIOx_ASCR。来看一下RM0351 的GPIO 寄存器中对这个寄存器的描述:
! Z  j7 ], k4 G) ?: M
15.png 2 [8 Z, o! k4 Y% E, @) E2 P( j
如果需要将模拟开关连接到ADC 输入,就必须在相应的位写“1”。这个位必须在ADC 转换之前设置。只能连接到ADC 输入的IO 口才进行设置,其他IO 口必须保持复位值。
* T5 a0 `6 K* t4 E现在回到STM32L4Cube 库来看这个程序如何对这个寄存器进行设置的。在stm32l4xx_hal_gpio.c 中的void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)函数,有以下一段代码:4 B( i. m& w+ d9 W  ?5 A' G7 b
16.png / q, G+ d+ E. _  U2 q) w
首先,这段代码仅对STM32L471、STM32L475、STM32L476、STM32L485 和STM32L486 有效。它的目的是先判断GPIO的模式是否为模拟口,是的话而且是连接到ADC 的话,将相应的GPIOx_ASCR 位写1。来看一下GPIO 的模式定义就知道了:
5 l5 }8 t9 i4 Q* N  ~9 e$ d
17.png
* \2 `! Z# x# M3 c' |3 _在此GPIO 模式预定义中,可以看到模拟口分成两种:GPIO_MODE_ANALOG 和GPIO_MODE_ANALOG_ADC_CONTROL。在注释中我们看GPIO_MODE_ANALOG_ADC_CONTROL 是针对ADC 转换的模拟模式。我们将其值放到刚才的那一段代码中去看,就会发现在相应的GPIOx_ASCR 位会进行写1 的情况。0 \3 C# K7 c! {! P! v
所以,当使用STM32L476 的ADC 转换中,其ADC 输入通道的GPIO 模式配置必须配置为" s2 Y6 ~0 `: @0 B: ?
GPIO_MODE_ANALOG_ADC_CONTROL 才可以。如果只是配置成GPIO_MODE_ANALOG,相应的GPIOx_ASCR 没有/ K, Q' k9 R8 }* L7 ]
置1,模拟开关没有进行连接,就会检测不到引脚上的电压。; h% G/ ?: b  M5 H
来看一下STM32L432 的例程,在stm32l4xx_hal_msp.c 中的void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)函数中,: L0 Z' j- m+ i3 a" E9 L& K3 _2 M% h
GPIO 是这样配置的:
4 N4 k0 E) i0 a* w( M& ^% G8 h5 v: T' c% c
18.png + S- W0 [9 M( W7 m1 b$ x/ B
它配置的Mode 是GPIO_MODE_ANALOG,这在STM32L432 没有问题,但是在STM32L476 却是有问题的,必须改正。
. A+ Y' O5 u& C2 ^
19.png * r5 k- ]2 Q, B/ ?: b* L% j' w) H& c
- m, p# _7 ^2 w: n7 a0 }
3.问题解决+ C# P8 u6 B& K/ }. D6 P% o% O8 n! W
将stm32l4xx_hal_msp.c 中的void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)函数中GPIO 配置修改为:0 V4 x' B# E) X$ N$ L2 G; x
20.png
2 u+ Q) w$ F7 w- v& S8 R问题解决,ADC 可以正常工作了。
! R+ s* R& Y  y% V6 @# Z
( m% d  ^0 N0 j4 D3 f' W7 x0 h- x% ?
结论0 p& a5 |4 ?1 t+ o4 M4 e' Y
由于STM32L476 和STM32L432 的ADC 通道配置上存在区别,所以STM32L432 的例程并不能直接使用,需要对其GPIO配置进行修改才可以。
7 T2 g: U$ R, X) y! c( F- ~& `# T( h4 ~" q* `% A
处理8 H3 ?# s' j/ x7 |5 O- \, V
需要根据STM32L4 相应的具体型号对ADC 输入通道的GPIO 模式进行相应的配置。在此,根据STM32L4 几份参考手册RM0351、RM0392、RM0393、RM0394、RM0395,对现有产品整理如下,以供查阅。; b$ M9 d) }6 z* u. F- @

- |2 |0 {+ j+ P/ g* R: V
$ `% l, l3 y7 e6 @. d& Y

& @3 y6 S4 k9 ^ STM32L4系列中ADC通道配置上的区别.pdf (277.15 KB, 下载次数: 137)
赞 收藏 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管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版