硬汉嵌入式论坛

 找回密码
 立即注册
查看: 366|回复: 2
收起左侧

[有问必答] 急!!!在F407标准库的汉字显示实验中,更换字库的起始地址后不能显示了

[复制链接]

3

主题

6

回帖

15

积分

新手上路

积分
15
发表于 2023-11-23 18:04:45 | 显示全部楼层 |阅读模式

无标题.png
//字库区域占用的总扇区数大小(3个字库+unigbk表+字库信息=3238700字节,约占791个W25QXX扇区)
#define FONTSECSIZE                 791
//字库存放起始地址
#define FONTINFOADDR         1024*1024*8 //1024*1024*12                                         //Explorer STM32F4是从12M地址以后开始存放字库
                                                                                                                //前面12M被fatfs占用了.
                                                                                                                //12M以后紧跟3个字库+UNIGBK.BIN,总大小3.09M,被字库占用了,不能动!
                                                                                                                //15.10M以后,用户可以自由使用.建议用最后的100K字节比较好.

如图我改变从8M地址开始存放字库,实际运行时一直在不断重复的更新。我通过调试发现每次初始化时
根据函数:u8 font_init(void)
{               
        u8 t=0;
        W25QXX_Init();  
        while(t<10)//连续读取10次,都是错误,说明确实是有问题,得更新字库了
        {
                t++;
                W25QXX_Read((u8*)&ftinfo,FONTINFOADDR,sizeof(ftinfo));//读出ftinfo结构体数据
                if(ftinfo.fontok==0XAA)break;
                delay_ms(20);
        }
        if(ftinfo.fontok!=0XAA)return 1;
        return 0;                    
}
会将SPIflash上读出数据保存到ftinfo上,但是调试发现结构体成员的值都是0xff和0xffff。导致不停的更新。所以我又怀疑是不是w25q128本身写不进数据,我又试了一下SPI实验的例程,把地址改到存字库的位置,发现读写数据都对。我又试着把地址改到12M,又全部正常了。搞不清楚是怎么回事了,更新字库明明就调用了W25QXX里的API,为什么会不行呢?试着多改了几个地址发现都不行。又觉得跟文件系统那部分没关系,毕竟是直接操作的W25QXX的API,大不了直接覆盖文件系统管理的部分。我也试着改了一下文件系统管理SPIFlash的大小,这一部分如下:

//////////////////////////////////////////////////////////////////////////////////          


#define SD_CARD         0  //SD卡,卷标为0
#define EX_FLASH 1        //外部flash,卷标为1

#define FLASH_SECTOR_SIZE         512                          
//对于W25Q128
//前10M字节给fatfs用,10M字节后,用于存放字库,字库占用3.09M.        14M字节以后,给客户自己用                                     
u16           FLASH_SECTOR_COUNT=2048*12;        //W25Q1218,前10M字节给FATFS占用
#define FLASH_BLOCK_SIZE           8             //每个BLOCK有8个扇区



#endif          
                if(tot_sect<2048*12)//总容量小于10M
                {
                    /* Print free space in unit of KB (assuming 512 bytes/sector) */
                    printf("\r\n磁盘总容量:%d KB\r\n"
                           "可用空间:%d KB\r\n",
                           tot_sect>>1,fre_sect>>1);
                }else
                {
                    /* Print free space in unit of KB (assuming 512 bytes/sector) */
                    printf("\r\n磁盘总容量:%d MB\r\n"
                           "可用空间:%d MB\r\n",
                           tot_sect>>11,fre_sect>>11);
                }
        }

都不管用,看正点原子库函数指南也没找到原因!想了一下午挺自闭的!!!
到底是我疏忽了什么啊!!!
寻求各位大佬帮助!!!!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
发表于 2023-11-24 08:47:32 | 显示全部楼层
帮顶。

ps:12点阵,16点阵,24点阵,32点阵全字库,通过MDK一键下载内部和外部SPI Flash,随意设置外部Fash地址,仅需修改个宏定义
https://www.armbbs.cn/forum.php? ... 3255&extra=page%3D1


下载 (8).png
回复

使用道具 举报

3

主题

6

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2023-11-25 00:01:13 | 显示全部楼层
感谢您的回复
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-3 19:10 , Processed in 0.261936 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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