用龙芯1c库在裸机编程中实现外部中断(GPIO中断、按键中断)

龙芯1c库是为龙芯1c单片机封装的常用外设接口集合,类似于STM32库。不仅可以用于裸机编程,还可以和实时系统(比如RT-Thread等)配合使用。这里就是讨论如何龙芯1c库实现外部中断(GPIO中断、按键中断)。龙芯1c库的完整的代码在https://gitee.com/caogos/OpenLoongsonLib1c

测试用的硬件

实物图


电路图


测试用的按键为S3,所在引脚位GPIO85/I2C_SDA0

测试的主要思路和主要代码

用一个变量对按下次数进行计数,按键被按下时,串口将计数值打印出来。整个思路很简单,代码也很简单,主要代码如下

// 按键中断的标志
volatile int gpio_key_irq_flag = 0;

/*
 * 按键中断的处理函数
 * @IRQn 中断号
 * @param 传递给中断处理函数的参数
 */
void test_gpio_key_irqhandler(int IRQn, void *param)
{
    gpio_key_irq_flag = 1;
}

/*
 * 测试库中外部中断(gpio中断,按键中断)的相关接口
 * 按键被按下后,会产生一个中断
 */
void test_gpio_key_irq(void)
{
    unsigned int key_gpio = 85;     // GPIO85/I2C_SDA0
    int key_irq = LS1C_GPIO_TO_IRQ(key_gpio);
    static int count = 0;

    // 初始化按键中断
    gpio_init(key_gpio, gpio_mode_input);
    gpio_set_irq_type(key_gpio, IRQ_TYPE_LEVEL_LOW);
//    gpio_set_irq_type(key_gpio, IRQ_TYPE_EDGE_FALLING);     // 当设为下降沿触发时,按下和弹起都会产生一次中断,理论上不应该这样,暂不知原因,改为低电平触发一切正常
    irq_install(key_irq, test_gpio_key_irqhandler, NULL);
    irq_enable(key_irq);

    while (1)
    {
        if (1 == gpio_key_irq_flag)
        {
            delay_ms(10);               // 延时10ms,消抖
            gpio_key_irq_flag = 0;      // 清标志
            count++;                    // 计数器加一
            myprintf("[%s] count=%d, key press\r\n", __FUNCTION__, count);
        }
    }
}
代码不难,简单描述一下就是,先调用gpio_init()将相应gpio设为输入模式,然后调用gpio_set_irq_type()设置中断为低电平触发,再调用irq_install()设置中断处理函数为test_gpio_key_irqhandler(),最后调用irq_enable()使能中断。注意中断号不是gpio编号,需要一个用宏LS1C_GPIO_TO_IRQ()转换一下。

更多更完整的代码,请移步到git查看。

测试结果

串口打印




猜你喜欢

转载自blog.csdn.net/caogos/article/details/78166271