单片机的三大秘境之揭秘 KEIL调试那些不为人知的事

///插播一条:我自己在今年年初录制了一套还比较系统的入门单片机教程,想要的同学找我拿就行了免費的,私信我就可以哦~点我头像黑色字体加我地球呺也能领取哦。最近比较闲,带做毕设,带学生参加省级或以上比赛///

导读:授人以鱼不如授人以渔,为什么那些前辈们能快速定位问题,这个系列的文章将揭秘 KEIL调试那些不为人知的事。

以下内容更适用于 STM32单片机(51也支持部分)。掌握了它们将加速你的调试速度,不信吗?试试看咯。

程序中最重要的是什么,数据。很多时候程序运行有问题和你的数据密切相关,如果你能实时观察程序中的数据,你觉得如何?

数据分为两种,一种是可变的,一种为不可变的。比如 RAM数据为可变的,FLASH数据为不可变的(实际上也能改变,不然你怎么把程序烧写到 FLASH中呢),还有一种极其特殊的存在:寄存器数据。

1、变量查看

首先说说可变数据的查看方式,比如你声明的一些变量,可以通过 Watch窗口查看。

通过以下方式可打开 Watch窗口(任选一个窗口打开即可):

在这里可以查看变量(这里选择 Watch 1):

是否发现上面的显示不太对劲?>,这是啥意思?这个是说明 KEIL无法找到这个变量。就我所知,有两种情况会出现这种现象:

1)、这个变量不存在:有可能你之前声明过这个变量,后来发现没用到,删除了。

2)、使用 static声明的变量。

比如像这样的:

如果是第二种情况,那么可以通过将程序运行到使用该变量的地方,然后停止就可以查看了。

添加变量:

那么如何添加你需要查看的变量呢?通常可以使用如下方法:

1)、光标处于变量位置,然后右击会出现一个界面,最后选择添加到你需要的窗口:

2)、直接将你的变量拖到你的 Watch窗口(前提是你已经打开了 Watch窗口):

3)、复制变量名,然后将变量名粘贴在窗口里面就可以了。

移除变量

能添加,也就能移除,可以通过以下方法移除你的变量(注意程序应该处于停止状态):

当然还有一种方法就是直接删除这个变量名,这也可以达到移除的效果。

如果你希望使用十进制的方式显示你的数据,那么试试去掉上面的 Hexadecimal Display勾选吧。

2、内存查看

如果你想查看 FLASH的数据怎么办?那么试试这个窗口:

比如说你想看看 FLASH地址开始处是什么数据,只要把 0x0800 0000输入进去后按回车键就可以了(注意数字中间没有空格,只是为了看起来方便才用空格分开的):

四字节显示不爽?那试试改变显示格式吧,无符号,有符号,char、int、float……任你选(如果不想用十进制表示,必须去掉 Decimal的勾选):

如果需要修改某个地址的数据,也可以通过上面的方式在某个数据上右击后选择修改(Modify)。

事实上,除了 FLASH数据,RAM数据也是可以通过它观察的:

从这里可以看到,Memory在数据显示上比 Watch窗口更强大,它可以对单片机上的所有数据进行查看,缺点就是你不知道谁是谁了(没有变量名显示,只能靠地址分辨了)。

对于以上知识可能很多人都了解过,下面说一说一般人不知道的点:

对于单片机来说,片上外设决定了你单片机的功能,所以多数情况下都需要查看外设寄存器的值,那么该如何查看呢?

通过 Watch窗口就可以了。怎么做?

以最为常用的串口外设为例说明:

之后你就可以看到寄存器的内容了:

是不是很方便啊。那到底添加什么标志符才能显示出来呢?实际上这个标志符就是那些外设宏定义了。怎么看?前面鱼鹰说过搜索也算一个调试功能,那你在工程内搜索之后就会发现这个定义:

明白了吧,你输入的 USART1其实就是一个指针,然后 KEIL就会从这个地址里读出数据并按照你的指针结构体显示出来。知道了这个,你应该也就知道该如何查看 GPIO、SPI等外设了。

其实这里还有一个额外的好处,不知道你是否发现了。我们都知道,使用宏定义虽好,但它有一个很麻烦的地方,就是不能很直观的知道这个值到底是多少,那么通过这个你也就可以知道 USART1的值就是 0x4001 3800了,也就是 USART1 外设基地址就是它:

事实上通过 Memory窗口也是可以的:

只是没有 Watch窗口那么直观罢了。

那么为什么需要支持这两种方式呢?我们知道有些变量空间非常大,比如串口缓存数组,可能有好几K,如果你通过 Watch窗口查看的话,你会发现它会严重干扰你的程序运行,表现情况就是数据刷新缓慢,但是通过 Memory就不一样了,相当流畅。所以如果你要看大数据的话,用 Memory效果最好。

还有一个好处就是,它能随时更改变量的显示方式,比如说你把一个浮点数据放在了四个字节数组变量中,那么我想查看这个浮点数据是什么怎么办,我不可能通过浮点数据的存储格式手工计算一下吧?如果你能计算出来还好,说明你很厉害,但是万一不懂存储格式或者计算错了呢?使用 Memory就不同了,你只要把这个数组的地址给它,然后设置显示方式为浮点型就可以了,相当方便。还有就是当使用宏定义时,查看这个宏定义的值非常不方便,使用 Memory就可以轻松查看。

比如查看 USART1的 DR寄存器地址,在 Watch窗口显示是这样的:

如果你要知道 DR的地址,你就需要通过基地址 0x400 13800和偏移地址 0x04知道它的地址为 0x400 13804,即使用 Watch单独查看 DR也是一样:

但是通过 Memory就是这样的:

这里千万要注意的是要使用取地址符 &,否则它就变成了这样:

外设地址怎么可能是0,所以肯定错了。

事实上你用 Watch也是可以的,但显得比较诡异,会让你觉得这是一个指针变量:

实际上它只是一个常量而已,并不是指针变量。

在这里你会发现,这些窗口支持运算符,看这个:

还有这个:

变量的查看也是如此,是不是特别方便啊。需要注意的是,Watch窗口和 Memory都支持在线修改数据,对于需要临时更改数据情况下非常有用。

单片机的三大秘境之揭秘 KEIL 调试那些不为人知的事相关推荐

  1. KEIL 调试经验总结

    来源:公众号[鱼鹰谈单片机] 作者:鱼鹰Osprey ID   :emOsprey 通过前面的多篇文章(已整理成专辑)我们已经了解了很多的 KEIL 调试方法,但是到底该怎么使用这些方法呢?这篇文章将 ...

  2. 佛祖保佑,永无 BUG,永不修改 | KEIL 调试系列总结篇

    本篇将总结前面关于KEIL调试系列文章,方便后来人系统查看文章. 在此之前,请看以下视频: (视频请看原文链接) 这个视频展示了鱼鹰平时是如何运用前面的KEIL调试方法进行调试的. 为了让自己能够在遗 ...

  3. keil调试串口的软件仿真方法

    Keil(MDK-ARM)使用教程(三)_在线调试 keil调试串口的软件仿真方法 由于我是直接使用(打开现有的软件工程),如果跟着需要下载上面演示参考的软件工程才行.工程默认是使用硬件在线调试,接下 ...

  4. Keil调试局部变量显示not in scope的问题解决

    Keil调试局部变量显示"not in scope"的问题解决     今天在调试程序的时候,发现函数返回值赋值给变量时,变量值总是显示"not in scope&quo ...

  5. STM32使用MDK keil 调试问题汇总

    一.MDK keil 调试指针不跳转 MOVS r0,r0问题 问题:keil 调试指针不跳转   MOVS r0,r0 keil硬仿卡死,Disassembly窗口停留在      0xFFFFFF ...

  6. keil 调试 操作系统_调试操作系统:内存分配的经验教训

    keil 调试 操作系统 It began, as so many investigations do, with a bug report. 和许多调查一样,它是从一个错误报告开始的 . The n ...

  7. 有关利用PL2303HX USB到RS232 TTL转换器适配器模块把STC89C52RC等STC系列单片机与计算机连接、向Keil添加STC库及hex文件考录方法小结

    有关利用PL2303HX USB到RS232 TTL转换器适配器模块把STC89C52RC等STC系列单片机与计算机连接.向Keil添加STC库及hex文件考录方法小结 PL2303HX转换器适配器模 ...

  8. Keil调试显示波形方法

    在实际工程调试中,很多时候需要显示一些数据的曲线来辅助调试,观察变量的变化状态:有些MCU不带DAC功能,需要用定时器模拟,使用时也不方便.在经过一系列的尝试后Keil Array Visualiza ...

  9. keil调试stm32无法退出debug

    keil调试stm32,debug之后有时会遇到这种情况.导致无法退出debug,只能任务管理器强制结束任务. 原因: keil对中文的支持不够友好. 工程路径过深或路径中有中文. 调试过程中打了断电 ...

最新文章

  1. Linux查看多核CPU利用率
  2. Spring Cloud微服务笔记(一)微服务与云概念
  3. C#判断某软件是否安装
  4. 战斗机各种世界之最,涨知识了。。。
  5. 再见Spring Security!推荐一款功能强大的权限认证框架,用起来够优雅!
  6. PyTorch 1.0 中文文档:广播语义
  7. 10万量级30秒自动化配座,0现场故障:这届冬奥票务系统有点不一样
  8. EditText以及登录UI实现
  9. 分布式事务处理--消息发送一致性的异常流程处理
  10. 如何使用Beyond Compare中心窗格
  11. oracle负数,oracle取交集_oracle取负数_oracle case when
  12. 电子电工产品IP防水测试及测试设备
  13. ibm服务器硬件故障检测工具,IBM服务器故障提示Memory/bttery problems were detected
  14. 从零开始封装windows10 1803 超详细图文分享 第三篇:程序的安装与优化
  15. 融合零样本学习和小样本学习的弱监督学习方法综述
  16. Excel表格文件,.xls和.xlsx格式的区别
  17. 四大抓包神器,非常好用
  18. 计算机钢琴汇编设计报告,汇编梦幻钢琴程序设计报告.doc
  19. 手动卸数+传输文件+入库
  20. 【思维导图】LAMPer技能树

热门文章

  1. 中国无纺布湿巾行业市场供需与战略研究报告
  2. word2007页面设置——首页不编码
  3. Linux assert
  4. 投影到电脑显示添加无线显示器
  5. Android WorkManager★★★
  6. GDB调试多线程程序
  7. 山东自学考试计算机专业目录,山东省高教自学考试开考专业目录
  8. linux内核4.9系统版本,Linux4.9版本将会有哪些不一样的特性
  9. 远程文件拷贝(fastcopy为例)
  10. python引用turtle画烟花_代码也浪漫:用Python放一场烟花秀!