香主,你好。我查看了FLASH区域,bank2的数据没有被覆盖掉。我又按照官方例子还是没有成功,也不知道那边出错了。但是这方面的官方资料真的好少。
是不是用的人比较少啊。主要参考了"STM32F769双bank启动"这篇**。(**位置)我仿真调试,发现SYSCFG_MEMRMP_SWP_FB的值确实改变了,但是实际上运行的BANK却未改变。
理论上SYSCFG_MEMRMP_SWP_FB的值就是切换2个bank的。
当前配置位nDBOOT 置1,nDBANK置0:
我直接对OBInit.BootAddr0的地址进行修改,然后再软复位。发现bank能够互相切换。
由于只是简单LED的闪烁,不能很明显看出中断向量是否也正常,已经耗了2天时间在这上面,
向量这里未做实验。
代码修改:
main函数里面的while循环代码:
注释掉的为官方的代码。
while (1)
{
/* Wait for BUTTON_TAMPER is released */
if (BSP_PB_GetState(BUTTON_USER) == SET)
{
while (BSP_PB_GetState(BUTTON_USER) == SET);
HAL_FLASH_Unlock();
HAL_Delay(10);
//解锁选项字节区
HAL_FLASH_OB_Unlock();
HAL_Delay(10);
/* Get the Dual boot configuration status */
HAL_FLASHEx_OBGetConfig(&OBInit);
HAL_Delay(10);
/* Turn on LED3 if FLASH is configured in Single Bank mode */
if((OBInit.USERConfig & OB_NDBANK_SINGLE_BANK) == OB_NDBANK_SINGLE_BANK)
{
while(1)
{
BSP_LED_Off(LED1);
BSP_LED_Off(LED2);
BSP_LED_On(LED3);
}
}
/* Swap Flash banks */
if (OBInit.BootAddr0==0X2000)//0:BANK1 1:BANK2
// if ((SYSCFG->MEMRMP & SYSCFG_MEMRMP_SWP_FB) == RESET)//0:BANK1 1:BANK2
{
/* Swap to bank2 */
// HAL_EnableMemorySwappingBank();
// SET_BIT(SYSCFG->MEMRMP, SYSCFG_MEMRMP_SWP_FB);
//
OBInit.BootAddr0=0X2040;
//
// if ((SYSCFG->MEMRMP & SYSCFG_MEMRMP_SWP_FB) == SET)
// BSP_LED_On(LED3);
}
else
{
/* Swap to bank1 */
// HAL_DisableMemorySwappingBank();
// CLEAR_BIT(SYSCFG->MEMRMP, SYSCFG_MEMRMP_SWP_FB);
//
OBInit.BootAddr0=0X2000;
//
// if ((SYSCFG->MEMRMP & SYSCFG_MEMRMP_SWP_FB) == RESET)
// BSP_LED_Off(LED3);
}
//重写选项字节
HAL_FLASHEx_OBProgram(&OBInit);
HAL_Delay(10);
//如果写入成功,则复位加载选项字节
HAL_FLASH_OB_Launch();
HAL_Delay(10);
//锁定选项字节
HAL_FLASH_OB_Lock();
HAL_Delay(10);
HAL_FLASH_Lock();
HAL_Delay(10);
//软件复位
HAL_NVIC_SystemReset();
}
else
{
#ifdef FLASH_BANK1
/* Toggle LED1 */
BSP_LED_Toggle(LED1);
/* Turn off LED2 */
BSP_LED_Off(LED2);
//HAL_Delay(1000);
#else
/* Toggle LED2 */
BSP_LED_Toggle(LED2);
/* Turn off LED1 */
BSP_LED_Off(LED1);
//HAL_Delay(100);
#endif
/* Insert 100 ms delay */
HAL_Delay(100);
}
}
system_stm32f7xx.c里面向量表位置修改:
/* Configure the Vector Table location add offset address ------------------*/
#ifdef VECT_TAB_SRAM
SCB->VTOR = RAMDTCM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
#else
#ifdef FLASH_BANK1
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
#else
SCB->VTOR = (FLASH_BASE+0X100000) | VECT_TAB_OFFSET;
#endif
#endif
虽然曲线的实现了功能,但是为啥官方的程序我运行不出现象,至今不清楚。等以后慢慢再弄吧。
如果有哪位大侠,能够写篇详细的说明给我等小白参考就更好了。
|