|
视频录像:
http://v.youku.com/v_show/id_XMjcwMjIxODI0.html
InfoNES 的移植过程:
(1)第一步需要解决的是基于 TF 卡实现 Fafts 文件系统。
需要解决的问题是 4bit 的 SDIO 的读写。
这里我们的准备工作为准备好
STM32F10x_StdPeriph_Lib_V3.5.0 (可以在官方网站下载)
经过实验 STM32F10x_StdPeriph_Lib_V3.5.0 比 STM32F10x_StdPeriph_Lib_V3.4.0 的库例程中把 SDIO 读写 SD 卡有了更新, 具体表现为提高了主频, 但是很可惜的是这个官方的例子在 红牛 V3 开发板上没有调试通过, 因此我依旧选择了 STM32F10x_StdPeriph_Lib_V3.4.0 中的例子, 经过测试速度还可以, 读写大扇区也没有问题。
简单步骤为:
创建 sdio_sd.c 和 sdio_sd.h
主函数中设置 NVIC, 打开 SDIO 事件处理中断
在中断处理函数 SDIO_IRQHandler 中调用 SD_ProcessIRQSrc();
接下来就是移植 Fatfs , 主要需要移植的就是 disk.c 中的几个函数。
disk_initialize - Initialize disk drive 初始化磁盘
disk_status - Get disk status 获得磁盘状态信息 (本例程中没有移植)
disk_read - Read sector(s) 读扇区
disk_write - Write sector(s) 写扇区
disk_ioctl - Control device dependent features 获得设备的一些特性
get_fattime - Get current time 获得创建或者修改文件的时间 (本例程中没有移植)
移植过程中主要用到的是 Fatfs 中的以下几个文件
Ff.c fatfs 文件系统
Diskio.c 移植的外部接口文件
Ffconfig.h 对 Fatfs 的一些配置文件,例如设置中文文件名, 长文件名等等
Cc936.c 对中文文件名的支持
了解完解决好这些问题后我们就可以来操作了。
第一步操作:f_mount(0,&FS); // 初始化分区结构,它不初始化SD卡
第二步操作:f_open(&fsrc,"SYSTEM/FONT/GBK16.FON",FA_READ); // 打开文件, 在这个操作中会初始化 SD 卡。
如果打开已经存在的文件可以使用 FA_READ 和 FA_OPEN_EXISTING 的参数
如果想创建一个新文件可以使用 FA_CREATE_ALWAYS 和 FA_WRITE 的参数
具体可以看 fstfs 对操作属性。
第三步操作:f_read(&fsrc,HzkCodeSRAM,fsrc.fsize,&br); // 读文件数据,长度file.fsize,
第四步操作:f_close(&fsrc); // 关闭文件。
当然除了这几个函数外还有两个常用的操作。f_lseek 和 f_write, 分别是移动文件指针和写文件操作。
(2)在 FATFS 文件系统中操作长文件名和中文文件名。
由于微软的 FAT版权的问题,默认为 DOS 8.3 文件名,即8个字节的文件名,一个”.“,然后3个字节的扩展名。
先到ffconf.h 中
#define _CODE_PAGE 437 // 437 - U.S. (OEM)
#define _USE_LFN 1 /* 0, 1 or 2 */
然后在工程文件中包含 ccsbcs.c(FATFS\option\目录下面)
ffconf.h 可以设置 #define _CODE_PAGE 936 //- Simplified Chinese GBK (DBCS, OEM, Windows)
总结: 经过上面两个步骤我们就完成了对文件系统的完整移植。接下来我们就会用到这些:
从 SD 卡中读字库文件
从 SD 卡中显示 bmp 图片
从 SD 卡中读取文件列别
从 SD 卡中读取 NES ROM 文件进行解码
(3)按键处理的编写
我们需要编写好构架, 第一处理按键必须精简,要尽可能少的占用系统资源, 在这里我们会选择在10mS 中断中处理按键处理和处理好按键防抖。
这部分我就不具体介绍了, 具体看代码。
(4)汉字字库的实现
基本思路
HZK16字库是符合GB2312标准的16×16点阵字库,HZK16的GB2312-80支持的汉字有6763个,符号682个。其中一级汉字有3755个,按声序排列,二级汉字有3008个,按偏旁部首排列。我们在一些应用场合根本用不到这么多汉字字模,所以在应用时就可以只提取部分字体作为己用。
HZK16字库里的16×16汉字一共需要256个点来显示,也就是说需要32个字节才能达到显示一个普通汉字的目的。
我们知道一个GB2312汉字是由两个字节编码的,范围为A1A1~FEFE。A1-A9为符号区,B0到F7为汉字区。每一个区有94个字符(注意:这只是编码的许可范围,不一定都有字型对应,比如符号区就有很多编码空白区域)。下面以汉字“我”为例,介绍如何在HZK16文件中找到它对应的32个字节的字模数据。
前面说到一个汉字占两个字节,这两个中前一个字节为该汉字的区号,后一个字节为该字的位号。其中,每个区记录94个汉字,位号为该字在该区中的位置。所以要找到“我”在hzk16库中的位置就必须得到它的区码和位码。(为了区别使用了区码和区号,其实是一个东西,别被我误导了)
区码:区号(汉字的第一个字节)-0xa0 (因为汉字编码是从0xa0区开始的,所以文件最前面就是从0xa0区开始,要算出相对区码)
位码:位号(汉字的第二个字节)-0xa0
这样我们就可以得到汉字在HZK16中的绝对偏移位置:
offset=(94*(区码-1)+(位码-1))*32
注解:1、区码减1是因为数组是以0为开始而区号位号是以1为开始的
2、(94*(区号-1)+位号-1)是一个汉字字模占用的字节数
3、最后乘以32是因为汉字库文应从该位置起的32字节信息记录该字的字模信息(前面提到一个汉字要有32个字节显示)
有了偏移地址就可以从HZK16中读取汉字编码了,剩下的就是文件操作了,就不说了,可以参考工程中的代码。
在我们 InfoNES 的移植上我们选择了一次性的把 SD 卡中的 HZK 文件读到片外的 SRAM 中, 这样可以加快菜单刷新速度。不会觉得卡。
STM32F103ZET6 有 512K byte 的片内 flash, 也可以把 字库文件编写在文件中烧录到片内 Flash 中, 这里先不多做介绍了, 我们工程中也实现了, 看下汉字显示部分代码就可以了。
关于汉字库的生成推荐一个软件叫 多国文字点阵字库, 工程中已经有了, 你可以试试看。
(5)接下来讲一下分散加载的实现, 其实就是怎么把一些变量定义在外部 SRAM 中。
第一步: 在 Keil 中设置好 SRAM 的地址
第二步:对当个文件的 Option 进行设置, 这样就可以把这个文件的变量定义到外部 SRAM 中了。
(6)片外 SRAM 的初始化
常用的可以调用自己编写的 SRAM_Init 函数。
第二种办法在 STM32F10x_StdPeriph_Lib_V3.5.0 中的 system_stm32f10x.c 中做个宏定义就可以了。找到下面这段话, 取消对 DATA_IN_ExtSRAM 注释就好。
#if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL)
/* #define DATA_IN_ExtSRAM */
#define DATA_IN_ExtSRAM
#endif
(7)所有准备工作做好了, 就是对 InfoNES 的移植了,要主意一点, InfoNES 的变量因为有些是用到片外的 SRAM 中了, 但是有些 InfoNES 的全局变量在定义的时候就进行初始化了, 这些初始化是在外部 SRAM 初始化之前进行的, 所以要把这些变量拿到片内中来, 这个是最需要注意的。
(8)解决速度问题。
经过测试,STM32F103ZET6 在片外的运行速度相比片内的 SRAM 的速度差之甚远, 所以必须进行一些优化, 把部分解码工作放到片内来。
第二步是对 TFT 的刷屏速度的提高, 红牛V3 是用的液晶驱动芯片 SSD1963, 把刷屏改为窗口式刷屏, 接下来是把 InfoNES 的跳帧设为 3. 也就是跳掉显示的2帧画面, 得到游戏的基本流畅。 好了好上面的问题, 可以玩有些了。
(9)测试帧数
可以在刷帧的显示函数里面做一个计数, 每秒钟通过窗口发到窗口调试助手上。
经过测试 , 在基于 STM32F103ZET6 的红牛V3开发板上可以获得的每秒钟 5 帧的速度, 如果再想提高就有一定的优化困难了。
(10)小技巧
在调试过程中可以使用
PUTCHAR_PROTOTYPE
{
/* Place your implementation of fputc here */
ITM_SendChar((uint8_t) ch);
return ch;
}
在 debug 选项框中在调试时加载STM32DBG.ini文件。
并在 Trace 中允许 ITM Channel 选项, 并选择好第一通道。
这样就调试仿真的时候可以在 View / Serial Window / ITM Viewer 中看到打印信息了。
这种方式可以不占用窗口资源, 调试方便, 所以推荐一下。
代码下载: Gamer_STM32_InfoNES.rar 2011年06月01日 20:26
点击此处下载 ourdev_644967SW6FPE.rar(文件大小:1.60M) (原文件名:Gamer_STM32_InfoNES.rar)
Copy 到 TF 卡中的文件:Gamer_STM32_InfoNES.rar 2011年06月01日 20:43
点击此处下载 ourdev_644978JO7IZ1.rar(文件大小:5.06M) (原文件名:Copy 到 TF 卡中的文件.rar)
(原文件名:nes1.JPG)
(原文件名:nes2.JPG)
(原文件名:nes3.JPG)
(原文件名:nes4.JPG) |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|