[AT32F413] F413外部flash数据丢失问题【已解决】

[复制链接]
 楼主| aple0807 发表于 2020-8-29 15:22 | 显示全部楼层 |阅读模式
本帖最后由 muyichuan2012 于 2020-8-31 09:10 编辑

atspim.png
bank3外部flash,型号用的GD25Q128。GUI已经跑起来,可以确定图片字库数据烧进去了。

可断电重新通电就没显示了,不烧录进调试看发现外部flash区数据全变0xFF了。
反复试了几次都这样。

这个原理图这样画是不是有问题?

我们其他项目这样连SPI接口存数据没发现有数据丢失现象。
muyichuan2012 发表于 2020-8-29 17:52 | 显示全部楼层
您好,从您描述的现象来看,可能的原因是程序其实已经下载到外部flash中了。但是在重新上电后,由于AT32  MCU先上电,外部flash后上电。导致程序MCU执行到需要访问外部flash内容时,外部flash其实并没有准备好,从而导致异常。

推荐的解决办法是:
MCU的main函数中进入后,加一点延时(等外部flash上电 ready),然后再往下执行。

退一步讲,AT32 MCU是做不到帮别的外部flash厂家丢程序的,毕竟是我们是不同厂家的IC.
084425 发表于 2020-8-29 17:59 来自手机 | 显示全部楼层
确认一下代码中初始化外部flash时,此时外部flash是否已上电
 楼主| aple0807 发表于 2020-8-29 21:57 | 显示全部楼层
经过反复测试,可以确定是我初始SPIM时漏了什么内容,但对比官方例程没找到具体漏了什么。

建的工程有两个分支,一个是带烧录字库到外部flash的,一个是不带烧录外部flash的。

带外部flash分支,下文描述为:分支IMG
应用程序在内部flash.
字库烧录位置 0x8400000  ,占用空间2.3MB

不带外部flash,下文描述为:分支APP
应用程序同上

测试部分1
步骤如下:
1、烧录分支IMG,程序正常工作,界面显示正常
2、不断电,重新烧录分支APP,界面显示同 1
3、烧录分支IMG,断电,再上电,死机
4、烧录分支APP,断电,再上电,死机
5、死机状态烧录分支IMG,不断电直接运行,同1正常工作
6、死机状态烧录分支APP,不断电直接运行,继续死机

测试部分2
APP分支 在0x8A00000处固定一个数组
重复部分1的第6步,不断电直接运行,又可以正常工作了

烧录外部flash恢复正常运行后,无论怎么复位,只要不断电,都可以正常运行,一旦断电就不行。说明程序并没有篡改芯片寄存器导致SPIM失败。


以上实验证明数据并未丢失,只是SPIM故障了,没法读数据。keil配套的烧写算法应该有什么东西可以让模块恢复正常,所以一烧录外部flash就可以正常运行。但我自己的程序应该是缺了什么导致SPIM并未正常启动。

SPIM配置代码是参考官方例程的,内容如下
  1.   GPIO_InitType GPIO_InitStructure;
  2.   
  3.   /* Enable ext.flash GPIO clock */
  4.   RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_AFIO|RCC_APB2PERIPH_GPIOA|RCC_APB2PERIPH_GPIOB, ENABLE);
  5.   
  6.   /* Configure ext.flash pin */
  7.   GPIO_StructInit(&GPIO_InitStructure);
  8.   GPIO_InitStructure.GPIO_Pins = GPIO_Pins_8;
  9.   GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;
  10.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  11.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  12.   GPIO_InitStructure.GPIO_Pins = GPIO_Pins_1|GPIO_Pins_6|GPIO_Pins_7|GPIO_Pins_10|GPIO_Pins_11;
  13.   GPIO_Init(GPIOB, &GPIO_InitStructure);
  14.   
  15.   /* Select PB10, PB11 as SPIF_TX and SPIF_RX */
  16.   GPIO_PinsRemapConfig(GPIO_Remap_EXT_FLASH, ENABLE);
  17.   GPIO_PinsRemapConfig(AFIO_MAP7_SPIF_1001, ENABLE);
  18.   
  19.   /* In this example, use on-board EN25QH128A as ext.flash */
  20.   FLASH->B3SEL = FLASH_SPIM_TYPE2;
  21.   
  22.   /* Unlock the ext.flash program erase controller */  
  23.   while (BIT_READ(FLASH->STS3, FLASH_STS_BSY));
  24.   FLASH->FCKEY3 = FLASH_KEY1;
  25.   FLASH->FCKEY3 = FLASH_KEY2;
  26.   while (BIT_READ(FLASH->CTRL3, FLASH_CTRL_LCK));
  27.   
  28.   /* If the data written to ext.flash need to be scrambled, please specify the scrambled range */
  29.   FLASH->DA = 0;
  30.   
  31.   return;


正常工作显示界面
iikkkk.png



 楼主| aple0807 发表于 2020-8-29 22:03 | 显示全部楼层
另外,断电再上电导致SPIM故障后,烧录官方例程里面的 operate_SPIM 例程,情况是一样的,SPIM无法恢复,看到的数据是0xFF,只要在外部flash随便一个位置烧一些数据就可以正常工作了。
 楼主| aple0807 发表于 2020-8-29 22:06 | 显示全部楼层
muyichuan2012 发表于 2020-8-29 17:52
您好,从您描述的现象来看,可能的原因是程序其实已经下载到外部flash中了。但是在重新上电后,由于AT32  M ...

麻烦帮忙看下4楼处的测试,这个问题应该是初始化的问题,谢谢!
muyichuan2012 发表于 2020-8-30 08:25 | 显示全部楼层
我还是怀疑是外部flash上电时间晚于mcu导致,请在以下代码后面增加500ms或更长延时试试。
  /* Enable ext.flash GPIO clock */
  RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_AFIO|RCC_APB2PERIPH_GPIOA|RCC_APB2PERIPH_GPIOB, ENABLE);

另外,请问官方例程在at start 413上可以复现问题吗?
 楼主| aple0807 发表于 2020-8-30 09:56 | 显示全部楼层
muyichuan2012 发表于 2020-8-30 08:25
我还是怀疑是外部flash上电时间晚于mcu导致,请在以下代码后面增加500ms或更长延时试试。
  /* Enable ext. ...

不是,第5步和第6步都是持续通着电测试的。 可以排除上电速度不一致的因素了。
 楼主| aple0807 发表于 2020-8-30 09:59 | 显示全部楼层
muyichuan2012 发表于 2020-8-30 08:25
我还是怀疑是外部flash上电时间晚于mcu导致,请在以下代码后面增加500ms或更长延时试试。
  /* Enable ext. ...

支持keil的烧写算法可以开源出来吗?一看就知道啥原因了,着应该不是机密文档吧? 我看NXP的烧写算法工程都是开源的啊
muyichuan2012 发表于 2020-8-30 10:11 来自手机 | 显示全部楼层
是的ARM keil官方有源码,您有兴趣的话  可自行下载研究。
muyichuan2012 发表于 2020-8-30 10:16 来自手机 | 显示全部楼层
您这里有能够在at start 413上复现问题的工程吗?可否贴到附件中  我们研究一下。
muyichuan2012 发表于 2020-8-30 10:19 来自手机 | 显示全部楼层
本帖最后由 muyichuan2012 于 2020-8-30 10:35 编辑

或者  您方便的话  留一个微信号也可以,我们技术负责帮您处理。毕竟,这样回帖太没效率。
 楼主| aple0807 发表于 2020-8-30 11:25 | 显示全部楼层
本帖最后由 aple0807 于 2020-8-30 22:19 编辑
muyichuan2012 发表于 2020-8-30 10:19
或者  您方便的话  留一个微信号也可以,我们技术负责帮您处理。毕竟,这样回帖太没效率。 ...

可以,不过我今天出去有点事,明天吧。 那个413的评估板,在办公室,明天去测试下,不过flash芯片不一样,结果也不一定。我回头换个GD25F128实验下。

 楼主| aple0807 发表于 2020-8-30 22:21 | 显示全部楼层
muyichuan2012 发表于 2020-8-30 10:19
或者  您方便的话  留一个微信号也可以,我们技术负责帮您处理。毕竟,这样回帖太没效率。 ...

问题已经解决了。GD25Q128上电默认是没有开启QPI功能的,我用IO模拟SPI开启QPI功能后再初始化SPIM模块,就可以正常工作了。 反复断电通电测试都没有问题。
muyichuan2012 发表于 2020-8-30 22:24 来自手机 | 显示全部楼层
厉害  膜拜中
嵌入小菜菜 发表于 2020-9-2 08:51 | 显示全部楼层
精华帖,看了之后,学习不少,以后多向楼主学习!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

326

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部