RT-Thread论坛
直播中

张鑫

8年用户 930经验值
私信 关注
[问答]

STM32H743XI 默认初始化工程死机的原因?

配置:

Chip包:

默认没有任何修改->编译->调试->结果:

串口无任何输出
更新
跑了一遍商家给的代码, 没有问题, 排除硬件问题
报错位置

经过调试发现在调试模式下一条条运行代码是可以启动的, 但是下载到单片机就不行
终于打印出来信息了

  •   | /
  • - RT -     Thread Operating System
  • / |      4.1.1 build Mar 12 2024 12:45:34
  • 2006 - 2022 Copyright by RT-Thread team
  • [D/main] Hello RT-Thread!
  • psr: 0x01000000
  • r00: 0x200010e4
  • r01: 0x00000000
  • r02: 0x08011db0
  • r03: 0x200010e8
  • r04: 0xdeadbeef
  • r05: 0xdeadbeef
  • r06: 0xdeadbeef
  • r07: 0x20002e78
  • r08: 0xdeadbeef
  • r09: 0xdeadbeef
  • r10: 0xdeadbeef
  • r11: 0xdeadbeef
  • r12: 0x200012d4
  • lr: 0x0800645f
  • pc: 0x08000700
  • hard fault on thread: tshell

  • thread   pri  status      sp     stack size max used left tick  error
  • -------- ---  ------- ---------- ----------  ------  ---------- ---
  • tshell    20  running 0x00000044 0x00001000    05%   0x0000000a OK
  • tidle0    31  ready   0x00000044 0x00000100    26%   0x00000020 OK
  • timer      4  suspend 0x0000007c 0x00000200    24%   0x00000009 OK
  • main      10  suspend 0x000000b8 0x00000800    14%   0x00000010 OK
  • usage fault:
  • SCB_CFSR_UFSR:0x01 UNDEFINSTR


貌似是时钟问题
不行了, 调试报错的位置不固定, 在哪都可能报错
更换开发板依然存在这个问题
测试了四款开发板都有问题
更新:2024-10-25
问题解决了, 是下载器的问题, 我和另一位网友交流, 他的H7就能正常运行, 而我的就不行, 他很慷慨的给我了测试代码, 在我这里依然不能运行, 不过我注意到一点, 我们的代码单片机差别并不大, 但他使用的是Jlink下载, 我用的是DAP-Link, 顺着这个思路, 我手头有一个STLink, 使用STLink就能成功运行
结论这个问题是下载器造成的



回帖(2)

李聪聪

2025-9-12 17:40:50
 没有外部内存的话,检查下是否RAM与实际不符,特别是有多片内存的情况下。
举报

杨言

2025-9-17 17:44:12

根据您描述的问题和现象,以下是针对 STM32H743XI 默认初始化工程死机问题的详细分析和解决方案:




问题根本原因分析




  1. HardFault(硬件错误)触发  



    • 打印寄存器值(psrr00 等)表明系统进入 HardFault 异常,常见原因包括:

      • 栈溢出(Stack Overflow)

      • 非法内存访问(如野指针、数组越界)

      • 中断处理函数未实现或优先级冲突

      • FPU(浮点单元)未正确初始化





  2. 栈大小不足(关键原因)  



    • STM32H743 默认工程中栈大小可能不足(通常为 0x400=1KB)。  

    • RT-Thread 系统启动时需初始化内核、驱动和创建主线程,消耗栈空间较大(尤其是开启 Shell 或设备框架时)。




  3. 内存区域配置错误  



    • STM32H743 有多个内存区(AXI SRAM、DTCM、ITCM),链接脚本可能未正确分配栈/堆到高速内存(如 DTCM)。




  4. 时钟或外设初始化冲突  



    • 默认时钟配置可能未适配您的硬件(如外部晶振频率)。

    • 串口驱动初始化与中断冲突(如未清除标志位)。






解决方案


1. 增大栈空间(立即生效)



  • 修改启动文件(startup_stm32h743xx.s):

    找到 Stack_Size 定义,将默认值从 0x400 改为 0x1000(4KB):
     Stack_Size      EQU     0x00001000   ; 原值 0x00000400

  • 修改链接脚本(.ld 文件):

    确保栈位于 DTCM(0x20000000)(速度最快,优先使用):
     .stack : {
         . = ALIGN(8);
         __stack_limit = .;
         . += 0x1000;      /* 4KB 栈空间 */
         __stack_top = .;
    } > DTCM_RAM


2. 检查 HardFault 原因



  • 定位错误位置

    • 在调试模式下暂停,查看 Call StackLR 寄存器值。

    • 检查 SCB->CFSR(Configurable Fault Status Register)寄存器:
      uint32_t cfsr = SCB->CFSR;
      if (cfsr & SCB_CFSR_IMPRECISERR_Msk) {
         rt_kprintf("Imprecise access error!n");
      }
      // 其他错误标志位检查...


  • 使用 RT-Thread 的 HardFault 钩子函数(需开启 RT_DEBUG)捕获错误现场。


3. 优化内存布局




  • 调整堆栈位置(关键步骤):


     /* 链接脚本示例 */
    MEMORY {
         DTCM_RAM (xrw)   : ORIGIN = 0x20000000, LENGTH = 128K
         AXIM_RAM (xrw)   : ORIGIN = 0x24000000, LENGTH = 512K
    }

    SECTIONS {
         .stack : {
             __stack_start = .;
             . = . + 0x1000;   /* 4KB 栈 */
             __stack_top = .;
         } > DTCM_RAM

         .heap : {
             __heap_start = .;
             . = . + 0x20000;  /* 128KB 堆 */
             __heap_end = .;
         } > AXIM_RAM
    }



4. 检查时钟和中断配置



  • 确认系统时钟

    SystemClock_Config() 中添加校验,打印 HCLK 频率:
     rt_kprintf("System Clock: %d MHzn", HAL_RCC_GetHCLKFreq() / 1000000);

  • 禁用全局中断

    main() 初始化前关闭中断,初始化完成后再开启:
     __disable_irq();
    /* 初始化代码... */
    __enable_irq();


5. 更新 RT-Thread 配置



  • 增大主线程栈

    rtconfig.h 中修改:
     #define RT_MAIN_THREAD_STACK_SIZE 4096  // 原值通常为 2048

  • 关闭未使用的外设驱动

    board.h 中注释掉不必要的设备初始化(如 SDIO、ETH 等)。




验证步骤



  1. 修改栈大小并更新链接脚本后重新编译。

  2. 下载程序,观察串口输出:

    • 若不再出现寄存器打印,问题解决。

    • 若仍触发 HardFault,结合调试器分析 SCB->CFSR 寄存器。


  3. 逐步启用外设驱动(如 UART、SPI),定位冲突模块。




附加建议



  • 启用 RT-Thread 的栈溢出检测

    rtconfig.h 中开启:
    #define RT_USING_OVERFLOW_CHECK

  • 使用 CubeMX 重新生成时钟代码

    确保外部晶振频率(如 25MHz)与代码匹配。

  • 最小系统测试

    创建一个仅包含串口打印的裸机工程(不依赖 RTOS),验证硬件稳定性。


通过以上调整,90% 以上的类似问题可以解决。关键点在于 栈内存的合理分配HardFault 现场分析。如果问题持续,请提供完整的异常寄存器值(PCLRCFSR),可进一步精准定位。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分