调试器不能连接到STM32的问题与解决办法 -- STM32 Releasing Your Creativity

调试器不能连接到STM32的问题与解决办法 -- STM32 Releasing Your Creativity


EDN首页 博客首页
cylrwhy 的 E空间 | 站内短信(0) | 退出 STM32 档案 相册
STM32 Releasing Your Creativity
首页
个人信息
博主:
STM32
+加为好友 +发送站内短信
+我的博客精华 +我的推荐文章
最近加入的小组
STM32团队 USB专区 博客公告
欢迎访问ST MCU的官方网站:
中文版,英文版
我的分类
资料文档 (20)
性能分析 (12)
实用例程 (15)
产品特性 (22)
博客日历
<2010年2月>

日一二三四五六
31123456
78910111213
14151617181920
21222324252627
28123456
78910111213

博客广告
STM32释放您的创造力
日志档案
2010年份 (4)
2009年份 (26)
2008年份 (39)
最新日志
· STM32定时器的预装载寄存器与影子寄存器之间的关系
· 如何使用STM32的USB库支持延迟HID的GET_REPORT请求
· 如何使用assert_param
· 调试器不能连接到STM32的问题与解决办法
· 使用STM32输出任意改变相位的PWM波形
更多>>
最新评论
STM32
评论于 2010/1/28 15:15:18
Release模式是ST提供的项目模板中的一种模式,与De…
cat_li
评论于 2010/1/28 12:27:22
release模式 指什么
xstm32
评论于 2010/1/28 9:51:58
学习了,谢谢博主
STM32
评论于 2010/1/26 8:56:15
请提出你的疑问。
tyxjl
评论于 2010/1/22 9:31:10
你好,对于选择字节的配置我有些疑问,不知道该怎…
友情链接
博客统计
文章:69篇
评论:172篇
访问:92466
访客记录
cylrwhy foxsports xstm32 winrar hudcm waterx3 日志档案
发表于 2010/1/12 15:24:04
0 标签: STM32 调试 下载程序
调试器不能连接到STM32的问题与解决办法很多人都碰到过调试器不能连接到STM32的问题,不管是IAR的J-Link还是Keil的ULink,或者是ST的ST-Link。出现这个问题时,调试软件会提示不能建立与Cortex-M3的连接,或提示不能下载程序,或提示找不到要调试的设备等。
这样的问题都是发生在调试那些可以在CPU不干预的时候自动运行的模块、或在调试低功耗模式的程序的时候。
所谓“可以在CPU不干预的时候自动运行的模块”包括:DMA、定时器、连续转换模式下的ADC、看门狗等模块。



这个问题的根源是:
1)调试器需要在RAM内执行一段程序,对Flash进行擦写操作,如果不停止这些自动运行的模块,它们会干扰程序在RAM中的执行,致使下载失败。比如DMA模块被配置为不停地拷贝一段数据区,而调试器刚好需要使用DMA数据传输的目标区域,这时DMA的操作将会与调试器的操作发生冲突。再比如,如

果启动了看门狗而没有执行硬件复位,则在下次调试器需要下载程序时,看门狗超时将触发芯片复位,导致下载操作失败。
2)低功耗是通过停止CPU的时钟而实现,JTAG调试是通过与CPU的通信实现,停止了CPU的时钟致使调试器会失去与CPU的通信。



有人说“我停止调试的时候,这些模块已经停止了运行,应该不会干扰到后续的调试”,这个问题要从几方面看:
一、调试器是通过停止CPU核心的时钟来停止被调试程序的运行,实际上被调试芯片的硬件模块并没有被复位,它们还处于使能状态,那些能够自动运行的模块只是处于暂停状态,一旦恢复了时钟之后,它们仍会继续运行。
二、目前常用的调试软件,不管是IAR EWARM还是Keil
MDK,调试软件界面上的"复位"按钮都不能对芯片执行硬件的复位,这个"复位"按钮只能对芯片内的程序执行软件复位,即把运行指针重新指向复位地址。
三、使用板上的复位按钮可以手动地进行硬件复位,使所有模块(包括那些能够自动运行的模块)停止工作并恢复到复位状态。但是当调试器需要控制CPU之前,它需要先为CPU核心提供时钟,然后需要较长的一段时间做一些初始化的动作,然后才能接管CPU核心的控制权。在调试器为CPU核心提供时钟之后,用户程序就已经开始运行起来,如果用户程序在调试器接管CPU核心的控制权之前,就初始化好硬件模块并启动运行,则仍然会产生与调试器的冲突。



根据以上的分析,解决这个问题的关键是,在调试器接管CPU核心的控制权之前,必须停止所有能够自动运行模块的操作,使它们处于关闭状态,要做到这一点,可以有以下几种方案;

1)每次退出调试状态时,先停止所有模块的运行,比如执行该模块的DeInit()操作。
2)在main()函数开始时,不管各模块处于什么状态,先执行该模块的DeInit()操作,然后在程序中较晚的时间或真正需要时再开启相应的模块。这样保证在刚进入调试状态时,调试器能够有充足的时间完成初始化和下载程序的操作。先执行该模块的DeInit()操作的目的是为了关闭哪些上一次操作开启的模块。
3)调整BOOT0/BOOT1的设置,把启动模式改变为从内部SRAM启动,再结合手工硬件复位。由于BOOT0/BOOT1的状态只在硬件复位时是有意义的,而调试器不做硬件复位,所以这样的设置不会影响调试器下载程序到Flash中,也不会影响在Flash中调试程序。

系统分类: 单片机 | 用户分类: 性能分析 | 来源: 无分类 | 【推荐给朋友】 | 【添加到收藏夹】
该用户于2010/1/12 15:47:13编辑过该文章阅读(254) | 评论(0) | 收藏(0) | 举报 | 最后修改于
2009-10-15 09:12

投一票您将和博主都有获奖机会!
最新评论 标题
姓名 必填
主页

验证码: 验证码不正确




相关文档
最新文档