circlegan 发表于 2023-7-5 23:57:40

emwin加载xbf字体出现段错误

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

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








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




eric2013 发表于 2023-7-6 09:16:21

调试下XBF从外部SPI Flash读取的接口函数,是不是正常返回值了

circlegan 发表于 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(不知道是怎么来的),后面就没有再调用了。

eric2013 发表于 2023-7-7 09:26:53

如果是U盘烧录的话,你的地址是不是对。这个不是直接的源文件写入了。

circlegan 发表于 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 = {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);
}

eric2013 发表于 2023-7-8 09:03:06

circlegan 发表于 2023-7-7 19:42
我的U盘烧录程序是调用下面函数,这个有什么问题没

void copy_font(uint32_t flash_addr)


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

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

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

circlegan 发表于 2023-7-8 19:31:48

eric2013 发表于 2023-7-8 09:03
这种的,你这个局部变量这么大u8 buff = {0};

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

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

circlegan 发表于 2023-7-9 23:59:51

找到原因了,是因为spiflash没有初始化好,导致字库没有写入成功,感谢硬汉:lol
页: [1]
查看完整版本: emwin加载xbf字体出现段错误