c语言单片机仿真keil,如何在keil中仿真stm32单片机
一、序言
在学习51单片机的时候,经常会使用keil+protues的方式来做一些实验,这样的模拟仿真为我们节省了很多硬件和时间成本,可以更直观的看到代码的执行过程。那么当切换到stm32系列单片机的时候,protues明显不支持了,但是keil的模拟功能还是有很大的用处,例如stm32f103单片机,在keil中可以实现很好的模拟效果,我们可以在其中使用中断、定时器、PWM等功能,可以观测到GPIO的输出情况。然而keil对stm32系列单片机不是很好的支持,如果换一个型号,你会发现完全无法模拟!!!
二、配置keil,模拟stm32系列单片机
我们可以通过修改某些地方来实现keil对stm32的模拟功能。
1)首先来修改“debug”标签的内容
“Use simulaor”代表要使用软件模拟仿真
“dialog DLL”的内容是“DARMSTM.DLL“,表示使用stm系列
“parameter”的内容是“-pSTM32F051C8“,这里匹配的是当前单片机的型号
2)initialization file
先来看一下这个文件的内容
map 0x40000000,0x4000ffff read write
map 0x40010000,0x4001ffff read write
map 0x40020000,0x4002ffff read write
map 0x48000000,0x4800ffff read write
这段内容其实是在设置单片机的内存地址的读写特性,上面的这几段地址都是可读可写的。C语言就是在存储器里不停的寻址,然后执行指令,那为什么会是上面这些地址呢?可以查看stm32f051单片机的存储器映射
上面只是截取部分存储器的映射情况,这是AHB2的地址。例如你要使用RCC功能,那么可以看到0x40021000•0x400213ff这部分地址需要有读写属性。
三、跟踪某个变量
1)找到逻辑分析仪
完成了基本的配置以后,我们就可以debug了
Debug按钮就不用多说了,中间有一个按钮时逻辑分析仪,我们可以点击它,唤醒逻辑分析功能。逻辑分析仪可以帮助我们以图形的方式来观测某个型号。
2)给逻辑分析仪添加变量
将鼠标定位到全局变量x的左侧,右键-->add x to-->logic analyzer,这样就可以将变量x添加到逻辑分析仪窗口,此时如果点击运行,可以在窗口看到x变量的曲线
3)修改显示效果
从上面的图可以看到,由于x是一个uint8类型的变量,因此取值范围是0~255。但是这样有时候看不出x的变化情况,因此我需要修改逻辑分析仪的显示效果。点击setup,弹出下面的对话框,我们可以修改去x的显示颜色和显示范围
修改之后的显示效果,可以看出来x每2s增加一次,这也正符合代码的逻辑
四、使用systick
上面的x变量显示2s增加一次,原因是我们在代码里面使用了cube库的HAL_Delay函数做了延时,来看一下代码
在cube库中,这个延时函数使用的是systick功能,也许你模拟出的图像显示x不会变化,那是因为你的systick功能没有配置好
1)点击peripheral---core peripheral---system tick timer
2)按照下面的方式,使能systick
3)去掉代码中的等待
如果你在配置时钟代码的时候,有一些状态的等待,那么你需要关掉它,否则无法模拟仿真的
五、追踪GPIO
如果你的代码中要输出一个pwm波,那么逻辑分析仪是好的结果勘测仪器,但是你没有逻辑分析仪,那么还是来软件模拟一下吧。现在假如我使用stm32f051c8这个芯片,在PB2口输出一个pwm波形,那么我们来模拟仿真一下
我们在keil软件的下方可以看到一个command窗口,在其中输入一条指令:
La (*((volatile unsigned int *)0x48000414))>>2
上面的指令是在逻辑分析仪中跟踪某个变量,这个变量的地址是0x48000414的bit2,
翻阅手册你可以看到,这个地址正好是PB2。。。这样我们就看到下面的结果
c语言单片机仿真keil,如何在keil中仿真stm32单片机相关推荐
- 单片机搭建环境烧录方法_万物互联-stm32单片机简介、烧录、编程及其项目环境搭建...
万物互联-stm32单片机简介.烧录.编程 前言:stm32单片机这里给出简单介绍,给不了解的朋友普及下硬件端的基本知识,叙述的较为简单,想深入研究的朋友可以去一些官方网站.论坛.博客汲取知识.最下端 ...
- c语言sgoto 标志位,如何在Go中设置TCP数据包的“不分段”标志位?(How to set “don't fragment” flag bit for TCP packet in Go?)...
如何在Go中设置TCP数据包的"不分段"标志位?(How to set "don't fragment" flag bit for TCP packet in ...
- r语言min-max归一化_如何在R中使用min()和max()
r语言min-max归一化 Finding min and max values is pretty much simple with the functions min() and max() in ...
- c语言删除控制台字符,如何在C中清除控制台?
有几种清除控制台或输出屏幕的方法,其中一种是clrscr()方法.当函数调用时,它将清除屏幕.在" conio.h"头文件中声明.还有一些其他方法,例如system(" ...
- 怎么这一个c语言的dll文件,如何在C中获取DLL文件的版本信息
感谢您的答案. 这对我有用: WCHAR fileName[_MAX_PATH]; DWORD size = GetModuleFileName(g_dllHandle, fileName, _MAX ...
- c语言int t格式,如何在C中打印int64_t类型
C99标准具有整数类型,字节大小类似int64_t.我使用下面的代码: #include #include int64_t my_int = 999999999999999999; printf(&q ...
- swift语言 数组定义_如何在Swift中声明弱引用数组?
I'd like to store an array of weak references in Swift. The array itself should not be a weak refere ...
- python语言打小数点_如何在python中打小数点-问答-阿里云开发者社区-阿里云
python提供了三种浮点值:内置的float与complex类型,以及标准库的decimal.Decimal类型. float类型存放双精度的浮点数,具体取值范围依赖于构建python的c编译器,由 ...
- python语言arrows用法_如何在Python中使用pyarrow读取parquet文件
我已经从数据库中创建了一个具有三列(id.author.title)的parquet文件,并希望使用条件(title='learnpython')读取拼花板文件. 下面提到的是我用于这个POC的pyt ...
- c语言scandir函数排序,如何在c中正确使用scandir()?
我试图在char **变量中存储文件列表. scandir()完成正常,但在尝试打印char **时出现分段错误. 这是代码: int main() { char** fileList; int no ...
最新文章
- 传统网站与营销型网站区别盘比
- Python文件处理
- 深入理解分布式技术 - 缓存过期策略手写LRU
- python关系运算符可以连续使用_python学习笔记-字符串拼接关系运算符逻辑运算符...
- Apache Hive JdbcStorageHandler 编程入门指南
- 设置三个线程顺序打印数字问题(转载)
- android studio 融云,融云 SDK 是否支持 AndroidX
- 2020年 显卡天梯图 / Top Graphics Ranking
- 如何用word制作英语答题卡_英语考试答题卡(word 版)
- springCloud 2020.x 版本变化,移除eureka以外的Netflix组件
- 保护环境从我做起(10件力所能及之事)
- mysql-5.7.27-winx64 安装教程
- 小程序服务器图片的使用
- html隐藏visibility,HTML DOM Style visibility 属性 | 菜鸟教程
- MCU单片机面试题(1)
- C++ Primer Plus 编程练习ch4
- android恢复出厂设置流程分析
- 抛出异常和捕获异常_多捕获和最终重新抛出的异常处理
- 对计算机硬件以及操作系统的一些了解
- 虚拟私有云弹性云服务器的隔离,虚拟私有云和弹性云服务器