Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
nes模拟器
星火1号_spark_星火一号_开发板
[NES]从模板工程到NES模拟的实现
发布于 2025-07-28 15:39:53 浏览:94
订阅该版
[摘要视频【b站】](https://www.bilibili.com/video/BV1nkudzeEwW/?share_source=copy_web&vd_source=c7ad00f5ae597e3c3c365b8ee59fd9af "摘要视频【b站】") **前置准备** nes游戏就选用最经典的SuperMary,先创建一个基于**06_demo_nes_simulator**示例的示例工程,找到其中game目录下的**SuperMary.nes**文件,将其复制到SD卡上 **软件包设置** 新建一个基于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保存设置 **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界面 **工程主体** 先构建项目,此时,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模拟成功实现! **感慨** 过程有那么一点点曲折,但是最终成功分析出了问题所在并解决,从模板工程到实现示例工程的过程相当于从无到有的创造,满满的成就感,仿佛离b站大佬更近了一步() 示例工程虽然很方便,但是只授之予鱼而非渔,从模板工程开始,一步一步的创造,虽然做出了以后很有成就感,但还是希望相关教程能多出一点(一步步推真的很不容易) 此外,在查看日志的时候还发现不管是示例工程还是模板工程  并没有发现这一段命令打印的路径日志,也没有分析出是什么原因,有知道的大佬可以解答一下 (BC真的很好用)
4
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
cgat
这个人很懒,
文章
2
回答
0
被采纳
0
关注TA
发私信
相关文章
1
[星火一号] 代码模板, 手动写启动代码, 开机后 snprintf 不能处理 %llu 了, 是有什么配置上的冲突吗?
2
使用MDK5.37开发星火一号,双击mklinks.bat 文件后,目录下没有 rt-thread 和 libraries 的文件夹图标。
3
studio文件构建丢失
4
rtt中星火一号stm-32怎么把两个示例工程合并成一个
5
星火一号串口发送问题
6
基于开发板建工程的疑问
7
使用星火一号开发板建工程的奇怪问题
8
星火一号板pwm功能,不报错,但也不输出,为什么?
9
星火一号怎么强制改变已占用的引脚的功能呢
10
火星一号的标准库在哪里?外设的数据手册在哪里看?
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
6
五分钟玩转RT-Thread新社区
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
Bootloader
AT
Hardfault
CAN总线
ART-Pi
FinSH
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
FAL
RTC
rt-smart
cubemx
I2C_IIC
UART
WIZnet_W5500
BSP
ESP8266
PWM
ota在线升级
packages_软件包
flash
freemodbus
GD32
潘多拉开发板_Pandora
编译报错
ADC
keil_MDK
flashDB
rt_mq_消息队列_msg_queue
ulog
socket
MicroPython
msh
中断
Debug
SFUD
at_device
SDIO总线
本月问答贡献
Ryan_CW
1
个答案
2
次被采纳
D1sguIse_
6
个答案
1
次被采纳
三世执戟
4
个答案
1
次被采纳
xiaorui
2
个答案
1
次被采纳
用户名由3_15位
2
个答案
1
次被采纳
本月文章贡献
出出啊
1
篇文章
1
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
2
次点赞
crystal266
2
篇文章
1
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部