硬汉嵌入式论坛

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

[TouchGFX] 把字库从NorFlash拷贝至Sdram中使用, 出现字符显示异常.

[复制链接]

26

主题

70

回帖

148

积分

初级会员

积分
148
发表于 2022-2-14 15:46:07 | 显示全部楼层 |阅读模式
本来要在屏上显示字符串“abcdefghijklmn”, 结果显示成了“a#c#e#g#i#j#m#”.


如果字库在NorFlash中用内存映射方式使用, 则可以正常显示.


KEEP extern const touchgfx::GlyphNode glyphs_verdanab_20_4bpp[] FONT_TABLE_LOCATION_FLASH_ATTRIBUTE =
{
   {    0, 0x0061, 12, 11, 11,  0, 13,  0,  0, 0x00 },
   {   66, 0x0062, 13, 15, 15,  1, 14,  0,  0, 0x00 },
   {  171, 0x0063, 12, 11, 11,  0, 12,  0,  0, 0x00 },
   {  237, 0x0064, 13, 15, 15,  0, 14,  0,  0, 0x00 },
   {  342, 0x0065, 13, 11, 11,  0, 13,  0,  0, 0x00 },
   {  419, 0x0066,  9, 15, 15,  0,  8,  0,  0, 0x00 },
   {  494, 0x0067, 13, 15, 11,  0, 14,  0,  0, 0x00 },
   {  599, 0x0068, 12, 15, 15,  1, 14,  0,  0, 0x00 },
   {  689, 0x0069,  5, 15, 15,  1,  7,  0,  0, 0x00 },
   {  734, 0x006A,  8, 19, 15, -1,  8,  0,  0, 0x00 },
   {  810, 0x006B, 13, 15, 15,  1, 13,  0,  0, 0x00 },
   {  915, 0x006C,  5, 15, 15,  1,  7,  0,  0, 0x00 },
   {  960, 0x006D, 19, 11, 11,  1, 21,  0,  0, 0x00 },
   { 1070, 0x006E, 12, 11, 11,  1, 14,  0,  0, 0x00 }
};

上表奇数的字母都能正常显示, 偶数的字母就显示异常, 对比了NorFlash和Sdram的数据, 是正确完整的拷贝. 这问题有人遇到吗?

renditionDownload.jpg
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107034
QQ
发表于 2022-2-14 15:55:14 | 显示全部楼层
楼主用的什么nor型flash,并口的还是支持内存映射的QSPI Flash。还是普通的SPI NOR Flash
回复

使用道具 举报

26

主题

70

回帖

148

积分

初级会员

积分
148
 楼主| 发表于 2022-2-14 16:28:48 | 显示全部楼层
eric2013 发表于 2022-2-14 15:55
楼主用的什么nor型flash,并口的还是支持内存映射的QSPI Flash。还是普通的SPI NOR Flash

Norflash是W25Q256, Qspi使用(Mem-map mode), 正常使用是图片字库都放W25Q256里面, 但升级时需要对W25Q256进行擦下, 从而要退出(Mem-map mode), 所以把图片和字库拷贝到SDRAM中进行使用.

然后发现图片和字符拷贝到SDRAM使用时图片能正常显示, 但是字符串的显示就出错了, 然后简化了一个测试工程专门针对字库放在SDRAM中进行调试. 现在DMA2D都关闭了, 现象还是一样.

有点懵了, 求指点.
回复

使用道具 举报

13

主题

192

回帖

231

积分

高级会员

积分
231
发表于 2022-2-14 17:42:02 | 显示全部楼层
我们就是存在Norflash里面,使用的时候拷贝到SDRAM里面,但是很正常,没有你的问题。但是我们Norflash使用的是单线SPI,没有使用QSPI。
回复

使用道具 举报

0

主题

84

回帖

84

积分

初级会员

积分
84
发表于 2022-2-15 08:38:05 | 显示全部楼层
hjhj7591418 发表于 2022-2-14 16:28
Norflash是W25Q256, Qspi使用(Mem-map mode), 正常使用是图片字库都放W25Q256里面, 但升级时需要对W25Q25 ...

减低SPI速度试试,可能太快了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107034
QQ
发表于 2022-2-15 09:50:58 | 显示全部楼层
hjhj7591418 发表于 2022-2-14 16:28
Norflash是W25Q256, Qspi使用(Mem-map mode), 正常使用是图片字库都放W25Q256里面, 但升级时需要对W25Q25 ...

现在用的什么系列,带cache的处理器吗,主处理下cache问题试试。
回复

使用道具 举报

26

主题

70

回帖

148

积分

初级会员

积分
148
 楼主| 发表于 2022-2-15 13:57:29 | 显示全部楼层
eric2013 发表于 2022-2-15 09:50
现在用的什么系列,带cache的处理器吗,主处理下cache问题试试。


STM32H750, 目前ICACHE和DCACHE都关闭了, 数据是从0x90000000手动拷贝到0xC0000000上再使用.

STACK / HEAP 放在DTCM, 其他地方使用的内存全部开辟在AXIRAM中, 其他部分内存没使用:

                     TEX   I   S   C   B
DTCM                 1   1   1   1   1
AXIRAM              1   0   0   0   0
QSPI FLASH        1   1   0   0   0
SDRAM               1   0   0   0   0

代码启动后进入main函数后初始化QSPI和SDRAM, 然后手动把所存放再QSPI FLASH里面的数据拷贝到SDRAM中.

// Code Zone
LR_BOOTDFU_CODE_INTFLASH 0x08000000 0x20000
{
/*******************************************************************************
*  Code
******************************************************************************/
    // Start Up Code -> IntFlash
    ER_BOOTDFU_CODE_INTFLASH 0x08000000 0x20000
    {
        *.o (RESET, +First)
        *(InRoot$$Sections)
        .ANY (+RO)
        .ANY (+XO)
    }

/*******************************************************************************
*  Dtcm
******************************************************************************/
    RW_IVT_DTCM 0x20000000 EMPTY 0x400{}

    RW_STACK_DTCM 0x20000400 UNINIT 0x4000
    {   // System Stack
        startup_stm32h750xx.o(STACK)
    }
    RW_HEAP_DTCM 0x20004400 UNINIT 0x4000
    {   // System Heap
        startup_stm32h750xx.o(HEAP)
    }
    RW_DATA_DTCM 0x20008400 (0x20000 - 0x8400)
    {   // High Speed Data
;        .ANY (+RW +ZI)            // 目前调试 -> 已屏蔽
        *(DTCM)
    }
/*******************************************************************************
*  D1_Sram
******************************************************************************/
    RW_DATA_AXISRAM m_intram_axisram_start m_intram_axisram_size
    {   // AxiSram
        .ANY (+RW +ZI)
        *(D1AXISRAM)
    }
}


// Data Zone
LR_DFU_DATA_NORFLASH 0xC0000000 0x100000
{
    ER_DFU_DATA_SDRAM 0xC0000000 0x100000
    {
        *.o (ExtFlashSection)
        *.o (FontFlashSection)
        *.o (TextFlashSection)
    }
}


  MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  MPU_InitStruct.Number = MPU_REGION_NUMBER0;
  MPU_InitStruct.BaseAddress = 0x00000000;
  MPU_InitStruct.Size = MPU_REGION_SIZE_64KB;
  MPU_InitStruct.SubRegionDisable = 0x0;
  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1;
  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
  MPU_InitStruct.IsShareable = MPU_ACCESS_SHAREABLE;
  MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
  MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;

  HAL_MPU_ConfigRegion(&MPU_InitStruct);
  /** Initializes and configures the Region and the memory to be protected
  */
  MPU_InitStruct.Number = MPU_REGION_NUMBER1;
  MPU_InitStruct.BaseAddress = 0x20000000;
  MPU_InitStruct.Size = MPU_REGION_SIZE_128KB;
  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
  MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;

  HAL_MPU_ConfigRegion(&MPU_InitStruct);
  /** Initializes and configures the Region and the memory to be protected
  */
  MPU_InitStruct.Number = MPU_REGION_NUMBER2;
  MPU_InitStruct.BaseAddress = 0x24000000;
  MPU_InitStruct.Size = MPU_REGION_SIZE_512KB;
  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE;

  HAL_MPU_ConfigRegion(&MPU_InitStruct);
  /** Initializes and configures the Region and the memory to be protected
  */
  MPU_InitStruct.Number = MPU_REGION_NUMBER3;
  MPU_InitStruct.BaseAddress = 0x30000000;
  MPU_InitStruct.Size = MPU_REGION_SIZE_256KB;

  HAL_MPU_ConfigRegion(&MPU_InitStruct);
  /** Initializes and configures the Region and the memory to be protected
  */
  MPU_InitStruct.Number = MPU_REGION_NUMBER4;
  MPU_InitStruct.BaseAddress = 0x90000000;
  MPU_InitStruct.Size = MPU_REGION_SIZE_32MB;
  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;

  HAL_MPU_ConfigRegion(&MPU_InitStruct);
  /** Initializes and configures the Region and the memory to be protected
  */
  MPU_InitStruct.Number = MPU_REGION_NUMBER5;
  MPU_InitStruct.BaseAddress = 0xC0000000;

  HAL_MPU_ConfigRegion(&MPU_InitStruct);
  /* Enables the MPU */
  HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);


回复

使用道具 举报

13

主题

192

回帖

231

积分

高级会员

积分
231
发表于 2022-2-15 15:51:20 | 显示全部楼层
看了一下我们的程序,我们配置的MPU和你的不一样,SDRAM的MPU配置如下
  MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  MPU_InitStruct.Number = MPU_REGION_NUMBER0;
  MPU_InitStruct.BaseAddress = 0x60000000; //SDRAM 32MB
  MPU_InitStruct.Size = MPU_REGION_SIZE_32MB;
  MPU_InitStruct.SubRegionDisable = 0x0;
  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE;
  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
  MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
NorFlash没有配置MPU,拷贝的时候关闭中断,不然可能会出问题。
然后直接用的memcpy拷贝过去的。
回复

使用道具 举报

26

主题

70

回帖

148

积分

初级会员

积分
148
 楼主| 发表于 2022-2-16 09:38:03 | 显示全部楼层
zhang0352505 发表于 2022-2-15 15:51
看了一下我们的程序,我们配置的MPU和你的不一样,SDRAM的MPU配置如下
  MPU_InitStruct.Enable = MPU_REG ...

问题的确出在MPU的配置上面, 我看ST外文论坛上有一篇帖子说到SDRAM要开启cache, 我受到了启发对比了下配置后解决的.:
                TEX   I    S   C   B
NorFlash       0   1    0   1   0
Sdram          0   1    0   1   1

改成这样配置就OK了, 代码和素材放在NorFlash和Sdram里面运行都没问题.

我还觉得我不开NorFlash和Sdram的Cache会更安全, 出问题第一时间把ICache和DCache都关闭再调试,
这里反而说要开启Cache, 原因是Font Table不是4字节对齐.

我还想看硬汉哥的进一步解读.

(开启Cache跟4字节对齐有什么联系啊?)
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107034
QQ
发表于 2022-2-16 10:57:27 | 显示全部楼层
hjhj7591418 发表于 2022-2-16 09:38
问题的确出在MPU的配置上面, 我看ST外文论坛上有一篇帖子说到SDRAM要开启cache, 我受到了启发对比了下配 ...

石锤内存访问不支持非对齐是否STM32H7的硬件bug
https://www.armbbs.cn/forum.php? ... 4562&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

26

主题

70

回帖

148

积分

初级会员

积分
148
 楼主| 发表于 2022-2-16 13:37:09 | 显示全部楼层
eric2013 发表于 2022-2-16 10:57
石锤内存访问不支持非对齐是否STM32H7的硬件bug
https://www.armbbs.cn/forum.php?mod=viewthread&tid=9 ...

看完安富莱的文档MPU和CACHE内容时, 感觉自己已经掌握好了, 就配置了一个自己感觉最稳当的.
结果进了另一个坑...

硬汉哥稳
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107034
QQ
发表于 2022-2-17 09:39:22 | 显示全部楼层
hjhj7591418 发表于 2022-2-16 13:37
看完安富莱的文档MPU和CACHE内容时, 感觉自己已经掌握好了, 就配置了一个自己感觉最稳当的.
结果进了另 ...

这个点属于骚操作系列,没有看到的话,确实不容易引起注意。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-15 05:11 , Processed in 0.291627 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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