单片机GD32F303RCT6 (Macos环境)开发 (五)—— IAP代码架构工程

IAP代码架构工程

1、IAP一般分两个工程,一个Bootloader工程,一个Application工程。
这两个工程的差异后面会讲。
IAP架构工程的好处在于产品上线以后,想要升级的话,不用借助烧录器,就可以完成产品的软件升级。
2、Bootloader的跳转
一般bootloader工程从0x8000000处运行,跑到main函数以后,通过一个跳转函数,跳到Applicaiton的地址,运行Application程序。本实验Application烧录到0x8007000地址,所以在代码中直接 jump_app(0x08007000)。

typedef void (*jump_callback) (void);


uint8_t jump_app(uint32_t app_addr) 
{
    uint32_t jump_addr;
    jump_callback cb;

    if (((*(__IO uint32_t*)app_addr) & 0x2FFE0000 ) == 0x20000000) 
    {  
        jump_addr = *(__IO uint32_t*) (app_addr + 4);  
        cb = (jump_callback)jump_addr;  
        __set_MSP(*(__IO uint32_t*)app_addr);  
        //__set_CONTROL(0);
        cb();
        return 1;
    } 
    return 0;
}

修改GD32F303RCTx_FLASH.ld,将Bootloader.bin大小限制在20K。

/* Specify the memory areas */
MEMORY
{
RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 48K
FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 20k
}

3、Application工程。开始可以直接copyBootloader工程,然后再修改即可。
1⃣️、修改Application的GD32F303RCTx_FLASH.ld文件,将起始地址修改为0x8007000、大小修改为50K

/* Specify the memory areas */
MEMORY
{
RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 48K
FLASH (rx)      : ORIGIN = 0x8007000, LENGTH = 50K
}

2⃣️、在main函数的最开始修改中断向量表。
这两句话是一样的

//设置中断向量表 	    
nvic_vector_table_set(NVIC_VECTTAB_FLASH,0x7000);
//SCB->VTOR = 0x08007000; //设置中断向量表

4、烧录的差异。

boot烧录命令:

pyocd flash --erase auto --target GD32F303RC  --base-address 0x8000000   ./Bootloader/build/Bootloader.bin

Application烧录命令:

pyocd flash --erase auto --target GD32F303RC  --base-address 0x8007000   ./Application/build/Application.bin

5、代码里可以使用make gdboot或者make gdapp烧录。
6、启动打印如下。先打印boot,在打印Application。
在这里插入图片描述
7、代码路径:https://gitee.com/xiaoguo-tec_0/gd32-iap-code.git

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值