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

STM32调试过程中常见的问题及解决方法

[复制链接]
ataudio 发布时间:2015-1-21 09:08
一、 在“Debug选项卡”下设置好仿真器的类型后,下载程序时却提示“No ULINK Device found.”
* G/ R- B9 X/ V: @) n, G- j+ W6 |     解决办法: Keil MDK默认使用ULINK仿真器下载程序,在“Utilities选项卡”下把编程所使用的仿真器改为相应的类型即可。
9 X! F0 g- B( D0 d7 e  二、 编译工程时提示如下信息:
$ \/ T1 e3 Y/ t& I# ], {  main.axf: Error: L6218E: Undefined symbol __BASEPRICONFIG (referred from stm32f10x_nvic.o).
/ D  M9 P* E- C  main.axf: Error: L6218E: Undefined symbol __GetBASEPRI (referred from stm32f10x_nvic.o).
- X  [) O; F- T0 W  main.axf: Error: L6218E: Undefined symbol __RESETFAULTMASK (referred from stm32f10x_nvic.o). 0 }1 V0 a* |- V0 r0 }
  main.axf: Error: L6218E: Undefined symbol __RESETPRIMASK (referred from stm32f10x_nvic.o). 6 n. t' Z' n% X8 M; n8 |1 B8 V& C
  main.axf: Error: L6218E: Undefined symbol __SETFAULTMASK (referred from stm32f10x_nvic.o). ( l4 l% y; X: ], q  Y7 t$ V( J& n2 c
  main.axf: Error: L6218E: Undefined symbol __SETPRIMASK (referred from stm32f10x_nvic.o). 5 U: r0 A4 |2 N& S  I3 g# o
      解决办法:工程缺少“cortexm3_macro.s”文件,把cortexm3_macro.s和STM3210x.s全部添加到工程即可。 1 e" y" o! J4 z2 ]' |$ I2 }  ^: n
  三、调试器不能连接到STM32的问题与解决办法 : T5 s& B7 I, w8 c( E' Y
      很多人都碰到过调试器不能连接到STM32的问题,不管是IAR的J-Link还是Keil的ULink,或者是ST的ST-Link。出现这个问题时,调试软件会提示不能建立与Cortex-M3的连接,或提示不能下载程序,或提示找不到要调试的设备等。 ( F2 j' h& Z; G5 l: @  c
      这样的问题都是发生在调试那些可以在CPU不干预的时候自动运行的模块、或在调试低功耗模式的程序的时候。所谓“可以在CPU不干预的时候自动运行的模块”包括:DMA、定时器、连续转换模式下的ADC、看门狗等模块。
' O6 X3 ~* d9 Q2 V# ?4 ~9 \( m( |+ ~  --------------------------------------------------------------------------------
, `+ J$ F; G8 s% h' V- V  这个问题的根源是:
0 A. j! Q$ v) s3 U4 O% o, N1 B9 f: n" C      1. 调试器需要在RAM内执行一段程序,对Flash进行擦写操作,如果不停止这些自动运行的模块,它们会干扰程序在RAM中的执行,致使下载失败。比如DMA模块被配置为不停地拷贝一段数据区,而调试器刚好需要使用DMA数据传输的目标区域,这时DMA的操作将会与调试器的操作发生冲突。再比如,如果启动了看门狗而没有执行硬件复位,则在下次调试器需要下载程序时,看门狗超时将触发芯片复位,导致下载操作失败。 - i/ K& l( u) F. c& Y% i
      2. 低功耗是通过停止CPU的时钟而实现,JTAG调试是通过与CPU的通信实现,停止了CPU的时钟致使调试器会失去与CPU的通信。 % s' a" k" b+ t* W6 u
  --------------------------------------------------------------------------------
% K* p- W4 R5 M' i      有人说“我停止调试的时候,这些模块已经停止了运行,应该不会干扰到后续的调试”,这个问题要从几方面看:
& J, d# Z; H" K4 q7 O      1. 调试器是通过停止CPU核心的时钟来停止被调试程序的运行,实际上被调试芯片的硬件模块并没有被复位,它们还处于使能状态,那些能够自动运行的模块只是处于暂停状态,一旦恢复了时钟之后,它们仍会继续运行。 0 [# |* _# }" a: z! Q: Y$ b
      2. 目前常用的调试软件,不管是IAR EWARM还是Keil MDK,调试软件界面上的"复位"按钮都不能对芯片执行硬件的复位,这个"复位"按钮只能对芯片内的程序执行软件复位,即把运行指针重新指向复位地址。 ) {( i9 s2 D6 i7 m: q1 b. o
      3. 使用板上的复位按钮可以手动地进行硬件复位,使所有模块(包括那些能够自动运行的模块)停止工作并恢复到复位状态。但是当调试器需要控制CPU之前,它需要先为CPU核心提供时钟,然后需要较长的一段时间做一些初始化的动作,然后才能接管CPU核心的控制权。在调试器为CPU核心提供时钟之后,用户程序就已经开始运行起来,如果用户程序在调试器接管CPU核心的控制权之前,就初始化好硬件模块并启动运行,则仍然会产生与调试器的冲突。
! X- z7 o  b/ Y% p, w  --------------------------------------------------------------------------------
3 i/ k- u3 U9 g8 }+ W      根据以上的分析,解决这个问题的关键是,在调试器接管CPU核心的控制权之前,必须停止所有能够自动运行模块的操作,使它们处于关闭状态,要做到这一点,可以有以下几种方案: % O, N( O! l7 f+ ~4 R- D
      1. 每次退出调试状态时,先停止所有模块的运行,比如执行该模块的DeInit()操作。
( i2 h* a$ v0 M      2. 在main()函数开始时,不管各模块处于什么状态,先执行该模块的DeInit()操作,然后在程序中较晚的时间或真正需要时再开启相应的模块。这样保证在刚进入调试状态时,调试器能够有充足的时间完成初始化和下载程序的操作。先执行该模块的DeInit()操作的目的是为了关闭哪些上一次操作开启的模块。
; U1 |6 [; C7 ?/ H# F" `) d      3. 调整BOOT0/BOOT1的设置,把启动模式改变为从内部SRAM启动,再结合手工硬件复位。由于BOOT0/BOOT1的状态只在硬件复位时是有意义的,而调试器不做硬件复位,所以这样的设置不会影响调试器下载程序到Flash中,也不会影响在Flash中调试程序。
6 V" B( P' t" H! D$ v9 [9 p  四、调试STM32程序时,某些标志位被调试软件意外清除的问题 # j5 h6 c$ n& G  [5 s1 y, D# r
      在调试的过程中,使用调试软件的寄存器或存储器显示窗口,可以很方便地查看外设寄存器的状态。 . z' b4 E, ]7 G; Y* J
      很多朋友都碰到过这样的问题:在单步调试时始终不能在显示窗口看到某些标志位的变化,应该设置这些标志位的时候,窗口中却显示为0,不少人都错误地认为这是芯片的问题。
/ c7 D5 ?: c0 X5 M0 r. h0 @      我们知道,不少STM32外设的状态寄存器位,可以通过对某些寄存器的读操作而清除(例如I2C的I2C_SR1中的很多标志位),在调试过程中,每当程序停止在设置的断点或单步停止时,调试软件都会自动地读出所有指定的寄存器和存储器中的内容,并刷新窗口的显示,调试软件的这个读操作恰好清除了那些标志位,造成了上面描述的现象。 ( a% P" V& a- R5 ?" W; p
      有几个简单的办法解决这个问题:
+ z/ r8 ?! |  @2 \' m3 H' E5 y    1. 关闭寄存器或存储器显示窗口。   
0 S* A. y* d) F8 V  2. 在寄存器或存储器显示窗口中不显示这些敏感的寄存器。   
- G- n* e% A9 _- i4 d  3. 不要把断点放在对这些敏感的寄存器位操作的前面,以保证这些寄存器位不被调试软件意外地操作。    ) H! r' ?5 t; U( {5 {5 V
  4. 看官自己添加~~~~~ . f! a: O0 ~- R" c6 \! U
  五、在使用STM32的外设时,由于IO口被用作复用功能,但是外设的初始化正确,GPIO口初始化正确,外设的时钟也已开启,但是外设无法正常运行
  i/ T2 @% O. |* K      其中最关键的一项,大多数使用者多没有设置,就是某个IO口被用作外设的接口时,需要开启IO口的复用功能的时钟,即进行外设、IO的时钟使能时,需要如下代码:
# u% f5 l7 Y. e( ?( x+ T  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx | RCC_APB2Periph_AFIO, ENABLE);    /* GPIOx and AFIO clock enable */ , o" Y7 `4 Y# f4 s* {* ~+ o! k$ m
  x --- 为对应的GPIO口,如:A、B、C、D、E。 ( f) I: X7 |$ a# u) T% ^
      在使用时,一定要注意该要点!
% r$ l' Z' m! b* V% H# u8 E# r3 s0 r! B6 @
            作者:Leo Chin
3 X3 z: l( O/ u  k( k5 ?        出处:http://www.cnblogs.com/hnrainll/# m7 ^1 @: |, Q9 v2 i
        本博客文章,大多系网络中收集,转载请注明出处
% |( w6 }2 d1 I4 r, M  相关标签:嵌入式培训嵌入式开发嵌入式学习
, x4 Q' ~7 ?: P8 c! f/ t. Z   
: N% A1 Z6 X1 e$ Y+ `. B
+ M9 d6 E2 X6 _4 L5 h; j% d* x/ L
收藏 2 评论6 发布时间:2015-1-21 09:08

举报

6个回答
党国特派员 回答时间:2015-1-21 09:18:26
1.png
ataudio 回答时间:2015-1-21 09:19:15
ST-link连接不上的问题,也可以参考一下。
天天晓宇 回答时间:2015-1-21 09:53:39
总结的不错
子曰小玖 回答时间:2015-1-21 10:00:31
谢谢分享
wyxy163@126.com 回答时间:2015-1-21 10:07:43
提示: 作者被禁止或删除 内容自动屏蔽
feel-376797 回答时间:2015-2-23 09:55:07
谢谢分享

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版