RT-Thread论坛
直播中

张娟

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

rtthread5.2.0移植到gd32H759无法启动芯片怎么解决?

1.使用mdk5 armv5编译软件正常通过,但切换为armv6报数据类型定义错误


头文件都包含,还需要修改哪里?
2.用armv5编译代码无错误,下载到gd32H759开发板上,导致jlink不能识别到芯片(swd下载),目前软件是通过env直接生成,没有添加代码,请问sct文件选择MDK5直接生成的,请问这需要考虑哪些?
麻烦指点一下,不胜感激!


回帖(1)

abdkjshd

2025-9-17 17:44:49

针对GD32H759移植RT-Thread 5.2.0的问题,结合你的描述,以下是系统化的解决方案:




问题1:ARMv6编译数据类型错误


原因分析

GD32H759采用Cortex-M7内核(ARMv7E-M架构),而ARMv5/ARMv6是老版本工具链(如ARMCC 5)。必须使用ARMv7兼容工具链(如ARM Compiler 6)。


解决方案:




  1. 切换正确工具链



    • 在MDK中:Project -> Options -> Target -> ARM Compiler 选择 ARM Compiler 6 (AC6)

    • 确保勾选FPU选项(GD32H759支持双精度FPU):

      FPU = FPv5-D16(根据芯片手册确认)




  2. 修复数据类型错误



    • 检查报错位置的头文件:

      • 确认包含路径包含RT-Thread的 include/libc 目录。

      • rtconfig.h 中显式定义标准库:
        #define RT_USING_NEWLIB
        // 或
        #define RT_USING_MINILIBC


    • 若使用newlib,在链接器选项中添加:

      --library_type=microlib 改为 --library_type=standard






问题2:下载后芯片无法识别(SWD失效)


核心原因

通常是时钟或初始化代码未正确配置导致芯片未运行,或SWD引脚被错误复用。


分步解决方案:


1. 检查链接脚本(.sct文件)



  • 确保ROM/RAM地址匹配GD32H759:
     LR_IROM1 0x08000000 0x00200000 { ; 内部FLASH起始地址
       ER_IROM1 0x08000000 0x00200000 {
         *.o (RESET, +First)
         * (InRoot$$Sections)
         .ANY (+RO)
       }
       RW_IRAM1 0x20000000 0x00080000 { ; SRAM1起始地址(参考手册)
         .ANY (+RW +ZI)
       }
    }

  • board.c 中确认堆栈大小:Stack_Size 至少 0x1000


2. 排查启动文件



  • 使用GD32H7xx标准启动文件(如 startup_gd32h7xx.s)。

  • 确认向量表第一个条目指向 __initial_sp(栈顶地址),第二个指向 Reset_Handler


3. 时钟配置验证




  • drv_clk.c 中检查时钟初始化代码:


     void SystemClock_Config(void)
    {
         // 示例配置(需按实际晶振修改)
         rcu_osci_on(RCU_HXTAL);
         while(!rcu_osci_stab_wait(RCU_HXTAL));

         rcu_ahb2_clock_config(RCU_AHB2_CKSYS_DIV2);
         rcu_ck_sys_config(RCU_CKSYSSRC_PLL);

         // 配置PLL(关键!)
         rcu_pll_config(RCU_PLLSRC_HXTAL, 25, 600); // 25MHz晶体 -> PLL=600MHz
         rcu_osci_on(RCU_PLL);
         while(!rcu_osci_stab_wait(RCU_PLL));
    }


  • board.h 中定义主频:

    #define GD32_SYSCLK_FREQ 600000000


4. SWD引脚保护



  • drv_gpio.c 初始化前禁止复用SWD引脚:
     void rt_hw_board_init()
    {
         // 禁用JTAG/SWD复用(保留SWD功能)
         rcu_periph_clock_enable(RCU_AF);
         gpio_pin_remap_config(GPIO_SWJ_SWDPENABLE_REMAP, ENABLE);
         // ...其他初始化
    }


5. 调试技巧



  • 复位时序:连接J-Link后,手动按下板载复位键再尝试识别。

  • 最小代码启动:注释所有初始化代码,仅保留时钟和GPIO初始化,逐步添加功能。

  • J-Link命令:使用J-Link Commander执行:
     exec EnableReset = 0    // 禁用复位引脚检测
    device GD32H759VI       // 手动指定器件


6. 检查FLASH配置



  • drv_flash_fmc.c 中确认擦除/编程函数适配H7系列。

  • 增加下载后的复位延迟:Options for Target -> Utilities -> Settings -> Reset and Run 增加 Reset Delay 至200ms。




移植要点总结



































关键项 GD32H759注意事项
工具链 ARM Compiler 6 (AC6) + FPv5-D16
启动文件 使用H7xx专用版本(检查堆栈/向量表)
时钟树 严格匹配PLL配置(25MHz晶振输入→600MHz输出)
内存映射 FLASH=0x08000000, RAM=0x20000000
SWD保护 初始化前禁用JTAG复用(保留SWD)
Flash驱动 使用FMC驱动(非标准SPI接口)



验证步骤



  1. 使用AC6编译空工程(仅时钟+LED闪烁),确认下载正常。

  2. 逐步添加RT-Thread组件(先不加文件系统/网络)。

  3. 监测复位后首条指令:在 Reset_Handler 入口设断点,若未暂停则检查BOOT引脚状态(需接地)。



提示:GD32H7与STM32H7存在差异,勿直接复用ST的BSP。推荐参考GD官方HAL库示例(如 GD32H7xx_Demo_Suites)核对寄存器操作。



通过以上步骤应能解决启动问题。若仍存在异常,建议用示波器检查晶振是否起振及NRST引脚电平。

举报

更多回帖

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