硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1404|回复: 11
收起左侧

[BOOT/IAP] STM32H7r如何在代码中修改OptionByte

[复制链接]

6

主题

68

回帖

86

积分

初级会员

积分
86
发表于 2024-9-2 16:24:06 | 显示全部楼层 |阅读模式
如图:

下载.png


最近在做bootloader 总是跳转不成功,打算用修改启动地址的方式,再复位,从而达到直接运行app的目的


回复

使用道具 举报

6

主题

68

回帖

86

积分

初级会员

积分
86
 楼主| 发表于 2024-9-2 16:25:30 | 显示全部楼层
跳转代码如下:模仿硬汉哥的,但是不知道咋回事,跳转过去了,app运行不起来
boot和app都有rtos
回复

使用道具 举报

6

主题

68

回帖

86

积分

初级会员

积分
86
 楼主| 发表于 2024-9-2 16:25:49 | 显示全部楼层
[C] 纯文本查看 复制代码
void JumpToApp(uint32_t AppAddr)
{	
	void (*AppJump)(void);         /* 声明一个函数指针 */
    	
    /* 关闭全局中断 */
	DISABLE_INT(); 
    
    /* 设置所有时钟到默认状态,使用HSI时钟 */
	HAL_RCC_DeInit();
    
	/* 关闭滴答定时器,复位到默认值 */
	SysTick->CTRL = 0;
    SysTick->LOAD = 0;
    SysTick->VAL = 0;

	/* 关闭所有中断,清除所有中断挂起标志 */
	for (int i = 0; i < 8; i++)
	{
		NVIC->ICER[i]=0xFFFFFFFF;
		NVIC->ICPR[i]=0xFFFFFFFF;
	}	
	
	// 不关闭暂时没发现问题	
	SCB_DisableICache();		// 关闭ICache
	SCB_DisableDCache();		// 关闭Dcache
  
	ENABLE_INT(); /* 使能全局中断 Must Add here!! */
	
	/* 跳转到应用程序,首地址是MSP,地址+4是复位中断服务程序地址 */
	AppJump = (void (*)(void)) (*((uint32_t *) (AppAddr + 4)));

	/* 设置主堆栈指针 */
	__set_MSP(*(uint32_t *)AppAddr);
	
	/* 在RTOS工程,这条语句很重要,设置为特权级模式,使用MSP指针 */
	__set_CONTROL(0);
	
	AppJump(); 	
	
	Onboard_Led_ON();	
	
	//Debug_info("Jump to APP [%08x] fail!!!",AppAddr);	
}
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117571
QQ
发表于 2024-9-3 01:08:29 | 显示全部楼层
casy99 发表于 2024-9-2 16:25
[mw_shl_code=c,true]void JumpToApp(uint32_t AppAddr)
{       
        void (*AppJump)(void);         /* 声明一 ...

你有必要这样测试下,你的程序main函数里面什么都不干,直接跳转。
回复

使用道具 举报

6

主题

306

回帖

324

积分

高级会员

积分
324
发表于 2024-9-3 09:05:53 | 显示全部楼层
最可靠的是在start.s文件里jl长跳转,超稳定,
回复

使用道具 举报

3

主题

91

回帖

100

积分

初级会员

积分
100
发表于 2024-9-3 13:16:03 来自手机 | 显示全部楼层
以前使用下载器下载boot然后升级,在跳转APP时软件操作选项字修改为读保护再跳转app,也是跳转不过去,好像卡死一样,其实选项字已经修改了,重新上电就正常运行,后来发现只要下载器下载之后,重新上电再升级就能一次性完成了,你看看是不是同样的情况
回复

使用道具 举报

3

主题

78

回帖

87

积分

初级会员

积分
87
发表于 2024-9-3 13:53:17 | 显示全部楼层
fxyc87 发表于 2024-9-3 09:05
最可靠的是在start.s文件里jl长跳转,超稳定,

有案例吗?
回复

使用道具 举报

0

主题

40

回帖

40

积分

新手上路

积分
40
发表于 2024-9-4 09:17:34 | 显示全部楼层
修改了OB,肯定要重新上电的
回复

使用道具 举报

6

主题

306

回帖

324

积分

高级会员

积分
324
发表于 2024-9-4 12:08:36 | 显示全部楼层

这还要案例么?.s里启动时,检测对应的RTC备份寄存器值,是否要跳转,
回复

使用道具 举报

6

主题

68

回帖

86

积分

初级会员

积分
86
 楼主| 发表于 2024-9-8 12:40:40 | 显示全部楼层
eric2013 发表于 2024-9-3 01:08
你有必要这样测试下,你的程序main函数里面什么都不干,直接跳转。

试过了,还是不行,可能与cache有关
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117571
QQ
发表于 2024-9-8 15:32:38 | 显示全部楼层
casy99 发表于 2024-9-8 12:40
试过了,还是不行,可能与cache有关

没注意你的题目,你的是STM32H7R,这个芯片你肯定是外部SPI Flash跳转,外部Flash跳转的坑就很多了。

比如你boot的SPI Flash配置,进入QSPI Flash前的内存映射地址空间MPU配置,进入程序后的Cache设置等。

23.png

另外强烈推荐此贴的玩法


爽,一种非常给力的STM32H7内部Flash和QSPI Flash混合运行程序的方式,不再需要用户单独制作BOOT和APP
https://forum.anfulai.cn/forum.p ... 1011&fromuid=58
(出处: 硬汉嵌入式论坛)



回复

使用道具 举报

8

主题

35

回帖

59

积分

初级会员

积分
59
发表于 2024-9-9 13:51:22 | 显示全部楼层
试试这个呢,在指针前面加上 static 防止优化。
[C] 纯文本查看 复制代码
#define SET_VECTOR_TABLE (1)
void jump_to_app(uint32_t app_boot_address)
{
	uint32_t i=0;

	static void (*SysMemBootJump)(void);  

	static __IO uint32_t BootAddr;
	BootAddr = app_boot_address; 

	DISABLE_INT();

	/* 关闭滴答定时器,复位到默认值 */
	SysTick->CTRL = 0;
	SysTick->LOAD = 0;
	SysTick->VAL = 0;

	/* 设置所有时钟到默认状态,使用 HSI 时钟 */
	HAL_RCC_DeInit();
	HAL_DeInit();

	/* 关闭所有中断,清除所有中断挂起标志 */
	for (i = 0; i < 8; i++)
	{
		NVIC->ICER[i]=0xFFFFFFFF;
		NVIC->ICPR[i]=0xFFFFFFFF;
	}

	/* 使能全局中断 */
	ENABLE_INT();

	/* 跳转到系统 BootLoader,首地址是 MSP,地址+4 是复位中断服务程序地址 */
	SysMemBootJump = (void (*)(void)) (*((uint32_t *) (BootAddr + 4)));

#if(SET_VECTOR_TABLE)
    SCB->VTOR = BootAddr;
#endif
	
	/* 设置主堆栈指针 */
	__set_MSP(*(uint32_t *)BootAddr);
	
	/* 在 RTOS 工程,这条语句很重要,设置为特权级模式,使用 MSP 指针 */
	__set_CONTROL(0);

	/* 跳转到系统 BootLoader */
	SysMemBootJump();

	/* 跳转成功的话,不会执行到这里,用户可以在这里添加代码 */
	while (1)
	{

	}
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-15 22:21 , Processed in 0.051859 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表