[技术问答] 自己写BOOTLOADER的实现方法

[复制链接]
197|1
 楼主 | 2019-9-29 11:56 | 显示全部楼层 |阅读模式
大家好,我这个项目是需要自己写个BootLoader,因为我要在我自己的BootLoader逻辑里做很多事情,包括在BootLoader里实现APP区域的update。我现在有几个问题不是很确定,第一,我的APP开始地址怎么确定,在哪定义?我没找到flash的分配管理文件,是直接在keil里编辑ROM1的地址值吗?

第二,我在BOOTLOADER要跳转到APP里的时候,我该怎么跳过去呢?是否可以直接参考你们的ISP源码?你们是怎么实现跳转到0X08000000地址执行的。
第三,其实也是第一点,APP地址定义好后,中断向量表要重新定义么?

使用特权

评论回复
| 2019-9-29 13:52 | 显示全部楼层
第一,我的APP开始地址怎么确定,在哪定义?我没找到flash的分配管理文件,是直接在keil里编辑ROM1的地址值吗?如果在配置中勾选了use memory layout from target dialog是通过IROM1进行配置,没勾选则在sct文件中配置。
bootloader的配置如下:
1.png
APP的配置如下:
2.png
第二,我在BOOTLOADER要跳转到APP里的时候,我该怎么跳过去呢?是否可以直接参考你们的ISP源码?你们是怎么实现跳转到0X08000000地址执行的。
可以参考我们的IAP代码。
bootloader跳转代码:
  1. /**
  2. * JumpTOApp
  3. *
  4. * @param[in] none
  5. * [url=home.php?mod=space&uid=266161]@return[/url]    none
  6. *
  7. * [url=home.php?mod=space&uid=247401]@brief[/url]  Jump to APP Code
  8. */
  9. void JumpTOApp(void)
  10. {
  11.     uint32_t JumpAddress;
  12.     __ASM("CPSID I");
  13.     if(((*(__IO uint32_t *)APP_ADDRESS) & 0x2FFE0000) == 0x20000000)
  14.     {
  15.         JumpAddress = *(__IO uint32_t *)(APP_ADDRESS + 4); // Jump to user application
  16.         s_jumpToApplication = (pFunction)JumpAddress;   // Initialize user application's Stack Pointer
  17.         __set_MSP(*(__IO uint32_t*)APP_ADDRESS);
  18.         s_jumpToApplication();  /* jump to app */
  19.     }
  20.     else
  21.     {
  22.         printf("top of stack pointer is unvalid! please reboot!\r\n");
  23.         while (1);  /* because of APP address have no code data */
  24.     }
  25. }
复制代码

第三,其实也是第一点,APP地址定义好后,中断向量表要重新定义么?


APP中,进入MAIN函数后,重定向中断向量表:
  1. __ASM(" CPSIE I");
  2. SCB->VTOR = APP_ADDRESS;
复制代码



使用特权

评论回复
扫描二维码,随时随地手机跟帖
*滑动验证:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表