记忆的永恒 发表于 2023-9-14 16:46:48

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

使用STM32CubeMX+IAR7.8基于HAL库创建的工程文件,MCU型号是STM32F334R8T6,要求程序的起始地址要是0x08004000,发现程序在线调试运行正常,退出在线调试后仍可正常运行,但发生复位或断电后程序无法运行,这是为什么?怎么解?

eric2013 发表于 2023-9-14 17:41:34

断电或者复位后不能使用是正常,根本原因是这个:

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

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

记忆的永恒 发表于 2023-9-14 19:03:38

eric2013 发表于 2023-9-14 17:41
断电或者复位后不能使用是正常,根本原因是这个:

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

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

记忆的永恒 发表于 2023-9-14 19:06:17

eric2013 发表于 2023-9-14 17:41
断电或者复位后不能使用是正常,根本原因是这个:

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

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

eric2013 发表于 2023-9-14 19:58:51

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

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

emwin 发表于 2023-9-14 20:52:43

简单地说是默认在0地址启动。指定Debug启动PC地址,参考:Introduction to debugging with C-SPY macros | IAR

记忆的永恒 发表于 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的仿真界面退出仿真时代码仍可运行,但复位或断电重启后程序无法运行。以上就是我遇到的情况了,不知道怎么解决?

eric2013 发表于 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?mod=viewthread&tid=93112&fromuid=58
(出处: 硬汉嵌入式论坛)


blackfire531 发表于 2023-9-15 15:00:18

加个bootloader跳转到0x08004000地址试试看呢?

caicaptain2 发表于 2023-9-15 16:31:07

因为在线调试可以指定程序起始地址,就是直接在项目配置里面改就行了。 但是,硬件复位,芯片一定是从固定的0x08000000处运行的。 所以,你得另外做个启动程序(即bootload),才能让程序跳转到0x08004000执行。
页: [1]
查看完整版本: 使用STM32CubeMX+IAR7.8创建的工程文件,要求程序的起始地址要是0x08004000,发现程序在线调试正常,复位后无法运行,怎么解?