m0_63392326 2026-01-07 16:45 采纳率: 0%
浏览 1

STM32H750新建工程问题

使用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:确认 SYSCLKAHB 频率正确。
      • 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 文件内容,我可以进一步帮你定位问题。希望以上内容能帮助你解决问题!

    评论

报告相同问题?

问题事件

  • 创建了问题 1月7日