国产开发板测评:沁恒CH32V103读取内存卡字库显示

原创 嵌入式ARM 2021-08-16 10:36


再次感谢沁恒官方寄送的这块 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; // 得到字库中的字节偏移量


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


END

本文系21ic资深网友gtbestom原创撰写


推荐阅读
HC32F460开发板之点亮板载的0.91寸OLED
STM32L431使用TencentOS tiny操作系统连接腾讯物联网开发平台
教你一招:如何在MCU上高效地管理内存?

→点关注,不迷路←
嵌入式ARM 关注这个时代最火的嵌入式ARM,你想知道的都在这里。
评论
  • 天问Block和Mixly是两个不同的编程工具,分别在单片机开发和教育编程领域有各自的应用。以下是对它们的详细比较: 基本定义 天问Block:天问Block是一个基于区块链技术的数字身份验证和数据交换平台。它的目标是为用户提供一个安全、去中心化、可信任的数字身份验证和数据交换解决方案。 Mixly:Mixly是一款由北京师范大学教育学部创客教育实验室开发的图形化编程软件,旨在为初学者提供一个易于学习和使用的Arduino编程环境。 主要功能 天问Block:支持STC全系列8位单片机,32位
    丙丁先生 2024-12-11 13:15 73浏览
  • 铁氧体芯片是一种基于铁氧体磁性材料制成的芯片,在通信、传感器、储能等领域有着广泛的应用。铁氧体磁性材料能够通过外加磁场调控其导电性质和反射性质,因此在信号处理和传感器技术方面有着独特的优势。以下是对半导体划片机在铁氧体划切领域应用的详细阐述: 一、半导体划片机的工作原理与特点半导体划片机是一种使用刀片或通过激光等方式高精度切割被加工物的装置,是半导体后道封测中晶圆切割和WLP切割环节的关键设备。它结合了水气电、空气静压高速主轴、精密机械传动、传感器及自动化控制等先进技术,具有高精度、高
    博捷芯划片机 2024-12-12 09:16 100浏览
  • 习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-11 17:58 99浏览
  • 全球智能电视时代来临这年头若是消费者想随意地从各个通路中选购电视时,不难发现目前市场上的产品都已是具有智能联网功能的智能电视了,可以宣告智能电视的普及时代已到临!Google从2021年开始大力推广Google TV(即原Android TV的升级版),其他各大品牌商也都跟进推出搭载Google TV操作系统的机种,除了Google TV外,LG、Samsung、Panasonic等大厂牌也开发出自家的智能电视平台,可以看出各家业者都一致地看好这块大饼。智能电视的Wi-Fi连线怎么消失了?智能电
    百佳泰测试实验室 2024-12-12 17:33 95浏览
  • 一、SAE J1939协议概述SAE J1939协议是由美国汽车工程师协会(SAE,Society of Automotive Engineers)定义的一种用于重型车辆和工业设备中的通信协议,主要应用于车辆和设备之间的实时数据交换。J1939基于CAN(Controller Area Network)总线技术,使用29bit的扩展标识符和扩展数据帧,CAN通信速率为250Kbps,用于车载电子控制单元(ECU)之间的通信和控制。小北同学在之前也对J1939协议做过扫盲科普【科普系列】SAE J
    北汇信息 2024-12-11 15:45 125浏览
  • 应用环境与极具挑战性的测试需求在服务器制造领域里,系统整合测试(System Integration Test;SIT)是确保产品质量和性能的关键步骤。随着服务器系统的复杂性不断提升,包括:多种硬件组件、操作系统、虚拟化平台以及各种应用程序和服务的整合,服务器制造商面临着更有挑战性的测试需求。这些挑战主要体现在以下五个方面:1. 硬件和软件的高度整合:现代服务器通常包括多个处理器、内存模块、储存设备和网络接口。这些硬件组件必须与操作系统及应用软件无缝整合。SIT测试可以帮助制造商确保这些不同组件
    百佳泰测试实验室 2024-12-12 17:45 96浏览
  • 习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-12 10:13 65浏览
  • RK3506 是瑞芯微推出的MPU产品,芯片制程为22nm,定位于轻量级、低成本解决方案。该MPU具有低功耗、外设接口丰富、实时性高的特点,适合用多种工商业场景。本文将基于RK3506的设计特点,为大家分析其应用场景。RK3506核心板主要分为三个型号,各型号间的区别如下图:​图 1  RK3506核心板处理器型号场景1:显示HMIRK3506核心板显示接口支持RGB、MIPI、QSPI输出,且支持2D图形加速,轻松运行QT、LVGL等GUI,最快3S内开
    万象奥科 2024-12-11 15:42 97浏览
  • 本文介绍瑞芯微RK3588主板/开发板Android12系统下,APK签名文件生成方法。触觉智能EVB3588开发板演示,搭载了瑞芯微RK3588芯片,该开发板是核心板加底板设计,音视频接口、通信接口等各类接口一应俱全,可帮助企业提高产品开发效率,缩短上市时间,降低成本和设计风险。工具准备下载Keytool-ImportKeyPair工具在源码:build/target/product/security/系统初始签名文件目录中,将以下三个文件拷贝出来:platform.pem;platform.
    Industio_触觉智能 2024-12-12 10:27 94浏览
  • 时源芯微——RE超标整机定位与解决详细流程一、 初步测量与问题确认使用专业的电磁辐射测量设备,对整机的辐射发射进行精确测量。确认是否存在RE超标问题,并记录超标频段和幅度。二、电缆检查与处理若存在信号电缆:步骤一:拔掉所有信号电缆,仅保留电源线,再次测量整机的辐射发射。若测量合格:判定问题出在信号电缆上,可能是电缆的共模电流导致。逐一连接信号电缆,每次连接后测量,定位具体哪根电缆或接口导致超标。对问题电缆进行处理,如加共模扼流圈、滤波器,或优化电缆布局和屏蔽。重新连接所有电缆,再次测量
    时源芯微 2024-12-11 17:11 125浏览
  • 首先在gitee上打个广告:ad5d2f3b647444a88b6f7f9555fd681f.mp4 · 丙丁先生/香河英茂工作室中国 - Gitee.com丙丁先生 (mr-bingding) - Gitee.com2024年对我来说是充满挑战和机遇的一年。在这一年里,我不仅进行了多个开发板的测评,还尝试了多种不同的项目和技术。今天,我想分享一下这一年的故事,希望能给大家带来一些启发和乐趣。 年初的时候,我开始对各种开发板进行测评。从STM32WBA55CG到瑞萨、平头哥和平海的开发板,我都
    丙丁先生 2024-12-11 20:14 89浏览
  • 在智能化技术快速发展当下,图像数据的采集与处理逐渐成为自动驾驶、工业等领域的一项关键技术。高质量的图像数据采集与算法集成测试都是确保系统性能和可靠性的关键。随着技术的不断进步,对于图像数据的采集、处理和分析的需求日益增长,这不仅要求我们拥有高性能的相机硬件,还要求我们能够高效地集成和测试各种算法。我们探索了一种多源相机数据采集与算法集成测试方案,能够满足不同应用场景下对图像采集和算法测试的多样化需求,确保数据的准确性和算法的有效性。一、相机组成相机一般由镜头(Lens),图像传感器(Image
    康谋 2024-12-12 09:45 108浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦