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

STM32调试中遇到的工具困难

[复制链接]
yumeii 发布时间:2019-12-31 16:25
总的来讲,单片机调试是单片机开发工作必不可少的环节。不管你愿不愿意,调试过程中总会有各种不期而遇的问题出现在我们面前来磨砺我们。这里分享几点STM32调试过程中与开发工具及IDE有关的几个常见问题,以供参考。& t& \; f6 H' ^9 R

" g. c, `% k7 o& X
5 w( {6 V& _# Z4 V- c9 r6 o0 ~% g
1、做低功耗调试时连接不上目标板; Y% e8 l" [2 I8 B, q0 }! j5 G
; G, o0 v3 C$ E4 R& _3 k
: J! O" F' M* k: x4 K5 }3 j0 F
默认情况下,当MCU进入低功耗模式后,内核时钟停止工作,调试连接将中断。不过,通过设置DBGMCU寄存器控制位,即使进入低功耗模式,还是可以进行一定程度的调试。
) h: `$ e* K- ]1 N  ]. \" X9 |- ^5 C( R* v
9 Z, ]! j2 Q& ~6 q) X! T
在保证DGBMCU控制位正确配置前提下,还需注意SWD调试脚没有被配置为【analog state】模拟输入状态。我们在具体应用时为了降低功耗可能会将芯片的包括SWD调试脚在内的GPIO配置为模拟功能,这样会到导致调试器连接不上情况。此时在连接前先做下复位,有时可能多做几次复位才连接得上。
2 w% j+ P3 w, `  R4 T. u' w8 i3 u! o

% R  y1 w, U, A5 I2 X/ X) l* N当然,上面是指低功耗模式下连接不上目标板的情况。如果是一般性的连接不上,原因就更多了,比方硬件器件、连接线路、驱动程序、用户代码本身等,这些要结合具体情况来分析。关于低功耗模式的调试支持,请参考各个系列参考手册的相关描述。6 I( E4 C8 A8 w1 }% C
) o' j+ h9 ^. Q+ F- g) ]3 t

1 M0 i$ }) f% p8 e/ X# F; ^2 r  D2、打印输出失败
3 }$ e3 q6 }" e- U/ \% L# n1 M6 x& f6 R0 {7 r# v3 k6 ]
' N8 d2 J# ]% o. q( k1 B
通常我们可以借助于串口助手做打印输出。如果使用STM32虚拟串口,注意PC端的虚拟串口驱动程序安装正常。相应软件包编号是STSW-STM32102。
: n: C8 D: K, h2 L
( d) N. `& \& c5 C( z, U$ G
! U' x  S6 S2 f9 G& ~
1.png : c3 F/ V/ E2 b

# [6 h  ?- p/ V! ?$ Y, U/ k3 H

$ G, W. u2 Y. K7 s* e# F再就是注意配置UART相关参数配置时,字长是包含了校验位的。比方8位字长,它是由 7个数据位,1个校验位组成。还有,VCP不支持字长在8位以下的传输。
  ~( E1 [* b( l/ f+ O8 Y, x* E& X: Q0 y9 Q+ A! D( H6 s0 D( V
* `$ E+ n$ g" j) _
2.png
) ^& p' l3 I4 v2 L- z' F) b" n7 _' |0 h; o: p1 i5 @
% U- D. V9 E7 C/ E) ]( `& V
另外,对于那些基于ARM CORTEX M3/M4/M7内核的STM32芯片,我们可以使用SWO方式做打印输出。
8 j+ b6 e' u3 p% Q$ L& [  i
3 \1 u0 W4 g+ `+ Y
/ S7 Z3 H- n! q4 g8 C9 L
3.png 6 p4 Z# X" v8 \$ k4 H! P. k
3 `4 U8 G5 {5 z# ^

$ G( Q  L4 `; e: A0 p" I0 U" e这里要注意的是:
. O" Y+ T  ?! S/ U$ D' H8 c. W' j% q3 a8 y; `2 A  p

0 k8 J; r  y2 e) J3 y* ba、不是所有MCU系列都支持SWO打印输出;目前仅基于ARM Cortex M3/M4/M7内核的芯片支持;: W: L7 \1 g  |

- [$ M0 x% P# H6 Y; U- ]b、目前只支持SWD模式,不支持JTAG模式;
. K1 Q: A$ J, ~6 b
9 X- N/ z/ e/ J$ e, x4 T4 u. B) Ic、在调试环境里需做适当配置和代码补充,涉及到DBG_MCU_CR寄存器的控制位。
% ?& _- ]2 B6 @3 [0 s: Y1 d
7 E' b0 d" _1 y6 L

4 o( c# L  }% a! B) @3、低功耗应用中功耗数据异常
3 A7 i! O4 O) p, B1 b  C* }" x* {
4 ]& b7 p! e2 P+ G; Q) G

0 J4 e& R  C9 \  e  j1 T这个原因很多,比方,测量方面的原因,不属于MCU的功耗也算进来了;有些外设及管脚没处理好,导致漏电流还在产生; 或者低功耗模式选择不对,或者进了低功耗模式马上又醒了而误测误判等等。
5 V) \/ k: ?) K& a# D, G% l8 U
. b' `# P9 ?9 q. M/ H
+ P1 R2 f2 d% g3 Z) B
这里再提醒1点:* ]( S) b7 ^) J
5 D$ G* _3 C( a' C- ]5 ?& U
) U3 Q9 N9 e) B% r
设置进入低功耗模式后,确认是否还在调试模式。即检查DBGMCU寄存器中与低功耗调试配置有关的寄存器控制位,确保关闭了低功耗调试状态。做低功耗数据测试时,最好不要还连接着调试器,给我们带来困扰。前不久就有人反映,用别的调试器连接着STM32目标板测得功耗与用STLINK调试器连接着测得功耗大不 一样,改用STLINK就合理了。
# u- t* P1 c: e* q% [5 w; s  L3 w3 \, u8 G; F% x

  ]9 V8 |! h3 S, y% H4、在Normal/System Reset模式下SWD连接不上目标板
" e& c2 Z1 _" Q; [: j) v6 m7 i( u( E" P- s

- i7 a) I  l( U9 W& K* J此时我们可以尝试换个连接模式,比如Connect Under Reset,或者换个复位模式,比如Hardware Reset 。
' n, l5 w# _/ h" k
4 d2 W9 K' Y) q( y1 e3 S7 O# N. ~

) Y; B' {4 G' {( ~0 ~ 4.png   a- m# s6 t+ A) s
2 _; r8 k9 o! N) v* f8 R9 t2 u

: j9 z3 M  X" G! U8 y 5.png 6 N& n2 g4 F  ?9 a* P! g4 j
/ Z: `+ \4 a# G8 b7 e7 A
9 V# t  g- c# d8 H) I; f# B* I/ |7 ?
6.png / q& T% `" M- B- ^9 b! }/ u- c

5 ^6 p1 A# X1 Z' H7 V0 ^
) x. b* u3 P6 w; u4 D* s7 {. Z
如果说借助STLINK,即使使用Connect Under Reset或Hardware Reset方式还连接不上呢?我们可以查看下STLINK的NRST脚与目标板上的MCU的NRST脚是否相连了。如果是nucleo板的话,还需确认下跳线SB12是否为连接状态。
: i0 Q: k2 ?, w, k3 d+ \. z( O% P! L) K7 V
5、MCO脚无时钟信号输出7 N' g* D) V& T! i8 c$ \

, }. B( P: k$ h% V( ^9 N' x, n! f
# c2 E! D$ U8 L) v& {7 f8 m
我们在STM32调试过程中,有时需要引出主时钟进行输出监视,即将主时钟通过MCO脚引出观察。: `1 T* i0 w1 o1 J

! o8 o( S% S% \6 A/ H
  J6 t& |5 e+ H/ \9 C$ C  `
要想正确输出,MCO做正确配置是必须的了。当然用CubeMx配置的话一般不会有啥大问题 。不过有个地方要注意,那个GPIO的输出速率参数要合适配置,不同STM32系列的GPIO最大可输出速率在数据手册上都明确出来了。当MCO输出时钟频率较高以至于超过GPIO的输出能力时,这时需要考虑先做分频后再来做观察。
$ {( r, I( t. o
) l, ?! c  b6 Z& x& y

3 c* f* v+ D7 f4 M' T' O一般来讲,当MCO的输出频率在1Mhz以上时,如果观察到的波形带有很严重的噪声或者扁平的小幅度信号,甚至看不到输出的时候,我们可以考虑下是否那个OSPEED参数设置得太小了;如果说看到周期较长、幅度较大带有明显上下峰值过冲情形的波形,我们可以考虑下是否那个OSPEED参数设置得太大了。
) @, q. K- ]4 I) C+ H5 X: g. L# L. C
7 t0 ~+ v. W+ t( ^
. m: l  p- ^! Q* m
6、没法对某些变量进行计算和监控或无法设置断点8 l1 M. {& _* O' `8 d" J& ^+ E

/ {4 f$ C( p8 z9 J

1 h3 x$ {$ c2 T  s5 ^这个原因较多,具体到调试环境,很可能跟你编译环境的优化等级配置有关。
, o; G/ q: ~+ `4 t" v1 e. Y" ~. n

! J' Y$ \& F7 {% i我们在MCU调试过程中,往往会用到编译器的优化功能来提升芯片的性能和精简代码空间。不过,经过代码优化,往往可能给我们调试带来些影响,主要体现在下面几个方面:
& n- x! ?, O+ p% Q
# V6 B- L9 D, v& w2 Y% w
' B8 T9 ~4 X4 P! A- S
a、 设置断点方面出现障碍,有些代码行没法做断点的设置;
) Y. j( x8 s9 _+ y  m! |
/ P- ^5 |0 g8 y% ]( k6 Gb、 无法对某些变量进行观察;
6 U% |/ ^. @. K1 w% {" T  e3 T# a1 d# R  N& H1 Y
c、 单步调试时出现代码运行“不连续”的情形,即执行到的地方和我看到的地方不一致;
4 B9 a/ P& q8 A/ P. I# h9 d2 [& |! f: K6 s6 _
7 Q& w% ]1 \2 |2 Y0 x4 ^* e. ?
因此,为了实现有效调试,我们在通过编译器做优化时要选择合适的优化等级。基本原则是不影响调试体验的前提下保障编译效率。一般来讲,在调试时建议将优化等级设置在较低水平。比方KEIL MDK 推荐调试时将优化等级设置在-O1, IAR 推荐调试时将优化等级设置在-None,GCC推荐调试是将优化等级设置在-Og.其实,编译器的优化等级设置越高,对代码的规范性要求以及我们对编译器的了解程度也越高。经常有人代码优化前程序运行得好好的,代码优化等级调高好程序功能变得面目全非了。4 J: K- f9 i$ [' `

7 K4 b3 e& B& ?# V4 G3 [+ s% V
赞 收藏 1 评论3 发布时间:2019-12-31 16:25

举报

3个回答
wdliming-222461 回答时间:2019-12-31 21:15:10
谢谢分享
feixiang20 回答时间:2019-12-31 23:58:00
学习111111111111111
Kevin_G 回答时间:2020-1-2 09:45:52
非常感谢,学习了; \+ g3 _2 O* t& b0 D5 }) B6 v# p
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版