Boot软件跳转APP软件函数

芯片型号:极海APM32F072

//定义一个函数类型的参数.这里iapfun是一个函数指针
typedef  void (*iapfun)(void);				

//跳转到应用程序段
//appxaddr:用户代码起始地址.
void iap_load_app(uint32_t appxaddr)
{
  iapfun jump2app;//定义一个函数指针变量
  
  __disable_irq(); 

  if(((*(__IO uint32_t*)appxaddr)&0x2FFE0000)==0x20000000)	//检查栈顶地址是否合法.
  { 
    //HAL_NVIC_DisableIRQ(DMA1_Channel2_3_IRQn);
    //HAL_NVIC_DisableIRQ(DMA1_Channel4_5_6_7_IRQn);
    //HAL_NVIC_DisableIRQ(USART1_IRQn);
    //HAL_NVIC_DisableIRQ(USART2_IRQn);
    //HAL_NVIC_DisableIRQ(USART3_4_IRQn);
    //HAL_NVIC_DisableIRQ(SysTick_IRQn);
      
    
    //函数指针实例化,给指针赋值,APP代码区第二个字内存的数据为程序开始地址(复位地址)
    jump2app=(iapfun)*(__IO uint32_t*)(appxaddr+4);	
	
    //初始化APP堆栈指针(APP代码区的第一个字内存的数据为栈顶地址)
    __set_MSP(*(__IO uint32_t*)appxaddr); 

    //跳转到APP.函数指针在前面已经实例化,这里直接用          
    jump2app();									
  }

}


/**
  \brief   Set Main Stack Pointer
  \details Assigns the given value to the Main Stack Pointer (MSP).
  \param [in]    topOfMainStack  Main Stack Pointer value to set
 */
__STATIC_INLINE void __set_MSP(uint32_t topOfMainStack)
{
  register uint32_t __regMainStackPointer     __ASM("msp");
  __regMainStackPointer = topOfMainStack;
}/**

芯片型号:STM32L431

typedef  void (*IapFun)(void);				//定义一个函数类型的参数
IapFun JumpToApp; 


//跳转到应用程序 AppAddr:用户代码起始地址.
void Iap_Load_App(uint32_t AppAddr)
{
  if(((*(uint32_t*)AppAddr)&0x2FFE0000)==0x20000000)	//检查栈顶地址是否合法.
  { 
    //用户代码区第二个字为程序开始地址(新程序复位地址)		
    JumpToApp = (IapFun)*(uint32_t*)(AppAddr+4); 

    //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
    MSR_MSP(*(uint32_t*)AppAddr);		 

    //设置PC指针为新程序复位中断函数的地址,往下执行
    JumpToApp();	
  }
}


void MSR_MSP(uint32_t addr) 
{
  //asm("MSR MSP, r0");  //使用Keil内嵌汇编时使用这两句
  //asm("BX r14");

  //set Main Stack value 将主堆栈地址保存到MSP寄存器(R13)中
  __ASM("msr msp, r0");  

  //跳转到lr中存放的地址处。bx是强制跳转指令 lr是连接寄存器,是STM32单片机的R14
  __ASM("bx lr"); 
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以回答这个问题。bootapp和irom1之间有关系,irom1是一个只读存储器,用于存储启动代码和引导程序,而bootapp则是指在引导完成后到应用程序的执行。因此,bootapp需要依赖irom1中的启动代码和引导程序来完成。 ### 回答2: "bootapp"和"irom1"是两个不同的概念,它们之间没有直接的关系。 首先,"bootapp"指的是启动过程中的一种操作,用于将设备从引导程序(boot到应用程序(app)运行。在这个过程中,引导程序会加载应用程序的代码,并将控制权交给应用程序来执行。 而"irom1"是指的是芯片中的一个存储区域,常常用来存放只读代码(Read-Only Memory,ROM),也被称为内部ROM(Internal ROM)。一般来说,irom1中存放的是一些固化的系统代码,如引导程序、底层驱动程序等。 尽管两者可以在系统启动过程中相互作用,但它们的关系并不是直接的。引导程序(boot)在启动过程中可以从irom1中加载代码,包括最终要执行的应用程序。因此,在引导过程中,引导程序可能会从irom1中加载app的代码,并通过操作将控制权移到app上。这样,可以说"bootapp"一定程度上依赖于irom1中存储的代码,但并不意味着两者有直接的关联。 总之,"bootapp"和"irom1"在设备启动和代码执行过程中都扮演了重要的角色,但它们是两个独立的概念,没有直接的关系。 ### 回答3: bootapp和irom1之间是有一定关系的。irom1是指内部ROM区域1,它是嵌入式系统中的一个重要部分,主要负责存放引导程序和初始化代码。而启动过程中的bootapp则是指在系统启动时,bootloader程序会根据一定的规则和条件,到应用程序进行加载和执行。 具体而言,bootapp需要通过bootloader程序来实现,而bootloader则通常会加载和执行irom1中的引导程序。引导程序主要负责进行硬件初始化、加载操作系统内核或应用程序的相关文件,并到内核或应用程序的入口点。因此,bootapp的实现离不开irom1的支持和协作。 同时,irom1中的引导程序也需要与bootapp进行配合,在引导程序中会有一些策略和规则,用来判断是否到应用程序的入口点。例如,引导程序可能会检测外部设备的状态,判断是否需要进行恢复或者升级操作,然后根据结果决定是否到应用程序。因此,bootapp和irom1之间是一种相互协作的关系。 总之,bootapp和irom1之间存在关系,它们共同实现了系统的启动过程,通过bootloader加载和执行irom1中的引导程序,然后到应用程序的入口点,完成系统的启动和运行。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值