单片机---HLK-W801移植Nes模拟器(一)

总目录

《单片机—HLK-W801移植Nes模拟器(一)》
《单片机—HLK-W801移植Nes模拟器(二)》
《单片机—HLK-W801移植Nes模拟器(三)》

背景介绍

年关将至,不过学习的脚步不能停,最近在着手研究一个能在单片机上运行的Nes模拟器,就是我们小时候常玩的红白机。
在这里插入图片描述

参考了网上的各位高手的文档,发现STM32上的居多,但是要能够存储和运行Nes模拟器,对rom和ram的要求,相对来说还是高一些,手中的103FC8T6目前还不能用,因为存不下也运行不起来。
不过还是被我发现了一个绝世高手的文章,最终运行ram居然只需要30多Kb,2013年的文章,这个真是不服不行。
在这里插入图片描述

传送至大佬文章

所以准备试一下前一阵买的HLK801,毕竟这个主频和存储,都没大问题。
开搞!!

代码准备

LCD驱动

目前是采用了之前用过的SPI总线的LCD,驱动芯片是ili9341。这块就不细说了,就是初始化SPI总线,然后按照手册读写。

模拟器源码

源码可以从大佬的文章中下载下来使用。
在这里插入图片描述
在这里插入图片描述

环境准备

开发环境搭建参考前面的文章《单片机—HLK-W801开发环境搭建》,还是采用了默认的SDK程序包,然后将nes模拟器的代码,添加到app路径下。

然后,将我们之前用到的ili9341的LCD显示屏也一并移植过来,放在同级目录,这里目前只需要实现一个描点画图即可,最后的图像显示,就是通过描点的方式显示出来的。

整体结构如下
在这里插入图片描述

漫漫征途

接下来就是开始漫长的编译,解决问题过程了。
在这里插入图片描述

首先添加必要的头文件链接路径
在这里插入图片描述
然后将lcd的头文件包含在info_nes.h中。最后main包含info_nes.h就可以调用nes的函数和lcd的函数了。
主函数书写如下

void UserMain(void)
{
	printf("lcd init \n");
	lcd_init();

	printf("start malloc \n");

	if(0!=InfoNES_Load(NULL))
	{
		printf("InfoNES_Load fail \n");
	}
	else
	{ 
		printf("InfoNES_Load success \n");
		InfoNES_Main();
	}
}

开始编译起来吧。
在这里插入图片描述

mapper包含编译问题

在这里插入图片描述
我们在mapper.c中包含了一系列的nes提供的mapper文件,但是在编译的时候,回去自动重新单独编译这些cpp文件,这与我们本来打算只编译InfoNES_Mapper.c的初衷是违背的,所以这里就选择了一种方式,将其cpp都改为头文件,然后就不再编译了。
重命名两百个文件,采用了bat脚本方式
在这里插入图片描述
放在mapper路径下,双击执行即可。
然后把所有包含的名称也对应修改即可。
在这里插入图片描述
然后重新删除nes路径,再添加到工程中。
在这里插入图片描述

图像显示

代码中的显示方式为逐行扫描,每行更新,所以这里只修改行显示

void InfoNES_LoadLine()
{
  int i;
  if(PPU_Scanline == 0)
  {
	FrameCount++;
	InfoNES_LoadFrame();
  }
  
  for(i=0;i<240;i++)
  {
  		ILI9341_DrawPoint(i,PPU_Scanline,WorkLine[i]); 
		//lcd_ili932x_pixel_draw_step2(WorkLine[i]);
		// GrContextForegroundSet(&sContext, WorkLine[i]);
		// GrPixelDraw(&sContext, i, PPU_Scanline);
  }
}

编译成功

在这里插入图片描述
烧写,开测!!!
上来就是黑屏待遇。
在这里插入图片描述
不放弃,正当我在阅读代码的时候,屏幕突然出了图像!!!
在这里插入图片描述
这熟悉的配方,眼泪都要掉下来了。开来启动需要一些时间。
在这里插入图片描述

然后修改一下划线的函数,不过可能是因为这个高低位的问题,这么以修改,速度提高了,但是颜色变了

void ILI9341_DrawLineOne(u16 y,unsigned char* data)
{
	ILI9341_Address_Set(0,y,240,y);//设置光标位置 
	GPIO_DATA();//写数据
	tls_spi_write(data,480);
}

然后提高了一下SPI的速度,这下稍微能看了一点,不过还是很有延迟,再打开了跳帧
在这里插入图片描述
效果如下

在这里插入图片描述

今日总结

今天就做到这里吧。其实这个玩意已经尝试了好几天了,手里的芯片试了一遍,发现只有W801能放得下,然后就是各种内存不足,只好在网上搜索,直到看到那位高手的方法,他的修改已经建立在对这个模拟器相当熟悉的程度上才能做出那种修改。
要学习的东西还很多。
明天再添加按键和尝试提速。

结束语

搞这个东西真的会上瘾,今天中午连饭都没去吃,也没休息,哈哈。
在这里插入图片描述
还有一天就放假了,那么所有的工作
在这里插入图片描述

版权声明:本文为CSDN博主「胖哥王老师」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/baidu_19348579/article/details/122711963

总目录

《单片机—HLK-W801移植Nes模拟器(一)》
《单片机—HLK-W801移植Nes模拟器(二)》
《单片机—HLK-W801移植Nes模拟器(三)》

背景介绍

年关将至,不过学习的脚步不能停,最近在着手研究一个能在单片机上运行的Nes模拟器,就是我们小时候常玩的红白机。
在这里插入图片描述

参考了网上的各位高手的文档,发现STM32上的居多,但是要能够存储和运行Nes模拟器,对rom和ram的要求,相对来说还是高一些,手中的103FC8T6目前还不能用,因为存不下也运行不起来。
不过还是被我发现了一个绝世高手的文章,最终运行ram居然只需要30多Kb,2013年的文章,这个真是不服不行。
在这里插入图片描述

传送至大佬文章

所以准备试一下前一阵买的HLK801,毕竟这个主频和存储,都没大问题。
开搞!!

代码准备

LCD驱动

目前是采用了之前用过的SPI总线的LCD,驱动芯片是ili9341。这块就不细说了,就是初始化SPI总线,然后按照手册读写。

模拟器源码

源码可以从大佬的文章中下载下来使用。
在这里插入图片描述
在这里插入图片描述

环境准备

开发环境搭建参考前面的文章《单片机—HLK-W801开发环境搭建》,还是采用了默认的SDK程序包,然后将nes模拟器的代码,添加到app路径下。

然后,将我们之前用到的ili9341的LCD显示屏也一并移植过来,放在同级目录,这里目前只需要实现一个描点画图即可,最后的图像显示,就是通过描点的方式显示出来的。

整体结构如下
在这里插入图片描述

漫漫征途

接下来就是开始漫长的编译,解决问题过程了。
在这里插入图片描述

首先添加必要的头文件链接路径
在这里插入图片描述
然后将lcd的头文件包含在info_nes.h中。最后main包含info_nes.h就可以调用nes的函数和lcd的函数了。
主函数书写如下

void UserMain(void)
{
	printf("lcd init \n");
	lcd_init();

	printf("start malloc \n");

	if(0!=InfoNES_Load(NULL))
	{
		printf("InfoNES_Load fail \n");
	}
	else
	{ 
		printf("InfoNES_Load success \n");
		InfoNES_Main();
	}
}

开始编译起来吧。
在这里插入图片描述

mapper包含编译问题

在这里插入图片描述
我们在mapper.c中包含了一系列的nes提供的mapper文件,但是在编译的时候,回去自动重新单独编译这些cpp文件,这与我们本来打算只编译InfoNES_Mapper.c的初衷是违背的,所以这里就选择了一种方式,将其cpp都改为头文件,然后就不再编译了。
重命名两百个文件,采用了bat脚本方式
在这里插入图片描述
放在mapper路径下,双击执行即可。
然后把所有包含的名称也对应修改即可。
在这里插入图片描述
然后重新删除nes路径,再添加到工程中。
在这里插入图片描述

图像显示

代码中的显示方式为逐行扫描,每行更新,所以这里只修改行显示

void InfoNES_LoadLine()
{
  int i;
  if(PPU_Scanline == 0)
  {
	FrameCount++;
	InfoNES_LoadFrame();
  }
  
  for(i=0;i<240;i++)
  {
  		ILI9341_DrawPoint(i,PPU_Scanline,WorkLine[i]); 
		//lcd_ili932x_pixel_draw_step2(WorkLine[i]);
		// GrContextForegroundSet(&sContext, WorkLine[i]);
		// GrPixelDraw(&sContext, i, PPU_Scanline);
  }
}

编译成功

在这里插入图片描述
烧写,开测!!!
上来就是黑屏待遇。
在这里插入图片描述
不放弃,正当我在阅读代码的时候,屏幕突然出了图像!!!
在这里插入图片描述
这熟悉的配方,眼泪都要掉下来了。开来启动需要一些时间。
在这里插入图片描述

然后修改一下划线的函数,不过可能是因为这个高低位的问题,这么以修改,速度提高了,但是颜色变了

void ILI9341_DrawLineOne(u16 y,unsigned char* data)
{
	ILI9341_Address_Set(0,y,240,y);//设置光标位置 
	GPIO_DATA();//写数据
	tls_spi_write(data,480);
}

然后提高了一下SPI的速度,这下稍微能看了一点,不过还是很有延迟,再打开了跳帧
在这里插入图片描述
效果如下

在这里插入图片描述

今日总结

今天就做到这里吧。其实这个玩意已经尝试了好几天了,手里的芯片试了一遍,发现只有W801能放得下,然后就是各种内存不足,只好在网上搜索,直到看到那位高手的方法,他的修改已经建立在对这个模拟器相当熟悉的程度上才能做出那种修改。
要学习的东西还很多。
明天再添加按键和尝试提速。

结束语

搞这个东西真的会上瘾,今天中午连饭都没去吃,也没休息,哈哈。
在这里插入图片描述
还有一天就放假了,那么所有的工作
在这里插入图片描述

版权声明:本文为CSDN博主「胖哥王老师」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/baidu_19348579/article/details/122711963

生成海报
点赞 0

胖哥王老师

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

单片机---HLK-W801蓝牙BLE功能测试

总目录 《单片机—HLK-W801开发环境搭建》 《单片机—HLK-W801蓝牙BLE功能测试》 提到蓝牙,大家现在应该并不陌生了,几乎上班族都会选择蓝牙耳机代替了传统的有线耳机,为了日常听歌不被领