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

调试组件于单片机中的作用

[复制链接]
yumeii 发布时间:2020-1-6 16:35
在我们的单片机调试过程中,经常会遇到类似如下因第3只眼而导致的问题。何谓第3只眼呢?不妨先看看几个实例就知道了。
. j8 s: F' `3 c2 h8 L8 ^. Z
# }7 Z* ?5 Q( Y0 \1 F
) Q" i/ E" t2 S) s& i
第一个案例,与ADC转换标志位有关的问题。遇到该问题是一种较为频繁的情形。
1 q4 z, T( J0 p9 @1 l
$ z4 \" ~1 |2 P0 q0 z) f' L

5 o. t, g0 @! o1 [/ Y' ~/ `经常有人在做STM32 ADC应用,进行代码单步调试时发现,明明启动了ADC转换就是等不到转换结束的那一刻,即总是检测不到EOC等于1的时候。有时让人直急得冒汗!比方类似下面的情形,开启了ADC转换指令,然后等待ADC转换结束。
, }) B2 @1 ]4 Y7 D- [
. q* c) f3 G9 V- R6 ~' T
8 X$ @. m2 Q. ~1 c7 c
1.png " f4 N' K2 }6 P0 _* X/ P: F
+ S% ~' c/ M4 R- \  ?5 C
; \* X) M+ R+ v$ c- c
在那蓝色圆圈的代码处,查询等待EOC等于1,可就是等不到它为1的时候。是怎么回事呢?
5 w% s3 C" h4 j1 B/ L
7 a9 ^, n0 w2 z6 S+ ]
" u. y+ f$ ?: Z! B7 L/ W
原来,STM32芯片ADC的转换结束标志EOC位,具有读清零的特性。当你调试时打开外设寄存器显示栏时,那调试组件在不停的读取它。当你单步操作去读取该标志位时往往先被调试组件读过了。即使它之前被置位过,但因调试组件的读取后又被清零。当你单步慢悠悠去读它时,结果读到的往往是0,你就查不到为1的那一刻,此时我们可能会傻傻的等和着急。
  S& |' C+ j7 }6 b' A8 K' y6 L, f7 X  l$ H& t
3 Z1 S2 ]  G1 v* K7 g6 Z
2.png ) e+ f7 X, M+ |) M

7 u3 C5 P" }# Q& h" Q, V/ r2 K

2 b$ Q4 \- i/ U# _9 @* k7 \/ N当然,如果你将右边ADC外设寄存器显示栏关闭就不会出现上述问题了。/ I% @2 d  h" w
3 ^2 E! f; T1 _; k6 s5 ]: b

$ M# S( w1 F8 J! N, H8 F; @. O第二个案例,与UART状态寄存器标志位有关的问题。遇到该问题也是较为频繁的情形。8 E2 ~7 f, u( |4 ~+ V
3 o) N5 M1 n+ ~; e% m2 g

5 V3 q" Z: K6 p. f4 N, `某STM32用户使用STM32F2系列芯片的UART外设及相关功能。他发现明明接收完毕,发送标志TC位也置位了,可就是不进IDLE空闲中断。当然,相关中断使能都已正常使能无误。实际情形是这样的:1 Q: f; i3 A6 g2 u1 s# U

& T: a1 P4 ]2 |, S" X
5 h# P* v  v, S0 W" Y/ l- V2 e
STM32F205的UART5发送指令(循环发送一个字节一个字节地发)给wifi芯片,WiFi芯片会返回相应数据过来,所以,正常来讲uart5会收到一帧数据之后应该进入串口接收IDLE中断.这是客户所期望的。
# X" j- z5 q0 O2 }0 L* l0 H) y6 I, ~
, C5 Z' Q( A  J2 i: C
他将断点打在UART中断服务程序的检查到IDLE中断请求位等于1后的入口处。就像下面截图的样子。他甚至在右边的UART寄存器显示栏都看到IDLE被置位过的痕迹了,可就是进不到相关代码里去,怎么回事呢?
( M2 s7 z9 V" Q3 `: l7 P) B4 J7 E1 ~- W( b0 {! `: g5 e* E

" F, R" x7 W7 t 3.png
8 j: |% G% U& b# h  t7 g8 Q9 \
% C1 D! v8 _: c4 P

- S$ f+ `7 ^/ E7 q$ c$ Y因为他开启了UART寄存器显示窗口,意味着调试组件在不停帮他读了UART相关寄存器,其中包括DR和SR寄存器。当他在中断代码里再去读SR寄存器里的IDLE标志位时,读回来的结果总是0,所以中断程序没法进一步走下去。对于他这里,严格地说是响应了中断,只是没法进一步进入相关中断服务代码区。. i9 p" S6 c- y# q$ |
# `+ z* q) {( y6 v

# A! C4 f& ~8 M3 j1 H- S其实,对于stm32f2芯片UART的IDLE中断请求标志位的清零会遵循一个访问序列,即读DR寄存器,然后读SR寄存器就可将IDLE位清零。
) O, A, K; G# J+ Q3 t) P# P" t" @
7 r$ c- z5 m% u8 G  F. D1 }: p/ v
: o3 n+ b) P; I; e" a) }* y
4.png 7 h5 {1 ]& }0 m# h. H9 m

+ k  n2 j0 z3 ~) i/ w

. z9 D8 d2 q5 a当然,解决上面问题的办法也很简单,调试跟踪时,将右边UART的外设寄存器显示栏关闭就好。
; T% m% X4 n+ n+ n! c8 W0 B
. r) R1 u8 t" T/ J, {
; P. K9 s6 d0 b' [# n+ V( b
第三个案例,与读取RTC日历有关的问题。一个较为隐蔽而容易误导人的问题。3 D2 T; I: G# K! Z$ F
1 z) E0 g0 o8 `) ]" H

, b/ E% H* `  J- w& o曾有人反馈说STM32F4和STM32L4的RTC脱机运行跑不起来,不运行。具体表现就是日历时间不动、不更新。奇怪的是,调试时候不论单步还是全速运行,查看日历寄存器都显示正常运行,数据也正确。
' H# ?& e6 A; K, G" U0 V9 Q2 f5 I6 q+ h! b. M5 `# }, z3 t
% G  G" t9 Z8 p# }& S  k
可当烧录代码到芯片后,通过调试助手查看日历的数据则原地不动了,感觉RTC没有运行。客户用STM32F4和STM32L4的板都测试过,出现同样问题。怀疑STM32F4和L4芯片的RTC是否有BUG【反正找不到原因了就想芯片bug】。) A. X2 x( \5 t8 G
, L6 N* Y! i+ x  _! ^& [1 j

" j; C8 f$ y3 p* ^" `8 |查看其测试代码,就是读RTC的日历,很简单。如下:9 u4 k+ u# [  w! ~- c8 ?

2 c1 J9 p& h, V/ ^
, b3 g, r% ~4 s
while (1)
3 U- ]5 E- }7 P9 ^( N{
6 v; u0 `- h% ^, ?1 B/ D+ |( ?4 o/ O6 ~# ]; u9 m; {: [9 D7 B
! F9 }( K) j$ P
HAL_RTC_GetTime(&hrtc,&rtcTime,RTC_FORMAT_BIN);3 L: x9 `% n; _7 c7 M3 N1 a
printf( ...... );
0 F2 N" X$ V0 L! N) j9 VHAL_Delay(1000);2 ^/ N+ ^: H, L& G; v
}
( a9 v3 k' |7 ]/ x& x# E
% R( i: h' F( R5 |' [& j
7 s. ?" y, d4 @( g( V' T! r
从上面代码不难看出就是不停地去读当前的时、分、秒时间。STM32参考手册在关于RTC日历读取操作部分有相关描述。为了读取时间的一致性,读取日历操作要求先读时分秒然后还得读日期,这样做为一个完整的操作。所以在读取TIME【时分秒】后,硬件会将当前日历值锁住,直到读取了日期寄存器。否则当你读了TIME而不读DATE的话,再去读TIME时还是原来的值维持不变。显然,客户这里的代码只有读取TIME时间的语句,没有读取DATE日期的代码。这是问题根本原因之所在。) L( |) E! X4 ?

  c7 |( h( ^0 w( \, M; |

* n0 `) u4 M) G! K) Z7 j% P但是,为什么同样代码在调试情况下又能正常运行呢?那是因为他在调试时打开着RTC寄存器外设显示窗口,虽然用户代码没去读DATE,但调试组件帮忙读了DATE寄存器,所以感觉上一切风调雨顺,也就没能及时发现问题,一直到程序烧进芯片后才发现异常症状。! X  T! a; ?& i% [! j; j
! n5 U+ ]; @8 |+ h2 n1 c
: ^( @- d+ A6 W7 G% O
5.png
& v1 Y4 l0 p2 ]0 `' j$ Y- \
' M. ]5 h: Z, H2 F5 L- c2 S& L. O9 r

6 a1 A! I# m  m% M到此,结合上述3个案例的分享介绍,我们应该明白了那个第3只眼了,即调试组件。个别寄存器或寄存器位具有“读则变”或“读有效”的特性。我们在调试时候要注意类似细节,调试时也不必时刻将那个外设寄存器显示栏开启挂在那里。其实,除了这个寄存器显示栏外,我们还可以利用其它输出,比方示波器、printf,或者WATCH窗口等来辅助观察运行状态或结果。
. u" y2 H7 i0 Y  x0 A* G$ S* S
# b" p. b/ E- }' z; V" h' J

& L9 n0 ?  Q1 q# L5 D既然这里把调试组件称之为第3只眼,那另外两只眼呢?这个不难想到CPU和DMA。# V+ [- q4 p3 g  q

- ]1 r8 _, N2 d* a' {1 |/ K+ `0 K
赞 收藏 评论0 发布时间:2020-1-6 16:35

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版