打印
[STM32F7]

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

[复制链接]
1064|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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 | 只看该作者
这个地方你好像有问题。

使用特权

评论回复
地板
qjp1988113|  楼主 | 2020-8-27 09:18 | 只看该作者
香水城 发表于 2020-8-26 21:51
这个地方你好像有问题。

麻蛋,还是不行,楼上,能不具体程序发我看些么?那个配置的选项字节,也截图看下哈》

使用特权

评论回复
5
qjp1988113|  楼主 | 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循环代码:
注释掉的为官方的代码。
 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
虽然曲线的实现了功能,但是为啥官方的程序我运行不出现象,至今不清楚。等以后慢慢再弄吧。
如果有哪位大侠,能够写篇详细的说明给我等小白参考就更好了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

111

主题

627

帖子

2

粉丝