当前位置:首页 > 网络技术 > keil5仿真调试教程(详解proteus仿真步骤)(keil与proteus仿真调试)

keil5仿真调试教程(详解proteus仿真步骤)(keil与proteus仿真调试)

longge@20222022-03-24 01:48:27网络技术139

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

这就是效率的差别。

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

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

keil调试工具设置

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

解决办法有两种:

1.调节keil的优化等级

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

2.把a改成全局变量

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

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

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

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

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

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

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

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

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

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

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

免责声明
本站部分资源来源于互联网 如有侵权 请联系站长删除
龙哥网是优质的互联网科技创业资源_行业项目分享_网络知识引流变现方法的平台为广大网友提供学习互联网相关知识_内容变现的方法。

“keil5仿真调试教程(详解proteus仿真步骤)(keil与proteus仿真调试)” 的相关文章

Javascript调用新浪股票数据接口返回的股票价格代码(普通版)(新浪股票历史数据接口)

Javascript调用新浪股票数据接口返回的股票价格代码(普通版)(新浪股票历史数据接口)

通过调用新浪实时股票数据接口返回的数据实现指定股票数据的调用,以下代码非实时更新,刷新页面才会更新股票数据。 步骤: 1、以中国平安的股票代码为例,调用新浪股票数据接口: &...

改变你未来九节运动科学课程

改变你未来九节运动科学课程

课程介绍运动科学将理论与运动实践相结合,主要研究体育运动与人的机体的相互关系及其规律,涉及运动学、生物学、养生学、医学等学科,在运动训练基地、运动保健康复中心等进行运动健身与营养指导、运动员身体机能诊...

饿了么领25-20元吃货联盟红包 需好友助力

饿了么领25-20元吃货联盟红包 需好友助力

先使用软件将定位改到无锡市或宁波市,然后打开饿了么APP点击我的-每日抢好券进去开启助力邀请10位好友助力即可领取30元吃货联盟红包 领取后免费吃一顿美食美滋滋!助力的用户可以不用改定位!...

SpringBoot 整合mapstruct的实现步骤_java

SpringBoot 整合mapstruct的实现步骤_java

目录 前言 mapstruct 使用来干什么的? mapstruct 相对于BeanUtils的优势在哪? 编码 引入依赖 创建 DTO、V...

springboot响应json null值过滤方式_java

springboot响应json null值过滤方式_java

目录 springboot响应json null值过滤 springboot处理返回json的null值 1、新建配置类(JsonConfig.java) 2、在启...

SpringBoot拦截器使用精讲_java(springboot 拦截器)

SpringBoot拦截器使用精讲_java(springboot 拦截器)

目录 定义拦截器 注册拦截器 指定拦截规则 实现登陆功能 验证登陆及登陆拦截功能 我们对拦截器并不陌生,无论是 Struts 2 还是 Spring MVC 中都...