龙芯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查看。