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

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

[复制链接]
zero99 发布时间:2017-4-5 17:33
STM32L4 系列中ADC 通道配置上的区别
) W* m) P8 V. J% W
前言
9 G( @# a- Q" B. ~* X) R* `即使同是STM32L4 系列中的子系列,其配置也可能会有微小的变化,需要注意一下。
% J1 f6 v2 O+ _' a( G! N( m' v5 W2 L" t7 }# F# Z/ p
问题0 \; F! K' p* A, o: z4 d
某客户在其产品的设计中,使用了STM32L476RGT6。客户在开发过程中,调试程序时发现不管ADC 通道在外部连接的电压如何变化,ADC 通道采样进来的电压始终在0.7V 左右。8 l& l3 p6 n) p2 b# W; b" \; P
) b5 L) T7 h, Q
3 r! Z4 m6 M# G& _
调研
6 W6 ?" f! |  W4 d3 j$ R* j: o1 D1.了解问题
  N9 X  N( T; b0 A7 w  F0 s客户在开发中使用了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 底下进行调试。
" I( u9 Y/ y" |; t- m0 i/ @* N在项目配置中,客户已经在Project Options 中将Device 配置成STM32L476RG 了,在“C/C++ Compiler”的Preprocessor页面中的Defined symbols 也已经将STM32L432xx 改成STM32L476xx 了。  C3 V- G1 J& R- V* z* A* k" t
11.jpg
9 k/ S" K) h  d1 x2 T7 q. ~# r
12.png ; H; S. p5 I2 H7 c, B4 r
但是,当编译调试时,发现ADC 通道采样进来的电压不管输入电压如何,始终是在0.7V 左右。
+ v1 G2 Y9 e' \* K" q' k. T# y: ]9 o# O# f
2.问题分析, K& d! w9 a4 S3 W
由于程序的采样电压不会随着外部的电压变化而变化,所以怀疑在I/O 配置上会有问题。客户使用STM32L432 的例程,在未做修改的情况下来调试STM32L476,并不能正常工作。我们需要来仔细比对一下STM32L432 和STM32L476 的ADC 通道配置的情况。* g1 J8 k' i- o1 G( \# G1 x4 ^) X1 P
STM32L432 的参考手册为RM0393,而STM32L476 的参考手册为RM0351。通过仔细阅读ADC 和GPIO 两章,可以发现在ADC 输入通道上,STM32L476 与STM32L432 是存在区别的,如下:
* K8 r% T$ _# `4 O0 P9 G     · STM32L476* J* K" l6 w* c# H) j8 H
       在ADC 的“16.3.11 Channel selection (SQRx, JSQRx)”有如下注意事项:
0 @9 G6 F& l3 i: P: o  J& A
13.png
+ {  y$ F8 _! u  x! ~+ o7 l. R      在 GPIO 的“9.3.2 I/O pin alternate function multiplexer and mapping”一节中,附加功能的描述:
  s5 G; [2 J+ N; j( r  D
14.png 8 t/ F, @: O: M; v
· STM32L4325 Y- m' @. L" _8 H& u
     在ADC 的“16.4.11 Channel selection (SQRx, JSQRx)”并没有那个注意事项。
* E& i' ?  E/ g0 c4 j+ y/ L     在GPIO 的“9.3.2 I/O pin alternate function multiplexer and mapping”一节中,附加功能的描述也不一样:3 M) O5 d# J+ x; j' A! s
99.png
" ^5 Q2 Z, k: S: L$ P, O也就是说,相比STM32L432,STM32L476 在ADC 通道的配置需要多配置一个寄存器GPIOx_ASCR。来看一下RM0351 的GPIO 寄存器中对这个寄存器的描述:
0 {6 u1 w3 e$ p+ I
15.png
2 @) F) p: ?& n( i* n9 L如果需要将模拟开关连接到ADC 输入,就必须在相应的位写“1”。这个位必须在ADC 转换之前设置。只能连接到ADC 输入的IO 口才进行设置,其他IO 口必须保持复位值。
4 P& V8 c6 q; `9 Q; n; b' M& i现在回到STM32L4Cube 库来看这个程序如何对这个寄存器进行设置的。在stm32l4xx_hal_gpio.c 中的void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)函数,有以下一段代码:
% |& y2 b9 W- b: n5 @7 X+ W
16.png , B9 \$ t% ]4 O! v' T0 v
首先,这段代码仅对STM32L471、STM32L475、STM32L476、STM32L485 和STM32L486 有效。它的目的是先判断GPIO的模式是否为模拟口,是的话而且是连接到ADC 的话,将相应的GPIOx_ASCR 位写1。来看一下GPIO 的模式定义就知道了:: ]% q, W3 O6 l; |, P- I  R$ u
17.png 5 N) \; p2 V' G- f# G. L! R, P
在此GPIO 模式预定义中,可以看到模拟口分成两种:GPIO_MODE_ANALOG 和GPIO_MODE_ANALOG_ADC_CONTROL。在注释中我们看GPIO_MODE_ANALOG_ADC_CONTROL 是针对ADC 转换的模拟模式。我们将其值放到刚才的那一段代码中去看,就会发现在相应的GPIOx_ASCR 位会进行写1 的情况。
) R) T; `9 n# g9 T0 c3 k0 H所以,当使用STM32L476 的ADC 转换中,其ADC 输入通道的GPIO 模式配置必须配置为+ ]) P4 q2 G7 }
GPIO_MODE_ANALOG_ADC_CONTROL 才可以。如果只是配置成GPIO_MODE_ANALOG,相应的GPIOx_ASCR 没有
$ M  E/ k2 J4 E' k* C置1,模拟开关没有进行连接,就会检测不到引脚上的电压。! J( P# [) V* q& R% b! \. q0 P
来看一下STM32L432 的例程,在stm32l4xx_hal_msp.c 中的void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)函数中,
- K7 S- ^3 R0 v! z6 R; D$ B4 VGPIO 是这样配置的:
& T# {  B) a  p  f2 H7 b
18.png
7 g: K0 K+ {% G9 M( w" W: }6 i它配置的Mode 是GPIO_MODE_ANALOG,这在STM32L432 没有问题,但是在STM32L476 却是有问题的,必须改正。) l% m6 s- ?8 }; a- l" {$ F8 X& L$ @
19.png 4 U% D( m: M/ V' e8 l3 r# n
# \6 ^$ S' w0 `% z
3.问题解决
, R: n9 K1 F; @+ I  H; h! R% e, G将stm32l4xx_hal_msp.c 中的void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)函数中GPIO 配置修改为:! x, C2 o# h1 @$ q, N
20.png
& I" G) t' C! `8 A3 g# ]问题解决,ADC 可以正常工作了。+ M% C: S- X2 Q# Y: G7 M; \( E

4 ~  Q% w; M4 A$ M: z8 P4 [( Q1 s4 |# t7 F
结论% v* w# ?! \1 {
由于STM32L476 和STM32L432 的ADC 通道配置上存在区别,所以STM32L432 的例程并不能直接使用,需要对其GPIO配置进行修改才可以。
6 Y/ X6 |, r8 W$ t$ {: a$ [$ y7 w5 D  J- ]! G
处理
" R5 D% O, R2 A9 V- X需要根据STM32L4 相应的具体型号对ADC 输入通道的GPIO 模式进行相应的配置。在此,根据STM32L4 几份参考手册RM0351、RM0392、RM0393、RM0394、RM0395,对现有产品整理如下,以供查阅。0 n& a7 V' m8 Z) _1 t- _; ~9 o
; T. i# ^9 c: k  t: l
' ^/ X2 H" V+ ^  _0 I! M8 V. k
3 ~; y: F% ~" L& Q! c$ g0 }
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 手机版