STM32F030跳转函数BootLoader和APP的主要部分


使用C语言

#define 	RAM_START_ADDR		(0x20000000)
#define		VECTOR_SIZE		(0xb0)//中断向量表的大小
typedef 	void (*pFunction)(void);

/**
  * @brief  Load and run user system
  * @note   
  * @rmtoll 
  * @param  None
  * @retval None
  */
void LoadUserSystem(u32 address)
{
	pFunction LoadAddress;
	u32 JumpAddress;
	
	if (((*(__IO uint32_t*)address) & 0x2FFE0000 ) == 0x20000000)
	{
		//关总中断
		__disable_irq();
		//复位地址
		JumpAddress = *(volatile u32*)(address + 4);
		LoadAddress = (pFunction)JumpAddress;
		memcpy((void *)RAM_START_ADDR, (void *)address, VECTOR_SIZE);
		LL_APB1_GRP2_EnableClock(LL_APB1_GRP2_PERIPH_SYSCFG);
		LL_SYSCFG_SetRemapMemory(LL_SYSCFG_REMAP_SRAM);
        
		//将把用户代码的栈顶地址设为栈顶指针
		__set_MSP(*(__IO uint32_t*)address);
		//程序跳转
		LoadAddress();
	}
}

使用汇编:

可以将C与汇编结合使用,将跳转函数转为汇编,其中C的代码部分


/**
  * @brief  Jump to user program
  * @note
  * @rmtoll
  * @param  None
  * @retval None
  */
int SystemJump2Where(uint32_t address)
{
	/* Test if user code is programmed starting from address "APPLICATION_ADDRESS" */
	if (((*(__IO uint32_t*)address) & 0x2FFE0000 ) == 0x20000000)
	{
		extern void vJumpToWhere(int);
		vJumpToWhere(address);
	}

	/*跳转失败,返回-1*/
	return -1;
}

1.在MDK中,汇编

		
        THUMB
        REQUIRE8
        PRESERVE8

        AREA ||i.vJumpToWhere||, CODE, READONLY, ALIGN=4

vJumpToWhere PROC
	cpsid           i 				;Disable interrupt
	ldr	    	r1, [r0]		;Get MSP location
	ldr	    	r2, [r0, #4]	;Get resethanler address
	movs    	r0, #0
	msr     	CONTROL, r0		;Use MSP
	msr     	MSP, r1
	bx    		r2 				;Jump
     
    ENDP
		
		
	EXPORT vJumpToWhere [CODE]
	END

 

2.在IAR中,汇编


    RSEG	CODE:CODE(2)
    thumb

	PUBLIC	vJumpToWhere

/*-----------------------------------------------------------*/
/**
  * @brief Jump to program start address and excute
  * @param Program start address
  * @retval None
  */
vJumpToWhere
	cpsid   i				//Disable interrupt
	ldr     r1, [r0]		//Get MSP location
	ldr     r2, [r0, #4]	        //Get resethanler address
	movs    r0, #0
	msr 	CONTROL, r0		//Use MSP
	msr 	MSP, r1
	bx	r2                      //Jump
     
    END

 

3.在STM32CubeIDE中(escplise),这部分代码还待优化


.global  vJumpToWhere	// 把vJumpToWhere链接属性改为外部,这样其他文件就可以看见了

	.thumb
	.section  .text.vJumpToWhere	//相关属性
	.type  vJumpToWhere, %function
	.size  vJumpToWhere, .-vJumpToWhere
	.align 4

/*-----------------------------------------------------------*/
/**
  * @brief Jump to program start address and excute
  * @param Program start address
  * @retval None
  */
vJumpToWhere:
    cpsid 	i				//Disable interrupt
	ldr     r1, [r0]		//Get MSP location
	ldr     r2, [r0, #4]	//Get resethanler address
	movs    r0, #0
	msr 	CONTROL, r0		//Use MSP
	msr 	MSP, r1
	bx		r2              //Jump
     

 

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!对于你的问题,可能有几个原因导致HAL_Delay函数APP程序后无法工作。以下是一些常见的可能原因和解决方法: 1. 时钟配置:确保在APP程序后,时钟配置与bootloader中的配置相匹配。如果时钟配置不正确,可能会导致HAL_Delay函数无法正常工作。可以使用调试器来检查时钟配置是否正确。 2. 中断配置:在APP程序后,确保中断配置与bootloader中的配置相同。如果中断配置不正确,可能会干扰HAL_Delay函数的正常运行。可以使用调试器来检查中断配置是否正确。 3. 调用位置:确定你在APP程序中正确地调用了HAL_Delay函数。确保在需要延时的地方正确地调用了该函数,并且没有其他代码干扰了延时的执行。 4. 代码重定位:如果你的APP程序使用了代码重定位(例如使用链接脚本),可能需要适当地配置重定位地址。确保重定位地址与bootloader中的配置相匹配,以确保HAL_Delay函数可以正确地执行。 5. 系统时钟频率:检查系统时钟频率是否正确配置,并且与HAL库中的设置相匹配。如果系统时钟频率不正确,可能会导致HAL_Delay函数无法正常工作。 如果以上方法都没有解决问题,那么可能需要更详细地检查你的APP程序代码,以确定是否有其他因素导致HAL_Delay函数无法正常工作。希望这些信息对你有所帮助!如果你有任何其他问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值