ARM Cortex-M0 BootLoader开发问题

SailorXing 2017-03-10 10:15:39
目前在做蓝牙方面的开发,用的是nRF51822的芯片(ARM Cortex-M0内核),想做一个BootLoader来通过串口更新Flash中的固件,目前写了两个程序做测试,分别是存放在Flash中0x00开始长度为0x4000的BootLoader、存放在0x4000长度为0x3C000的APP,分别将两个工程生成的HEX文件烧录到Flash后可以通过BootLoader来调用APP的main()函数正常运行APP,但如果在APP中加入中断后APP就不能正常运行了,是不是APP的中断向量表没有进行重映射导致错误调用了BootLoader的中断向量,最后导致程序跑飞了?没有做过BootLoader,望大神指点迷津,谢谢!


//BootLoader主程序
//Test nRF51822
#include <stdint.h>
#include "bsp/led.h"
#include "main.h"
#include "buzzer.h"


typedef void (*application_main_t)(void);

void BSP_Init(void)
{
LED_Init();

BUZZER_Init();
//Flash Init

}

int main(void)
{
BSP_Init();

//注意:
//bootloader放在从0x00开始的Flash中容易被刷掉,
//如果放到Flash的最后边则只会在烧写进去的程序能覆盖到bootloader的时候才会被破坏。
//像目前将bootloader的存放段定在0x00 ~ 0x40000,烧写进去后并没有将Flash中0x0003C800的旧程序覆盖掉。

//Bootloader部分测试代码
//begin rom adr: 0x0003C800, size: 0x3800
BUZZER_On();
DelayMs(200);
BUZZER_Off();

LED_On();
DelayMs(3000);
LED_Off();
//end boolader test

//跳转到主程序
//application_main_t application_main = *(application_main_t *)(APPLICATION_BASE_ADDRESS+4);
application_main_t application_main = *(application_main_t *)(0x3C800+4); //跳到main()
//application_main_t application_main = *(application_main_t *)(0x3C800); //直接跳到APP的零地址(不行,APP不运行!这个地址可能不为函数)
application_main();

//程序已跳转,不会执行到这里来
while (1)
{
}
}



//APP主程序
//Test nRF51822
#include <stdint.h>
#include "bsp/led.h"
#include "main.h"


void BSP_Init()
{
LED_Init();

BUZZER_Init();
//Flash Init

}

int main(void)
{
BSP_Init();


//APP 部分测试代码
//begin rom adr: 0x00, size: 0x20000(注意:不要覆盖了bootloader)
int led_status = 0; //0.灭、1.亮

BUZZER_On();
DelayMs(200);
BUZZER_Off();

while (1)
{
if (led_status == 0)
{
led_status = 1;
LED_On();
}
else
{
led_status = 0;
LED_Off();
}
DelayMs(500);
}
}
...全文
1073 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

1,616

社区成员

发帖
与我相关
我的任务
社区描述
智能硬件,智能手表,可穿戴设备,智能电视,谷歌眼镜,Google Glass 相关讨论。
社区管理员
  • 智能硬件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧