2.1 介绍
RT_Thread Studio 的板级支持包里并没有gpio驱动,在gitee中GD450的bsp里是有的,只需去copy过来即可。gitee: rt_thread GD450https://gitee.com/rtthread/rt-thread/tree/gitee_master/bsp/gd32/arm/libraries/gd32_drivers
2.2 修改SConscript
想要添加文件在drivers文件内并参加构建需要修改SConscript,添加文件到构建。如果不修改的话,每次保存RT-THREAD Settings时,添加的文件会被排除构建。
修改的方法有两种:
1. group上添加下面一段, 就把drv_gpio.c加入构建了。
# add gpio drivers
if GetDepend('RT_USING_PIN'):
src += ['drv_gpio.c']
group = DefineGroup('Drivers', src, depend = [''], CPPPATH = CPPPATH)
2. 删除类似1 的定义,添加 src = Glob('*.c'),即可把drivers内所有.c文件加入构建。
CPPPATH = [cwd]
src = Glob('*.c')
group = DefineGroup('Drivers', src, depend = [''], CPPPATH = CPPPATH)
2.3 添加文件
复制 drv_gpio.c 和 drv_gpio.h 文件到文件目录内,刷新下就可以看到了。
drv_gpio.c 中通过 gd32_pin_ops 实现RT_Thread 对GD450pin设备的管理。
const static struct rt_pin_ops gd32_pin_ops =
{
.pin_mode = gd32_pin_mode,
.pin_write = gd32_pin_write,
.pin_read = gd32_pin_read,
.pin_attach_irq = gd32_pin_attach_irq, //设置 pin 中断模式及回调
.pin_detach_irq= gd32_pin_detach_irq, //清除 pin 中断模式及回调
.pin_irq_enable = gd32_pin_irq_enable, //调用gd库函数配置引脚中断
RT_NULL,
};
文件添加后进行编译, 0 errors, 0 warnings.
2.4 使用 drv_gpio 完成 点灯 验证代码
引脚可查看手册或者参考demo例程 gd32f450z_lcd_eval 里的代码.
项目资源管理器中看不到被排除构建的文件,过滤器中取消 RTT Excluded Resource勾选即可。
附 代码:
/* drv_led.h */
#ifndef DRIVERS_BSP_H_BSP_LED_H_
#define DRIVERS_BSP_H_BSP_LED_H_
#include <rtdevice.h>
#include <rthw.h>
#include <rtconfig.h>
#include "drv_gpio.h"
#define LED1_PIN GET_PIN(D, 4)
#define LED2_PIN GET_PIN(D, 5)
#define LED3_PIN GET_PIN(G, 3)
typedef enum
{
led1 = 1,
led2,
led3
} led_e;
int bsp_led_ctl(int led,rt_base_t value);
void rt_led_demo_thread_entry(void *par);
#endif /* DRIVERS_BSP_H_BSP_LED_H_ */
/* drv_led.c */
#include <rtthread.h>
#include <board.h>
#include "gd32f4xx.h"
#include "drv_led.h"
int rt_led_init(void)
{
rt_pin_mode(LED1_PIN,PIN_MODE_OUTPUT );
rt_pin_mode(LED2_PIN,PIN_MODE_OUTPUT );
rt_pin_mode(LED3_PIN,PIN_MODE_OUTPUT );
rt_pin_write(LED1_PIN, PIN_LOW);
rt_pin_write(LED2_PIN, PIN_LOW);
rt_pin_write(LED3_PIN, PIN_LOW);
return RT_EOK;
}
INIT_BOARD_EXPORT(rt_led_init);
int bsp_led_ctl(int led,rt_base_t value)
{
switch(led)
{
case led1:
rt_pin_write(LED1_PIN,value);
break;
case led2:
rt_pin_write(LED2_PIN,value);
break;
case led3:
rt_pin_write(LED3_PIN,value);
break;
}
}
void rt_led_demo_thread_entry(void *par)
{
uint8_t state = 0;
while (1)
{
bsp_led_ctl(led1,state);
bsp_led_ctl(led2,!state);
state = !state;
rt_thread_mdelay(500);
}
}