at91sam926X的GPIO中断

布满荆棘的人生 2022-12-26 13:26 216阅读 0赞

先上一个代码实例:

  1. static int gpio_irq_init(void)
  2. {
  3. int ret;
  4. ret = gpio_request (AT91_PIN_PC6, "IRQ"); /* GPIO request*/
  5. if (ret) {
  6. printk ("Unable to request PC6\n");
  7. }
  8. at91_set_GPIO_periph (AT91_PIN_PC6, 1); // Pull Up
  9. at91_set_gpio_input (AT91_PIN_PC6, 1); // input with Pull Up
  10. at91_set_deglitch (AT91_PIN_PC6, 1); // deglitch
  11. ret = request_irq (AT91_PIN_PC6,my_irq_handler_func,IRQF_TRIGGER_RISING|IRQF_TRIGGER_FALLING , "MyIRQ", NULL);
  12. if (ret)
  13. {
  14. printk ("IRQ %d is not free\n", AT91_PIN_PC6);
  15. return ret;
  16. }
  17. return 0;
  18. }

上面的例子,将PC6设置成GPIO,输入,上拉电阻使能,申请了上升沿或者下降沿触发中断。上面的例子在AT91sam9260上测试通过,上升沿和下降沿都可以触发中断。

简单介绍一下其中的内容,一般gpio_request封装了mem_request(),起保护作用,最后要调用mem_free之类的。主要是告诉内核这地址被占用了。当其它地方调用同一

地址的gpio_request就会报告错误,该地址已被申请。在/proc/mem应该会有地址占用表描述。

这种用法的保护作用前提是大家都遵守先申请再访问,有一个地方没遵守这个规则,这功能就失效了。好比进程互斥,必需大家在访问临界资源的时候都得先获取锁一样,其中

一个没遵守约定,代码就废了。

另外关于at91sam926x的GPIO的中断触发类型,在linux 2.6内核的arch/arm/mach-at91中的gpio.c文件中,有一个函数如下:

  1. static int gpio_irq_type(unsigned pin, unsigned type)
  2. {
  3. switch (type) {
  4. case IRQ_TYPE_NONE:
  5. case IRQ_TYPE_EDGE_BOTH:
  6. return 0;
  7. default:
  8. return -EINVAL;
  9. }
  10. }

该函数说明,at91的GPIO的 中断触发类型是边沿触发(上升沿和下降沿),在设置中断触发类型时不能只设置上升沿或者只设置下降沿,上升沿和下降沿必须同时设置;高低

电平触发也不支持。

另外需要注意GPIO口的上拉电阻,不同的板子可能情况不一样,更加自己的情况决定上拉电阻是否使能。

转载请注明:http://blog.csdn.net/shanzhizi/article/category/1277259

发表评论

表情:
评论列表 (有 0 条评论,216人围观)

还没有评论,来说两句吧...

相关阅读