Keil(MDK-ARM)系列教程(八)_在线调试(Ⅰ)

推荐

分享一个大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来!http://www.captainbed.net/strongerhuang

 

我的网站:https://www.strongerhuang.com

我的知乎:https://www.zhihu.com/people/strongerHuang.com

 

Ⅰ、写在前面

Keil在线调试的内容有很多,本文带来在线调试常用的内容:Debug Toolbar调试工具栏复位、全速运行、停止运行、单步调试、逐行调试、跳出调试、运行到光标行、跳转到暂停行、调试窗口)快捷按钮的详细内容。

 

Keil工具栏总共有三种:文件工具栏(File Toolbar)、编译工具栏(Build Toolbar)、调试工具栏(Debug Toolbar)编译工具栏只在编辑模式有效,调试工具栏只在调试模式下有效。文件工具栏在两种模式下都有效。

 

文件工具栏可以参看文章:Keil(MDK-ARM)系列教程(二)_工具栏详细说明.

 

本文内容已经整理成PDF文件,提供给大家下载:

http://pan.baidu.com/s/1nuJ0RDR

 

Ⅱ、本文要点

调试工具栏是我们在线调试时常用的工具栏(按钮),掌握这些按钮就能快速的调试代码,也即能快速的定位我们程序哪些地方存在不足。

 

1.编译,进入调试

编辑(或修改)代码之后,我们需要编译代码(F7)查看是否有错误,编译无误后点击调试按钮(Ctrl + F5)进入在线调试。

 

编译,进入调试动画效果:

 

2.复位,全速运行,停止运行

复位:让程序复位到起点,调试设置恢复到初始状态。这里可以参看文章Keil(MDK-ARM)系列教程(四)_工程目标选项配置(Ⅱ)Debug选项。

 

全速运行(F5):可以让程序运行常看运行状态,也可以在特定位置打断点,让程序运行到特定位置,查看运行状态。

 

停止运行:程序全速运行时(有效),点击该按钮可让程序停止运行。

 

复位,全速运行动画效果:

 

3.单步调试

单步调试(F11)也就是每点一次按钮,程序运行一步,遇到函数会跳进函数执行

 

单步调试动画效果:

 

4.逐步调试

逐行调试(F10)也就是每点一次按钮,程序运行一行,遇到函数跳过函数执行

 

逐步调试动画效果:

 

5.跳出调试

跳出调试(Ctrl + F11)也就是每点一次按钮,程序跳出当前函数执行,直到跳出最外面的函数(main函数)。

 

跳出调试动画效果:

 

6.运行到光标行

运行到光标处(Ctrl + F10)即将光标放在某一行,点击该按钮(或Ctrl + F11),程序执行到光标的位置就会停止下来(前提是程序能执行到光标的位置)。

 

运行到光标行动画效果:

 

7.跳转到暂停行

这个功能在程序停止运行时有效,主要的作用就是我们打开了很多文件,不知道将程序翻到哪里去了,点击改按钮即可知道我们的程序暂停在那个位置。

 

跳转到暂停行动画效果:

 

8.调试窗口

【调试窗口】是在调试的时候可以查看的窗口,这里有别于平时编辑状态下的窗口。平时编辑时View菜单下面的选项很少,但是进入调试模式,这里就多了很多选项,这些选项就是调试时查看的窗口(见下图)。

 

下面简述一下常用的调试窗口

 

A.watch查看窗口

Watch查看窗口也就是我们常用于查看变量的窗口。

 

B.系统外设窗口

这个窗口用于查看外设寄存器数值的窗口。

 

Ⅲ、说明

每一种工具的功能都是需要自己亲自实践,并长期使用才能达到灵活运用的地步,不建议死记硬背。若要了解更多关于Keil的使用教程,可以进入我微信公众号或博客查看。

 

以上内容仅供参考,若有不对之处,敬请谅解。

 

Ⅳ、最后

我的博客:http://blog.youkuaiyun.com/ybhuangfugui

微信公众号:EmbeddDeveloper

 

本着免费分享的原则,方便大家业余利用手机学习知识,定期在微信公众号分享相关知识。如果觉得文章的内容对你有用,又想了解更多相关的文章,请用微信搜索“EmbeddDeveloper” 或者扫描下面二维码、关注,将有更多精彩内容等着你。

<think>Hmm, the user is asking about solutions for when Keil enters debug mode but the program won't run. Based on the references provided, this seems to be a common issue with STM32 development. Let me analyze the key points from the references. The problem manifests as the program getting stuck during debugging - either freezing at SystemInit [^1], failing to reach main() [^4], or showing abnormal behavior like full-speed running without hitting breakpoints [^4]. References point to several potential causes: First, hardware connection issues could be the culprit. Loose JTAG/SWD cables or unstable power supply might disrupt communication. Then there's the debug configuration aspect - the reset mode setting seems critical. Reference [^3] specifically mentions changing from "Reset pin" to "Normal" solved their issue. Software configuration matters too. Incorrect clock settings (especially if external crystals are involved) or disabled debug ports in the code could cause halting. The vector table offset needs to match the actual memory mapping as well. Looking at the code level, interrupt handlers might be problematic if they trigger before full initialization. Reference [^4] suggests disabling communication interrupts before entering debug mode. The solution approach should be methodical: start with hardware checks (cables, power), then debug settings (reset mode, interface selection), followed by software configuration (clocks, debug port enable), and finally inspect initialization code and vector tables. For the user's benefit, I'll organize solutions from simplest to most complex. Hardware checks first since they're quick to verify, then configuration tweaks before diving into code modifications. The related questions should cover prevention and deeper troubleshooting aspects.</think>针对Keil进入调试模式后程序无法运行的问题,结合引用信息和常见解决方案,整理以下排查步骤: ### 一、硬件连接检查 1. **调试器连接** - 检查JTAG/SWD接口是否松动或接触不良 - 尝试更换调试线缆或接口(如SWD替代JTAG) - 确认目标板供电稳定(电压波动可能导致异常)[^1] 2. **复位电路检测** - 检查复位引脚是否被意外拉低 - 测量复位信号波形是否正常 - 尝试手动复位开发板后启动调试 ### 二、调试配置修正 1. **复位模式设置**(关键步骤) 在Debug设置 → Reset选项: ```plaintext [错误配置] Reset pin → [正确配置] Normal ``` 引用[^3]证实此配置错误会导致程序卡在初始化阶段 2. **连接方式调整** ```mermaid graph LR A[Debug设置] --> B(Connect选项) B --> C1{问题现象} C1 -->|卡在SystemInit| D[改为 underReset] C1 -->|无法进入main| E[改为 with Pre-reset] ``` 3. **时钟源配置** - 检查`SystemInit()`中的时钟初始化代码 - 确认外部晶振匹配电路参数(尤其新增外设后) - 临时切换为内部时钟源测试(如HSI) ### 三、软件层面排查 1. **中断冲突处理** ```c // 调试前禁用可能冲突的中断 __disable_irq(); // 进入main后再启用 ``` 引用[^4]表明通信中断可能抢占调试资源 2. **向量表偏移校正** ```c // 在SystemInit中添加(适用于带Bootloader场景) SCB->VTOR = FLASH_BASE | 0x10000; // 根据实际偏移修改 ``` 3. **堆栈溢出检测** - 增大启动文件中的堆栈大小(如Stack_Size EQU 0x1000) - 在map文件中检查__initial_sp是否在有效RAM范围内 ### 四、进阶解决方案 1. **调试接口复用冲突** - 检查GPIO初始化是否禁用了SWD/JTAG引脚(如PA13/PA14) - 在初始化代码后添加延迟: ```c void SystemInit(void) { // ...其他初始化 for(int i=0; i<1000000; i++); // 临时延迟 } ``` 2. **使用复位检测** 在main入口添加硬件复位标志检测: ```c if (RCC->CSR & RCC_CSR_SFTRSTF) { RCC->CSR |= RCC_CSR_RMVF; // 清除复位标志 __NOP(); // 断点位置 } ``` ### 五、替代调试方案 1. **半主机模式禁用** 在Target选项勾选`Use MicroLIB` 或添加以下代码: ```c extern void initialise_monitor_handles(void); #pragma import(__use_no_semihosting) ``` > **重要提示**:若新增外设后出现此问题[^1],建议逐行注释新增代码进行隔离测试,重点检查外设时钟使能顺序和GPIO复用配置。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

strongerHuang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值