打印
[MM32硬件]

MM32F0131系列单片机IAP跳转程序死机问题

[复制链接]
629|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
首先看BOOT代码程序跳转部分部分
//跳转到应用程序段
//appxaddr:用户代码起始地址.
void iap_load_app(u32 appxaddr)
{
        if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000)        //检查栈顶地址是否合法.
        {
                JumpAddress = *(__IO uint32_t *)(appxaddr + 4);// jump2app=(iapfun)*(vu32*)(appxaddr+4);                //用户代码区第二个字为程序开始地址(复位地址)               
                jump2app = (iapfun)JumpAddress;
                __set_MSP(*(volatile uint32_t*)appxaddr);//MSR_MSP(*(vu32*)appxaddr);                                        //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址   (__IO uint32_t *)
                jump2app();                                                                        //跳转到APP.
        }
}                 
因为mm32f0131是M0内核的单片机目前的库函数中没有SCB->VTOR这个中断向量表重定义的寄存器于是我们可以通过以下方法来实现中断向量表重定义。

使用特权

评论回复
沙发
wailian1265k|  楼主 | 2022-11-9 23:50 | 只看该作者
基本思想:
1、将中断向量表放入到RAM的起始地址(只需要在应用程序中保留RAM起始地址的0x100大小不使用即可)。
2、在Bootloader中将应用程序的中断向量表从Flash中拷贝到RAM中。
3、设置MM32F013中断向量表位于RAM中

使用特权

评论回复
板凳
wailian1265k|  楼主 | 2022-11-9 23:50 | 只看该作者
在APP的程序中添加如下代码
            

        #define APP_START_ADDRESS (uint32_t)(0x8008000)
main()
{
        memcpy((uint8_t *)SRAM_BASE, (uint8_t *)APP_START_ADDRESS, 48*4);        //这里复制中断向量表
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);                       
                SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);        

.
.
.
.
.
}

使用特权

评论回复
地板
wailian1265k|  楼主 | 2022-11-9 23:51 | 只看该作者
我这里把flash的起始地址设为0x8008000,可以根据需要进行修改   要注意的是   48*4  是因为我使用的该款单片机有48个中断向量每个向量4个字节   不同的单片机可能存在不同。

使用特权

评论回复
5
wailian1265k|  楼主 | 2022-11-9 23:51 | 只看该作者
在app程序中设置地址

0x8008000设置是因为我app的flash起始地址是这个

0x20000C0的设置是因为我使用的该款单片机有48个中断向量*4即为C0

BOOT部分原码:https://download.csdn.net/download/qxw0923/19823759?spm=1001.2014.3001.5501

使用特权

评论回复
6
yangxiaor520| | 2022-11-13 10:38 | 只看该作者
为什么不一起发,又是在回帖中。

使用特权

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

本版积分规则

51

主题

342

帖子

0

粉丝