STM32/APM32 M0内核IAP升级

10 篇文章 0 订阅

注意:STM32F0不支持非对齐访问,会引起的硬件错误,stm8也不支持,

	uint8_t data[10]={1,2,3,4,5,6,7};
	print_x("hello main\r\n");
	uint32_t pp = *(uint32_t*)(&data[1]);//M0内核直接异常跑死
	print_x("pp %X\r\n",pp);

1、APP部分,M0内核的向量表必须拷贝到内存,并将中断向量修改为RAM

#define SYSCFG_MemoryRemap_SRAM     ((uint8_t)0x03)
void IAP_Set()
{
    uint32_t i = 0;
    /* Relocate by software the vector table to the internal SRAM at 0x20000000 ***/
    /* Copy the vector table from the Flash (mapped at the base of the application
       load address 0x08003000) to the base address of the SRAM at 0x20000000. */
    for(i = 0; i < 48; i++)
    {
        *((uint32_t*)(0x20000000 + (i << 2)))=*(__IO uint32_t*)(APP_ADDRESS + (i<<2));
    }
    /* Enable the SYSCFG peripheral clock*/
#if 0 //STM32
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
    SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);
#else //AMP32
    RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_SYSCFG);
    /* Remap SRAM at 0x00000000 */
    SYSCFG->CFG1_B.MMSEL = SYSCFG_MemoryRemap_SRAM;
#endif
}

2、APP中中断向量表在RAM中,所以要避免RAM覆盖,APP设置如下

 3、IAP跳转到APP

typedef  void (*pFunction)(void);
pFunction Jump_To_Application;
uint32_t JumpAddress;
void JumpAPP()
{
    /* Test if user code is programmed starting from address "APPLICATION_ADDRESS" */
    if (((*(__IO uint32_t*)APP_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
    {
        /* Jump to user application */
        JumpAddress = *(__IO uint32_t*) (APP_ADDRESS + 4);
        Jump_To_Application = (pFunction) JumpAddress;
        /* Initialize user application's Stack Pointer */
        __set_MSP(*(__IO uint32_t*) APP_ADDRESS);
        /* Jump to application */
        Jump_To_Application();
    }
}

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值