硬汉嵌入式论坛

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

[IAR] 使用STM32CubeMX+IAR7.8创建的工程文件,要求程序的起始地址要是0x08004000,发现程序在线调试正常,复位后无法运行,怎么解?

[复制链接]

2

主题

5

回帖

11

积分

新手上路

积分
11
发表于 2023-9-14 16:46:48 | 显示全部楼层 |阅读模式
使用STM32CubeMX+IAR7.8基于HAL库创建的工程文件,MCU型号是STM32F334R8T6,要求程序的起始地址要是0x08004000,发现程序在线调试运行正常,退出在线调试后仍可正常运行,但发生复位或断电后程序无法运行,这是为什么?怎么解?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2023-9-14 17:41:34 | 显示全部楼层
断电或者复位后不能使用是正常,根本原因是这个:

【不是问题的问题】为什么STM32的Flash地址要设置到0x08000000
https://www.armbbs.cn/forum.php?mod=viewthread&tid=109321

而调试状态可以使用,估计是IAR的处理了,设置了SP和PC寄存器。
回复

使用道具 举报

2

主题

5

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2023-9-14 19:03:38 | 显示全部楼层
eric2013 发表于 2023-9-14 17:41
断电或者复位后不能使用是正常,根本原因是这个:

【不是问题的问题】为什么STM32的Flash地址要设置到0x ...

已经按照这个帖子的说明尝试过了,问题还是没有解决,还特意使用MDK创建了一个点灯程序,还是一样的问题,这肯定是需要进行中断向量偏移操作的,我是在system_stm32f3xx.c文件里修改VECT_TAB_OFFSET值完成的
回复

使用道具 举报

2

主题

5

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2023-9-14 19:06:17 | 显示全部楼层
eric2013 发表于 2023-9-14 17:41
断电或者复位后不能使用是正常,根本原因是这个:

【不是问题的问题】为什么STM32的Flash地址要设置到0x ...

IAR是怎么设置SP和PC寄存器的?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2023-9-14 19:58:51 | 显示全部楼层
记忆的永恒 发表于 2023-9-14 19:03
已经按照这个帖子的说明尝试过了,问题还是没有解决,还特意使用MDK创建了一个点灯程序,还是一样的问题 ...

那个帖子不是帮助你解决问题的,是想告诉你,你的0x0800 0000地址没有中断向量表是无法正常使用。
回复

使用道具 举报

210

主题

1042

回帖

1682

积分

至尊会员

More we do, more we can do.

积分
1682
发表于 2023-9-14 20:52:43 | 显示全部楼层
简单地说是默认在0地址启动。指定Debug启动PC地址,参考:Introduction to debugging with C-SPY macros | IAR
回复

使用道具 举报

2

主题

5

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2023-9-15 11:22:28 | 显示全部楼层
eric2013 发表于 2023-9-14 19:58
那个帖子不是帮助你解决问题的,是想告诉你,你的0x0800 0000地址没有中断向量表是无法正常使用。

这个我明白,我对这篇文章的理解就是程序的物理起始地址是0x00000000,但这个被Flash、系统存储器和内部SRAM三者重映射,不能单独的直接将Flash、系统存储器或内部SRAM设置到这个地址,所以当我需要从Flash启动程序且程序的起始地址是0x08004000而不是0x08000000时,需要将原本的Flash地址0x08000000偏移到新的Flash地址0x08004000,对应的中断向量表的起始地址也需要偏移到0x08004000,使用SCB->VTOR对中断向量表实现偏移,然后就发现程序在MDK5.36编译无错误,但无法进行仿真和程序无法运行;在IAR7.8编译无错误,可以进行仿真,在IAR的仿真界面退出仿真时代码仍可运行,但复位或断电重启后程序无法运行。以上就是我遇到的情况了,不知道怎么解决?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2023-9-15 11:47:31 | 显示全部楼层
记忆的永恒 发表于 2023-9-15 11:22
这个我明白,我对这篇文章的理解就是程序的物理起始地址是0x00000000,但这个被Flash、系统存储器和内部S ...

MDK调试设置个脚本就行:MDK Option Debug里面有个脚本,设置PC和SP

参考此贴:

基于STM32H7的内部SRAM程序调试工程模板(512KB的AXI SRAM存程序,DTCM做主RAM)
https://www.armbbs.cn/forum.php? ... 3112&fromuid=58
(出处: 硬汉嵌入式论坛)


回复

使用道具 举报

23

主题

211

回帖

280

积分

高级会员

积分
280
发表于 2023-9-15 15:00:18 | 显示全部楼层
加个bootloader跳转到0x08004000地址试试看呢?
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
发表于 2023-9-15 16:31:07 | 显示全部楼层
因为在线调试可以指定程序起始地址,就是直接在项目配置里面改就行了。 但是,硬件复位,芯片一定是从固定的0x08000000处运行的。 所以,你得另外做个启动程序(即bootload),才能让程序跳转到0x08004000执行。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 00:44 , Processed in 0.212024 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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