打印
[其他ST产品]

stm32怎么用keil软件进行仿真?

[复制链接]
748|31
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
在做开发的前几年,基本上都没用仿真,有bug就尝试改程序,一边改一边调试。
甚至都还不知道硬件仿真存在的价值,因为一直都没用过,而且很多芯片也不支持。
直到有一次在做行车记录仪项目的时候,接触到了GRAIN公司的一款单片机
本来我打算是直接开干的,但是老大非要我把这个芯片的仿真环境搭好。
于是我就开始网上搜集资料,不得不说这块的资料真少,那时又刚接触仿真这块的。
搞了将近半个月都搞不定,然后我鼓起勇气跟老大说,仿真搞不出来,要不我就直接开始写程序烧录进去调试算了。
但是老大的意思还是希望我把仿真的环境搭建出来,我又试了2个星期,还是不行,于是就不理他了,直接开始写程序调试。
如果没浪费时间研究怎么搭建仿环境,估计我程序都完成40%-50%了。
过了一个星期,确实我也把程序跑起来了,在屏上显示了一些UI,老大问我仿真搞定了?
我说没有,跟他说没仿真也能调啊,为什么一定要用仿真?
老大只是笑了笑没说话,我也不解他具体是几个意思,不过后面这个项目没完全做完就跳槽了(不是因为仿真的事情)。
直到后面,我在做一些比较复杂的主机程序的时候,我才理解老大当初为什么叫我一定让我把仿真环境搭建出来。
因为通过硬件仿真开发效率至少比没有仿真高很多!
我来举个简单的例子,比如说我要看一个指针指向的地址。
如果我要看指针指向的地址到底是多少,如果有屏和串口还好,可以通过屏或者串口打印出来。
不过这个过程也需要改程序,调试完以后再把程序注释,还是比较麻烦。
而用仿真的话,直接在keil上面把鼠标移动到指针的位置就能直接看到地址。
这就是效率的差别。
所以,仿真的功能在写一些复杂的产品程序的时候太重要了!
下面,我给大家分享下,stm32怎么用keil进行仿真。

使用特权

评论回复
沙发
和下土|  楼主 | 2022-3-24 15:09 | 只看该作者
1.keil调试工具设置

使用特权

评论回复
板凳
和下土|  楼主 | 2022-3-24 15:09 | 只看该作者
先点击那个锤子图标进入keil的设置。


使用特权

评论回复
评论
和下土 2022-3-24 15:10 回复TA
选择Debug,然后在USE那里点下拉按键,选择St-Link Debugger。 
地板
和下土|  楼主 | 2022-3-24 15:11 | 只看该作者
这一步是选择我们使用的仿真器,一般有jtag和st-link,其中st-link实际产品用的最多,所以以这个为主。

使用特权

评论回复
5
和下土|  楼主 | 2022-3-24 15:11 | 只看该作者
设置好仿真器以后,我们需要把仿真器连接到板子(我板子是直接用st-link的vdd供电,如果你没用则板子单独供电)。

使用特权

评论回复
6
和下土|  楼主 | 2022-3-24 15:12 | 只看该作者
板子上电,并且st-link连接到板子。

使用特权

评论回复
7
和下土|  楼主 | 2022-3-24 15:12 | 只看该作者
我们下一步点击Settings,会弹出上图这个界面,如果Device name显示ARM core….就代表板子和st-link连接成功,可以正常进行仿真和烧录程序了。

使用特权

评论回复
8
和下土|  楼主 | 2022-3-24 15:13 | 只看该作者

使用特权

评论回复
9
和下土|  楼主 | 2022-3-24 15:13 | 只看该作者
我们点击确定返回到工程界面后,点击红色那个小放大镜进入仿真模式(注意板子和st-link保持连接和供电)。

使用特权

评论回复
10
和下土|  楼主 | 2022-3-24 15:14 | 只看该作者
进入仿真模式好,我们看右上角我标注的那几个箭头图标,我红色箭头标注的中间那个就是用的最多的单步执行,也就是说点击一下,就会执行一条语句,这个大家下去可以试下。

使用特权

评论回复
11
和下土|  楼主 | 2022-3-24 15:15 | 只看该作者

使用特权

评论回复
12
和下土|  楼主 | 2022-3-24 15:15 | 只看该作者
如果你嫌弃单步执行太慢,也可以设置断点,然后点全速运行,让程序自动跑到断点位置,然后停止等待你下一步的操作。

使用特权

评论回复
13
和下土|  楼主 | 2022-3-24 15:16 | 只看该作者
一般来说,我们调试程序的时候就是通过这种方式。

使用特权

评论回复
14
和下土|  楼主 | 2022-3-24 15:17 | 只看该作者

使用特权

评论回复
15
和下土|  楼主 | 2022-3-24 15:17 | 只看该作者
比如说,我现在要看变量a的值在不同程序位置的变化,我可以根据上图来设置断点1,2,然后点全速执行。

使用特权

评论回复
16
和下土|  楼主 | 2022-3-24 15:21 | 只看该作者

使用特权

评论回复
17
和下土|  楼主 | 2022-3-24 15:21 | 只看该作者
如果要看程序里变量的值,大家还需要把watch窗口调出来,按照上面的步骤。

使用特权

评论回复
18
和下土|  楼主 | 2022-3-24 15:22 | 只看该作者
然后我们把变量名输入到watch窗口方便查看。



使用特权

评论回复
19
和下土|  楼主 | 2022-3-24 15:24 | 只看该作者
我们点全速运行,我们可以看到在”2”标识的位置前面有个黄色和蓝色的箭头,代表程序已经执行到这里并且停止。

使用特权

评论回复
20
和下土|  楼主 | 2022-3-24 15:24 | 只看该作者
这个时候,我们看watch窗口a的值,也就是”3”标识的那里,卧槽,怎么没值出来?a这个时候不是应该等于0xAA吗?

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

102

主题

1061

帖子

0

粉丝