@star 发表于 2023-11-23 18:04:45

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



//字库区域占用的总扇区数大小(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);
                }
        }

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

eric2013 发表于 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



@star 发表于 2023-11-25 00:01:13

感谢您的回复
页: [1]
查看完整版本: 急!!!在F407标准库的汉字显示实验中,更换字库的起始地址后不能显示了