自己做了一块板子,FLASH(W25Qxx)都是空的,自己写了段简洁的代码用FAT从SD卡写到FLASH中。
有两种方式写入字库。一种把FAT系统做到FLASH里,第二种是直接写入FLASH后一段地址空间里。相比之下,我选择后者。为什么呢?FATFS太大了!你要是每次显示几个汉字就去移植,再去编译下载,那可真慢。。所以后者直接移植一个FLASH驱动就可以了。代码不多,用到什么写什么嘛,实现小功能就小代码呗。
下面贴代码了,大概讲一下

地址定义


//W25Q128! -> 总空间:16M
#define SPI_FONT_START                  12          //从12M开始写入,其余是文件系统#define    FONT16x16_SPI_ADDR              (SPI_FONT_START*1024/16 * 4096) //16x16字库
#define FONT16x16_SPI_SIZE              282752                          //使用空间Byte
#define FONT16x16_SPI_TOTAL_SIZE        (280*1024)                      //占用空间#define   FONT24x24_SPI_ADDR              (FONT16x16_SPI_ADDR+FONT16x16_SPI_TOTAL_SIZE)
#define FONT24x24_SPI_SIZE              636192                          //使用空间Byte
#define FONT24x24_SPI_TOTAL_SIZE        (624*1024)                      //占用空间#define   FONT32x32_SPI_ADDR              (FONT24x24_SPI_ADDR+FONT24x24_SPI_TOTAL_SIZE)
#define FONT32x32_SPI_SIZE              1131008                         //使用空间Byte
#define FONT32x32_SPI_TOTAL_SIZE        (1108*1024)                     //占用空间

特别注意一点,文件空间和占用空间不一样,和Window一样,一个扇区4KB,哪怕超了1bit也要占用一个扇区。
这里根据自己需要定义要存的位置。但是自己要计算好空间够不够。

实现代码

代码由于是我自己写的,所以我从简,我也挺烦一大串复杂冗余的代码。

u8 exchangeBuf[4096] __attribute__((at(0XC0000000)));FRESULT f_res;
FIL fil;
UINT spi_btr;//ph: 16x16字库文件路径  绝对路径!
void Update_SPI_FONT16x16(const TCHAR* ph)
{u16 NumtoRead = 0;u16 ByteCnt = 0;u16 spi_offset = 0;u16 Data_Reserve = 0;f_res = f_open(&fil,ph,FA_OPEN_EXISTING|FA_READ);NumtoRead = FONT16x16_SPI_TOTAL_SIZE/4096-1;                  //完整扇区读写Data_Reserve = FONT16x16_SPI_SIZE -(FONT16x16_SPI_TOTAL_SIZE - 4096);  //剩余扇区读写if(f_res == FR_OK){printf("\r\n打开文件成功");printf("\r\n开始写入SPI FLASH");while(NumtoRead != 0){f_res = f_lseek(&fil,4096*spi_offset);f_res = f_read(&fil,exchangeBuf,4096,&spi_btr);if(f_res == FR_OK) {SPI_FLASH_BufferWrite(exchangeBuf,FONT16x16_SPI_ADDR+4096*spi_offset,4096);ByteCnt+=4;spi_offset++;printf("\r\n已写入 %d 个字节",ByteCnt);if(f_res == FR_OK)NumtoRead--;else{printf("\r\nSD卡文件偏移失败!!");return;}}else{printf("\r\n读取失败退出写入!!");return;}}f_res = f_read(&fil,exchangeBuf,Data_Reserve,&spi_btr);    //剩余数据写入if(f_res == FR_OK){SPI_FLASH_BufferWrite(exchangeBuf,FONT16x16_SPI_ADDR+4096*spi_offset,Data_Reserve);printf("\r\n已经完成SPI FLASH 16x16的读写!");f_res = f_close(&fil);if(f_res == FR_OK) printf("\r\n"),printf("\r\n成功完成读写过程!");}else{printf("\r\n写入数据不完整!!需要重新写入");}}else{printf("\r\n打开文件失败");}
}

我从SDRAM开了片4KB空间给缓冲区(因为FLASH一个扇区4KB)
什么?要SDRAM?
慢着!别走这是我图快。。不用SDRAM完全可以的。
你只要从STM32内存里分配256个也可以。只是需要多写几次罢了,记得地址每次要偏移256B!但是有SRAM/SDRAM的朋友就不会觉得那么麻烦了(也就是代码麻烦)。。
这是16x16的字库,文件比较小。对于24x24、32x32一样的代码,把宏改一下。

字库使用

对于没接触过字库文件的的确很懵,我也是总觉得那玩意前面有个文件头、信息头啥的,还要加偏移。。但是字库这玩意的确没有,按GBK编码寻址就行了,这里大概说一下,毕竟不是主题

u32 Get_GBK_OffSet_Addr(const u16 Hz)
{u8 CodeH = 0,CodeL=0;u32 Addr;CodeH = (u8)(Hz >> 8);CodeL = (u8)(Hz & 0x00FF);Addr = (((CodeH - 0xA0 - 1)*94) + (CodeL-0xA0 - 1)) * (Font_Size * Font_Size / 8);return Addr;
}

这是按GB2312的编码来的,0XA0就是ASCII最后一个码,其他算法没去具体了解。按这个计算公式
你要调用?

Get_GBK_OffSet_Addr('汉');

得到偏移地址代入SPIFLASH字库基地址就可以显示了

本人学习笔记,热爱分享
<完>

STM32制作FLASH字库相关推荐

  1. STM32 内部Flash读写 程序源码 [已验证]

    目录 STM32 内部Flash带缓存读写 程序源码 0 Macro 1.Flash_Erase 2. Flash_Read_Byte 3.Flash_Write_NoBuffer 4.Flash_W ...

  2. 17-1-数据处理思想和程序架构: 单片机stm32的flash保存数据优化方案(让擦写次数达到上百万至上千万次)

    资料源码:https://gitee.com/yang456/OpenProgrammingModuleForMCU.git 点击加入群聊[单片机,物联网,上位机]: 说明1:知识从未如此性感. 烂程 ...

  3. STM32外挂FLASH模拟U盘(基于HAL库)

    STM32外挂FLASH模拟U盘(基于HAL库) 1.背景 1.1这篇文章能给你带来什么 1.2根据你要解决的问题,精确快速跳转到相应位置 1.3我在做完这个后还有不明白的地方,希望能有大触解答困惑 ...

  4. 简单的flash小动画成品_怎么制作flash动画?看这里怎么说。

    互联网的发展带动抖音短视频制作浪潮,现在抖音短视频动画很流行,我们会看到很多一些二维动画片段,看多了这些可爱的动画视频,人们都想自己动手做一个简单动画.但是大部分人都是小白,不知道如何制作这样的动画. ...

  5. 利用STM32制作红外测温仪之软件设计(MLX90614)

    目录 (一)工程目录如图: (二)main函数实现: (三)MLX90614测温代码实现 前面介绍了使用 STM32制作红外测温仪硬件设计,今天来说一下软件的实现,具体的程序,完整的keil代码我已经 ...

  6. map文件分析 stm32_使用STM32内部Flash额外的空间来存储数据

    本次分享关于STM32内部FLASH的笔记. STM32 芯片内部的 FLASH 存储器,主要用于存储我们代码.如果内部FLASH存储完我们的代码还有剩余的空间,那么这些剩余的空间我们就可以利用起来, ...

  7. stm32内部Flash读写

    文章目录 1.stm32内部flash介绍 2.读写驱动编写 3.源码 上篇文章讲到了STM32来驱动外部flah的操作,flash真是好东西啊,内存大,能存的东西多,这样我们就可以用它来做一些大点的 ...

  8. 关于STM32的Flash使用规划以及程序设计(以f407ZGT6为例)

    关于STM32的Flash使用规划以及程序设计(以f407ZGT6为例) 在涉及到比较多功能应用的时候,我们在对单片机内存资源的应用也是做一些规划比较好.不可胡乱的做内存的划分. 1.STM32F40 ...

  9. 基于STM32的Flash擦除方式

    基于STM32的Flash擦除方式 前言 介绍 STM32 FLASH 闪存的编程和擦除 Flash擦除的标准库函数 软件设计 直接使用固件库函数擦除当前地址所在的内容 擦除对应地址和大小的Flash ...

  10. 大漠插件ocr多选字库_易语言大漠插件模块制作设置字库及OcrEx识别字符串

    本课视频演示的命令有:OcrEx.OcrExOne.FetchWord,经过测试OcrExOne返回值为空,在易语言中,OcrEx返回值也和大漠说明文档不同.具体看视频 511遇见大漠模块制作 大漠接 ...

最新文章

  1. Python可以调用Gpu吗_加快Python算法的四个方法:Numba篇
  2. 简单总结过去的2021年
  3. 我的Google Adsense帐户被关
  4. Cracer8-模块和正则表达式
  5. SparkStructured报错:Failed to send RPC xxx to /xxx:34744: ClosedChannelException Lost executor
  6. chrome http请求,测试webapp接口之DHC - REST/HTTP API Client
  7. FireFox不支持InnerText的解决方法
  8. 7.王道考研数据结构-队列
  9. java 安祿山,夏天吃生菜最清爽,生菜上澆點蠔油,做法簡單,卻好吃到不行,換成肉還跟我生氣!...
  10. springboot配置手动提交_Spring Boot 入门教程 | 图文讲解
  11. cisco2811路由器密码恢复
  12. WidsMob ImageConvert for Mac(图片格式转换器)
  13. FFMPEG学习【libavcodec】:编解码器:硬件加速器桥:VDA
  14. 鸟哥的linux私房菜学习笔记7
  15. 最大公约数的四种求法(暴力、短除法、辗转相除法递归和非递归)
  16. matlab设置固定的窗宽窗位,如何设定窗宽窗位,附正常人体组织CT值
  17. 100个python算法超详细讲解:将真分数分解为埃及分数
  18. 单元测试@Test+@RunWith(SpringRunner.class)
  19. Sqoop 是什么?Sqoop 有什么特点?
  20. 计算机应用基础excel2007 6.2使用函数和公式 教案,计算机应用基础教案6.2使用函数和公式.docx...

热门文章

  1. VUE 3文件上传 Change事件无效 和 unsupported media type 415
  2. 花音机器人_【扑杀花音攻略组】超弩风机器人攻略(复刻x2)
  3. 20162327WJH四则运算第二周总结
  4. ACM题解——贪心——卫星安装
  5. HTML制作诗词,利用 html2canvas 做个简单的诗词卡片生成器
  6. 几何分布的期望和方差公式推导_GPR(高斯过程回归)详细推导
  7. nas服务器加密文件夹,NAS加密文件夹创建和使用教程
  8. 国庆专属头像、国旗专属头像一键生成源代码
  9. Cypress使用教程
  10. 安卓怎么打开html游戏,安卓手机如何打开.xapk文件