0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

极海MCU的ISP和IAP中程序跳转运行问题分析

Geehy极海半导体 来源:21ic论坛极海半导体专区 2025-10-10 14:31 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

《APM32芯得》系列内容为用户使用APM32系列产品的经验总结,均转载自21ic论坛极海半导体专区,全文未作任何修改,未经原文作者授权禁止转载。

1、前言

最近在调试程序的程序升级方式,遇到了不少的问题,本篇笔记记录一下遇到的一些问题及在这个过程中的一些问题及思考。

首先什么是ISP和IAP?

我这里简单总结一下,简单来说MCU程序更新的方式一般有3种:

1. IAP,在应用中编程,通过一些串行接口对应用程序进行更新的一种方式,其模式是BootLoader+APP的方式,且这两部分的代码一般均保存在MCU的Flash区域。

2. ISP,在系统中进行编程,一般是通过MCU厂商提供的一段保存在系统存储区的程序,通过串行接口对Flash进行编程。

3. ICP,在电路中进行编程,一般是通过SWD/JTAG的方式对Flash进行编程。

程序跳转运行

我这里使用的MCU是极海的APM32F103C8T6,由于其是基于ArmCortex-M3内核的一款芯片,其程序的跳转运行非常简单。

Cortex-M内核的芯片一般而言仅需在程序中改变PC、MSP寄存器至指定位置即可使得我们的程序跳转至某处运行。

比如极海官方提供的例程:

/* Jump to user application */

JumpAddress = *(__IO uint32_t *) (address + 4);

Jump_To_Application = (pFunction) JumpAddress;

/* Initialize user application's Stack Pointer */

__set_MSP(*(__IO uint32_t *) address);

/* Jump to application */

Jump_To_Application();

2、跳转运行遇到的一些问题

在实践中,我发现若是在一个程序跳转至另外一个程序的时候(如BootLoader跳转至APP),若前段程序开启了一些中断,而后段程序未开启相关中断的情况下会导致程序无法正常运行。

如设计一个IAP程序:

BootLoader无任何中断打开,而APP开启的滴答中断,若此时我们在APP中使用的是程序跳转运行的方式回到BootLoader,此时会造成BootLoader程序无法正常响应滴答中断(因为BootLoader程序没有滴答中断服务函数)。从而导致我们的BootLoader程序异常卡死。

e7f39c34-99ef-11f0-8c8f-92fbcf53809c.png

3、解决问题

理论上,若BootLoader或者APP单独保存在flash中,并以复位运行的操作下,我们的程序都是可以正常运行的,而问题在于我们跳转运行会导致异常。

从上面的理论,我们总结一下:

1. 跳转运行会导致程序异常。

2. 复位运行不会导致程序异常。

从上面两点,我们引申思考得到:我们只要在程序跳转前将芯片的各个状态保持回到复位状态,我们就可以保证程序跳转后能够正常运行。

那么问题来了,复位状态是一个什么样的状态?

复位时芯片刚刚上电,此时的MCU

1. 各个外设时钟均未打开。

2. 对中断的设置均未进行。

那么我们根据这个思路,来编写我们重新跳转前的程序:

1. 关闭中断响应,保证我们的后续“还原至复位状态的”操作不会被中断。

2. 关闭所有的中断使能及还原芯片中断寄存器状态。

3. 关闭所有外设的时钟并对外设进行复位。

4. 设置主时钟为HSI。

5. 开启中断响应。

最后跳转至目标程序区域

e8578a64-99ef-11f0-8c8f-92fbcf53809c.png

那完成以上操作后就可以保证一定程度上保证我们的程序能够回到“复位状态”在去执行我们的目标程序啦。

这里我也贴一段代码提供给大家参考。

void ResetSystem(void)

{

/* Set the interrupt shielding position and prohibit all interruptions. */

__set_PRIMASK(1);

/* Disable all peripheral clocks */

RCM->APB2CLKEN = 0;

RCM->APB1CLKEN = 0;

RCM->AHBCLKEN = 0;

/* Reset all peripherals */

RCM->APB2RST = 0xFFFFFFFF;

RCM->APB1RST = 0xFFFFFFFF;

RCM->AHBRST = 0xFFFFFFFF;

RCM->APB2RST = 0;

RCM->APB1RST = 0;

RCM->AHBRST = 0;

/* Disable all interruptions */

for (uint8_t i; i < 8; i++)

{

NVIC->ICER[i] = 0xFFFFFFFF;

NVIC->ICPR[i] = 0xFFFFFFFF;

}

/* Configure the external interrupt controller and set all the interrupt

mask and trigger method to 0. */

EINT->IMASK = 0x0;

EINT->EMASK = 0x0;

EINT->RTEN = 0x0;

EINT->FTEN = 0x0;

EINT->IPEND = 0x0;

/* Set HSIEN bit */

RCM->CTRL_B.HSIEN = BIT_SET;

/* Reset SCLKSEL, AHBPSC, APB1PSC, APB2PSC, ADCPSC and MCOSEL bits */

RCM->CFG &= (uint32_t) 0xF8FF0000;

__set_PRIMASK(0);

}

以上便是一份我本次的思考与总结,欢迎大家斧正。

原文地址:https://bbs.21ic.com/icview-3311062-1-1.html

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    147

    文章

    18604

    浏览量

    386556
  • 接口
    +关注

    关注

    33

    文章

    9443

    浏览量

    156108
  • 程序
    +关注

    关注

    117

    文章

    3836

    浏览量

    84745

原文标题:APM32芯得 EP.63 | APM32F103C8T6_关于ISP_IAP中程序跳转运行的思考

文章出处:【微信号:geehysemi,微信公众号:Geehy极海半导体】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    STM32 MCU IAP例程分析

    STM32 MCU IAP例程跳转到APP代码简要分析
    发表于 05-15 14:30

    IAP程序跳转到APP只能运行大约2秒

    );} 问题:如果设置了" __MSR_MSP (AppSpInitVal);//设置SP.,则跳转过去大约2秒就又回到IAP程序了;而不操作这个SP,则可以正常运行,实际上就是在
    发表于 03-14 08:05

    浅析STM32的IAP与APP互相跳转

    很多问题。现将IAP学习过程和实际遇到问题总结一下。首先说一下什么是IAPIAP(In Application Programming)即在应用编程,IAP是用户自己的
    发表于 08-05 07:24

    MCU bootload IAP程序是如何跳转

    MCU bootloadIAP程序是如何跳转的?需要注意哪些事项呢?
    发表于 11-29 07:48

    ISPIAP的区别

    ISPIAP的区别       IAP: in applicatin progr
    发表于 12-28 11:28 1900次阅读

    STC-USER-IAP-ISP-DEMO程序

    STC-USER-IAP-ISP-DEMO
    发表于 11-16 19:12 14次下载

    关于如何利用STM8S做IAP的步骤

    ,个人感觉叫IAP更合适。IAP程序烧写到flash中程序最开始运行的地方,这个程序负责升级更新
    发表于 09-20 20:29 14次下载
    关于如何利用STM8S做<b class='flag-5'>IAP</b>的步骤

    STM32 IAP - Boot跳转到APP

    简单IAP设计思路:单片机上电首先运行BootLoader程序; Bootloader如果检测到需要更新APP,则首先进行更新,更新完成后跳转到APP并
    发表于 12-03 14:21 13次下载
    STM32 <b class='flag-5'>IAP</b> - Boot<b class='flag-5'>跳转</b>到APP

    单片机的烧录方式:ISP、ICP、IAP的区别

    单片机的烧录方式:单片机三种烧录方式ISPIAP和ICP有什么不同?单片机三种烧录方式ICP、IAPISP详解单片机程序烧录的3种方式(
    发表于 12-03 18:21 27次下载
    单片机的烧录方式:<b class='flag-5'>ISP</b>、ICP、<b class='flag-5'>IAP</b>的区别

    STM32+IAP+uCOS-iii升级跳转至APP程序跑飞问题

    最近项目中MCU使用的是STM32F103,APP程序操作系统使用的是uCOS-iii,在进行IAP升级时发现,从Bootloader跳转至APP
    发表于 12-09 09:51 16次下载
    STM32+<b class='flag-5'>IAP</b>+uCOS-iii升级<b class='flag-5'>跳转</b>至APP<b class='flag-5'>程序</b>跑飞问题

    关于STM32 BOOT和IAP跳转的流程梳理

    前言首先先简要的介绍一下boot和iap。boot( Bootlader)引导装载程序。单片机上电程序开始运行的时候就是运行的该部分的代码,
    发表于 12-23 19:03 29次下载
    关于STM32 BOOT和<b class='flag-5'>IAP</b><b class='flag-5'>跳转</b>的流程梳理

    MCU ISP Tools安装程序

    MCU ISP Tools安装程序
    发表于 07-08 10:22 25次下载

    MCU型号表

    MCU型号表
    发表于 11-09 21:03 0次下载
    <b class='flag-5'>极</b><b class='flag-5'>海</b><b class='flag-5'>MCU</b>型号表

    AN040 IAP程序跳转说明

    AN040 IAP程序跳转说明
    发表于 02-23 19:11 0次下载
    AN040 <b class='flag-5'>IAP</b><b class='flag-5'>程序</b><b class='flag-5'>跳转</b>说明

    什么ISP?什么是IAP

    做单片机开发的工程师经常会听到两个词:ISPIAP,但新手往往对这两个概念不是很清楚,今天就来和大家聊聊什么是ISP,什么是IAP
    的头像 发表于 01-28 09:26 5769次阅读
    什么<b class='flag-5'>ISP</b>?什么是<b class='flag-5'>IAP</b>?