【问题标题】:Start bootloader from firmware从固件启动引导加载程序
【发布时间】:2014-03-24 19:35:18
【问题描述】:

我希望能够直接从代码启动引导加载程序,而无需将引脚设置为高电平并重置微控制器以访问它。下面的想法是引导加载程序二进制文件存储在 char 数组中。调用 Start_BootLoader() 时,引导加载程序被复制到 SRAM 中并执行。

但是,代码会复制到 RAM 中,但是当它尝试在我复制到的位置执行代码时,它什么也不做。

微型。是能源微EFM32380f1024。我使用的以下代码基于 Energy Micro 的应用笔记 AN0042。

void Start_Bootloader(void)
{
  /* Diable interrupts */
  INT_Disable();

  __set_MSP( ( 0x20000000 + sizeof( bootloader ) + 0x400 ) & 0xFFFFFFF0 );

  /* Load the entire bootloader into SRAM. */

  memcpy( (void*)0x20000000, bootloader, sizeof( bootloader ) );

  /* Start executing the bootloader. */

  BOOT_jump( *(uint32_t*)0x20000000, *(uint32_t*)0x20000004 );
}

【问题讨论】:

  • 我不知道这个特定的设备,但是快速的互联网搜索似乎表明是 ARM 芯片?您已经复制了代码。 BOOT_jump()flushes 指令缓存吗?
  • 我不清楚 EM 引导加载程序是否与位置无关。我没有在应用笔记中看到任何内容,并且与应用笔记一起分发的 IAR 项目文件不会将其构建为独立于位置的。所以我想我想知道是什么让你认为它应该在复制到新的内存位置时运行。
  • 您已验证引导加载程序数据确实存在(在非易失性存储中)并且它不仅仅是将随机数据从 ram 复制到 ram?
  • 你禁用了 i 和 d 缓存?
  • EFM32GG 既没有 I 也没有 D 缓存。请参阅 Cortex M3 标签。

标签: c arm microcontroller cortex-m3


【解决方案1】:

代码附带 ROM 和 RAM 链接器设置 - 但只有 RAM 版本可能适用于您的情况。尝试从二进制文件中读取第二个字(32 位小端序)——它应该指向 0x20000000 范围内的奇数地址,因为它是新的 PC 值。

【讨论】:

  • 那个:*(uint32_t*)0x20000004memcpy()之后。
猜你喜欢
  • 1970-01-01
  • 2021-07-14
  • 1970-01-01
  • 2017-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-18
  • 2011-12-04
相关资源
最近更新 更多