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

共1条 1/1 1 跳转至

【gd32f527移植Zephyr】3移植GPIO成功

高工
2026-02-17 18:01:33     打赏

一、前言

本文记录将Zephyr RTOS的GPIO驱动移植到GD32F527的过程。GD32F5xx系列

已有多款芯片在Zephyr中支持,但GD32F527需要添加一些特定配置才能

完整使用GPIO功能。

二、移植步骤

1. 修改HAL头文件包含

文件: modules/hal_gigadevice/common_include/gd32_gpio.h

修改: 添加GD32F5XX系列的头文件包含

修改前:

#elif defined(CONFIG_SOC_SERIES_GD32F4XX)
#include <gd32f4xx_gpio.h>
#elif defined(CONFIG_SOC_SERIES_GD32L23X)
#include <gd32l23x_gpio.h>

修改后:

#elif defined(CONFIG_SOC_SERIES_GD32F4XX)
#include <gd32f4xx_gpio.h>
#elif defined(CONFIG_SOC_SERIES_GD32F5XX)
#include <gd32f5xx_gpio.h>
#elif defined(CONFIG_SOC_SERIES_GD32L23X)
#include <gd32l23x_gpio.h>

2. 修改EXTI头文件包含

文件: modules/hal_gigadevice/common_include/gd32_exti.h

修改: 添加GD32F5XX系列的EXTI头文件包含

修改前:

#elif defined(CONFIG_SOC_SERIES_GD32F4XX)
#include <gd32f4xx_exti.h>
#elif defined(CONFIG_SOC_SERIES_GD32L23X)
#include <gd32l23x_exti.h>

修改后:

#elif defined(CONFIG_SOC_SERIES_GD32F4XX)
#include <gd32f4xx_exti.h>
#elif defined(CONFIG_SOC_SERIES_GD32F5XX)
#include <gd32f5xx_exti.h>
#elif defined(CONFIG_SOC_SERIES_GD32L23X)
#include <gd32l23x_exti.h>

3. 添加GPIO_CTL0和GPIO_CTL1兼容宏

文件: modules/hal/gigadevice/gd32f5xx/standard_peripheral/include/gd32f5xx_gpio.h

修改: 在文件末尾添加Zephyr GPIO驱动需要的兼容宏

添加内容:

/* Zephyr GPIO driver compatibility macros */
#define GPIO_CTL0(gpiox)           GPIO_CTL(gpiox)             /*!< GPIO CTL0 register (pins 0-7) */
#define GPIO_CTL1(gpiox)           GPIO_CTL(gpiox)             /*!< GPIO CTL1 register (pins 8-15) */

4. 添加SYSCFG头文件包含

文件: modules/hal/gigadevice/gd32f5xx/standard_peripheral/include/gd32f5xx_gpio.h

修改: 添加SYSCFG头文件包含(用于EXTI配置)


修改前:

#include "gd32f5xx.h"
#include "gd32f5xx_rcu.h"

修改后:

#include "gd32f5xx.h"
#include "gd32f5xx_rcu.h"
#include "gd32f5xx_syscfg.h"

5. 配置SOC默认选项

文件: zephyr/soc/gd/gd32/gd32f5xx/Kconfig.defconfig.gd32f527

修改: 添加GD32F5XX系列特有的配置选项

添加内容:

# GD32F5xx uses SYSCFG for pinmux (not AFIO)
config GD32_HAS_AF_PINMUX
    default y

config GD32_HAS_AFIO_PINMUX
    default n

6. 配置EXTI设备树

文件: zephyr/dts/arm/gd/gd32f5xx/gd32f5xx.dtsi

修改: 添加EXTI中断定义

修改前:

exti: interrupt-controller@40013c00 {
    compatible = "gd,gd32-exti";
    interrupt-controller;
    #interrupt-cells = <1>;
    reg = <0x40013c00 0x400>;
    num-lines = <23>;
    status = "disabled";
};


修改后:

exti: interrupt-controller@40013c00 {
    compatible = "gd,gd32-exti";
    interrupt-controller;
    #interrupt-cells = <1>;
    reg = <0x40013c00 0x400>;
    num-lines = <23>;
    interrupt-names = "line0", "line1", "line2", "line3", "line4",
                 "line5_9", "line5_9", "line5_9", "line5_9", "line5_9",
                 "line10_15", "line10_15", "line10_15", "line10_15", "line10_15", "line10_15";
    interrupts = <6 0>, <7 0>, <8 0>, <9 0>, <10 0>,
                 <23 0>, <23 0>, <23 0>, <23 0>, <23 0>,
                 <40 0>, <40 0>, <40 0>, <40 0>, <40 0>, <40 0>;
    status = "disabled";
};

7. 启用板级GPIO和EXTI

文件: zephyr/boards/gd/gd32f527_eval/gd32f527_eval.dts

修改: 启用GPIOF和EXTI


添加/修改内容:

&gpiof {
    status = "okay";
};

&exti {
    status = "okay";
};

8. 添加LED设备定义

文件: zephyr/boards/gd/gd32f527_eval/gd32f527_eval.dts

修改: 在根节点添加LED设备

添加内容:

/ {
    ...

    /* LED device definition */
    aliases {
        led0 = &led_0;
    };

    leds {
        compatible = "gpio-leds";
        led_0: led_0 {
            gpios = <&gpiof 7 GPIO_ACTIVE_LOW>;
            label = "LED";
        };
    };
};

9. 配置编译选项

文件: zephyr/boards/gd/gd32f527_eval/gd32f527_eval_defconfig

修改: 启用GPIO和EXTI驱动


修改前:

# Disable GPIO driver (GD32F5xx not yet supported in Zephyr driver)
CONFIG_GPIO=n

# Disable EXTI driver
CONFIG_GD32_EXTI=n

修改后:

# Enable GPIO driver for GD32F5xx
CONFIG_GPIO=y

# Enable LED driver
CONFIG_LED=n
CONFIG_LED_GPIO=n

# Enable EXTI driver (required by GPIO driver)
CONFIG_GD32_EXTI=y

三、完整修改文件列表

| 文件路径                                                     | 修改内容                         |

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

| modules/hal_gigadevice/common_include/gd32_gpio.h          | 添加GD32F5XX头文件包含           |

| modules/hal_gigadevice/common_include/gd32_exti.h           | 添加GD32F5XX头文件包含           |

| modules/hal/gigadevice/gd32f5xx/standard_peripheral/include/gd32f5xx_gpio.h | 添加CTL0/CTL1宏和syscfg头文件   |

| zephyr/soc/gd/gd32/gd32f5xx/Kconfig.defconfig.gd32f527    | 添加AF_PINMUX配置选项             |

| zephyr/dts/arm/gd/gd32f5xx/gd32f5xx.dtsi                   | 添加EXTI中断定义                  |

| zephyr/boards/gd/gd32f527_eval/gd32f527_eval.dts           | 启用GPIOF/EXTI,添加LED设备      |

| zephyr/boards/gd/gd32f527_eval/gd32f527_eval_defconfig      | 启用GPIO和EXTI驱动               |


四、LED测试代码

设备树定义(dts):

leds {
    compatible = "gpio-leds";
    led_0: led_0 {
        gpios = <&gpiof 7 GPIO_ACTIVE_LOW>;
        label = "LED";
    };
};


C代码(main.c):

#include <zephyr/drivers/gpio.h>

#define LED0_NODE DT_ALIAS(led0)
static const struct gpio_dt_spec led_spec = GPIO_DT_SPEC_GET(LED0_NODE, gpios);

int main(void)
{
    /* 检查LED设备就绪 */
    if (!gpio_is_ready_dt(&led_spec)) {
        return 0;
    }

    /* 配置LED引脚 */
    gpio_pin_configure_dt(&led_spec, GPIO_OUTPUT_ACTIVE);

    /* 闪烁LED */
    while (1) {
        gpio_pin_set_dt(&led_spec, 0);  // LED亮
        k_msleep(500);
        gpio_pin_set_dt(&led_spec, 1);  // LED灭
        k_msleep(500);
    }
}


五、可能遇到的问题

问题1: 编译错误 - 'AFIO_EXTISS0' undeclared

解决: 确保在defconfig中启用了CONFIG_GD32_HAS_AF_PINMUX=y


问题2: 链接错误 - undefined reference to 'gd32_exti_disable'

解决: 确保启用了CONFIG_GD32_EXTI=y

问题3: 设备树错误 - interrupts property missing

解决: 在gd32f5xx.dtsi中为EXTI节点添加正确的中断定义


六、参考资源

1. Zephyr GPIO驱动: zephyr/drivers/gpio/gpio_gd32.c

2. GD32F5xx SDK: modules/hal/gigadevice/gd32f5xx/

3. Zephyr设备树绑定: zephyr/dts/bindings/gpio/gd,gd32-gpio.yaml

4. 其他GD32系列参考: zephyr/soc/gd/gd32/gd32f4xx/






关键词: gd32f527     移植     gpio    

共1条 1/1 1 跳转至

回复

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