一、序言

在学习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单片机相关推荐

  1. 单片机搭建环境烧录方法_万物互联-stm32单片机简介、烧录、编程及其项目环境搭建...

    万物互联-stm32单片机简介.烧录.编程 前言:stm32单片机这里给出简单介绍,给不了解的朋友普及下硬件端的基本知识,叙述的较为简单,想深入研究的朋友可以去一些官方网站.论坛.博客汲取知识.最下端 ...

  2. 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 ...

  3. 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 ...

  4. c语言删除控制台字符,如何在C中清除控制台?

    有几种清除控制台或输出屏幕的方法,其中一种是clrscr()方法.当函数调用时,它将清除屏幕.在" conio.h"头文件中声明.还有一些其他方法,例如system(" ...

  5. 怎么这一个c语言的dll文件,如何在C中获取DLL文件的版本信息

    感谢您的答案. 这对我有用: WCHAR fileName[_MAX_PATH]; DWORD size = GetModuleFileName(g_dllHandle, fileName, _MAX ...

  6. c语言int t格式,如何在C中打印int64_t类型

    C99标准具有整数类型,字节大小类似int64_t.我使用下面的代码: #include #include int64_t my_int = 999999999999999999; printf(&q ...

  7. swift语言 数组定义_如何在Swift中声明弱引用数组?

    I'd like to store an array of weak references in Swift. The array itself should not be a weak refere ...

  8. python语言打小数点_如何在python中打小数点-问答-阿里云开发者社区-阿里云

    python提供了三种浮点值:内置的float与complex类型,以及标准库的decimal.Decimal类型. float类型存放双精度的浮点数,具体取值范围依赖于构建python的c编译器,由 ...

  9. python语言arrows用法_如何在Python中使用pyarrow读取parquet文件

    我已经从数据库中创建了一个具有三列(id.author.title)的parquet文件,并希望使用条件(title='learnpython')读取拼花板文件. 下面提到的是我用于这个POC的pyt ...

  10. c语言scandir函数排序,如何在c中正确使用scandir()?

    我试图在char **变量中存储文件列表. scandir()完成正常,但在尝试打印char **时出现分段错误. 这是代码: int main() { char** fileList; int no ...

最新文章

  1. 传统网站与营销型网站区别盘比
  2. Python文件处理
  3. 深入理解分布式技术 - 缓存过期策略手写LRU
  4. python关系运算符可以连续使用_python学习笔记-字符串拼接关系运算符逻辑运算符...
  5. Apache Hive JdbcStorageHandler 编程入门指南
  6. 设置三个线程顺序打印数字问题(转载)
  7. android studio 融云,融云 SDK 是否支持 AndroidX
  8. 2020年 显卡天梯图 / Top Graphics Ranking
  9. 如何用word制作英语答题卡_英语考试答题卡(word 版)
  10. springCloud 2020.x 版本变化,移除eureka以外的Netflix组件
  11. 保护环境从我做起(10件力所能及之事)
  12. mysql-5.7.27-winx64 安装教程
  13. 小程序服务器图片的使用
  14. html隐藏visibility,HTML DOM Style visibility 属性 | 菜鸟教程
  15. MCU单片机面试题(1)
  16. C++ Primer Plus 编程练习ch4
  17. android恢复出厂设置流程分析
  18. 抛出异常和捕获异常_多捕获和最终重新抛出的异常处理
  19. 对计算机硬件以及操作系统的一些了解
  20. 虚拟私有云弹性云服务器的隔离,虚拟私有云和弹性云服务器

热门文章

  1. SECS/GSM 测试工具
  2. 从Shutterstock下载无水印图片
  3. Android 裁剪摄像头预览窗口-SurfaceView
  4. 手写汉字识别数据集的预处理
  5. 系统工程原理——指标权重的确定方法
  6. android psensor测试,MTK camera驱动结构
  7. 不打补贴战,快狗打车凭什么冲刺“同城货运第一股”?
  8. 科三——应对特殊情况
  9. 独家深访:腾讯变革150天全记录
  10. python怎么转换中文_使用Python进行中文繁简转换