你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F765@216MHz跑NES模拟器【代码】【视频】

[复制链接]
电信工see 发布时间:2019-2-22 15:41
    本文public自《STM32F765@216MHz输出I2S试验ES9023P音频听感》链接(https://www.stmcu.org.cn/module/forum/thread-619481-1-1.html)
4 R+ r9 N; p% Y; Y8 D
* I  ]7 v: Z1 J7 H8 p( @    性能:作者的开发板使用STM32F765VIT6@216MHz,开发板使用3225封装的有源晶振提供25MHz(-+20PPM)的HSE,通过PLL倍频到216MHz,实际测试修改倍频参数,可以将内核时钟超频到270MHz不跑飞(测试时间约40分钟,更高频率或更长测试时间未测试过),就MCU界来说性能已经可以傲视群雄了。5 Y) H) w7 W1 d6 _' @9 T" M& D; G

7 M- Y9 j6 }6 S! O) M/ V    想法:那么作者有想法了,开发板有Button、LCD和Audio,是不是可以跑一些多媒体,或者做成交互式娱乐设备。看到网上有跑NES游戏的,细看,实质是通过软件模拟上世纪八九十年代的CPU 6502和外围RAM这些,然后在模拟器上跑NES游戏。
6502 1.jpg

- ^' f/ i2 B# J    关于6502:仔细了解之后,作者对6502的评价是:伟大。在那个时代,它被用在很多场景下,除了Nintendo的FC,还有乔布斯的早期Apple PC、Commodore的主机、拉斯维加斯赌场的老虎机、早期的国产文曲星,甚至天网的T800系列终结者也都搭载这款CPU开个玩笑。一款造就了无数优秀的程序员、带给无数人欢乐的CPU,称之为时代巨著当之无愧。
  u6 x. x* E+ ]0 V1 d
$ {! a. H/ h& S* o0 Z    回到正题:在开源软件发达的今天,本着站在巨人的肩膀上的心态,作者直接网上找来3款模拟器,包括InfoNES、Neil的6502 emulator和网友ye781205的NES。) C' {' |9 i; u0 i: y$ L+ D7 N

  O. d$ X8 F- Q    a. 首先是InfoNES,主要是新建InfoNES_System.c,并在InfoNES_System.c中实现InfoNES_System.h中的接口;然后适当修改硬件相关的文件InfoNES.c、InfoNES.h、K6502_rw.h,其中包括模拟SRAM的内存实现,在堆中分配内存(注意修改Heap Size),还是以指定首地址的野路子。- L; R5 |1 T" o7 e7 ?% K* W7 J- t
8 f0 J$ L, b! C1 ?
        作者在开发板上跑InfoNES,FPS大致在9左右@216MHz,这就让人不想继续实现音频了,虽然跳2帧勉强能玩,但看着PPT的效果,还是放弃了。
  f9 M; n+ N* Q4 Q' N& B
% b8 Q/ w1 `; O! w3 m8 l    b. 接着是Neil的6502 emulator,这款模拟器不带音频,源码已经是在stm32f1上移植好了的,作者只需要修改到自己的开发板上,在定时中断里面获取按键填充全局数组JoyPad[0](玩家1)和JoyPad[1](玩家2),在PPU.c中实现NES_LCD_DisplayLine()适配LCD填充和拉伸即可。
9 X: w5 M9 t. M8 ^1 D6 l; m# ^+ m. J* A1 ^( s2 D
        从U盘读取NES文件到数组rom_file[ROM_FILE_SIZE]里,然后运行nes_main()启动游戏(ROM_FILE_SIZE宏作者修改为200Kbytes,数组rom_file在Rom_files.c中定义,在rom.h中申明为外部变量)。
- |- Q9 `; Y0 o. E$ c; H
' F- f# X0 H$ {$ `" H        作者实测FPS上30@216MHz,但是没有声音,支持的游戏不多,还是不够完美。; o  L" a/ _4 X; O1 ^: D: ^: D4 ~
) e6 W2 m$ v: U% Q
    c. 最后是openedv网友ye781205的NES,这款NES核心采用汇编实现,正点原子进行了完善,效率很高。作者在网上搜来的源码来自正点原子的工程包,工程运行在stm32f1上面。作者不清楚M7是否向下兼容汇编,带着试一试的心态就开干。具体过程包括
- E  [9 O, G& P* s9 ~, u(1) 在nes_main.c中nes_load(char *pname),实现文件打开、f_stat判断文件大小信息并malloc内存空间给romfile、读取文件到romfile里、nes_load_rom()并初始化之后就通过nes_emulate_frame()启动;
/ R- h9 w6 u  n9 P: S
$ X) D! A; b. ?/ S2 p9 B
(2) 在nes_main.c中nes_set_window()适配LCD显示区域;; m. r. A" N! [' X5 o

& j: a2 h0 H; r(3) 在nes_main.c中nes_get_gamepadval()实现按键获取填充全局变量PAData0和PAData1,在6502.s中会使用到;2 U& e7 m* L7 X: t5 I
PADdata.PNG
# A' T: `0 g+ a. X# G+ a7 \
(4) 在nes_ppu.c中scanline_draw()做LCD的像素填充和拉伸( g+ d7 F1 P% R; b2 F3 ?
) f+ ]4 c/ W; R6 a$ {% m
(5) 在nes_main.c中实现nes_apu_fill_buffer()、nes_sound_open()、nes_sound_close()输出音频
( R' h, e8 F' _# G' G" F5 \4 U6 V( }1 \5 w! o9 [" v  M0 q4 z
(6) 在nes_apu.h中调整宏,设置音频采样频率,设置最大帧率限制  e6 e. o0 w( R7 k
帧率.PNG

8 |! a) U% X4 z6 U- m. j/ F(7) 修改正点原子自定义的内存管理,改为使用编译器提供的malloc,使用SOC内部SRAM,并将启动代码里面Heap_Size调大些。
. b9 i& Q: R3 @" y5 Y; r* g9 O
$ b4 [2 }' o" A$ f3 i      音频方面:作者用wavebuf填充发送buffer中的左右声道(左右相同),16-bit,最后通过DMA由I2S1直出ES9023P,DMA设置为循环模式,字节对齐设置为半字(16-bit),实现HAL_I2S_TxCpltCallback()发送完成回调中设置发送完成标志,在nes_apu_fill_buffer()中判断音频buffer是否发送完成,以此来限制模拟器运行最大帧率。# z9 S) L" l) E9 K+ |( `
& D1 {, @+ S! t3 T. M+ U8 o
      帧率:作者实测不加帧率限制,优化LCD刷屏,FPS可以上95@216MHz。如果深入底层针对M7的6级双发射超标量流水线进行优化,并使用L1 Cache应该可以获取更高帧率。
" g! P) u; G0 p& W: L! u. Z
* J6 d+ z( f, q5 l" b, j      作者将FPS限制在60帧,通过U盘读取nes并运行,实际效果如视频:  ~1 f5 z& r: ^4 J* K, g( x8 s

# T1 @; K% E0 j) y4 f如果视频无法播放,请复制链接单独查看https://v.youku.com/v_show/id_XNDA3MzM4NTYwNA==.html?x&sharefrom=android&sharekey=2e0f402405de533ff6c5cfbdcb930c9393 c% ], e  ^1 _- P  S4 |; ?

1 t1 V  D; ]8 h
      作者未使用OS,通过CubeMX建立的标准HAL工程,按照惯例,双手奉上,供大家取用:
【附件,工程压缩包】
(工程为.7z压缩包,下载后请删除多余.zip后缀,再解压)
cube6c.7z.zip (4.75 MB, 下载次数: 236)
收藏 3 评论6 发布时间:2019-2-22 15:41

举报

6个回答
Kevin_G 回答时间:2019-2-25 11:22:00
好牛X
csercser 回答时间:2019-7-16 19:29:31
好牛X!学习
csercser 回答时间:2019-7-16 19:31:12
没有金币了
whm597 回答时间:2019-8-26 21:35:12
厉害了,能跑到95帧,看了视频,声音似乎还不太和谐
generalcircuits 回答时间:2019-8-27 10:04:53
这操作厉害了,学习看看
myname222 回答时间:2023-3-26 21:12:05

同感,我也试了InfoNES,画面卡顿感强烈。。。

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版