<<RT_Thread gd450 学习 >> 二. drv_gpio

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);
     }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值