我进入到SBL下载模式,想回到正常模式,就在直接
crc[1] = crc[0];
crc[0] = 0xFFFF;
HalFlashWrite(HAL_SBL_IMG_CRC, (uint8 *)crc, 1);
HAL_SYSTEM_RESET();
然后,复位进来还是在下载模式,为什么呢?
Yue TANG:
1. 如果你已经有可用的img,直接复位就好了,不需要去写。
crc[1] = crc[0];
crc[0] = 0xFFFF;
HalFlashWrite(HAL_SBL_IMG_CRC, (uint8 *)crc, 1);
2. flash 要写是需要擦除再写的,擦过的你可以把1改0,但不能把0改1.要改1,需要先按页先擦除。所以你写0xffff是没用的。
Jiaming Li:
回复 Yue TANG:
现在的问题是:板子原来是正常运行模式的,从串口收到指令后,复位到SBL模式,但是某些情况下,我不要升级了,要回到正常模式,这时是完全没有写过flash的,但是重新复位后,还是在SBL模式,不能回到正常模式,我已经写了CRC的了。
Yue TANG:
回复 Jiaming Li:
你复位到SBL时,做了什么操作?有没有写crc?
Jiaming Li:
回复 Yue TANG:
有,运行模式下,我写了CRC,复位能够进入到SBL模式:
HAL_DISABLE_INTERRUPTS();
crc[0] ^= 0xFFFF; crc[1] = 0xFFFF; HalFlashWrite(HAL_SBL_IMG_CRC, (uint8 *)crc, 1);
HAL_SYSTEM_RESET();
但是我在SBL模式下,要回到运行模式(我完全没有写过flash的),也写了CRC,复位还是SBL模式:
HalFlashRead(HAL_SBL_IMG_CRC / SBL_PAGE_SIZE, (HAL_SBL_IMG_CRC % SBL_PAGE_SIZE) << 2, (uint8 *)crc, sizeof(crc));
if (crc[1] != crc[0]) { crc[1] = crc[0]; crc[0] = 0xFFFF;
HalFlashWrite(HAL_SBL_IMG_CRC, (uint8 *)crc, 1); HalFlashRead(HAL_SBL_IMG_CRC / SBL_PAGE_SIZE,(HAL_SBL_IMG_CRC % SBL_PAGE_SIZE) << 2, (uint8 *)crc, sizeof(crc)); }
HAL_SYSTEM_RESET();