stm32怎么用keil软件进行调试

2023-04-14 13:00   342   0  

在做开发的前几年,基本上都没用仿真,有bug就尝试改程序,一边改一边调试。


甚至都还不知道硬件仿真存在的价值,因为一直都没用过,而且很多芯片也不支持。


直到有一次在做行车记录仪项目的时候,接触到了GRAIN公司的一款单片机。


本来我打算是直接开干的,但是老大非要我把这个芯片的仿真环境搭好。


于是我就开始网上搜集资料,不得不说这块的资料真少,那时又刚接触仿真这块的。


搞了将近半个月都搞不定,然后我鼓起勇气跟老大说,仿真搞不出来,要不我就直接开始写程序烧录进去调试算了。


但是老大的意思还是希望我把仿真的环境搭建出来,我又试了2个星期,还是不行,于是就不理他了,直接开始写程序调试。


如果没浪费时间研究怎么搭建仿环境,估计我程序都完成40%-50%了。


过了一个星期,确实我也把程序跑起来了,在屏上显示了一些UI,老大问我仿真搞定了?


我说没有,跟他说没仿真也能调啊,为什么一定要用仿真?


老大只是笑了笑没说话,我也不解他具体是几个意思,不过后面这个项目没完全做完就跳槽了(不是因为仿真的事情)。


直到后面,我在做一些比较复杂的主机程序的时候,我才理解老大当初为什么叫我一定让我把仿真环境搭建出来。


因为通过硬件仿真开发效率至少比没有仿真高很多!


我来举个简单的例子,比如说我要看一个指针指向的地址。


如果我要看指针指向的地址到底是多少,如果有屏和串口还好,可以通过屏或者串口打印出来。


不过这个过程也需要改程序,调试完以后再把程序注释,还是比较麻烦。


而用仿真的话,直接在keil上面把鼠标移动到指针的位置就能直接看到地址。


这就是效率的差别。


所以,仿真的功能在写一些复杂的产品程序的时候太重要了!


下面,我给大家分享下,stm32怎么用keil进行仿真。


1. keil调试工具设置


de8896c4-ac53-11ed-bcd2-b8ca3a6cb5c4.webp


先点击那个锤子图标进入keil的设置。


de8896c5-ac53-11ed-bcd2-b8ca3a6cb5c4.webp


选择Debug,然后在USE那里点下拉按键,选择St-Link Debugger。


这一步是选择我们使用的仿真器,一般有jtag和st-link,其中st-link实际产品用的最多,所以以这个为主。


de8896c6-ac53-11ed-bcd2-b8ca3a6cb5c4.webp


设置好仿真器以后,我们需要把仿真器连接到板子(我板子是直接用st-link的vdd供电,如果你没用则板子单独供电)


板子上电,并且st-link连接到板子。


de8896c7-ac53-11ed-bcd2-b8ca3a6cb5c4.webp


我们下一步点击Settings,会弹出上图这个界面,如果Device name显示ARM core….就代表板子和st-link连接成功,可以正常进行仿真和烧录程序了。


de8896c8-ac53-11ed-bcd2-b8ca3a6cb5c4.webp


我们点击确定返回到工程界面后,点击红色那个小放大镜进入仿真模式(注意板子和st-link保持连接和供电)。


de8896c9-ac53-11ed-bcd2-b8ca3a6cb5c4.webp


进入仿真模式好,我们看右上角我标注的那几个箭头图标,我红色箭头标注的中间那个就是用的最多的单步执行,也就是说点击一下,就会执行一条语句,这个大家下去可以试下。


df8971f4-ac53-11ed-bcd2-b8ca3a6cb5c4.webp


如果你嫌弃单步执行太慢,也可以设置断点,然后点全速运行,让程序自动跑到断点位置,然后停止等待你下一步的操作。


一般来说,我们调试程序的时候就是通过这种方式。


df8971f5-ac53-11ed-bcd2-b8ca3a6cb5c4.webp


比如说,我现在要看变量a的值在不同程序位置的变化,我可以根据上图来设置断点1,2,然后点全速执行。


df8971f6-ac53-11ed-bcd2-b8ca3a6cb5c4.webp


如果要看程序里变量的值,大家还需要把watch窗口调出来,按照上面的步骤。


df8971f7-ac53-11ed-bcd2-b8ca3a6cb5c4.webp


然后我们把变量名输入到watch窗口方便查看。


df8971f8-ac53-11ed-bcd2-b8ca3a6cb5c4.webp


我们点全速运行,我们可以看到在”2”标识的位置前面有个黄色和蓝色的箭头,代表程序已经执行到这里并且停止。


这个时候,我们看watch窗口a的值,也就是”3”标识的那里,卧槽,怎么没值出来?a这个时候不是应该等于0xAA吗?


别着急,这个是编译器的问题,a定义的是局部变量,编译器把局部变量优化了,并没有在内存中生成导致。


解决办法有两种:


1.调节keil的优化等级


这个大家可以自行度娘,一般我不去改,以免产生别的惊喜。


2.把a改成全局变量


df8971f9-ac53-11ed-bcd2-b8ca3a6cb5c4.webp


改完以后记得重新编译哦,这样就可以看到a的值变为0xFF啦。


上面是仿真看变量,下面仿真看看硬件。


df8971fa-ac53-11ed-bcd2-b8ca3a6cb5c4.webp


这个时候我板子上的LED是熄灭的。


df8971fb-ac53-11ed-bcd2-b8ca3a6cb5c4.webp


上图这个函数就是用来控制LED点亮的,我们继续点全速运行,让程序跑到第24行断点处。


df8971fc-ac53-11ed-bcd2-b8ca3a6cb5c4.webp


这个时候奇迹发生了,LED亮啦!!!是不是很神奇???


学完这两种基本的仿真调试方法,其他的骚操作就靠大家自行发挥啦。


如果大家有什么更好的调试方法也欢迎来告诉我们无际单片机编程团队。


实际的产品调试比这个还要复杂一些,调试过程中也会碰到一些问题。


比如一点单步执行,程序就一直执行,问题千奇百怪,这里说不完。


其实这种问题也很好解决,直接把问题现象在度娘搜一下就可以了,肯定会有人碰到并提供解决的办法。


我一直以来都是这样去解决问题的。




登录icspec成功后,会自动跳转查看全文
博客评论
还没有人评论,赶紧抢个沙发~
发表评论
说明:请文明发言,共建和谐网络,您的个人信息不会被公开显示。