一、前言
本文记录将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/
我要赚赏金
