国产开发板测评:沁恒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,你想知道的都在这里。
评论
  • 在不断发展的电子元件领域,继电器——作为切换电路的关键设备,正在经历前所未有的技术变革。固态继电器(SSR)和机械继电器之间的争论由来已久。然而,从未来发展的角度来看,固态继电器正逐渐占据上风。本文将从耐用性、速度和能效三个方面,全面剖析固态继电器为何更具优势,并探讨其在行业中的应用与发展趋势。1. 耐用性:经久耐用的设计机械继电器:机械继电器依靠物理触点完成电路切换。然而,随着时间的推移,这些触点因电弧、氧化和材料老化而逐渐磨损,导致其使用寿命有限。因此,它们更适合低频或对切换耐久性要求不高的
    腾恩科技-彭工 2025-01-10 16:15 100浏览
  • 新年伊始,又到了对去年做总结,对今年做展望的时刻 不知道你在2024年初立的Flag都实现了吗? 2025年对自己又有什么新的期待呢? 2024年注定是不平凡的一年, 一年里我测评了50余块开发板, 写出了很多科普文章, 从一个小小的工作室成长为科工公司。 展望2025年, 中国香河英茂科工, 会继续深耕于,具身机器人、飞行器、物联网等方面的研发, 我觉得,要向未来学习未来, 未来是什么? 是掌握在孩子们生活中的发现,和精历, 把最好的技术带给孩子,
    丙丁先生 2025-01-11 11:35 457浏览
  • PNT、GNSS、GPS均是卫星定位和导航相关领域中的常见缩写词,他们经常会被用到,且在很多情况下会被等同使用或替换使用。我们会把定位导航功能测试叫做PNT性能测试,也会叫做GNSS性能测试。我们会把定位导航终端叫做GNSS模块,也会叫做GPS模块。但是实际上他们之间是有一些重要的区别。伴随着技术发展与越发深入,我们有必要对这三个词汇做以清晰的区分。一、什么是GPS?GPS是Global Positioning System(全球定位系统)的缩写,它是美国建立的全球卫星定位导航系统,是GNSS概
    德思特测试测量 2025-01-13 15:42 491浏览
  • ARMv8-A是ARM公司为满足新需求而重新设计的一个架构,是近20年来ARM架构变动最大的一次。以下是对ARMv8-A的详细介绍: 1. 背景介绍    ARM公司最初并未涉足PC市场,其产品主要针对功耗敏感的移动设备。     随着技术的发展和市场需求的变化,ARM开始扩展到企业设备、服务器等领域,这要求其架构能够支持更大的内存和更复杂的计算任务。 2. 架构特点    ARMv8-A引入了Execution State(执行状
    丙丁先生 2025-01-12 10:30 466浏览
  • 数字隔离芯片是现代电气工程师在进行电路设计时所必须考虑的一种电子元件,主要用于保护低压控制电路中敏感电子设备的稳定运行与操作人员的人身安全。其不仅能隔离两个或多个高低压回路之间的电气联系,还能防止漏电流、共模噪声与浪涌等干扰信号的传播,有效增强电路间信号传输的抗干扰能力,同时提升电子系统的电磁兼容性与通信稳定性。容耦隔离芯片的典型应用原理图值得一提的是,在电子电路中引入隔离措施会带来传输延迟、功耗增加、成本增加与尺寸增加等问题,而数字隔离芯片的目标就是尽可能消除这些不利影响,同时满足安全法规的要
    华普微HOPERF 2025-01-15 09:48 78浏览
  • 01. 什么是过程能力分析?过程能力研究利用生产过程中初始一批产品的数据,预测制造过程是否能够稳定地生产符合规格的产品。可以把它想象成一种预测。通过历史数据的分析,推断未来是否可以依赖该工艺持续生产高质量产品。客户可能会要求将过程能力研究作为生产件批准程序 (PPAP) 的一部分。这是为了确保制造过程能够持续稳定地生产合格的产品。02. 基本概念在定义制造过程时,目标是确保生产的零件符合上下规格限 (USL 和 LSL)。过程能力衡量制造过程能多大程度上稳定地生产符合规格的产品。核心概念很简单:
    优思学院 2025-01-12 15:43 520浏览
  • 食物浪费已成为全球亟待解决的严峻挑战,并对环境和经济造成了重大影响。最新统计数据显示,全球高达三分之一的粮食在生产过程中损失或被无谓浪费,这不仅导致了资源消耗,还加剧了温室气体排放,并带来了巨大经济损失。全球领先的光学解决方案供应商艾迈斯欧司朗(SIX:AMS)近日宣布,艾迈斯欧司朗基于AS7341多光谱传感器开发的创新应用来解决食物浪费这一全球性难题。其多光谱传感解决方案为农业与食品行业带来深远变革,该技术通过精确判定最佳收获时机,提升质量控制水平,并在整个供应链中有效减少浪费。 在2024
    艾迈斯欧司朗 2025-01-14 18:45 59浏览
  • 随着数字化的不断推进,LED显示屏行业对4K、8K等超高清画质的需求日益提升。与此同时,Mini及Micro LED技术的日益成熟,推动了间距小于1.2 Pitch的Mini、Micro LED显示屏的快速发展。这类显示屏不仅画质卓越,而且尺寸适中,通常在110至1000英寸之间,非常适合应用于电影院、监控中心、大型会议、以及电影拍摄等多种室内场景。鉴于室内LED显示屏与用户距离较近,因此对于噪音控制、体积小型化、冗余备份能力及电气安全性的要求尤为严格。为满足这一市场需求,开关电源技术推出了专为
    晶台光耦 2025-01-13 10:42 498浏览
  •   在信号处理过程中,由于信号的时域截断会导致频谱扩展泄露现象。那么导致频谱泄露发生的根本原因是什么?又该采取什么样的改善方法。本文以ADC性能指标的测试场景为例,探讨了对ADC的输出结果进行非周期截断所带来的影响及问题总结。 两个点   为了更好的分析或处理信号,实际应用时需要从频域而非时域的角度观察原信号。但物理意义上只能直接获取信号的时域信息,为了得到信号的频域信息需要利用傅里叶变换这个工具计算出原信号的频谱函数。但对于计算机来说实现这种计算需要面对两个问题: 1.
    TIAN301 2025-01-14 14:15 108浏览
  • 随着通信技术的迅速发展,现代通信设备需要更高效、可靠且紧凑的解决方案来应对日益复杂的系统。中国自主研发和制造的国产接口芯片,正逐渐成为通信设备(从5G基站到工业通信模块)中的重要基石。这些芯片凭借卓越性能、成本效益及灵活性,满足了现代通信基础设施的多样化需求。 1. 接口芯片在通信设备中的关键作用接口芯片作为数据交互的桥梁,是通信设备中不可或缺的核心组件。它们在设备内的各种子系统之间实现无缝数据传输,支持高速数据交换、协议转换和信号调节等功能。无论是5G基站中的数据处理,还是物联网网关
    克里雅半导体科技 2025-01-10 16:20 444浏览
  • 电动汽车(EV)正在改变交通运输,为传统内燃机提供更清洁、更高效的替代方案。这种转变的核心是电力电子和能源管理方面的创新,而光耦合器在其中发挥着关键作用。这些不起眼的组件可实现可靠的通信、增强安全性并优化电动汽车系统的性能,使其成为正在进行的革命中不可或缺的一部分。光耦合器,也称为光隔离器,是一种使用光传输电信号的设备。通过隔离高压和低压电路,光耦合器可确保安全性、减少干扰并保持信号完整性。这些特性对于电动汽车至关重要,因为精确控制和安全性至关重要。 光耦合器在电动汽车中的作用1.电池
    腾恩科技-彭工 2025-01-10 16:14 78浏览
  • 根据Global Info Research(环洋市场咨询)项目团队最新调研,预计2030年全球无人机电池和电源产值达到2834百万美元,2024-2030年期间年复合增长率CAGR为10.1%。 无人机电池是为无人机提供动力并使其飞行的关键。无人机使用的电池类型因无人机的大小和型号而异。一些常见的无人机电池类型包括锂聚合物(LiPo)电池、锂离子电池和镍氢(NiMH)电池。锂聚合物电池是最常用的无人机电池类型,因为其能量密度高、设计轻巧。这些电池以输出功率大、飞行时间长而著称。不过,它们需要
    GIRtina 2025-01-13 10:49 181浏览
  • 随着全球向绿色能源转型的加速,对高效、可靠和环保元件的需求从未如此强烈。在这种背景下,国产固态继电器(SSR)在实现太阳能逆变器、风力涡轮机和储能系统等关键技术方面发挥着关键作用。本文探讨了绿色能源系统背景下中国固态继电器行业的前景,并强调了2025年的前景。 1.对绿色能源解决方案日益增长的需求绿色能源系统依靠先进的电源管理技术来最大限度地提高效率并最大限度地减少损失。固态继电器以其耐用性、快速开关速度和抗机械磨损而闻名,正日益成为传统机电继电器的首选。可再生能源(尤其是太阳能和风能
    克里雅半导体科技 2025-01-10 16:18 325浏览
  • 流量传感器是实现对燃气、废气、生活用水、污水、冷却液、石油等各种流体流量精准计量的关键手段。但随着工业自动化、数字化、智能化与低碳化进程的不断加速,采用传统机械式检测方式的流量传感器已不能满足当代流体计量行业对于测量精度、测量范围、使用寿命与维护成本等方面的精细需求。流量传感器的应用场景(部分)超声波流量传感器,是一种利用超声波技术测量流体流量的新型传感器,其主要通过发射超声波信号并接收反射回来的信号,根据超声波在流体中传播的时间、幅度或相位变化等参数,间接计算流体的流量,具有非侵入式测量、高精
    华普微HOPERF 2025-01-13 14:18 482浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦