【龙芯1c库】封装gpio接口和使用示例

龙芯1c库是把龙芯1c的常用外设的常用功能封装为一个库,类似于STM32库。git地址:https://gitee.com/caogos/OpenLoongsonLib1c

本文首先以一个例子介绍“龙芯1c库”中gpio接口是怎样使用的,然后再详细讲解是怎样封装这些接口的。

龙芯1c库中gpio接口使用示例

gpio接口简介

龙芯1c库提供3个接口,分别是gpio_init(),gpio_set()和gpio_get()。

使用步骤为,先使用gpio_init()初始化对应的gpio,然后使用gpio_set()在gpio上输出高低电平,或者使用gpio_get()读取gpio上的电平值。

测试思路

使用led测试gpio输出,选择了GPIO6,GPIO32,GPIO74三个引脚来测试。

用按键测试gpio输入,采用不断读取gpio的方式,一旦发现按键按下,则指示灯点亮,否则指示灯熄灭。按键所在引脚为GPIO85(智龙v2.0和v2.1上的按键S3),指示灯为GPIO32。

在智龙首发版、v2.0和v2.1上gpio32都接有led,并且都可控。

代码清单

app\main.c

#include "../lib/gpio.h"
#include "../lib/clock.h"
#include "led.h"


/*
 * 测试库中gpio作为输出时的相关接口
 * led闪烁10次
 */
void gpio_test_output(void)
{
    int i;
    unsigned int gpio = 32;     // 智龙首发版、v2.0和v2.1都有这个led
//    unsigned int gpio = 6;
//    unsigned int gpio = 74;

    // 初始化
    gpio_init(gpio, gpio_mode_output);

    // 输出10个矩形波,如果gpio50上有led,则可以看见led闪烁10次
    for (i=0; i<10; i++)
    {
        gpio_set(gpio, gpio_level_low);
        delay();
        gpio_set(gpio, gpio_level_high);
        delay();
    }
    return ;
}



/*
 * 测试库中gpio作为输入时的相关接口
 * 按键按下时,指示灯点亮,否则,熄灭
 */
void gpio_test_input(void)
{
    unsigned int key_gpio = 85;     // GPIO85/I2C_SDA0,智龙v2.1上的按键S3
    unsigned int led_gpio = 32;     // 用于当按键被按下时,此led点亮,否则熄灭

    // 初始化
    gpio_init(key_gpio, gpio_mode_input);
    led_init(led_gpio);

    while (1)
    {
        if (gpio_level_low != gpio_get(key_gpio))
            continue;       // 按键没有按下

        // 延时(软件消抖)后再次确认按键是否按下
        delay();
        if (gpio_level_low != gpio_get(key_gpio))
            continue;       // 按键没有按下

        // 点亮指示灯
        led_on(led_gpio);

        // 等待释放按键
        while (gpio_level_high != gpio_get(key_gpio))
            ;
        delay();

        // 熄灭指示灯
        led_off(led_gpio);
    }
}


int main(void)
{
    /*
     * 测试库中gpio作为输出时的相关接口
     * led闪烁10次
     */
    gpio_test_output();
        
    /*
     * 测试库中gpio作为输入时的相关接口
     * 按键按下时,指示灯点亮,否则,熄灭
     */
    gpio_test_input();

	return(0);
}

更完整的代码清单,请查看http://git.oschina.net/caogos/OpenLoongsonLib1c的提交记录
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
龙芯系统的GPIO是通过内存映射IO方式实现的,需要使用相应的操作系统接口进行访问。以下是使用Linux系统中C语言访问GPIO示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <sys/mman.h> #define GPIO_BASE 0x1F02B000 // GPIO控制器的物理地址 #define GPIO_SIZE 0x1000 // GPIO控制器的大小 #define GPIO_PIN_INPUT 0 // GPIO输入模式 #define GPIO_PIN_OUTPUT 1 // GPIO输出模式 // 映射到用户空间的内存指针 volatile unsigned int* gpio; // 初始化GPIO int init_gpio() { int mem_fd; void* gpio_map; // 以只读方式打开/dev/mem if ((mem_fd = open("/dev/mem", O_RDWR|O_SYNC)) < 0) { perror("open /dev/mem failed"); return -1; } // 映射GPIO控制器的内存区域到用户空间 gpio_map = mmap(NULL, GPIO_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, mem_fd, GPIO_BASE); close(mem_fd); if (gpio_map == MAP_FAILED) { perror("mmap failed"); return -1; } // 将映射到用户空间的指针转换为虚拟地址 gpio = (volatile unsigned int*)gpio_map; return 0; } // 设置GPIO的工作模式 void set_gpio_mode(int pin, int mode) { int bank = pin / 32; int offset = pin % 32; // 将GPIO对应的寄存器偏移量计算出来 unsigned int reg_offset = bank * 8 + offset / 16 * 4; unsigned int reg_mask = ~(0x7 << ((offset % 16) * 3)); unsigned int reg_value = mode << ((offset % 16) * 3); // 设置GPIO对应的工作模式 gpio[reg_offset / 4] = (gpio[reg_offset / 4] & reg_mask) | reg_value; } // 设置GPIO输出状态 void set_gpio_output(int pin, int value) { int bank = pin / 32; int offset = pin % 32; // 将GPIO对应的寄存器偏移量计算出来 unsigned int reg_offset = bank * 8 + 0x10; unsigned int reg_mask = ~(1 << offset); unsigned int reg_value = value << offset; // 设置GPIO的输出状态 gpio[reg_offset / 4] = (gpio[reg_offset / 4] & reg_mask) | reg_value; } // 获取GPIO输入状态 int get_gpio_input(int pin) { int bank = pin / 32; int offset = pin % 32; // 将GPIO对应的寄存器偏移量计算出来 unsigned int reg_offset = bank * 8 + 0x14; // 返回GPIO的输入状态 return (gpio[reg_offset / 4] >> offset) & 0x1; } int main() { int gpio_pin = 0; // 初始化GPIO if (init_gpio() < 0) { printf("init gpio failed\n"); return -1; } // 设置GPIO为输出模式 set_gpio_mode(gpio_pin, GPIO_PIN_OUTPUT); // 循环设置GPIO输出状态 while (1) { set_gpio_output(gpio_pin, 1); usleep(500000); set_gpio_output(gpio_pin, 0); usleep(500000); } return 0; } ``` 在以上代码中,使用mmap函数将GPIO控制器的物理地址映射到用户空间,然后通过读写对应的寄存器来控制GPIO的输入输出状态。需要注意的是,GPIO使用需要root权限。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值