目录
摘要视频
前置准备
软件包设置
CubeMx配置
工程主体
感慨
2 前置准备
nes游戏就选用最经典的SuperMary,先创建一个基于06_demo_nes_simulator示例的示例工程,找到其中game目录下的SuperMary.nes文件,将其复制到SD卡上、
3 软件包设置
新建一个基于RT-Spark的模板工程,进入RT setting,进入详细界面,选中硬件,将以下设置添加(选中)
<板载驱动设备>
1.SRAM
2.onboard LCD(ST7789)—>TIM14_CH1
3.File system—>SDCARD
<芯片驱动设备>
1.PWM14 channel1
2.SPI BUS—>RW007 onboard
添加完成后,ctrl+s保存设置
4 CubeMx配置
找到board—>CubeMx_Config目录下的CubeMx_Config.ioc文件,双击进入STM32CubeMx界面
配置同LCD配置
Timers—>TIM14—>PWM Generation CH1
Connectivity—>FSMC—>LCD1
Memory type | LCD Register Select | Data |
LCD Interface | A18 | 8 bits |
设置完成后,点击右上角的GENERATE CODE,回到RT-Studio界面
5 工程主体
先构建项目,此时,CubeMx_Config目录下会多出Drivers,MDK-ARM两个文件夹,控制台会出现很多报错,将这两个文件夹和Src目录下的main.c文件删除,右键工程文件—>同步Scons配置至项目
同步完成后,将示例工程application目录下的main.c的代码复制到模板工程相同目录的main.c文件中进行替换,nes文件夹同理复制到模板工程中,再次构建项目,如果出现报错,再次进行Scons同步后重复操作
此时将工程下载到开发板中,然后打开串口工具(!!记得插上SD卡,不然就会出现如下报错!!)
插上SD卡后,串口工具输出正常
输入命令nes_start sdcard/SuperMary.nes
然后就能看到,又报错了…
这里的报错提示出现了断言失败,那么回到RT-Studio分析代码,搜索small_mem,定位相关代码段
仔细分析一遍并没有发现代码有什么问题,那么问题在哪,为什么会导致断言出现?
查阅相关资料发现,RT_ASSERT的启用依赖于debug.h头文件,而在正式发布产品时,通常会禁用调试代码功能(即不定义RT_DEBUG宏)从而减少代码体积并提高代码效率,但是这里又没有用到debug相关的语句
再次检查代码发现并没有明显问题,使用BC辅助分析
对比可以看到模板工程和示例工程的不同点,重点关注各种config文件还有scons文件,这些都与配置有关
在rtconfig.h文件中,可以看到,模板工程在这里定义了DEBUG的宏,将这两行注释掉,同步scons配置,再次构建项目,下载,测试输入指令LCD是否成功运行游戏
可以看到,这次并没有报错,说明上述操作正常,但是发现LCD上依旧是白屏,并没有按想象中那样运行游戏,这就很令人疑惑了
虽然没有报错,但LCD也没有正常工作,那问题出在哪了?LCD没有运行游戏,但是正常亮起,说明LCD配置方面没有问题,而在这个项目中,RT-Spark开发板上只用到了 LCD,SD插口,按键,很显然按键和当前问题联系不大,那么问题最有可能出在了SD相关的东西上
顺着上面的思路,可以推测,也许是SD插口相关配置没有正常工作,导致SD插口没有读取到SD卡上的数据,也有可能是LCD没有接收到SD卡传入的数据,重新回到代码分析寻找思路
在application的main.c文件中,可以找到nes_start函数的定义,正好在输入指令时用到了nes_start的指令,而通过输入的指令可以看出,nes_start的作用应该是读取SD卡上相关数据
那么可以大胆推测nes_start和我们想要解决的问题有关联,分析nes_start函数,可以知道这个函数的工作就是读取nes文件地址,下载nes文件,然后判断下载的nes文件是否为NULL,这时根据这段代码,又可以发现些许蹊跷
if(!nes){ return-1; }
这段代码在判断nes是否为空,为空则提前退出,那么,又多了一种可能,就是SD的读取和LCD的接收都没有问题,而是提前退出导致nes文件没有运行,往这个if中加入一段打印日志的代码
rt_kprintf("create default!\n");
再次构建项目,下载,然后输入指令
那么问题就显而易见了,程序运行到这时提前退出导致LCD没有显示游戏画面,但是,什么原因导致了程序的提前退出,回到BC将模板工程和示例工程的main.c进行对比
可是并没有发现差异,而且发现application文件夹并没有差异,排除法缩小范围,setting,rt-thread明显无关,application,libraries,和Debug没有差异,都进行排除,再排除一些明显无关的文件
那么只剩下了这些部分,rtconfig_preinc.h文件内容没有差异,Kconfig文件也几乎没有差异,排除
打开board目录,CubeMx_Config,.ignore_format.yml,link.icf,board.h,board.c无明显差异也可以进行排除
那么只剩下了这几个文件,先分析之前分析过的rtconfig.h
这几段包含了和TIMER有关的宏定义,考虑到LCD虽然没有正常运行游戏,但是能正常亮起,先进行排除
前两张虽然看不懂,但是明显和LCD以及nes关联不大,最后一张和网络协议相关,直接排除,那么就排除了rtconfig.h
再来分析其他文件,.config,cconfig.h文件中的内容同理rtconfig.h,排除,那么只剩下了和link相关的两个文件
这些和开发板的linker有关,想到之前的一种可能,SD插口与LCD连接配置出问题导致LCD接收不到SD插口发送的数据,从而程序运行时提前退出,考虑到这种可能,分析代码发现
这几段代码都和nes相关,将它们复制过去,同步scons,构建项目,下载,输入指令,查看运行结果
游戏正常运行,串口工具处也没有报错,说明操作正确,问题解决,nes模拟成功实现!
6 感概
过程有那么一点点曲折,但是最终成功分析出了问题所在并解决,从模板工程到实现示例工程的过程相当于从无到有的创造,满满的成就感,仿佛离b站大佬更近了一步()
示例工程虽然很方便,但是只授之予鱼而非渔,从模板工程开始,一步一步的创造,虽然做出了以后很有成就感,但还是希望相关教程能多出一点(一步步推真的很不容易)
此外,在查看日志的时候还发现不管是示例工程还是模板工程
并没有发现这一段命令打印的路径日志,也没有分析出是什么原因,有知道的大佬可以解答一下
(BC真的很好用)
-
嵌入式
+关注
关注
5161文章
19805浏览量
320124 -
SD卡
+关注
关注
2文章
581浏览量
66272 -
NES
+关注
关注
0文章
7浏览量
7531
发布评论请先 登录
如何安装模拟器玩nes小游戏-基于米尔瑞芯微RK3576开发板
赚人气,用STM32F407做个NES游戏机玩玩
STM32F1做的NES模拟器 支持声音及全屏游戏
ESP32 NES模拟器教程
游戏精灵到NES顶部装载机适配器
【HD-G2UL-EVM开发板体验】掌上游戏机之三 —— NES游戏模拟器移植
5个步骤,让你的核桃派玩回当年火爆全球NES游戏
PC专用经典NES手柄
如何使用ESP32和ATtiny861制作NES模拟器游戏控制台

评论