目錄
摘要視頻
前置準備
軟件包設置
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真的很好用)
-
嵌入式
+關注
關注
5189文章
20192瀏覽量
329551 -
SD卡
+關注
關注
2文章
583瀏覽量
67914 -
NES
+關注
關注
0文章
7瀏覽量
7564
發布評論請先 登錄
如何安裝模擬器玩nes小游戲-基于米爾瑞芯微RK3576開發板
賺人氣,用STM32F407做個NES游戲機玩玩
STM32F1做的NES模擬器 支持聲音及全屏游戲
ESP32 NES模擬器教程
游戲精靈到NES頂部裝載機適配器
【HD-G2UL-EVM開發板體驗】掌上游戲機之三 —— NES游戲模擬器移植
5個步驟,讓你的核桃派玩回當年火爆全球NES游戲
PC專用經典NES手柄
如何使用ESP32和ATtiny861制作NES模擬器游戲控制臺

[NES]從模板工程到NES模擬的實現 | 技術集結
評論