本期分享来自RT-Thread的社区小伙伴霹雳大乌龙,如果你也有文章愿意分享/希望获得官方的写作指导,可以发送文章/联系方式邮件至邮箱:xuqianqian@rt-thread.com
回顾往期:
软件包应用分享|基于RT-Thread的百度语音识别(一)
一、前言
本篇分享的是项目介绍中的第7点:
● 使用SUFD组件+FAL软件包读取存储在外部flash的中文字库,实现LCD的中文显示,用来显示语音识别结果。
为什么要实现这部分?是因为考虑到语音识别的应用可以不仅仅局限于控制简单的外设。最初的想法是,我不用来控制rgb灯了,除了控制台,我还可以用LCD来显示识别结果;待到可以显示识别结果了,更多的应用场景也就随之打开,比如语音显示个天气预报什么的...
二、准备工作
1、首先你必须完成了 连载(一)中讲解的内容;
2、学习汉字显示原理,如何制作字库,如何将字库烧写进flash中(参考正点原子的教程);
3、因为本篇分享的是如何读取字库文件,所以你需要自行将字库文件烧写进外部Flash中(字库文件为正点原子FONT文件夹下的内容);
正点原子提供的中文字库包含了12,16,24,32四种字体大小的字库文件以及unicode和gbk的互换表。这里我为了方便直接运行原子的汉字显示例程,该程序里包含将字库烧写进spi flash的部分。无论你使用何种方式烧写字库,请记住你烧录的地址。
这次我们还将用到RT-Thread的SUFD组件和FAL软件包,简单介绍一下:
SUFD(串行闪存通用驱动库)
看中文名就知道了,用来驱动spi flash的。SFUD是一种开源的串行SPI Flash通用驱动库,使用这个库,你就不必自己编写flash驱动了,基本市面上绝大多数的flash,都可以轻轻松松地驱动起来,非常方便。
FAL(Flash抽象层)
简单来说,使用该软件包,你可以方便地使用API对flash进行分区管理,读写操作等,支持自定义分区表,不得不说,很强!
fal软件包的使用是本次工程的重点,但使用fal前我们还需要做些准备工作,对fal进行移植:
首先你需要对 Flash 设备进行定义;
然后定义 Flash 设备表,根据你字库文件在外部Flash的存放位置,为字库文件划分相应的分区;
参考:https://github.com/RT-Thread-packages/fal/blob/master/samples/porting/README.md
三、动手实践
1. ENV配置
● 打开SUFD组件:
● 打开fal软件包:
●使能外部FLASH和LCD
2. 移植fal
2.1 定义flash设备
1/* fal_flash_sufd_port.c */
2/* 参考自IoT Board SDK */
3
4#include <fal.h>
5
6#ifdef FAL_FLASH_PORT_DRIVER_SFUD
7#include <sfud.h>
8#include <spi_flash_sfud.h>
9
10sfud_flash sfud_norflash0;
11
12static int fal_sfud_init(void)
13{
14 sfud_flash_t sfud_flash0 = NULL;
15 sfud_flash0 = (sfud_flash_t)rt_sfud_flash_find("qspi10");
16 if (NULL == sfud_flash0)
17 {
18 return -1;
19 }
20
21 sfud_norflash0 = *sfud_flash0;
22 return 0;
23}
24
25static int read(long offset, uint8_t *buf, size_t size)
26{
27 sfud_read(&sfud_norflash0, nor_flash0.addr + offset, size, buf);
28
29 return size;
30}
31
32static int write(long offset, const uint8_t *buf, size_t size)
33{
34 if (sfud_write(&sfud_norflash0, nor_flash0.addr + offset, size, buf) != SFUD_SUCCESS)
35 {
36 return -1;
37 }
38
39 return size;
40}
41
42static int erase(long offset, size_t size)
43{
44 if (sfud_erase(&sfud_norflash0, nor_flash0.addr + offset, size) != SFUD_SUCCESS)
45 {
46 return -1;
47 }
48
49 return size;
50}
51const struct fal_flash_dev nor_flash0 = { "nor_flash", 0, (16 * 1024 * 1024), 4096, {fal_sfud_init, read, write, erase} };
52#endif /* FAL_FLASH_PORT_DRIVER_SFUD */
2.2 定义flash设备表
1/* fal_cfg.h */
2/* 参考自IoT Board SDK */
3
4#ifndef _FAL_CFG_H_
5#define _FAL_CFG_H_
6
7#include <rtthread