打印
[MM32软件]

MM32F0144 Cortex-M0内核IAP远程升级

[复制链接]
336|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2024-6-12 13:09 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
一、 概述
此文档记录MM32 Cortex-M0内核使用IAP远程升级方案,通讯接口使用USART3,MM32F0144单片机为Cortex-M0内核,64KB Flash,8KB SRAM。实现Bootload与Application双向跳转BOOTLOAD2APP( )函数实现从BOOTLOAD跳转到APP功能,APPLICATION2BOOTLOAD( )函数实现从APP跳转到BOOTLOAD功能。
MM32F0144共有48项中断向量,故中断向量表的大小为48*4 = 192 =0xC0 Byte。

二、 实现原理
实现IAP技术的核心是一段预先烧写在单片机内部的IAP程序。这段程序主要负责与外部的上位机软件进行握手同步,然后将通过外设通信接口将来自于上位机软件的程序数据接收后写入单片机内部指定的闪存区域,然后再跳转执行新写入的程序,最终就达到了程序更新的目的。
MM32、STM32等内部Flash闪存起始地址为0x8000_0000,一般情况程序文件就是从此地址开始写入,其内部通过一张“中断向量表”来响应中断,程序启动后,将首先从“中断向量表”取出复位中断向量执行复位中断程序完成启动。而这张“中断向量表”的起始地址是0x8000004,当中断来临,MCU的内部硬件机制亦会自动将PC指针定位到“中断向量表”处,并根据中断源取出对应的中断向量执行中断服务程序,故可以通过重定义中断向量表实现执行程序跳转。
MM32F0144是基于Cortex-M0内核,相比于M3、M4内核,M0内核没有中断向量表重定义寄存器SCB->VTOR,所以先备份到片上SRAM中,实现相同的功能,需要思想为下三点:
1、将中断向量表放入到RAM的起始地址(只需要在应用程序中保留RAM起始地址的0x100大小不使用即可)。
2、在bootload中将应用程序的中断向量表从Flash中拷贝到RAM中。
3、设置MM32F0144中断向量表位于RAM中

三、Bootload工程配置
3.1 闪存配置



3.2 烧录配置



3.3 跳转实现代码
#define APPLICATION_START_ADDR (uint32_t)(0x08004000)
typedef void (pFunction)(void);
uint32_t JumpAddress = 0;
pFunction JumpToApplication;
void BOOTLOAD2APP(void)
{
if((uint32_t *)APPLICATION_START_ADDR != 0xFFFFFFFF)
{
NVIC->ICER[0] = 0xFFFFFFFF; //Disable All IRQ
JumpAddress = *(volatile uint32_t )(APPLICATION_START_ADDR + 4);
JumpToApplication = (pFunction) JumpAddress;
__set_MSP((volatile uint32_t *)APPLICATION_START_ADDR);
JumpToApplication();
}
else
{

}

}

四、 Application工程配置
4.1 内存映射配置



4.2 烧录配置



4.3 跳转实现代码
#define APPLICATION_START_ADDR (uint32_t)(0x08004000)
#define BOOTLOAD_START_ADDR (uint32_t)(0x08000000)
typedef void (pFunction)(void);
uint32_t JumpAddress = 0;
pFunction JumpToBootload;
void APPLICATION2BOOTLOAD(void)
{
if((uint32_t *)BOOTLOAD_START_ADDR != 0xFFFFFFFF)
{
NVIC->ICER[0] = 0xFFFFFFFF; //Disable All IRQ
JumpAddress = *(volatile uint32_t )(BOOTLOAD_START_ADDR+4);
JumpToBootload = (pFunction) JumpAddress;
// SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_Flash);
// RCC_APB2PeriphResetCmd(RCC_APB2RSTR_SYSCFG, ENABLE);
__set_MSP((volatile uint32_t *)BOOTLOAD_START_ADDR);
JumpToBootload();
}
else
{

}

}



————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/qq_42315062/article/details/135116386

使用特权

评论回复
沙发
yangxiaor520| | 2024-6-19 08:28 | 只看该作者
IAP远程升级首先得解决联网问题

使用特权

评论回复
板凳
CarterERO| | 2024-6-19 21:03 | 只看该作者
也可以用串口做IAP啊

使用特权

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

本版积分规则

1498

主题

14379

帖子

9

粉丝