单片机开发---ESP32S3移植NES模拟器(二)

书接上文

《单片机开发—ESP32-S3模块上手》
《单片机开发—ESP32S3移植lvgl+触摸屏》
《单片机开发—ESP32S3移植NES模拟器(一)》

暖场视频,小时候称这个为—超级曲线射门!!!!!!!!!!

ESP32上天使之翼游戏

继续优化

看门狗

源码中有两处看门狗的喂狗操作,前期都被注释掉了。
在这里插入图片描述
因为开始经常出现看门狗报警的重启。然后我将看门狗都关闭之后就不再重启了
在这里插入图片描述
问题如果不再出现,那它还是问题吗
在这里插入图片描述

分区表

前面如果需要使用分区存储rom数据的时候,需要使用定制的分区表
在(Top) → Partition Table → Partition Table 配置下,选择第四项
在这里插入图片描述
根目录下放置文件,内容如下
在这里插入图片描述
如果直接用内存,就不需要修改这些。
如果有多个应用的话,可以在这里选择配置,从不同位置启动程序。

I2S声音输出

有了声音,才能更好的玩游戏
在这里插入图片描述

所以又斥资购买的外置模块,接线图如下

在这里插入图片描述
I2S有3个主要信号,各种叫法,反正就这个意思

各种昵称说明
SCLK 、BCLK串行时钟SCLK,也叫位时钟(BCLK),即对应数字音频的每一位数据,SCLK都有1个脉冲。SCLK的频率=2×采样频率×采样位数。
LRCK、LRC、WS帧时钟LRCK,(也称WS),用于切换左右声道的数据。LRCK为“1”表示正在传输的是右声道的数据,为“0”则表示正在传输的是左声道的数据。LRCK的频率等于采样频率。
SDATA、DIN串行数据SDATA,就是用二进制补码表示的音频数据。

增加了声音的驱动,将原来写在一起的部分分离开,方便以后移植。

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/i2s.h"
#include "driver/gpio.h"
#include "esp_system.h"
#include "esp_log.h"
#include <math.h>
#include "drv_pin.h"
#include "drv_sound.h"#if CONFIG_SOUND_ENABLEDvoid sound_init(void)
{i2s_config_t i2s_config = {.mode = I2S_MODE_MASTER | I2S_MODE_TX ,.sample_rate = AUDIO_SAMPLERATE,.bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT,.channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,.communication_format = I2S_COMM_FORMAT_I2S_MSB,.dma_buf_count = 8,.dma_buf_len = 64,.use_apll = false,.intr_alloc_flags = ESP_INTR_FLAG_INTRDISABLED   //Interrupt level 1};i2s_pin_config_t pin_config = {.mck_io_num = I2S_PIN_NO_CHANGE,.bck_io_num = I2S_BCK_IO,.ws_io_num = I2S_WS_IO,.data_out_num = I2S_DO_IO,.data_in_num = I2S_DI_IO    //Not used};i2s_driver_install(I2S_NUM, &i2s_config, 0, NULL);i2s_set_pin(I2S_NUM, &pin_config);
}void sound_send(const void *src, size_t size, size_t *bytes_written, TickType_t ticks_to_wait)
{i2s_write(I2S_NUM, src, size, bytes_written, ticks_to_wait);
}
void sound_stop(void)
{i2s_stop(I2S_NUM);
}
void sound_clear(void)
{i2s_zero_dma_buffer(I2S_NUM);
}
#endif

用这些函数代替之前的操作。
不过为什么波特率配置为这个44.1k的一半,还不太清楚,后续可以研究一下。

按照这样配置的时候,会有很大的杂音。需要修改一下声道。

 .channel_format = I2S_CHANNEL_FMT_ONLY_RIGHT,

这里也要注意,模块电压是5V,等我回去试试电压5V是不是更好一些。
在这里插入图片描述

手柄适配

声音有了,还是需要用手柄玩,更贴心。
在这里插入图片描述

常用的九孔插头,里面有5根线有用。
在这里插入图片描述
七孔插头
在这里插入图片描述
还有一种
在这里插入图片描述

引脚含义
VCC5V供电
GND地线
LATCH锁存信号,由主机发送
CLOCK时钟信号,有些文档会叫PULSE,由主机发送
DATA串行数据线 低电平有效。

时序图
在这里插入图片描述
先普及个基础知识。日版美版FC主机均为NTSC制式,画面为60Hz。欧版以及中国的仿制机为PAL-D制式,50Hz。港版正规机以及某些地区是PAL-60制式,60Hz。下面的说明都是基于60Hz来解释,50Hz和60Hz时间参数有点差异。

当游戏机启动后,游戏机会每16.67ms(60Hz,1/60秒)读取一次手柄的状态。这个过程通过两个步骤来实现。

首先主机发送一个LATCH锁存信号脉冲,这个脉冲的宽度为12us。告诉手柄开始检查按键状态。

在LATCH的脉冲发送后间隔6us,CLOCK(PULSE)线开始发送周期为12us,占空比50%的脉冲信号,一共发8次。每次的脉冲的上升沿对DATA线采样,检查DATA线是否在该位置被拉低。按键被检查的顺序是固定的(游戏机设计时候设计人员固定的),按键顺序为A,B,SEL,START,上下左右。上图DATA线上标注的就是每个按键时序所在位置。如果按键被按下,那么对于位置的DATA是低电平。

这里找到了一个原理图,感觉可以自己做一个了。
在这里插入图片描述
在这里插入图片描述

引脚初始化,一定要注意上拉和下拉的使用
在这里插入图片描述

读取代码如下,时间可以严格按照时序图中的要求来定义,记住在上升沿的时候,读取data值。

	int b2b1 = 65535;gpio_set_level(INPUT_HW_JS1_LATCH_PIN, 1);ets_delay_us(12);gpio_set_level(INPUT_HW_JS1_LATCH_PIN, 0);for(int i = 0; i < 8; i++){ets_delay_us(6);if(gpio_get_level(INPUT_HW_JS1_DATA_PIN) == 0){b2b1 -= sfc_ps_button_info[i];//printf("%s ",sfc_ps_button_va[i]);}gpio_set_level(INPUT_HW_JS1_CLOCK_PIN, 1);ets_delay_us(6);gpio_set_level(INPUT_HW_JS1_CLOCK_PIN, 0);}

一定要注意,这种手柄的电压,至少要达到4.8V,否则可能出现如下问题
1.延迟必须增大才能读取按键
2.在读取按键的时候,一次如果按下超过两个按键,就会识别为全部按下。

这也是我灵光一现,才破解了这个问题。
在这里插入图片描述

双手柄支持

这里需要重新增加一个手柄
在这里插入图片描述

void osd_getinput2(void)
{// Note: These are in the order of PSX controller bitmasks (see psxcontroller.c)const int ev[16] = {event_joypad2_select, 0, 0, event_joypad2_start, event_joypad2_up, event_joypad2_right, event_joypad2_down, event_joypad2_left,0, 0, 0, 0, 0, event_joypad2_a, event_joypad2_b, 0};static int oldb = 0xffff;int b = input2_read();int chg = b ^ oldb;int x;oldb = b;event_t evh;//	printf("Input: %x\n", b);for (x = 0; x < 16; x++){if (chg & 1){evh = event_get(ev[x]);if (evh)evh((b & 1) ? INP_STATE_BREAK : INP_STATE_MAKE);}chg >>= 1;b >>= 1;}
}

主要就是注意选择事件。不过改归改,还么测试
在这里插入图片描述

游戏名称

注意复制到SD卡中的游戏,名字不能过长,否则会出现死机的问题,导致重启。
另外可以增加如下判断,只显示rom名称,屏蔽其他文件
在这里插入图片描述
这个后续可以替换成其他界面,毕竟连汉字都不支持,低端
在这里插入图片描述

游戏兼容性

测试了一些过关游戏,基本都可以,不过在测试一些智能卡的游戏的时候,会出现重启现象,打印输出

GUI: Mapper 74 not yet implemented

因为本身模拟器支持的mapper有限,并没有支持到74号,这个游戏就是《天使之翼》,
还有164号mapper,游戏是《三国志2》。

后续一定要解决这个问题,加上mapper。
至于这个mapper是什么

mapper,这个概念来源于 memory mapping,又叫做 Memory Management Chip,它是解决地址映射的一种电路,简单来说就是决定物理内存如何映射到 CPU 或者 PPU 的地址空间。
mapper 可以用来支持增加卡带的 RAM 甚至支持额外的音频通道,但更一般的目的就是控制物理内存到地址空间的映射,突破游戏 40KB 的限制。
为什么说是 40KB 的限制,因为早期一般的游戏最大就是 的 PRG,以及 的 CHR,加起来就是 40KB,而更复杂的 mapper 硬件可以使得游戏突破这个限制。

软件重启

增加了手柄远端重启机器,其实就是在按键的时候判断一下,如果同时按下select和start,重启设备
在这里插入图片描述
这样测试就比较方便了。

效果展示

冒险岛系列
在这里插入图片描述
赤色要塞
在这里插入图片描述

热血系列,这么激烈打斗的游戏,非常流畅。在这里插入图片描述
快打旋风
在这里插入图片描述
激龟忍者传视频

ESP32S3-nes上的《激龟忍者传3》

参考资料

《FC游戏机手柄工作原理 》
《小霸王游戏机手柄(一)——硬件破解》
《NES 模拟器开发教程》
《童年神机小霸王(七) Mapper》
这篇文章的作者写了几篇相关的介绍,感兴趣的可以学习一下。
在这里插入图片描述

结束语

这个83年推出的产品,到现在快四十年了,承载了无数80后的儿童时光,几年玩的游戏加起来,估计也没有几十兆的空间,里面的技术可想而知,把硬件软件的性能压榨到了极点了。
在这里插入图片描述

最近这chatGPT很火,国内外各种模仿争相出现,国内的还是老样子,不该问的别问。救媳妇还是救妈妈,豆腐脑吃甜的还是辣的,是吧
在这里插入图片描述

反正豆腐脑我吃咸的。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/19495.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开个帖子 记录刷题过程。

由于是转码 也深知代码能力的重要性 但之前断断续续的刷总觉得没什么长进 今天痛定思痛 决定开一个帖子 用来记录我的刷题过程 以此监督自己 。 2023.5.15 今天练习了贪心思想 目前我觉得比较关键的点是 排序 与 搞清楚贪心的对象。 455没有什么好说的 435需要明白 我们需要贪…

CTFshow web入门之信息收集(web1-web20)

信息搜集&#xff1a; 文章目录 信息搜集&#xff1a;web1&#xff1a;web2&#xff1a;web3&#xff1a;web4&#xff1a;web5&#xff1a;web6&#xff1a;web7&#xff1a;web8&#xff1a;web9&#xff1a;web10&#xff1a;web11&#xff1a;web12&#xff1a;web13&#…

chatgpt赋能python:Python主机发现——提高SEO效果的必备方法

Python 主机发现——提高SEO效果的必备方法 作为一名有10年python编程经验的工程师&#xff0c;我发现Python主机发现是一种非常有效的提高搜索引擎优化&#xff08;SEO&#xff09;效果的方法。虽然它可能会花费一些时间和精力&#xff0c;但是一旦你掌握了这个技能&#xff…

3DMax 卡死、白屏、渲染死机问题总结

白屏&#xff1a; 3dmax出现白屏解决方法 以下是ChatGPT给出的答案 内存不足&#xff1a;3DsMax需要大量的内存才能正常运行。如果你的计算机内存不足&#xff0c;3DsMax就会卡死。解决办法是升级你的计算机内存或者关闭一些不必要的程序来释放内存。 显卡驱动过时&#xff1…

世界杯——手动为梅西标名

梅西的铁粉来集赞啦。 今天带来了一个为图片添加字样的小功能&#xff0c;我们的测试目标图片是&#xff1a; 我们的测试目标是&#xff1a; 我们使用的是Python语言&#xff0c;使用了Image包用作图片处理&#xff0c;matplotlib包用作坐标查阅&#xff0c;这个坐标还是很好看…

不要对chatgpt过度反思 第二部分

如果未来&#xff0c;它真的可以引爆下一轮科技革命&#xff0c;只要双方不存在科技代差&#xff0c;就无法阻止科技扩散。 打个比方&#xff0c;如果你本身没有网络基础&#xff0c;没有大数据&#xff0c;她确实和你无关&#xff0c;反之&#xff0c;捅破了那层窗户纸&#x…

关于本次周总结

在本次的前端的学习中&#xff0c;虽然前端入门简单&#xff0c;但自己运用起来却有点小难度&#xff0c;尤其是自己做一个页面的时候&#xff0c;页面乱的让人疯狂&#xff0c;归根结底还是知识掌握的不扎实&#xff0c;没有得心应手的感觉用着没有丝滑感&#xff0c;我认真反…

独家 | ChatGPT提高你日常工作的五个特点以及如何使用它来提高代码质量

翻译&#xff1a;陈超 校对&#xff1a;赵茹萱本文约3200字&#xff0c;建议阅读8分钟 本文介绍了ChatGPT提高日常工作的五个特点。 ChatGPT已经完全改变了代码开发模式。然而&#xff0c;大多数软件开发者和数据专家们仍然不使用ChatGPT来完善——并简化他们的工作。 这就是我…

Python+chatGPT编程法力无边?

作为初学者&#xff0c;我们总是有一些不好意思问的问题。 现在我们可以尽情社恐&#xff0c;我们甚至可以向 ChatGPT 提出最低级的代码问题。 假设我们忘记了如何将两个字典合并。以下是 ChatGPT 可以如何帮助你的部分。 ChatGPT 还可以协助你进行更好的在线学习。假设你正在…

有了ChatGPT我还需要学习Python吗?

前言 ChatGPT是人工智能的产物&#xff0c;理解人类的思维&#xff0c;精通各种语言&#xff0c;能够辅助我们写代码&#xff0c;但是无法完全取代人类去编写代码。 首先&#xff0c;ChatGPT提供给我们一个思路去解决&#xff0c;它编写的代码不是完全正确的。如果我们不学习…

AutoGPT自主人工智能用法和使用案例

介绍 AutoGPT是什么&#xff1a;自主人工智能&#xff0c;不需要人为的干预&#xff0c;自己完成思考和决策【比如最近比较热门的用AutoGPT创业&#xff0c;做项目–>就是比较消耗token】 AI 自己上网、自己使用第三方工具、自己思考、自己操作你的电脑【就是操作你的电脑…

Python |浅谈爬虫的由来

本文概要 本篇文章主要介绍Python爬虫的由来以及过程&#xff0c;适合刚入门爬虫的同学&#xff0c;文中描述和代码示例很详细&#xff0c;干货满满&#xff0c;感兴趣的小伙伴快来一起学习吧&#xff01; &#x1f31f;&#x1f31f;&#x1f31f;个人简介&#x1f31f;&…

适合普通人的基金投资研究工具之:且慢与基金组合

当投资者在进行了充分的基金投资研究之后&#xff0c;如何开展投资实践就成了头等大事。从基金投资者具体的实践来看&#xff0c;很少会有投资者只选择单一基金进行长期投资&#xff0c;绝大多数的投资者都是在做基金组合投资。 &#xff08;一&#xff09;且慢与基金组合功能 …

杨立昆最新访谈:AI威胁论是蒙昧主义,控制欲只有人才有 (全文+视频)

作者&#xff1a;城主 | 编辑&#xff1a;腾讯新闻 郝博阳 编辑导语 经过了前一段时间的辛顿&#xff08;Hinton&#xff09;离职事件和AI监管大讨论之后&#xff0c;整个舆论界都在围绕着“AI毁灭人类的100种方法”大出文章。在这种众口一词的大合唱里&#xff0c;其实一直都有…

张俊林趣谈:GPT4是否已具备类人智慧,为何GPT通过Next Token Prediction可以产生智能...

夕小瑶科技说 分享 作者&#xff1a;张俊林 来源&#xff1a;知乎 导读&#xff1a;本文转载自张俊林老师首发在知乎的文章《世界的参数倒影&#xff1a;为何GPT通过Next Token Prediction可以产生智能》&#xff0c;文章结合当前对LLM的各种研究&#xff0c;以拼图的方式&…

张俊林:GPT4等LLM模型具备类人智慧了吗?

编辑&#xff1a;DataFunTalk 进NLP群—>加入NLP交流群 导读&#xff1a;本文转载自张俊林老师首发在知乎的文章《世界的参数倒影&#xff1a;为何GPT通过Next Token Prediction可以产生智能》&#xff0c;文章结合当前对LLM的各种研究&#xff0c;以拼图的方式&#xff0c;…

世界的参数倒影:为何GPT通过Next Token Prediction可以产生智能

作者&#xff1a;张俊林 来源&#xff1a;知乎 夕小瑶科技说 编辑 “两位说英语的荒岛幸存者被困在相邻岛屿上&#xff0c;中间隔着危险水域。幸运的是&#xff0c;他们发现了前任居民留下的电报机&#xff0c;电报机通过一条水下电缆连接起来&#xff0c;他们能够通过电报…

张俊林趣谈:GPT4是否已具备类人智慧,为何GPT通过Next Token Prediction可以产生智能

夕小瑶科技说 分享 作者 | 张俊林 来源 | 知乎 导读&#xff1a;本文转载自张俊林老师首发在知乎的文章《世界的参数倒影&#xff1a;为何GPT通过Next Token Prediction可以产生智能》&#xff0c;文章结合当前对LLM的各种研究&#xff0c;以拼图的方式&#xff0c;对LLM是否具…

关于语言大模型的八大论断

近几个月来&#xff0c;语言大模型&#xff08;LLM&#xff09;的广泛公开部署引起了倡导者、政策制定者和许多领域学者们的新一轮关注和参与。Anthropic技术团队成员、纽约大学助理教授Samuel R. Bowman总结了八个可能引发思考的观点&#xff0c;并讨论了LLM还存在的局限性。 …

这波可以,终于有内行人把 GPT-4 说透了。

&#x1f449;腾小云导读 近三个月 ChatGPT 方兴未艾&#xff0c;昨日凌晨 OpenAI 趁势发布多模态预训练大模型 GPT-4 &#xff0c;其能力的升级和应用的拓展又一次引爆国内外网络。腾讯算法工程师冉昱将通过10问10答的形式&#xff0c;分享其个人对于 GPT-4 技术能力、特点及应…