[评测]沁恒RISC-V开发板读取内存卡字库显示

电子电路开发学习 2021-08-27 09:00


再次感谢沁恒官方寄送的这块 CH32V103 开发板,集成了仿真下载器,集成了USB转串口,还兼容了Arduino接口,使用起来很方便。

FAT 文件配置表经过多年发展(FAT、FAT12、FAT16、FAT32、exFAT),目前已经广泛应用在 内存卡、U盘 等小容量存储介质中。

FAT~FAT16 由于最大容量限制等原因,目前已经逐步退出历史舞台,FAT32目前使用还比较广泛也是我正在使用的。

本文使用 FATFS,实现对文件目录的检索和长文件名的读取转换,最终将结果打印到串口调试助手。 
先看一下U盘里都存了什么(一不小心暴露了年龄):


通过FATFS,我们能轻而易举的读取到这些文件的 8.3 短文件名,8字节文件名(中文则为4字),3字节后缀。
   

规规整整,但总觉得少了点什么,只有歌手名没有歌曲名?小写的后缀mp3变成大写的?然后~1又是什么?

想了解短文件名的可以搜一下论坛了解,这里就不重复,我们目的是长文件名,继续。

在 FATFS 配置中开启中文长文件名支持:#define _LFN_UNICODE    1,开启中文支持:#define _CODE_PAGE  936


成功了一半,由于长文件名是 Unicode 编码的,直接读出来,再通过串口打印显示,全是乱码??这里就涉及编码转换问题,串口助手一般都是显示GBK编码的字符,编码不同就导致乱码,需要用到 FATFS 里的编码转换函数进行转换,但由于 GBK 和 Unicode 转换是无规律的,只能纯粹的查表,老美给中国人设置的坑???为什么要为难中文和非英文??这个表还非常大,要占用 170K 以上的存储空间。。。

我这是一个 64K Flash 的单片机???

有难度才有动力啊,放入外置Flash?没有Flash,那只好放入内存卡了,刚好这些歌曲也是放在内存卡的,就建立一个目录,SYS,里面放入 Unicode 和 GBK 互转的对照表。

在内存卡插入的时候,挂载文件系统,读取 Unicode 和 GBK 转换表。

        if(SD_Detect())            {                if(sd_status == 0)                {                    sd_status = 1;                    printf("Insert\r\n");                }            }            else            {                sd_status = 0;        }
if(sd_status == 1) { path[0] = '0'; path[1] = ':'; path[2] = 0; res_sd = f_mount(&fs,path,1); if(res_sd == FR_OK) { sd_status = 2; printf("Mount Ok\r\n");
path[0] = '0'; path[1] = ':'; path[2] = '/'; path[3] = 'S'; path[4] = 'Y'; path[5] = 'S'; path[6] = '/'; path[7] = 'U'; path[8] = 'N'; path[9] = 'I'; path[10] = 'G'; path[11] = 'B'; path[12] = 'K'; path[13] = '.'; path[14] = 'B'; path[15] = 'I'; path[16] = 'N'; path[17] = 0;
res_sd = f_open(&gd_FileUNItoGBK,path,FA_READ); if(res_sd == FR_OK) printf("Load UNIGBK.BIN Ok\r\n"); else printf("Load UNIGBK.BIN Fail\r\n");
path[2] = '/'; path[3] = 0; scan_files(path); } else if(res_sd == FR_NO_FILESYSTEM) { printf("No File System\r\n"); } else { printf("Mount Fail\r\n"); } }


改写 cc936.c 文件里的 ff_convert 函数,改为从内存卡指定偏移位置读取对照表信息。

WCHAR ff_convert (  /* Converted code, 0 means conversion error */    WCHAR   src,    /* Character code to be converted */    UINT    dir     /* 0: Unicode to OEMCP, 1: OEMCP to Unicode */){    WCHAR t[2];    WCHAR c;    DWORD i, li, hi;    WCHAR n;    UINT cout;    DWORD offset;
if(src < 0x80) // ASCII return src; else { if(dir) // GBK TO UNICODE { offset = gd_FileUNItoGBK.fsize >> 1; } else // UNICODE TO GBK { offset = 0; } if(gd_FileUNItoGBK.fsize != 0) { hi = gd_FileUNItoGBK.fsize >> 1; hi = (hi >> 2) - 1; li = 0; for(n=16; n; n--) { i = li + ((hi - li) >> 1); f_lseek(&gd_FileUNItoGBK, (i << 2) + offset); f_read(&gd_FileUNItoGBK, &t, 4, &cout); if(src == t[0]) break; if(src > t[0]) li = i; else hi = i; } c = n ? t[1] : 0; } else c = 0; } return c;}

核心部分基本就完成了,接下来读取长文件名,转换为GBK编码并打印。

                p = pt;                pth = *fno.lfname ? fno.lfname : fno.fname;                while(*pth != 0)                {                    ct = ff_convert(*pth, 0);
if(ct > 255) { *p = (u8)(ct>>8); p++; *p = (u8)ct; p++; } else { *p = (u8)ct; p++; } pth++; } *p = 0;
printf("%s\r\n", pt);

这样终于能显示中文长文件名了。


由于是 SPI 接口读取内存卡,中文编码转换速度有点慢,在没有 SDIO 接口的情况下,只能调高 SPI 速率,再借助 DMA 来提高读写速度。

显示到串口助手显然不太方便,我看目录还要带个电脑?再说有电脑我还需要这样看目录?

这次我们换个地方显示。

说干就干。

从杂物堆里找来了一个12864显示屏,非常mini的那种,0.96寸,某宝上也有很多哦,10米左右即可拥有。



怎么点亮屏幕这篇文章就不说了,买屏送的资料就够亮屏了。

本次主要实现内存卡字库的读取,显示。

由于内存卡存放的文件,文件名可能是各种各样的,如果要显示任意中文字符,就需要对所有 汉字 进行取模,生成字库。

那把所有汉字打出来,再一一取模不就好了?


这里涉及2个问题:
1、汉字有上万个,常见的也有几千个,一一取模再转换未免太费神。
2、这么多汉字,如何一一对照,例如我想在这一堆字模中,快速找到“我”这个字的字模。
什么?忘记取模的时候“我”的字模排在第几位了。

对于第一个问题,感谢一些前辈大佬,已经有很多生成字库的软件了。

第二个问题,汉字编码有很多种,例如 GB2312(收录6763汉字)、GBK(收录21886汉字)、Unicode(收录6万多字)、UTF-32则收录了12万字。

已经有以上多种编码了,编码就代表着文字的排序,直接对照就好。

这里取GBK和Unicode为例。GBK中出现的第一个汉字为“丂”,编码为16进制的8140,一个汉字用2个字节表示。

如何获取汉字GBK编码?这里提供一种土办法,串口助手!

将RX和TX短接,发送设置为字符GBK编码,接收设置为16进制,发送后接收到的就是字符编码:


获取 Unicode 同理,发送切换到 Unicode 编码,接收为16进制:


取模不管对照GBK编码,还是Unicode编码,都是能实现我们这个功能的。直接选个编码开始取模:


生成字库二进制文件:


再放入内存卡即可,然后使用 FATFS 读取字库文件信息:
f_open(&gd_FileFontLib16, path, FA_READ);

偏移文件读取指针:
f_lseek(&gd_FileFontLib16, foffset);

读取字模信息:
f_read (&gd_FileFontLib16, Buff, 32, &cout);

使用 Unicode 编码的字库时,foffset偏移就是汉字编码,使用 GBK 编码的字库时,foffset偏移按照以下计算方法:


  qh = *Str;  ql = *(++Str);
  if(qh<0x81 || ql<0x40 || ql==0xff || qh==0xff)        // 非常用汉字  {    for(i=0; i<(Size<<1) ;i++)      *Buff++ = 0x00;                                   // 填充    return 0; }
  if(ql < 0x7f)    ql-=0x40;  else ql-=0x41;
  qh -= 0x81; foffset = ((u32)190 * qh + ql) * (Size&0x07 ? (Size>>3)+1 : Size>>3) * Size; // 得到字库中的字节偏移量


得到字模后显示即可,就不多说了,上图:




电子电路开发学习 单片机点灯小能手,电子行业从业者。开发板评测、嵌入式开源项目分享、学习笔记记录。可能不会经常更新,但每一篇都是精心编写。
评论 (0)
  • 文/Leon编辑/cc孙聪颖‍2023年,厨电行业在相对平稳的市场环境中迎来温和复苏,看似为行业增长积蓄势能。带着对市场向好的预期,2024 年初,老板电器副董事长兼总经理任富佳为企业定下双位数增长目标。然而现实与预期相悖,过去一年,这家老牌厨电企业不仅未能达成业绩目标,曾提出的“三年再造一个老板电器”愿景,也因市场下行压力面临落空风险。作为“企二代”管理者,任富佳在掌舵企业穿越市场周期的过程中,正面临着前所未有的挑战。4月29日,老板电器(002508.SZ)发布了2024年年度报告及2025
    华尔街科技眼 2025-04-30 12:40 206浏览
  • 随着电子元器件的快速发展,导致各种常见的贴片电阻元器件也越来越小,给我们分辨也就变得越来越难,下面就由smt贴片加工厂_安徽英特丽就来告诉大家如何分辨的SMT贴片元器件。先来看看贴片电感和贴片电容的区分:(1)看颜色(黑色)——一般黑色都是贴片电感。贴片电容只有勇于精密设备中的贴片钽电容才是黑色的,其他普通贴片电容基本都不是黑色的。(2)看型号标码——贴片电感以L开头,贴片电容以C开头。从外形是圆形初步判断应为电感,测量两端电阻为零点几欧,则为电感。(3)检测——贴片电感一般阻值小,更没有“充放
    贴片加工小安 2025-04-29 14:59 223浏览
  • 在智能硬件设备趋向微型化的背景下,语音芯片方案厂商针对小体积设备开发了多款超小型语音芯片方案,其中WTV系列和WT2003H系列凭借其QFN封装设计、高性能与高集成度,成为微型设备语音方案的理想选择。以下从封装特性、功能优势及典型应用场景三个方面进行详细介绍。一、超小体积封装:QFN技术的核心优势WTV系列与WT2003H系列均提供QFN封装(如QFN32,尺寸为4×4mm),这种封装形式具有以下特点:体积紧凑:QFN封装通过减少引脚间距和优化内部结构,显著缩小芯片体积,适用于智能门铃、穿戴设备
    广州唯创电子 2025-04-30 09:02 236浏览
  • 浪潮之上:智能时代的觉醒    近日参加了一场课题的答辩,这是医疗人工智能揭榜挂帅的国家项目的地区考场,参与者众多,围绕着医疗健康的主题,八仙过海各显神通,百花齐放。   中国大地正在发生着激动人心的场景:深圳前海深港人工智能算力中心高速运转的液冷服务器,武汉马路上自动驾驶出租车穿行的智慧道路,机器人参与北京的马拉松竞赛。从中央到地方,人工智能相关政策和消息如雨后春笋般不断出台,数字中国的建设图景正在智能浪潮中徐徐展开,战略布局如同围棋
    广州铁金刚 2025-04-30 15:24 187浏览
  • 你是不是也有在公共场合被偷看手机或笔电的经验呢?科技时代下,不少现代人的各式机密数据都在手机、平板或是笔电等可携式的3C产品上处理,若是经常性地需要在公共场合使用,不管是工作上的机密文件,或是重要的个人信息等,民众都有防窃防盗意识,为了避免他人窥探内容,都会选择使用「防窥保护贴片」,以防止数据外泄。现今市面上「防窥保护贴」、「防窥片」、「屏幕防窥膜」等产品就是这种目的下产物 (以下简称防窥片)!防窥片功能与常见问题解析首先,防窥片最主要的功能就是用来防止他人窥视屏幕上的隐私信息,它是利用百叶窗的
    百佳泰测试实验室 2025-04-30 13:28 324浏览
  • 文/郭楚妤编辑/cc孙聪颖‍越来越多的企业开始蚕食动力电池市场,行业“去宁王化”态势逐渐明显。随着这种趋势的加强,打开新的市场对于宁德时代而言至关重要。“我们不希望被定义为电池的制造者,而是希望把自己称作新能源产业的开拓者。”4月21日,在宁德时代举行的“超级科技日”发布会上,宁德时代掌门人曾毓群如是说。随着宁德时代核心新品骁遥双核电池的发布,其搭载的“电电增程”技术也走进业界视野。除此之外,经过近3年试水,宁德时代在换电业务上重资加码。曾毓群认为换电是一个重资产、高投入、长周期的产业,涉及的利
    华尔街科技眼 2025-04-28 21:55 163浏览
  • 在CAN总线分析软件领域,当CANoe不再是唯一选择时,虹科PCAN-Explorer 6软件成为了一个有竞争力的解决方案。在现代工业控制和汽车领域,CAN总线分析软件的重要性不言而喻。随着技术的进步和市场需求的多样化,单一的解决方案已无法满足所有用户的需求。正是在这样的背景下,虹科PCAN-Explorer 6软件以其独特的模块化设计和灵活的功能扩展,为CAN总线分析领域带来了新的选择和可能性。本文将深入探讨虹科PCAN-Explorer 6软件如何以其创新的模块化插件策略,提供定制化的功能选
    虹科汽车智能互联 2025-04-28 16:00 184浏览
  • 网约车,真的“饱和”了?近日,网约车市场的 “饱和” 话题再度引发热议。多地陆续发布网约车风险预警,提醒从业者谨慎入局,这背后究竟隐藏着怎样的市场现状呢?从数据来看,网约车市场的“过剩”现象已愈发明显。以东莞为例,截至2024年12月底,全市网约车数量超过5.77万辆,考取网约车驾驶员证的人数更是超过13.48万人。随着司机数量的不断攀升,订单量却未能同步增长,导致单车日均接单量和营收双双下降。2024年下半年,东莞网约出租车单车日均订单量约10.5单,而单车日均营收也不容乐
    用户1742991715177 2025-04-29 18:28 221浏览
  • 贞光科技代理品牌紫光国芯的车规级LPDDR4内存正成为智能驾驶舱的核心选择。在汽车电子国产化浪潮中,其产品以宽温域稳定工作能力、优异电磁兼容性和超长使用寿命赢得市场认可。紫光国芯不仅确保供应链安全可控,还提供专业本地技术支持。面向未来,紫光国芯正研发LPDDR5车规级产品,将以更高带宽、更低功耗支持汽车智能化发展。随着智能网联汽车的迅猛发展,智能驾驶舱作为人机交互的核心载体,对处理器和存储器的性能与可靠性提出了更高要求。在汽车电子国产化浪潮中,贞光科技代理品牌紫光国芯的车规级LPDDR4内存凭借
    贞光科技 2025-04-28 16:52 256浏览
  • 一、gao效冷却与控温机制‌1、‌冷媒流动设计‌采用低压液氮(或液氦)通过毛细管路导入蒸发器,蒸汽喷射至样品腔实现快速冷却,冷却效率高(室温至80K约20分钟,至4.2K约30分钟)。通过控温仪动态调节蒸发器加热功率,结合温度传感器(如PT100铂电阻或Cernox磁场不敏感传感器),实现±0.01K的高精度温度稳定性。2、‌宽温区覆盖与扩展性‌标准温区为80K-325K,通过降压选件可将下限延伸至65K(液氮模式)或4K(液氦模式)。可选配475K高温模块,满足材料在ji端温度下的性能测试需求
    锦正茂科技 2025-04-30 13:08 251浏览
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦