0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

[NES]从模板工程到NES模拟的实现 | 技术集结

RT-Thread官方账号 2025-08-23 10:06 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

目录


摘要视频


前置准备


软件包设置


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卡,不然就会出现如下报错!!)

bf3ac090-7fc5-11f0-9080-92fbcf53809c.png

插上SD卡后,串口工具输出正常

bf4eaa9c-7fc5-11f0-9080-92fbcf53809c.png

输入命令nes_start sdcard/SuperMary.nes

然后就能看到,又报错了…

bf669e2c-7fc5-11f0-9080-92fbcf53809c.png

这里的报错提示出现了断言失败,那么回到RT-Studio分析代码,搜索small_mem,定位相关代码段

bf813098-7fc5-11f0-9080-92fbcf53809c.png

仔细分析一遍并没有发现代码有什么问题,那么问题在哪,为什么会导致断言出现?

查阅相关资料发现,RT_ASSERT的启用依赖于debug.h头文件,而在正式发布产品时,通常会禁用调试代码功能(即不定义RT_DEBUG宏)从而减少代码体积并提高代码效率,但是这里又没有用到debug相关的语句

再次检查代码发现并没有明显问题,使用BC辅助分析

bf94cfea-7fc5-11f0-9080-92fbcf53809c.png

对比可以看到模板工程和示例工程的不同点,重点关注各种config文件还有scons文件,这些都与配置有关

bfa5ef32-7fc5-11f0-9080-92fbcf53809c.png

在rtconfig.h文件中,可以看到,模板工程在这里定义了DEBUG的宏,将这两行注释掉,同步scons配置,再次构建项目,下载,测试输入指令LCD是否成功运行游戏

bfb8a726-7fc5-11f0-9080-92fbcf53809c.png

可以看到,这次并没有报错,说明上述操作正常,但是发现LCD上依旧是白屏,并没有按想象中那样运行游戏,这就很令人疑惑了

虽然没有报错,但LCD也没有正常工作,那问题出在哪了?LCD没有运行游戏,但是正常亮起,说明LCD配置方面没有问题,而在这个项目中,RT-Spark开发板上只用到了 LCD,SD插口,按键,很显然按键和当前问题联系不大,那么问题最有可能出在了SD相关的东西上

顺着上面的思路,可以推测,也许是SD插口相关配置没有正常工作,导致SD插口没有读取到SD卡上的数据,也有可能是LCD没有接收到SD卡传入的数据,重新回到代码分析寻找思路

在application的main.c文件中,可以找到nes_start函数的定义,正好在输入指令时用到了nes_start的指令,而通过输入的指令可以看出,nes_start的作用应该是读取SD卡上相关数据

bfc31c38-7fc5-11f0-9080-92fbcf53809c.png

那么可以大胆推测nes_start和我们想要解决的问题有关联,分析nes_start函数,可以知道这个函数的工作就是读取nes文件地址,下载nes文件,然后判断下载的nes文件是否为NULL,这时根据这段代码,又可以发现些许蹊跷

if(!nes){ return-1; }

这段代码在判断nes是否为空,为空则提前退出,那么,又多了一种可能,就是SD的读取和LCD的接收都没有问题,而是提前退出导致nes文件没有运行,往这个if中加入一段打印日志的代码

rt_kprintf("create default!\n");

再次构建项目,下载,然后输入指令

bfd9e206-7fc5-11f0-9080-92fbcf53809c.png

那么问题就显而易见了,程序运行到这时提前退出导致LCD没有显示游戏画面,但是,什么原因导致了程序的提前退出,回到BC将模板工程和示例工程的main.c进行对比

可是并没有发现差异,而且发现application文件夹并没有差异,排除法缩小范围,setting,rt-thread明显无关,application,libraries,和Debug没有差异,都进行排除,再排除一些明显无关的文件

bfe58606-7fc5-11f0-9080-92fbcf53809c.png

那么只剩下了这些部分,rtconfig_preinc.h文件内容没有差异,Kconfig文件也几乎没有差异,排除

打开board目录,CubeMx_Config,.ignore_format.yml,link.icf,board.h,board.c无明显差异也可以进行排除

bff329be-7fc5-11f0-9080-92fbcf53809c.png

那么只剩下了这几个文件,先分析之前分析过的rtconfig.h

c003da66-7fc5-11f0-9080-92fbcf53809c.png

这几段包含了和TIMER有关的宏定义,考虑到LCD虽然没有正常运行游戏,但是能正常亮起,先进行排除

c0156056-7fc5-11f0-9080-92fbcf53809c.pngc025e07a-7fc5-11f0-9080-92fbcf53809c.pngc033ce92-7fc5-11f0-9080-92fbcf53809c.png

前两张虽然看不懂,但是明显和LCD以及nes关联不大,最后一张和网络协议相关,直接排除,那么就排除了rtconfig.h

再来分析其他文件,.config,cconfig.h文件中的内容同理rtconfig.h,排除,那么只剩下了和link相关的两个文件

c03fb928-7fc5-11f0-9080-92fbcf53809c.png

这些和开发板的linker有关,想到之前的一种可能,SD插口与LCD连接配置出问题导致LCD接收不到SD插口发送的数据,从而程序运行时提前退出,考虑到这种可能,分析代码发现

c04d0196-7fc5-11f0-9080-92fbcf53809c.pngc055e662-7fc5-11f0-9080-92fbcf53809c.png

这几段代码都和nes相关,将它们复制过去,同步scons,构建项目,下载,输入指令,查看运行结果

c05e9a64-7fc5-11f0-9080-92fbcf53809c.pngc066fc04-7fc5-11f0-9080-92fbcf53809c.jpg

游戏正常运行,串口工具处也没有报错,说明操作正确,问题解决,nes模拟成功实现!

6 感概


过程有那么一点点曲折,但是最终成功分析出了问题所在并解决,从模板工程到实现示例工程的过程相当于从无到有的创造,满满的成就感,仿佛离b站大佬更近了一步()

示例工程虽然很方便,但是只授之予鱼而非渔,从模板工程开始,一步一步的创造,虽然做出了以后很有成就感,但还是希望相关教程能多出一点(一步步推真的很不容易)

此外,在查看日志的时候还发现不管是示例工程还是模板工程

c0738a50-7fc5-11f0-9080-92fbcf53809c.png

并没有发现这一段命令打印的路径日志,也没有分析出是什么原因,有知道的大佬可以解答一下

(BC真的很好用)

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5163

    文章

    19805

    浏览量

    320128
  • SD卡
    +关注

    关注

    2

    文章

    581

    浏览量

    66273
  • NES
    NES
    +关注

    关注

    0

    文章

    7

    浏览量

    7531
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    如何安装模拟器玩nes小游戏-基于米尔瑞芯微RK3576开发板

    本篇源自:优秀创作者 小手凉凉本文将介绍基于米尔电子MYD-LR3576开发板(米尔基于瑞芯微 RK3576开发板)的安装模拟器玩nes小游戏方案测试。 核心板系统 操作系统镜像文件说明
    发表于 02-08 12:10

    赚人气,用STM32F407做个NES游戏机玩玩

    的,感谢一下,不过不爽的是原子的NES是跑在UCOS上的,这个被我移植裸机上的,自由度高一点,代码还有BUG,最近忙没优化,可以公开大家一起搞搞,不过工程都是分开的,没合到一起,看看大家感兴趣不,再传。`
    发表于 11-18 11:29

    STM32F1做的NES模拟器 支持声音及全屏游戏

    最近一直想做个NES模拟器玩玩,在网上一顿狂搜各种资料,视频,移值过很多各版本的模拟器,我感觉效果最好的是原子哥和ye781205网友的程序。移值很简单这里就不提了。这里说下改进:支持DAC输出
    发表于 01-31 15:07

    NES模式下规划精度及测试效率提升分析

    NES是什么? NES系统包括哪些部分?有什么应用?
    发表于 06-02 06:40

    ESP32 NES模拟器教程

    (模拟器),玩上几把小时候最喜欢玩的游戏,而nes模拟器正是不二之选,通过制作模拟器我们能学习软硬件各方面的知识,可谓是很多程序员走向编程
    发表于 01-12 08:20

    游戏精灵NES顶部装载机适配器

    描述游戏精灵 NES 顶部装载机适配器接口板允许 Game Genie正确连接 NES Top Loader 。提供必要的 1.2
    发表于 09-08 06:26

    【HD-G2UL-EVM开发板体验】掌上游戏机之三 —— NES游戏模拟器移植

    前言前面我们完成了USB手柄按键采集,RTP实时推流H264PC端显示作为虚拟显示器。完成了移植NES游戏模拟器的基本要素,这一篇我们开始进行真正的移植。过程如下是移植好的代码git clone
    发表于 12-22 16:01

    5个步骤,让你的核桃派玩回当年火爆全球NES游戏

    1.准备好你的nes游戏: nes游戏链接:链接:百度网盘 请输入提取码 提取码:k6sh 2.安装nes游戏模拟器: sudo apt-get install nestopia 3
    发表于 11-22 10:50

    PC专用经典NES手柄

    PC专用经典NES手柄 在电脑城转转,随便哪个摊位都可以看到各种电脑用手柄,这东西实在是烂大街了,可是今天的新闻不由得让我头顶青天了。
    发表于 03-10 09:28 1288次阅读

    如何使用ESP32和ATtiny861制作NES模拟器游戏控制台

     NES模拟器不是ESP32唯一有趣的事情。例如。你可以用它构建一个微型python控制台。您需要更改的唯一组件是I2C游戏手柄I2C键盘。我认为使用ATtiny88控制器制作它并
    的头像 发表于 08-27 14:20 1.3w次阅读
    如何使用ESP32和ATtiny861制作<b class='flag-5'>NES</b><b class='flag-5'>模拟</b>器游戏控制台

    NES盒式外置硬盘的制作

    现在,您可以使用新的NES驱动器来容纳NES仿真器和所有非法的NES rom。
    的头像 发表于 10-10 09:48 2561次阅读

    NES更换PSU PCB开源

    电子发烧友网站提供《NES更换PSU PCB开源.zip》资料免费下载
    发表于 07-21 14:49 1次下载
    <b class='flag-5'>NES</b>更换PSU PCB开源

    游戏精灵NES顶部装载机适配器

    电子发烧友网站提供《游戏精灵NES顶部装载机适配器.zip》资料免费下载
    发表于 08-17 09:55 0次下载
    游戏精灵<b class='flag-5'>到</b><b class='flag-5'>NES</b>顶部装载机适配器

    开源!自制NES模拟器,3元MCU也能跑

    器的乐趣——模拟器已集成LuatOS中!1开源NES模拟器简介本文演示NES模拟器由合宙社群@
    的头像 发表于 04-13 11:06 4769次阅读
    开源!自制<b class='flag-5'>NES</b><b class='flag-5'>模拟</b>器,3元MCU也能跑

    超越节点引擎临界:华为云 NES 颠覆游戏规则

    技术领域,创新是引人注目的产物。华为云 Web3 节点引擎服务 NES(以下简称:华为云 NES)以卓越的技术实力赢得业内良好口碑。在近期 SUSTAINABLE WEB3 SG 2
    的头像 发表于 04-07 17:06 1032次阅读