经过反复测试,可以确定是我初始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;
正常工作显示界面
|