SBL升级模式回到正常模式
我进入到SBL下载模式,想回到正常模式,就在直接
crc[1] = crc[0];
crc[0] = 0xFFFF;
HalFlashWrite(HAL_SBL_IMG_CRC, (uint8 *)crc, 1);
HAL_SYSTEM_RESET();
然后,复位进来还是在下载模式,为什么呢?
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是没用的。
现在的问题是:板子原来是正常运行模式的,从串口收到指令后,复位到SBL模式,但是某些情况下,我不要升级了,要回到正常模式,这时是完全没有写过flash的,但是重新复位后,还是在SBL模式,不能回到正常模式,我已经写了CRC的了。
你复位到SBL时,做了什么操作?有没有写crc?
有,运行模式下,我写了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();