这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【gd32f527移植Zephyr】2GD32F527EVAL移植ZephyrR

共1条 1/1 1 跳转至

【gd32f527移植Zephyr】2GD32F527EVAL移植ZephyrRTOS详细记录

高工
2026-02-17 17:22:20   被打赏 50 分(兑奖)     打赏

一、前言

GD32F527是兆易创新(GigaDevice)推出的基于Cortex-M33内核的MCU,性能强劲,本文详细记录将Zephyr RTOS移植到GD32F527-EVAL开发板的过程。

硬件配置:

- MCU: GD32F527VCT6 (Cortex-M33, 200MHz, 512KB Flash, 192KB SRAM)

- 调试器: J-Link OB (板载)

- LED: PF7 (低电平有效)

- 晶振: 25MHz

二、开发环境

1. Zephyr SDK版本: 0.17.2

2. Python版本: 3.11

3. 操作系统: Windows 10 + MINGW32

4. 调试工具: Segger Ozone + J-Link

安装步骤:

  west init -m --mr v3.7.0 zephyrproject

  cd zephyrproject

  west update

  west zephyr-install

三、移植过程

1. 创建板级支持文件

位置: zephyr/boards/gd/gd32f527_eval/

需要创建:

- gd32f527_eval.yaml      (板卡描述文件)

- gd32f527_eval_defconfig (默认配置)

- CMakeLists.txt          (构建配置)

gd32f527_eval_defconfig关键配置:

  CONFIG_SOC_GD32F527=y

  CONFIG_BOARD_GD32F527_EVAL=y

  CONFIG_NO_OPTIMIZATIONS=y          # 调试时关闭优化

  CONFIG_ARM_MPU=n                   # 调试时关闭MPU

  CONFIG_SOC_RESET_HOOK=y            # 使能复位钩子

  CONFIG_SOC_EARLY_INIT_HOOK=y       # 使能早期初始化

2. SOC支持文件

位置: zephyr/soc/gd/gd32f5xx/

需要创建/修改:

- Kconfig.soc           (SOC配置)

- Kconfig.defconfig     (默认配置)

- CMakeLists.txt        (构建配置)

关键配置:

  select SOC_FAMILY_GIGADEVICE

  select SOC_SERIES_GD32F5XX

3. HAL层文件 (从SDK移植)

位置: modules/hal/gigadevice/gd32f5xx/

从官方SDK V1.4.0复制以下文件:

- cmsis/gd/gd32f5xx/include/gd32f5xx.h

- cmsis/gd/gd32f5xx/include/gd32f5xx_misc.h

- cmsis/gd/gd32f5xx/include/system_gd32f5xx.h

- standard_peripheral/include/gd32f5xx_rcu.h

- standard_peripheral/include/gd32f5xx_gpio.h

- standard_peripheral/Source/gd32f5xx_gpio.c (可选)

- standard_peripheral/Source/gd32f5xx_rcu.c (可选)


修改gd32f5xx.h:

- 添加Zephyr兼容性支持

- 添加设备类型定义(CONFIG_SOC_GD32F527时定义GD32F527)

- 添加时钟常量(HXTAL_VALUE, IRC16M_VALUE)

- 添加启动超时常量

4. 关键寄存器地址定义

根据SDK手册和实测,寄存器地址如下:

image.png

5. GPIO配置详解 (PF7 LED)


PF7属于GPIOF的第7个引脚,控制寄存器是CTL0(不是CTL1!)

GPIO引脚分配:

- CTL0: Pin 0-7

- CTL1: Pin 8-15

CTL0位定义(每引脚2位):

image.png

配置PF7为输出推挽:

  GPIOF_CTL0 &= ~(0x03 << 14);  // 清除位14-15

  GPIOF_CTL0 |= (0x01 << 14);   // 设置为输出模式(01)


设置输出速度(50MHz):

  GPIOF_OSPD &= ~(0x03 << 14);

  GPIOF_OSPD |= (0x02 << 14);   // 50MHz


使能GPIOF时钟:

  RCU_AHBEN |= (1 << 5);        // Bit5 = GPIOF

6. LED控制 (低电平有效)

注意: GD32F527-EVAL板上的LED是低电平有效


| 操作   | 寄存器      | 值         | 电平  |

|--------|-------------|------------|-------|

| LED亮  | GPIOF_BC    | 1 << 7    | LOW   |

| LED灭  | GPIOF_BOP   | 1 << 7    | HIGH  |


代码示例:

  GPIOF_BC = (1 << 7);    // LED亮

  GPIOF_BOP = (1 << 7);   // LED灭


7. 时钟配置


默认使用内部IRC16M时钟(~16MHz),无需外部晶振即可运行。


如果需要使用外部25MHz晶振,需要配置:

1. 使能HXTAL: RCU_CTL |= (1 << 0)

2. 等待稳定: while(!(RCU_CTL & (1 << 1)))

3. 配置PLL

4. 切换系统时钟源


8. 调试配置 (Ozone)

创建gd32f527_eval.jdebug配置文件:


  Project {

    Device = GD32F527

    Board = GD32F527-EVAL

    Core = Cortex-M33

    TargetInterface = J-Link

    File = build/zephyr/zephyr.elf

    MemoryMap = {

      FLASH (rx) : Origin = 0x08000000, Length = 0x300000

      RAM (rwx)  : Origin = 0x20000000, Length = 0x40000

    }

    Breakpoints = All

    Watchpoints = All

    JTAGSpeed = 4000

  }


在Ozone中查看寄存器:

- Memory窗口: 输入地址 0x40021400 (GPIOF_BASE)

- Watch表达式: *(uint32_t *)0x40021404 (GPIOF_CTL0)


四、完整LED闪烁代码

#include <stdio.h>
#include <stdint.h>

/* GD32F5xx register definitions */
#define RCU_BASE         (0x40023800U)
#define GPIOF_BASE       (0x40021400U)

/* RCU registers */
#define RCU_AHBEN        (*(volatile uint32_t *)(RCU_BASE + 0x30U))
#define RCU_AHBEN_GPIOF  (1U << 5)

/* GPIOF registers */
#define GPIOF_CTL0       (*(volatile uint32_t *)(GPIOF_BASE + 0x00U))
#define GPIOF_OMODE      (*(volatile uint32_t *)(GPIOF_BASE + 0x04U))
#define GPIOF_OSPD       (*(volatile uint32_t *)(GPIOF_BASE + 0x08U))
#define GPIOF_PUD        (*(volatile uint32_t *)(GPIOF_BASE + 0x0CU))
#define GPIOF_ISTAT      (*(volatile uint32_t *)(GPIOF_BASE + 0x10U))
#define GPIOF_OCTL       (*(volatile uint32_t *)(GPIOF_BASE + 0x14U))
#define GPIOF_BOP        (*(volatile uint32_t *)(GPIOF_BASE + 0x18U))
#define GPIOF_BC         (*(volatile uint32_t *)(GPIOF_BASE + 0x28U))

/* PF7 pin configuration */
#define PIN_PF7              (7U)
#define CTL0_PF7_MODE        (0x01U << (PIN_PF7 * 2))  /* Output mode (01) */
#define OMODE_PF7            (0U << PIN_PF7)            /* Push-pull (0=default) */
#define OSPEED_PF7           (0x02U << (PIN_PF7 * 2))  /* 50MHz */
#define BOP_PF7              (1U << PIN_PF7)           /* Bit set */
#define BC_PF7               (1U << PIN_PF7)           /* Bit clear */

void delay(volatile uint32_t count)
{
    for (volatile uint32_t i = 0; i < count; i++) {
        __asm__ volatile ("nop");
    }
}

int main(void)
{
    printf("Hello World! %s\n", CONFIG_BOARD_TARGET);

    /* Enable GPIOF clock */
    RCU_AHBEN |= RCU_AHBEN_GPIOF;

    /* Configure PF7 as output push-pull */
    GPIOF_CTL0 &= ~(0x03U << (PIN_PF7 * 2));
    GPIOF_CTL0 |= CTL0_PF7_MODE;
    GPIOF_OMODE |= OMODE_PF7;

    /* Toggle LED on PF7 (active low) */
    while (1) {
        GPIOF_BC = BC_PF7;    /* LED on */
        delay(500000);
        GPIOF_BOP = BOP_PF7;  /* LED off */
        delay(500000);
    }

    return 0;
}

五、问题解决记录

问题1: 编译错误 - 缺少HXTAL_STARTUP_TIMEOUT

解决: 在gd32f5xx.h中添加定义

  #define HXTAL_STARTUP_TIMEOUT ((uint16_t)0x1400)

问题2: 编译错误 - 缺少ErrStatus等类型定义

解决: 在gd32f5xx.h中添加枚举定义

  typedef enum {DISABLE=0, ENABLE=!DISABLE} EventStatus, ControlStatus;

  typedef enum {RESET=0, SET=!RESET} FlagStatus;

  typedef enum {ERROR=0, SUCCESS=!ERROR} ErrStatus;

问题3: LED不亮 - GPIOF地址错误

解决: RCU_AHBEN偏移是0x30,不是0x18或0x20

问题4: LED不亮 - 寄存器配置到错误的CTL

解决: PF7属于CTL0(0x40021400),不是CTL1(0x40021404)

问题5: LED不亮 - OMODE地址错误

解决: GPIO_OMODE偏移是0x04,不是0x08

问题6: LED不亮 - 输出电平逻辑反了

解决: LED是低电平有效,需要用GPIOF_BC亮灯,GPIOF_BOP灭灯

六、后续工作

1. 添加完整的GPIO驱动支持

2. 添加UART驱动(USART0)

3. 添加DMA驱动

4. 添加SysTick系统时钟

5. 完善设备树支持

6. 使能更多外设

七、参考资源

1. GD32F5xx官方数据手册

2. GD32F5xx官方SDK V1.4.0

3. Zephyr官方文档: https://docs.zephyrproject.org/

4. Segger Ozone用户手册

5. CMSIS官方文档






关键词: GD32F527     Zephyr     移植    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]