OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6658|回复: 5

FatFs R0.14 字库放在flash sd卡 切换例子

[复制链接]

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-10-28 18:02:23 | 显示全部楼层 |阅读模式
本帖最后由 nashui_sx 于 2020-12-29 10:08 编辑

1.STM32F103C8T6
2.字库升级等代码,参见正点原子的例子
3.fatfs采用最新的FatFs R0.14  http://elm-chan.org/fsw/ff/00index_e.html
4.以下是说明
1)首先不创建读取汉字文件名文件,fatfs文件系统是不需要字库的,文件内部读写汉字不受字库有无影响
2)带sd卡时候又不想带flash,读写汉字文件名文件可以直接把字库放在SD卡
3)STM32F10x_CONF_H里面有是否带SD卡 或者是否带flash的宏
4)下面的宏是优先使用flash的字库
#if    (SET_W25Qxx==0)
#define ZiKu_Weizhi            2  //2:SD卡字库
#endif
#if    (SET_SD==0)
#define ZiKu_Weizhi            1  //1:Flash字库
#endif
#if    (SET_W25Qxx==0&&SET_SD==0)
#define ZiKu_Weizhi            0 //0:程序内部(全部ASCII+部分汉字)
#endif
#if    (SET_W25Qxx!=0&&SET_SD!=0)
#define ZiKu_Weizhi            1 //1:Flash字库
#endif

5)移植主要是对接 936大数组(最新版在ffunicode.c中)  大数组删掉,改成从sd或者flash读取转码
WCHAR ff_convert(WCHAR        src,UINT        dir)
{
        WCHAR t[2];
        WCHAR c;
        u32 i, li, hi;
        u16 n;                        
        unsigned int cout;                  
        u32 gbk2uni_offset=0;                  
            
        if (src < 0x80) c = src;                            //ASCII,直接不用转换.
#if ZiKu_Weizhi==1
        else
        {
                if(dir)gbk2uni_offset=ftinfo.ungbk_size/2;        //GBK 2 UNICODE
                else         gbk2uni_offset=0;                  //UNICODE 2 GBK  
               
                if(ZiKu_Open_Flag)//存在                     
                {
                        /* Unicode to OEMCP */
                        hi=ftinfo.ungbk_size/2;//对半开.
                        hi =hi / 4 - 1;
                        li = 0;
                        for (n = 16; n; n--)
                        {
                                i = li + (hi - li) / 2;                 
                                W25Qxx_Read((u8*)&t,ftinfo.ungbk_addr+i*4+gbk2uni_offset,4);//读出4个字节   
                                if (src == t[0]) break;
                                if (src > t[0])li = i;  
                                else hi = i;   
                        }
                        c = n ? t[1] : 0;
                 }
                else  c=0;
        }
#endif
#if ZiKu_Weizhi==2
        else
        {
                if(dir)gbk2uni_offset=f_size(&SD_UNIGBK_FILE)/2;        //GBK 2 UNICODE
                else         gbk2uni_offset=0;                          //UNICODE 2 GBK  

                if(ZiKu_Open_Flag)//存在                     
                {
                        /* Unicode to OEMCP */
                        hi=f_size(&SD_UNIGBK_FILE)/2;//对半开.
                        hi =hi / 4 - 1;
                        li = 0;
                        for (n = 16; n; n--)
                        {
                                i = li + (hi - li) / 2;                 
                                f_lseek(&SD_UNIGBK_FILE,i*4+gbk2uni_offset);
                                f_read(&SD_UNIGBK_FILE,&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;
        }
#endif
        return c;
}

6)字库路径
//字库存放在sd卡中的路径
const u8 *UNIGBK_PATH   ="0:/SD_SAVE_FILE/FONT/UNIGBK.BIN";    //UNIGBK的存放位置( 936大数组)
const u8 *ASCII_PATH    ="0:/SD_SAVE_FILE/FONT/ASCII.FON" ;    //ASCII的存放位置
const u8 *GBK12_PATH    ="0:/SD_SAVE_FILE/FONT/GBK12.FON" ;                 //GBK12的存放位置
const u8 *GBK16_PATH    ="0:/SD_SAVE_FILE/FONT/GBK16.FON" ;                 //GBK16的存放位置
const u8 *GBK24_PATH    ="0:/SD_SAVE_FILE/FONT/GBK24.FON" ;                 //GBK24的存放位置
const u8 *GBK32_PATH    ="0:/SD_SAVE_FILE/FONT/GBK32.FON" ;                 //GBK32的存放位置

6)sd flash对接自己的开发板 只需要改相应的.h移植区就好了,.c无需修改  
(修改SPI_SD_H 中的SD_CS引脚   _W25QXX_H_  W25Qxx_CS 这两个地方103的开发板 肯定可以直接运行)////////////////////////////////////////移植修改区域///////////////////////////////////////////////////////////
//.c 文件无需任何修改
#define W25Qxx_TYPE                       W25Q128
#define        W25Qxx_CS_GPIOx                   GPIOC
#define        W25Qxx_CS_Pin                     GPIO_Pin_13
#define        W25Qxx_CS                         PCout(13)
#define W25Qxx_SPI_SELECT                 1                       //1:SPI1  2:SPI2
#define W25Qxx_SPI_BaudRatePrescaler_x    SPI_BaudRatePrescaler_2 //(W25Qxx的最大SPI时钟为104Mhz)
                                                                                                                                  //根据芯片型号与SPI设置分频数值
                                                                                                                                  //103:SPI1-APB2=72M  SPI2-APB1=36M
                                                                                                                                  //407:SPI1-APB2=84M  SPI2-APB1=42M
////////////////////////////////////////移植修改区域///////////////////////////////////////////////////////////
////////////////////////////////////////移植修改区域///////////////////////////////////////////////////////////
//.c 文件无需任何修改
#define        SD_GPIOx                      GPIOA
#define        SD_CS_Pin                     GPIO_Pin_4
#define        SD_CS                         PAout(4)
#define SD_SPI_SELECT                 1                       //1:SPI1  2:SPI2
#define SD_SPI_BaudRatePrescaler_x    SPI_BaudRatePrescaler_2 //(SD的最大SPI时钟为 Mhz)
                                                                                                                          //根据芯片型号与SPI设置分频数值
                                                                                                                          //103:SPI1-APB2=72M  SPI2-APB1=36M
                                                                                                                          //407:SPI1-APB2=84M  SPI2-APB1=42M
////////////////////////////////////////移植修改区域///////////////////////////////////////////////////////////

#define SD_MODE_SPI_SDIO              0//0:SPI   1:SDIO

7) sd.h中  #define SD_MODE_SPI_SDIO              0//0:SPI   1:SDIO 切换sd卡驱动方式
8)其他的看工程
FATFS FLASH SD ZIKU.rar (445.33 KB, 下载次数: 363)
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

10

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2019-10-31
在线时间
13 小时
发表于 2019-10-31 22:40:40 | 显示全部楼层
回复 支持 反对

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4480
金钱
4480
注册时间
2013-4-22
在线时间
337 小时
发表于 2020-1-21 14:24:22 | 显示全部楼层
不错,谢谢分享
回复 支持 反对

使用道具 举报

5

主题

134

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1793
金钱
1793
注册时间
2015-3-13
在线时间
273 小时
发表于 2021-9-4 17:34:48 | 显示全部楼层
点阵字库生成器   根本不能用
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
 楼主| 发表于 2021-9-4 20:12:00 | 显示全部楼层
shiqurizi 发表于 2021-9-4 17:34
点阵字库生成器   根本不能用

你不会用罢了
回复 支持 反对

使用道具 举报

2

主题

474

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6505
金钱
6505
注册时间
2018-6-27
在线时间
549 小时
发表于 2021-10-25 18:08:28 | 显示全部楼层
谢谢分享,学习学习。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 08:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表