栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

前文回顾

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

本章重点—优化显示

前两章完成之后,测试了一下刷新速率,达到了惊人的3帧每秒

提高主频

main函数中,有设置时钟分频的位置,尝试修改为最高

修改LCD初始

默认的ILI9341是竖屏,320*240的话,我们写数据,就需要进行截断处理,因为这个模拟器的每行是256个字符。
所以我们进行一下横屏,并且配置一下绘图范围的内存,我们就让它与模拟器提供的行buf一一对应,就避免了很多配置动作,只需要不停的写入就好了。

    ILI9341_WR_REG(0x36);	   //set the model of scanning
	ILI9341_WR_DATA8((1<<5)|(0<<6)|(1<<7)|(1<<3)); //左横屏
	
	//ILI9341_WR_DATA8((1<<5)|(1<<6));右横屏幕
	//ILI9341_WR_DATA8(0x08); 竖屏幕
	ILI9341_WR_REG(0x2B); 	//set the page address 横屏幕设置 Y轴到239
	ILI9341_WR_DATA8(0x00);
	ILI9341_WR_DATA8(0x00);
	ILI9341_WR_DATA8(0x00);
	ILI9341_WR_DATA8(0xDF);

	ILI9341_WR_REG(0x2A);    //set the column address X轴到319 改为255
	ILI9341_WR_DATA8(0x00);
	ILI9341_WR_DATA8(0x00);
	//ILI9341_WR_DATA8(0x01);
	//ILI9341_WR_DATA8(0x3F);
	ILI9341_WR_DATA8(0x00);
	ILI9341_WR_DATA8(0xFF);
	
	ILI9341_WR_REG(0x2c);//储存器写

这里,我们进行了左横屏,并且配置横纵坐标范围为256*240。
然后我们的写屏函数就可以化为最简单的写SPI

void ILI9341_DrawLine(u16 y,u16* data)
{
	tls_spi_write((uint8_t *)data,512);
}

那么有人会注意到了,前面用的Y轴应该是239,转化为十六进制应该是EF。可为什么是DF,那么就是因为这个游戏的首行地址,并不是从0开始,而一共只有0xEF行,所以为了能最简单的进行画图,不去设置行列地址,那么就直接配置所用的显示位置纵坐标为0xDF。否则,就会出现滚屏的问题。

测试帧率

然后我们配置了一个5秒的定时器,然后我们每画一帧,就记一次数据,5秒看一下绘制了多少帧。

extern unsigned int frameCount;
static void demo_timer_irq2(u8 *arg)
{
	printf("%02d fp/5sn",(frameCount));
	frameCount=0;
}
void  timer_demo(void)
{
	u8 timer_id2;
	struct tls_timer_cfg timer_cfg2;

	timer_cfg2.unit = TLS_TIMER_UNIT_MS;
	timer_cfg2.timeout = 5000;
	timer_cfg2.is_repeat = 1;
	timer_cfg2.callback = (tls_timer_irq_callback)demo_timer_irq2;
	timer_cfg2.arg = NULL;
	timer_id2 = tls_timer_create(&timer_cfg2);
	tls_timer_start(timer_id2);
}

绘制图像处计数

void InfoNES_LoadLine()
{
	if(PPU_Scanline==100)
	{
		frameCount++;
	}
	ILI9341_DrawLine(PPU_Scanline,WorkLine);
}

最终测试了一下

10fps左右的水平。

在注释掉绘图操作之后,模拟器计算帧的速度如下

大约是28fps。所以可以看到绘图还是挺耗时的。

SPI的速率是20MHZ。那么每秒最大传输大约20帧。

每帧的计算大约0.035秒,传输大约0.05秒,加起来大约耗时0.085秒,所以每秒大约传输大约11.7帧,再除去其他操作,大约就是11帧/s。

看来还是需要用并口才能实现高的刷新率。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/738207.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号