F413外部flash数据丢失问题【已解决】
本帖最后由 muyichuan2012 于 2020-8-31 09:10 编辑bank3外部flash,型号用的GD25Q128。GUI已经跑起来,可以确定图片字库数据烧进去了。
可断电重新通电就没显示了,不烧录进调试看发现外部flash区数据全变0xFF了。
反复试了几次都这样。
这个原理图这样画是不是有问题?
我们其他项目这样连SPI接口存数据没发现有数据丢失现象。
您好,从您描述的现象来看,可能的原因是程序其实已经下载到外部flash中了。但是在重新上电后,由于AT32MCU先上电,外部flash后上电。导致程序MCU执行到需要访问外部flash内容时,外部flash其实并没有准备好,从而导致异常。
推荐的解决办法是:
MCU的main函数中进入后,加一点延时(等外部flash上电 ready),然后再往下执行。
退一步讲,AT32 MCU是做不到帮别的外部flash厂家丢程序的,毕竟是我们是不同厂家的IC.
确认一下代码中初始化外部flash时,此时外部flash是否已上电 经过反复测试,可以确定是我初始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配置代码是参考官方例程的,内容如下
GPIO_InitType GPIO_InitStructure;
/* Enable ext.flash GPIO clock */
RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_AFIO|RCC_APB2PERIPH_GPIOA|RCC_APB2PERIPH_GPIOB, ENABLE);
/* Configure ext.flash pin */
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pins = GPIO_Pins_8;
GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pins = GPIO_Pins_1|GPIO_Pins_6|GPIO_Pins_7|GPIO_Pins_10|GPIO_Pins_11;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* Select PB10, PB11 as SPIF_TX and SPIF_RX */
GPIO_PinsRemapConfig(GPIO_Remap_EXT_FLASH, ENABLE);
GPIO_PinsRemapConfig(AFIO_MAP7_SPIF_1001, ENABLE);
/* In this example, use on-board EN25QH128A as ext.flash */
FLASH->B3SEL = FLASH_SPIM_TYPE2;
/* Unlock the ext.flash program erase controller */
while (BIT_READ(FLASH->STS3, FLASH_STS_BSY));
FLASH->FCKEY3 = FLASH_KEY1;
FLASH->FCKEY3 = FLASH_KEY2;
while (BIT_READ(FLASH->CTRL3, FLASH_CTRL_LCK));
/* If the data written to ext.flash need to be scrambled, please specify the scrambled range */
FLASH->DA = 0;
return;
正常工作显示界面
另外,断电再上电导致SPIM故障后,烧录官方例程里面的 operate_SPIM 例程,情况是一样的,SPIM无法恢复,看到的数据是0xFF,只要在外部flash随便一个位置烧一些数据就可以正常工作了。 muyichuan2012 发表于 2020-8-29 17:52
您好,从您描述的现象来看,可能的原因是程序其实已经下载到外部flash中了。但是在重新上电后,由于AT32M ...
麻烦帮忙看下4楼处的测试,这个问题应该是初始化的问题,谢谢! 我还是怀疑是外部flash上电时间晚于mcu导致,请在以下代码后面增加500ms或更长延时试试。
/* Enable ext.flash GPIO clock */
RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_AFIO|RCC_APB2PERIPH_GPIOA|RCC_APB2PERIPH_GPIOB, ENABLE);
另外,请问官方例程在at start 413上可以复现问题吗? muyichuan2012 发表于 2020-8-30 08:25
我还是怀疑是外部flash上电时间晚于mcu导致,请在以下代码后面增加500ms或更长延时试试。
/* Enable ext. ...
不是,第5步和第6步都是持续通着电测试的。 可以排除上电速度不一致的因素了。 muyichuan2012 发表于 2020-8-30 08:25
我还是怀疑是外部flash上电时间晚于mcu导致,请在以下代码后面增加500ms或更长延时试试。
/* Enable ext. ...
支持keil的烧写算法可以开源出来吗?一看就知道啥原因了,着应该不是机密文档吧? 我看NXP的烧写算法工程都是开源的啊 是的ARM keil官方有源码,您有兴趣的话可自行下载研究。 您这里有能够在at start 413上复现问题的工程吗?可否贴到附件中我们研究一下。 本帖最后由 muyichuan2012 于 2020-8-30 10:35 编辑
或者您方便的话留一个微信号也可以,我们技术负责帮您处理。毕竟,这样回帖太没效率。 本帖最后由 aple0807 于 2020-8-30 22:19 编辑
muyichuan2012 发表于 2020-8-30 10:19
或者您方便的话留一个微信号也可以,我们技术负责帮您处理。毕竟,这样回帖太没效率。 ...
可以,不过我今天出去有点事,明天吧。 那个413的评估板,在办公室,明天去测试下,不过flash芯片不一样,结果也不一定。我回头换个GD25F128实验下。
muyichuan2012 发表于 2020-8-30 10:19
或者您方便的话留一个微信号也可以,我们技术负责帮您处理。毕竟,这样回帖太没效率。 ...
问题已经解决了。GD25Q128上电默认是没有开启QPI功能的,我用IO模拟SPI开启QPI功能后再初始化SPIM模块,就可以正常工作了。 反复断电通电测试都没有问题。 厉害膜拜中 精华帖,看了之后,学习不少,以后多向楼主学习!
页:
[1]