This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSPM0G3519:复位后重试存储在存储器中的数据时出现问题

Guru**** 2873830 points

Other Parts Discussed in Thread: MSPM0G3519

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1630148/mspm0g3519-problem-in-retriving-data-stored-in-memory-after-reset

器件型号: MSPM0G3519

您好、

 

我使用 MSPM0G3519 LaunchPad、通过使用此功能、我正在开发固件升级代码。

我正在使用自定义引导加载程序。

我正在关注。

  1. 引导加载程序代码:此代码在复位后运行。 处理闪存复制(应用存储器到应用程序存储器的临时存储器)。 检查是否使用 内存 0x00007C00 上的标志请求升级。

   2.应用程序代码:这是第一个运行的固件。 它保持在 0x00008000。 之后运行      引导加载程序会检查 0x00008000 是否存在任何有效数据。  

此代码通过 BLE 接收更新。 收到的新固件存储在 0x00058000 中。 完全接收到固件后、将更新标志存储在位置 0x00007C00。  

我的期望:

复位后、引导加载程序代码将检查 0x00007C00 中是否存在更新标志、如果是、则应将数据从 0x00058000 复制到 0x00008000、然后它应运行应用程序。

但复位后、我没有获得 0x00058000 的任何数据。 为什么它在复位后被擦除?

是否需要遵循任何设置?

在运行时、我已经通过将数据从 0x00058000 复制到 0x00008000 来检查此问题、它可以正常工作。 现在、我想在重置电路板后进行复制。

请引导我。

这时,我才明白妈妈有多性感。

 

谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    0x58000 是闪存组 1

    0x08000 是闪存组 0

    对组 0 和组 1 的写入操作都需要具有 Flashctl 外设的闪存 API。

    、但重置后、我无法在 0x00058000 获得任何数据。 为什么它在重置后被擦除?

    如果您在尝试启动其他调试会话时选择在复位之间擦除整个芯片、则 0x58000 可能会被调试器擦除。

    请在收到 BLE 后仔细检查、0x58000 有数据。

    擦除闪存只能使用两种方法:调试器和 CPU 运行闪存 API 擦除命令。

    我是否需要遵循任何设置?

    尝试检查调试器擦除方法、如果使用的是 XDS110、请尝试选择“ERASE NEEDED REGION ONLY(仅擦除必要区域)“。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    谢谢。 在写之前、我需要取消保护。 我的问题得到解决。

    我正在进行固件升级。 当我升级大小小于 1KB 的固件时、代码工作正常。 当我使用大小为 3KB 的固件时、它不会升级。 原因可能是什么。

    在这里、我将发送复制函数、将数据从临时区域复制到应用区域、并发送跳转到应用程序函数。 我怀疑复制函数没有复制整个文件。 如何在运行时进行调试、我不明白。

    void jump_to_application (void)
      __disable_irq()
      uint32_t sp =*(uint32_t *) app_base;
      uint32_t reset =*(uint32_t *)(APP_BASE + 4);  
      if (sp!= 0xFFFFFFFF)
      {
          DL_GPIO_clearPins (GPIO_LEDS_PORT、GPIO_LEDS_USER_LED_1_PIN);
          DELAY_CYCLES (8000000);
          DL_GPIO_togglePins (GPIO_LEDS_PORT、GPIO_LEDS_USER_LED_2_PIN);

      }
      SCB->VTOR = APP_BASE;  
      ((void (*)(void)) reset)();
    }
    #define FLASH_SECTOR_SIZE  2048

    void erase_application_area (void)
      对于 (uint32_t addr = APP_BASE;
         addr < TEMP_BASE;
         addr += FLASH_SECTOR_SIZE)
      {
        __disable_irq()
        DL_FlashCTL_executeClearStatus (FLASHCTL);
        DL_FlashCTL_unprotectSector (
          FLASHCTL、
          地址、
          DL_FLASHCTL_REGION_SELECT_MAIN);

        DL_FlashCTL_eraseMemory (
          FLASHCTL、
          地址、
          DL_FLASHCTL_COMMAND_SIZE_SECTOR);
        DL_FlashCTL_waitForCmdDone (FLASHCTL);
        _enable_irq()
        
      }
      
    }
    RAMFUNC void copy_temp_to_application (void)
      uint32_t offset = 0x00000000
      uint32_t 缓冲器[2]
      uint32_t CURRENT_SECTOR = 0xFFFFFFFF
      
      __disable_irq()
     // NVIC_DisableIRQ (UART_1_INST_INT_IRQN);

      while(偏移< firmware_size)
      {
        
        uint32_t app_addr = APP_BASE +偏移;       
        
        /*从 TEMP 区域读取 8 个字节*/
        Buffer[0]=*(uint32_t *)(TEMP_BASE +偏移);
        //__BKPT (0);     
        Buffer[1]=*(uint32_t *)(TEMP_BASE + OFFSET + 4)
        
          if (*(uint32_t *) app_addr == 0xFFFFFFFF){
          DL_FlashCTL_unprotectSector (
            FLASHCTL、
            APP_addr、
            DL_FLASHCTL_REGION_SELECT_MAIN);
          gCmdStatus = DL_FlashCTL_programMemoryFromRAM64WithECCGenerated (
          FLASHCTL、APP_addr、BUFFER);
          
          DL_FlashCTL_waitForCmdDone (FLASHCTL);
          }     
        偏移+= 8
       
      }
     // NVIC_EnableIRQ (UART_1_INST_INT_IRQN);
      _enable_irq()
        
    }
    在主循环中、我执行以下操作:
     if(is_update_requested())  
          {       
          clear_update_flag()
          erase_application_area()
          copy_temp_to_application()
          // NVIC_SystemReset();
          
          jump_to_application()
          }
    请帮我解决这个问题
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、此演示包含所有相关的 API、可供您的固件更新参考:

    C:\ti\mspm0_sdk_2_10_00_04\examples\nortos\LP_MSPM0G3519\bsl\secondary_bsl_uart

    例如:

    CMD_API_COM Flash_Range_Erase
    CMD_API_COM Program_Data
    CMD_API_DBACK Memory_Read_
    CMD_API_startApplication

    我认为、BSL 演示上面有很多帮助、下面是 BSL 文档:

    MSPM0 引导加载程序用户指南 — 协议

    https://www.ti.com/lit/pdf/slau887

    MSPM0 引导加载程序 (BSL) 实现 — 使用方法

    https://www.ti.com/lit/pdf/slaae88

    当我升级大小小于 1KB 的固件时、代码工作正常。 当我使用大小为 3KB 的固件时、它不会升级。 原因可能是什么。

    建议遵循 BSL 逻辑、擦除 1KB、编程 1KB、然后擦除第二个 1KB、编程 1KB。 或者、您可以先擦除所有 3KB、然后逐个编程固件。

    此外、您需要将所有固件区域闪存保持为空、而不会被引导加载程序或其他功能覆盖。

    在这里、我要发送复制函数来将数据从临时区域复制到应用程序区域、以及跳转到应用程序函数。 我怀疑复制函数没有复制整个文件。 我不明白如何在运行时进行调试。

    不要同时测试整个流程。

    您可以逐个启用一个模块、逐个测试这些模块。

    使用其他方法、例如向 UART 发送固件以进行仔细检查。