在最初几年的发展中,基本上没有使用模拟。如果有错误,试着改变程序,同时调试它。
我甚至不知道硬件仿真的价值,因为从来没用过,很多芯片都不支持。
直到有一次,我在做行车记录仪项目的时候,接触到了一个粮食公司的单片机。
我本来打算直接启动的,但是老板坚持让我设置这个芯片的仿真环境。
于是我开始在网上搜集资料,不得不说这一块的资料真的很少,而且当时也是刚接触到模拟这一块。
近半个月的工作,我做不下去了。然后我鼓起勇气跟老板说,模拟做不了,不然我就直接开始写程序烧了调试。
但是老板还是想让我建立模拟环境。我又试了2周,还是不行,就不理他了,开始写程序调试。
如果不是浪费时间研究如何搭建调试环境,估计我的程序早就完成40%-50%了。
一周后,我确实运行了程序,并在屏幕上显示了一些UI。老板问我模拟做好了吗?
我说不用,告诉他不用模拟也能调。为什么一定要用模拟?
老板只是笑笑不说话,我也不明白他什么意思。然而,他在这个项目没有完全完成后就跳槽了(不是因为模拟)。
直到后来,我在做一些复杂的主机程序的时候,我才明白为什么老板让我设置模拟环境。
因为通过硬件仿真的开发效率至少比没有仿真的高很多!
我举个简单的例子。例如,我希望看到指针指向的地址。
如果我想看指针所指的地址,如果有屏幕或者串口,我可以通过屏幕或者串口打印出来。
但是这个过程也需要修改程序,调试后给程序做注解比较麻烦。
使用simulation,将鼠标移动到keil上的指针上,就可以直接看到地址。
这就是效率的差别。
所以在编写一些复杂的产品程序时,仿真的作用太重要了!
下面,我给大家分享一下如何用keil模拟stm32。
keil调试工具设置
点击锤子图标,先进入keil的设置。
选择Debug,然后单击使用中的下拉按钮,并选择St-Link Debugger。
这一步是选择我们使用的仿真器。一般jtag和st-link都有,其中st-link是最常用的产品,所以这个是主要的。
设置好仿真器后,我们需要将仿真器连接到板(我的板直接用st-link的vdd供电,不用的话,板单独供电)。
板上电,st-link连接到板上。
接下来,当我们点击设置时,会弹出上图所示的界面。如果设备名称显示ARM内核
在我们点击OK返回工程界面后,点击红色放大镜进入仿真模式(注意板卡和st-link已连接并通电)。
进入模拟模式就好。让我们看看我在右上角标记的箭头图标。中间用我的红色箭头标记的是使用最多的单步执行。也就是说,一旦点击,就会执行一条语句。你可以试试这个。
如果不喜欢单步执行慢,也可以设置一个断点,然后全速运行,让程序自动运行到断点,然后停止等待你的下一次操作。
一般来说,我们就是这样调试程序的。
比如现在我想看看变量A的值在不同程序位置的变化。我可以根据上图设置断点1和断点2,然后点击全速执行。
如果要查看程序中变量的值,还需要调出watch窗口,按照上面的步骤操作。
然后我们将变量名输入到监视窗口中,以便于查看。
我们正在全速运行,在标有“2”的位置前面可以看到一个黄蓝相间的箭头,表示程序已经执行到这里,停止了。
这时候我们再来看手表窗口A的值,也就是标有“3”的地方,躺在槽里。为什么不值得?这时候A不应该等于0xAA吗?
不用担心,这是编译器的问题。a定义局部变量,编译器优化局部变量,局部变量不是在内存中生成的。
有两种解决方案:
1。调整keil的优化级别
你可以自己支配时间。一般我不改是为了避免其他惊喜。
2。将A更改为全局变量
更改后记得重新编译,这样可以看到A的值变成了0xFF。
以上是模拟变量,以下是模拟硬件。
此时,我的板上的LED不亮。
以上功能用于控制LED照明。让我们继续全速运行,让程序运行到第24行的断点。
这时奇迹发生了,LED亮了!!!是不是很神奇???
学会了模拟和调试这两个基本方法,剩下的骚操作就看大家自己的发挥了。
如果你有什么更好的调试方法,欢迎来告诉我们无边的单片机编程团队。
实际产品调试比这个复杂,调试过程中会遇到一些问题。
比如一个程序单步执行,程序会一直执行下去,还有各种各样的问题,这里说不完。
其实这种问题也很好解决。直接在度娘里搜现象就行了,肯定会有人碰到,并提供解决方案。
这是我解决问题的方式。
本文来自少年我念你投稿,不代表舒华文档立场,如若转载,请注明出处:https://www.chinashuhua.cn/24/635325.html