软件包应用分享|基于RT-Thread的百度语音识别(二)

本文介绍了如何利用RT-Thread的SUFD组件和FAL软件包,结合百度语音识别,实现在LCD上显示中文识别结果。通过移植fal,配置ENV,定义flash设备和分区,实现从外部Flash读取中文字库,解决utf-8到gbk的转换问题。
摘要由CSDN通过智能技术生成

本期分享来自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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值