硬汉嵌入式论坛

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

emwin加载xbf字体出现段错误

[复制链接]

7

主题

22

回帖

43

积分

新手上路

积分
43
发表于 2023-7-5 23:57:40 | 显示全部楼层 |阅读模式
我这里根据安富莱的教程通过FontCvt生成了xbf全字库,然后将两个字库合并成了一个font.bin文件,并通过U盘烧录进了spi flash中,字库加载方式和调用代码如下图所示
一旦进入了调用该字库的界面,就会出现段错误,是什么原因导致的呢,大家有没有遇到过这个问题啊?_cbGetXbfFontNewSong24()和_cbGetXbfFontNewSong12()这两个函数也只有上电的时候进入了一次

显示屏是800*480, 我配置的GUI_NUMBYTES为70*1024, GUI_BLOCKSIZE = 0x80
堆和栈别为0x4000和0x6000

1.png

2.png

3.png


进入该界面后,执行完InitDialog_Option(pMsg)就出现段错误,如果不设置pfont = &XBF_FontNewSong12;就没有问题

4.png


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106749
QQ
发表于 2023-7-6 09:16:21 | 显示全部楼层
调试下XBF从外部SPI Flash读取的接口函数,是不是正常返回值了
回复

使用道具 举报

7

主题

22

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2023-7-6 22:53:21 | 显示全部楼层

STM32F407 EMWIN 加载xbf字库出现段错误

eric2013 发表于 2023-7-6 09:16
调试下XBF从外部SPI Flash读取的接口函数,是不是正常返回值了

这个函数sf_ReadBuffer()应该没什么问题,我们的一些仪器信息和项目信息也都是存在spi flash中的,读写都正常。
单步调试发现_cbGetXbfFontNewSong12()和_cbGetXbfFontNewSong24()函数也只是在创建字库的时候GUI_XBF_CreateFont()调用一次,其中NumberBytes都是12(不知道是怎么来的),后面就没有再调用了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106749
QQ
发表于 2023-7-7 09:26:53 | 显示全部楼层
如果是U盘烧录的话,你的地址是不是对。这个不是直接的源文件写入了。
回复

使用道具 举报

7

主题

22

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2023-7-7 19:42:17 | 显示全部楼层
本帖最后由 circlegan 于 2023-7-7 20:18 编辑
eric2013 发表于 2023-7-7 09:26
如果是U盘烧录的话,你的地址是不是对。这个不是直接的源文件写入了。

我的U盘烧录程序是调用下面函数,这个有什么问题没

void copy_font(uint32_t flash_addr)
{
        u32 total = 0;
        u32 i = 0;
        FRESULT res_flash;        
        u8 buff[4096] = {0};
        FIL fnew;
        UINT br = 0;        
        u32 fwaddr = flash_addr;        //写入的地址,0x00000000        
        res_flash = f_open(&fnew,"0:update/font.bin", FA_READ);
        if(res_flash != FR_OK)
                return;
        else if(fnew.fsize > 4 * 1024 * 1024)  // 只有4M空间
        {
                return;
        }
        
        for(i=0;i<fnew.fsize/4096+1; i++)
        {
                res_flash = f_read(&fnew, buff, 4096, &br);
                if(br == 0)  // 没有读取到数据
                        break;
                sf_WriteBuffer(buff, fwaddr+total, br);
                total += br;
                if(br < 4096)  // 已经读完
                        break;
        }
        f_close(&fnew);
}
font数据.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106749
QQ
发表于 2023-7-8 09:03:06 | 显示全部楼层
circlegan 发表于 2023-7-7 19:42
我的U盘烧录程序是调用下面函数,这个有什么问题没

void copy_font(uint32_t flash_addr)

这种的,你这个局部变量这么大u8 buff[4096] = {0};

如果使用了RTOS,你的任务栈空间要够,如果使用的裸机,xxx.S文件的stack大小要够。

别的看着没什么问题,可以考虑全部复制完毕后,做个读取对比校验。

回复

使用道具 举报

7

主题

22

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2023-7-8 19:31:48 来自手机 | 显示全部楼层
eric2013 发表于 2023-7-8 09:03
这种的,你这个局部变量这么大u8 buff[4096] = {0};

如果使用了RTOS,你的任务栈空间要够,如果使用的 ...

我的这个是裸机,栈设置了64k,堆设置了16k。上面那个图是调试对比的内容,好像是不太一样。我再按你说的写完之后,再读取和源文件对比下看看,谢谢你了哈
回复

使用道具 举报

7

主题

22

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2023-7-9 23:59:51 | 显示全部楼层
找到原因了,是因为spiflash没有初始化好,导致字库没有写入成功,感谢硬汉
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 07:17 , Processed in 0.183533 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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