打印
[技术问答]

自己写BOOTLOADER的实现方法

[复制链接]
1083|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
大家好,我这个项目是需要自己写个BootLoader,因为我要在我自己的BootLoader逻辑里做很多事情,包括在BootLoader里实现APP区域的update。我现在有几个问题不是很确定,第一,我的APP开始地址怎么确定,在哪定义?我没找到flash的分配管理文件,是直接在keil里编辑ROM1的地址值吗?

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

使用特权

评论回复

相关帖子

沙发
AutochipsMCU| | 2019-9-29 13:52 | 只看该作者
第一,我的APP开始地址怎么确定,在哪定义?我没找到flash的分配管理文件,是直接在keil里编辑ROM1的地址值吗?如果在配置中勾选了use memory layout from target dialog是通过IROM1进行配置,没勾选则在sct文件中配置。
bootloader的配置如下:

APP的配置如下:

第二,我在BOOTLOADER要跳转到APP里的时候,我该怎么跳过去呢?是否可以直接参考你们的ISP源码?你们是怎么实现跳转到0X08000000地址执行的。
可以参考我们的IAP代码。
bootloader跳转代码:
/**
* JumpTOApp
*
* @param[in] none
* [url=home.php?mod=space&uid=266161]@return[/url]    none
*
* [url=home.php?mod=space&uid=247401]@brief[/url]  Jump to APP Code
*/
void JumpTOApp(void)
{
    uint32_t JumpAddress;
    __ASM("CPSID I");
    if(((*(__IO uint32_t *)APP_ADDRESS) & 0x2FFE0000) == 0x20000000)
    {
        JumpAddress = *(__IO uint32_t *)(APP_ADDRESS + 4); // Jump to user application
        s_jumpToApplication = (pFunction)JumpAddress;   // Initialize user application's Stack Pointer
        __set_MSP(*(__IO uint32_t*)APP_ADDRESS);
        s_jumpToApplication();  /* jump to app */
    }
    else
    {
        printf("top of stack pointer is unvalid! please reboot!\r\n");
        while (1);  /* because of APP address have no code data */
    }
}

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


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



使用特权

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

本版积分规则

3

主题

168

帖子

0

粉丝