[STM32F7] STM32F767 NUCLEO 自带的双bank实验曲线成功,官方仍不成功.

[复制链接]
 楼主| 发表于 2020-8-26 14:52 | 显示全部楼层 |阅读模式
本帖最后由 qjp1988113 于 2020-8-27 15:38 编辑

最近在做STM32F767的双bank实验,可是怎么弄也不成功,哪位大佬,弄过,请帮小弟看下:
例子是F7HAL SDK包里面STM32F767 NUCLEO对应的例子:
STM32Cube_FW_F7_V1.6.0\Projects\STM32F767ZI-Nucleo\Examples\FLASH\FLASH_SwapBank
我先定义了FLASH_BANK2,然后修改了FLASH位置和大小

原来作为一个整体FLASH时,起始地址和大小是0x8000000 0x200000

编译,生成了FLASH_BANK2.hex文件。
在修改上面这两项。定义FLASH_BANK1:


编译,生成了FLASH_BANK1.hex文件。
然后打开STM32 ST-LINK Utility
菜单:Target-->Option Byte.
去掉nDBANK的选择

然后用STM32 ST-LINK Utility 先下载FLASH_BANK2.hex
在下载FLASH_BANK1.hex,
然后复位BANK1运行对应的LED1闪烁,
按下用户按键:理论上会切换到BANK2运行,LED2会闪烁
但实际效果还是LED1闪烁,重复了几次还是这样
感觉就是按照程序里面说明做的了:
Below are the steps to run this example:
1- Choose the FLASH_SwapBank_Bank2 project and generate its binary (ie: FLASH_SwapBank.bin)

2- Configure the FLASH memory at Dual Bank mode using STM32 ST-LINK Utilities (Target -> Options Bytes:
   "nDBANK" should be unchecked, "nDBOOT" should be checked).
   Then, Load FLASH_SwapBank.bin binary at the bank2 of the flash (at the address 0x08100000) using STM32
   ST-LINK Utilities(www.st.com) or any similar tool.   

@note:
- You can avoid step 1 by directly loading the binary file provided with the example
- You have to configure your preferred toolchain in order to generate the binary
   file after compiling the project.

3- Choose the FLASH_SwapBank_Bank1 project and run it, this project will be loaded
   in the bank1 of the flash: at the address 0x08000000

4- Click the BUTTON_USER button to swap between the two banks,

- If program is executing from bank1 is selected, LED1 toggles,

- If program is executing from bank2 is selected, LED2 toggles,

- If error occurs, LED3 is turn on.


不知道哪里出错,求大佬解答~

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
发表于 2020-8-26 21:44 | 显示全部楼层
我刚对你提到的例程用开发板测试了下,没有问题。

你的截图应没问题。担心你在烧录FLASH_SwapBank_Bank1 这个环节是否将BANK2的代码擦除了。你可以查看下8100000空间还有没有东西。
发表于 2020-8-26 21:51 | 显示全部楼层
这个地方你好像有问题。

 楼主| 发表于 2020-8-27 09:18 | 显示全部楼层
香水城 发表于 2020-8-26 21:51
这个地方你好像有问题。

麻蛋,还是不行,楼上,能不具体程序发我看些么?那个配置的选项字节,也截图看下哈》
 楼主| 发表于 2020-8-27 15:34 | 显示全部楼层
香水城 发表于 2020-8-26 21:51
这个地方你好像有问题。

香主,你好。我查看了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循环代码:
注释掉的为官方的代码。
  1. while (1)
  2.   {
  3.     /* Wait for BUTTON_TAMPER is released */
  4.     if (BSP_PB_GetState(BUTTON_USER) == SET)
  5.     {
  6.       while (BSP_PB_GetState(BUTTON_USER) == SET);
  7.       
  8.                        
  9.                        
  10.                         HAL_FLASH_Unlock();
  11.                         HAL_Delay(10);
  12.                         //解锁选项字节区       
  13.                         HAL_FLASH_OB_Unlock();
  14.                         HAL_Delay(10);
  15.       /* Get the Dual boot configuration status */
  16.       HAL_FLASHEx_OBGetConfig(&OBInit);
  17.                         HAL_Delay(10);

  18.       /* Turn on LED3 if FLASH is configured in Single Bank mode */
  19.       if((OBInit.USERConfig & OB_NDBANK_SINGLE_BANK) == OB_NDBANK_SINGLE_BANK)
  20.       {
  21.         while(1)
  22.         {
  23.           BSP_LED_Off(LED1);
  24.           BSP_LED_Off(LED2);
  25.           BSP_LED_On(LED3);
  26.         }
  27.       }

  28.       /* Swap Flash banks */
  29.                         if (OBInit.BootAddr0==0X2000)//0:BANK1  1:BANK2
  30. //      if ((SYSCFG->MEMRMP & SYSCFG_MEMRMP_SWP_FB) == RESET)//0:BANK1  1:BANK2
  31.       {
  32.         /* Swap to bank2 */
  33. //        HAL_EnableMemorySwappingBank();
  34. //                                SET_BIT(SYSCFG->MEMRMP, SYSCFG_MEMRMP_SWP_FB);
  35. //                               
  36.                                 OBInit.BootAddr0=0X2040;
  37. //                               
  38. //                                if ((SYSCFG->MEMRMP & SYSCFG_MEMRMP_SWP_FB) == SET)
  39. //                                BSP_LED_On(LED3);                               
  40.       }
  41.       else
  42.       {
  43.         /* Swap to bank1 */
  44. //        HAL_DisableMemorySwappingBank();       
  45. //                                CLEAR_BIT(SYSCFG->MEMRMP, SYSCFG_MEMRMP_SWP_FB);
  46. //                               
  47.                                 OBInit.BootAddr0=0X2000;
  48. //                               
  49. //                                if ((SYSCFG->MEMRMP & SYSCFG_MEMRMP_SWP_FB) == RESET)
  50. //                                BSP_LED_Off(LED3);
  51.                                
  52.       }
  53.                         //重写选项字节
  54.                         HAL_FLASHEx_OBProgram(&OBInit);
  55.                         HAL_Delay(10);
  56.                         //如果写入成功,则复位加载选项字节
  57.                         HAL_FLASH_OB_Launch();
  58.                         HAL_Delay(10);
  59.                         //锁定选项字节
  60.                         HAL_FLASH_OB_Lock();
  61.                         HAL_Delay(10);
  62.                         HAL_FLASH_Lock();
  63.                         HAL_Delay(10);
  64.                         //软件复位
  65.                         HAL_NVIC_SystemReset();
  66.     }
  67.     else
  68.     {
  69. #ifdef FLASH_BANK1
  70.       /* Toggle LED1 */
  71.       BSP_LED_Toggle(LED1);
  72.       /* Turn off LED2 */
  73.       BSP_LED_Off(LED2);
  74.                        
  75.                         //HAL_Delay(1000);
  76. #else
  77.       /* Toggle LED2 */
  78.       BSP_LED_Toggle(LED2);
  79.       /* Turn off LED1 */
  80.       BSP_LED_Off(LED1);
  81.                         //HAL_Delay(100);
  82. #endif

  83.       /* Insert 100 ms delay */
  84.       HAL_Delay(100);
  85.     }
  86.   }
system_stm32f7xx.c里面向量表位置修改:


  1.   /* Configure the Vector Table location add offset address ------------------*/
  2. #ifdef VECT_TAB_SRAM
  3.   SCB->VTOR = RAMDTCM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
  4. #else
  5.   #ifdef FLASH_BANK1
  6.   SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
  7.         #else
  8.         SCB->VTOR = (FLASH_BASE+0X100000) | VECT_TAB_OFFSET;
  9.         #endif
  10. #endif
虽然曲线的实现了功能,但是为啥官方的程序我运行不出现象,至今不清楚。等以后慢慢再弄吧。
如果有哪位大侠,能够写篇详细的说明给我等小白参考就更好了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

111

主题

627

帖子

2

粉丝
快速回复 返回顶部 返回列表