使用STM32CubeMX生成STM32H750VBT6的工程代码,生成后没有加代码,编译不报错,模拟仿真代码不运行,停在“LDR R0, =SystemInit”,且报错:*** error 65: access violation at 0x5C001000 : no 'read' permission。找了好多帖子都没解决,路过的大佬有没有知道什么原因的?求指教
2条回答 默认 最新
檀越@新空间 2026-01-07 16:46关注下午好🌅🌅🌅
本答案参考通义千问你遇到的问题是关于 STM32H750VBT6 使用 STM32CubeMX 生成工程后,代码无法运行、仿真时停在
LDR R0, =SystemInit并报错:*** error 65: access violation at 0x5C001000 : no 'read' permission。这个问题通常与 内存映射配置错误 或 启动文件(startup file)设置不当 有关。下面我将详细分析原因,并提供解决方案。
✅ 一、问题原因分析
1. 内存地址冲突或权限错误
错误信息中提到的地址
0x5C001000是一个 不可读的地址,说明程序试图访问一个没有被正确配置为可读的内存区域。- STM32H7系列使用的是 MMU(内存管理单元),某些内存区域需要特别配置权限。
- 如果你的工程中使用了 外部存储器(如SRAM、Flash、QSPI等),但未正确配置其访问权限,就会导致此类错误。
2. SystemInit 函数未被正确执行
LDR R0, =SystemInit是调用系统初始化函数的地方。如果这个函数没有被正确加载或执行,可能导致程序卡在这里。- 原因可能是:链接脚本(.ld 文件)配置错误,或者 启动文件(startup.s)中跳转逻辑有误。
3. 启动文件(startup.s)配置问题
- 如果你使用的是 STM32CubeMX 生成的默认 startup.s 文件,但没有正确修改,可能会导致程序无法正常跳转到
main()。 - 特别是在 H7 系列中,需要使用特定的 startup 文件(如
stm32h7xx_startup.s),而不是通用的stm32f4xx_startup.s。
✅ 二、解决步骤(有序列表)
1. 检查并更新 Startup 文件
- 打开项目目录,找到
Core/Src/startup_stm32h750xx.s(根据芯片型号可能略有不同)。 - 确保该文件是 STM32H750 的专用启动文件,不是 F4/F7 等其他系列的。
- 如果你使用的是 CubeMX 自动生成的,可能需要手动替换为官方提供的启动文件。
注意: STM32H7 系列的启动文件需从 STM32 官方库中获取,例如:
2. 确认链接脚本(.ld 文件)是否正确
- 检查
.ld文件是否正确定义了内存区域(如 RAM、FLASH、SRAM 等)。 - 例如,确保以下部分正确:
MEMORY { FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 0x00080000 RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00020000 }重点: 内存区域必须有正确的权限(
rwx表示可读、写、执行)。3. 检查 SystemInit() 是否被正确调用
- 在
main.c中确认SystemInit();是否被调用。 - 如果没有被调用,会导致时钟、GPIO 等初始化失败。
4. 检查调试配置(JTAG/SWD)和 Flash 编程
- 如果你使用的是 仿真调试(SWD/JTAG),请确认:
- 调试器(如 ST-Link、J-Link)连接正确。
- 目标芯片的 Flash 是否已正确烧录。
- 如果 Flash 未烧录,程序会从 SRAM 启动,而 SRAM 可能没有初始化。
5. 检查 CubeMX 配置
- 打开 CubeMX,重新检查以下配置:
- Clock Configuration:确保 HSE/HSI 正确配置。
- System Core:确认
SYSCLK和AHB频率正确。 - GPIO:确保关键引脚(如 SWD)未被错误配置为输入/输出。
6. 检查调试器和目标板的电源
- 有时候,目标板电源不稳定 也会导致程序无法运行。
- 请确保目标板供电稳定,尤其是 STM32H750 的 VDD 和 VDDA 电压是否符合要求。
✅ 三、修改建议(代码示例)
修改
main.c中的SystemInit()调用int main(void) { /* STM32 HAL initialization */ HAL_Init(); /* Configure the system clock */ SystemInit(); // 确保此行存在且被调用 /* Other initializations... */ while (1) { // Your code here } }修改
.ld文件中的内存配置(示例)MEMORY { FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 0x00080000 RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00020000 }
✅ 四、附加建议
1. 使用 STM32CubeProgrammer 验证 Flash
- 使用 STM32CubeProgrammer 将编译后的
.bin文件烧录到 Flash。 - 然后尝试 重启设备,看是否能正常运行。
2. 使用 STM32H7 的标准外设库(HAL 或 LL)
- 如果你使用的是 HAL 库,请确保包含所有必要的头文件。
- 例如,在
main.c中添加:
#include "stm32h7xx_hal.h"
✅ 五、总结
| 问题 | 解决方案 | |------|----------| | 无法运行,停在
LDR R0, =SystemInit| 检查startup.s和.ld文件是否正确 | | 访问权限错误(access violation) | 确保内存区域权限配置正确(rwx) | | SystemInit 未被调用 | 在main()中显式调用SystemInit()| | CubeMX 配置错误 | 重新检查 Clock、GPIO、System Core 配置 |
如果你能提供具体的
startup.s和.ld文件内容,我可以进一步帮你定位问题。希望以上内容能帮助你解决问题!解决 无用评论 打赏 举报