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**** 2885180 points

Other Parts Discussed in Thread: MSPM0G3519, MSPM0C1104, UNIFLASH, MSPM0G3518

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1619356/mspm0g3519-firmware-upgrade-procedure

器件型号: MSPM0G3519
主题中讨论的其他器件: MSPM0C1104UNIFLASHMSPM0G3518

您好:

我使用的是 MSPM0G3519 LaunchPad。 我想进行基于 OTA 的固件升级、 我有 2 个代码。 第 1 页是引导加载程序代码、我在其中更改了 linker.cmd 文件中的闪存区域  

闪存中      (Rx) :origin = 0x00000000、length = 0x00008000。
 
在此引导加载程序代码中、我通过蓝牙接收.bin 文件、并存储在从 0x00008000 开始的位置。 完成后、我想检查应用程序是否有效、如果有效、我想跳转到应用程序。
int is_application_valid (void)
  uint32_t stack =*(uint32_t *) app_vector_address;
  //_BKPT (0);
  // if ((stack & 0xFFF00000)== 0x20200000)
  if ((stack & 0x2FFE0000)== 0x20200000){
    JUMP_FLAG = 1;
    结果= 1;
  }
    
  其他{

    结果= 2;
  }
  返回结果;
}

void jump_to_application (void)
  uint32_t *矢量表=(uint32_t *) app_vector_address;

  uint32_t appStack =矢量表[0];
  uint32_t appReset =矢量表[1];

  __disable_irq();

  /*禁用所有 NVIC 中断*/
  for (int i = 0;i < 8;i++)
  {
    NVIC->FFFFFF[i]= ICER; //禁用
    NVIC->ICPR[i]= 0xFFFFFFFF; //清除挂起
  }

  /*禁用 SysTick */
  SysTick ->CTRL = 0;

  SCB->VTOR = app_vector_address;
  __set_MSP (appStack);

   void (* appEntry)(void)=(void (*)(void)) appReset;
  appEntry ();
}
 
链接器.cmd 文件如下所示。
移动数据
  闪存中      (Rx) :origin = 0x00008000、length = 0x00078000
  SRAM_BANK0   (rwx):origin = 0x20200000、length = 0x00010000
  SRAM_BANK1   (RWX):origin = 0x20210000、length = 0x00010000
  BCR_CONFIG   (R) :origin = 0x41C00000、length = 0x000000FF
  BSL_CONFIG   (R) :origin = 0x41C00100、length = 0x00000080
  数据       (r) :origin = 0x41D00000、length = 0x00004000
}

很重要
  .intvecs: {} > 0x00008000
  .text :palign(8){}> flash
  .const : palign(8){}> flash
  .cinit :palign (8){}> FLASH
  .pinit :palign(8){}> flash
  .rodata : palign(8){}> flash
  .arm.exidx  :palign(8){}> flash
  .init_array :palign(8){}> flash
  .binit    : palign(8){}> flash
  .TI.ramfunc :load = FLASH、palign (8)、run=SRAM_BANK0、table (BINIT)

  .vtable: > SRAM_BANK0
  .args : > SRAM_BANK0
  .data : > SRAM_BANK0
  .bss  : > SRAM_BANK0
  .sysmem : > SRAM_BANK0
  .TrimTable: > SRAM_BANK0
  .stack : > SRAM_BANK0 (high)

  .bCRConfig :{}> BCR_config
  .BSLSConfig :{}> BSL_config
  .databank :{}>数据
}
binfile_storing.pngbin_hex_convert.png
 
在应用程序代码 main() 中、我使用了  
SCB->VTOR = 0x00008000;
我构建工程并生成.bin 文件。 我附上了.bin 文件的屏幕截图、该文件转换为十六进制视图后、显示了存储此值的内存视图。  当我检查 is_application_valid() 时、在 if 条件下存储后、它进入了一些默认的处理程序、我无法退出循环。 我不理解正在发生的事情。 我也在共享 main() 函数。  
内部 main (void)
  SYSCFG_DL_init ();
  _enable_irq();

  DL_UART_Main_ENABLE (UART_1_INST);
  NVIC_EnableIRQ (UART_1_INST_INT_IRQN);

  delay_ms (3000);

  /*if(is_application_valid())
  {
    __ BKPT (0);
    jump_to_application();
  }*/

  //请勿在此处擦除

  while (1)
  {
    DELAY_ms (1);
    lastReceiveTime++;

    IF(lastReceiverveTime > 2000)
    {
      if (rxIndex >= 8)
      {
        uint16_t fullBlocks = rxIndex / 8;

        for (int i = 0;i < fullBlocks * 8;I += 8)
        {
          flash_write_block (&rxBuffer[i]);
        }

        rxIndex = 0;
      }
if (lastReceiverveTime > 20000){
      __disable_irq();

      if(is_application_valid())
      {
        __ BKPT (0);
        jump_to_application();
      }
}
    }
  }
}
 
我想知道这是进行固件升级的正确方法吗? 还是有其他方法可以做到这一点?
我需要这方面的指导。 情况紧急。 我就不相信了。“
 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Gary、

    很抱歉晚回复。 昨天我就走了。 是的,无论你说什么都是正确的。 使用 UART0 时、无需在上电时按下复位按钮。 添加 UART1 时、每次上电时都需要按下复位按钮。 才会运行代码

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

    您好、

    我已经删除了  

    NVIC_EnableIRQ (UART_0_INST_INT_IRQN);从我的代码中、代码在上电时运行。
    但在开机时、当我进行固件升级时、它无法正常工作。
    但当我使用 Uart0 时、每次加电时固件升级都正常工作。
    使用 uart1 时、仅在调试模式下可以进行固件升级。
    现在区别是什么、如何解决该问题。
    我正在接收固件、但 jump_to_application() 不工作。 在调试模式和上电模式下、相同的代码使用 uart0。 但使用 uart1 时、只能在调试模式(不是上电模式)下正常工作
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    首先、让我先澄清一下问题。 对于将 MSPM0G3519 作为目标器件、如何获取新固件? UART?

    如果是、假设您使用 UART0 获取固件、那么它运行良好。 对于 UART1、您可以使用什么来使用它? 替换 UART0 以获取固件?

    如何将器件触发到 BSL 中? 如何通过 GPIO 或软件调用?

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

    您好、

    调用来配置存储器。 我采用了通过软件调用的 BSL 示例代码。 我将 BLE 模块连接到 PA8 和 PA9。  我不是发送 BSL 数据包、而是发送应用程序代码的十六进制字节并将其存储在 0x00058000 中。 接收完成后、我将应用程序代码从 0x00058000 复制到 0x00008000。 和调用跳转到应用程序函数。

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

    您好、Gary、

    感谢您的帮助,在开机时我收到垃圾数据,这就是为什么固件没有升级。 现在我找到了问题。