吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

RK3568外部IO中斷示例

武漢萬象奧科 ? 2023-11-03 13:56 ? 次閱讀

?

  1. 外部IO中斷介紹

本篇文章以萬象奧科HD-RK3568-IOT評估板中GPIO30為例,介紹Linux內核中斷的注冊方法,使用中斷的方式檢測GPIO30是否出現上升沿信號。中斷在linux、設備驅動開發里使用的都非常多,可以更加實時的檢測GPIO30的狀態。

Linux內核提供了中斷的注冊接口:

  1. 注冊中斷

頭文件 include\linux\interrupt.h

定義文件 include\linux\interrupt.h

函數原型 int request_irq(unsigned int irq, /* 做實參傳遞給中斷服務函數第1個參數 */

Irq_handler_t handler, /* 中斷服務函數指針 */

unsigned long flags,

const char *name,

void *dev_id); /* 做實參傳遞給中斷服務函數第2個參數 */

函數功能: 向內核注冊一個中斷服務函數;

當發生中斷號為irq的中斷時,會執行handler指針函數。

函數參數:

irq: 中斷編號(每個中斷有唯一的編號)。

handler: 中斷服務函數指針。

原型 typedef irqreturn_t(*irq_handler_t)(int, void *)。

flag: 中斷的標志,用來描述本中斷的基本特征的。

有固定的值,由中斷源的特征決定;

比如外中斷有: 上升沿,下降沿觸發中斷這類標志。

name: 中斷名字,注冊后會出現cat /proc/interrupts

dev_id: 這個參數是傳遞給中斷服務函數。

對共享中斷來說,這個參數一定有要;

當注銷共享中斷中的其中一個時,用這個標識要注銷哪一個。

對于有唯一入口的中斷,可以傳遞NULL;

但是一般來說都會傳遞一個有意義指針,在中斷程序中使用,以方便編程

返回值 0 標識成功

-EINVAL (無效參數22) 表示中斷號無效。

-EBUSY (設備或者資源忙16) 表示中斷已經被占用。

2) 注銷中斷

void free_irq(unsigned int irq, void *dev_id)

irq: 要注銷的中斷號

dev_id: 其實就是注冊時需要使用的dev參數,在共享中斷必不可少,不能傳遞NULL。

注意:為防止在注銷時同時發生中斷,調用時候,先禁掉中斷。

3) 中斷開啟與關閉

禁止中斷:

void disable_irq_nosync(unsigned int irq);

void disable_irq(unsigned int irq);

參數: irq,要禁止的中斷對應的編號。

注意:在中斷服務程序中不能使用disable_irq這個函數,否則內核崩潰,可以使用disable_irq_nosync,

disable_irq: 函數調用后,函數不會馬上返回,而等待中斷程序執行完成才返回,在中斷調用會導致死鎖。

使能中斷:

void enable_irq(unsigned int irq);

參數: irq, 要使能的中斷對應的編號。

4) 獲取irq中斷號

Int gpio_to_irq(unsigned int irq);

參數: irq,要使能的中斷對應的編號

  1. 外部IO中斷驅動編寫
    1. IO原理圖
wKgZomVEizqAAaH_AAFy1JumMiQ719.png

圖 2.1 GPIO0_D6

GPIO0_D6=0*32+(4-1)-8+6=30

    1. 驅動示例代碼

#include

#include

#include

#include

#include

#define GPIO_PIN 30 // 替換為你的GPIO引腳

static unsigned int irq_number;

// GPIO中斷處理函數

static irqreturn_t gpio_irq_handler(int irq, void *dev_id) {

printk("GPIO中斷觸發!\n");

return IRQ_HANDLED;

}

static int __init mymodule_init(void) {

int ret;

// 請求GPIO

ret = gpio_request(GPIO_PIN, "my_gpio");

if (ret) {

printk("無法請求GPIO %d\n", GPIO_PIN);

return ret;

}

// 配置GPIO引腳為輸入

ret = gpio_direction_input(GPIO_PIN);

if (ret) {

printk("無法配置GPIO %d 為輸入\n", GPIO_PIN);

gpio_free(GPIO_PIN);

return ret;

}

// 請求GPIO中斷

irq_number = gpio_to_irq(GPIO_PIN);

ret = request_irq(irq_number, gpio_irq_handler, IRQF_TRIGGER_RISING, "my_gpio_irq", NULL);

/* IRQF_TRIGGER_RISING 上升沿有效 */

if (ret) {

printk("無法請求GPIO中斷 %d\n", irq_number);

gpio_free(GPIO_PIN);

return ret;

}

printk("模塊加載成功\n");

return 0;

}

static void __exit mymodule_exit(void) {

// 釋放GPIO中斷

free_irq(irq_number, NULL);

// 釋放GPIO

gpio_free(GPIO_PIN);

printk("模塊卸載成功\n");

}

module_init(mymodule_init);

module_exit(mymodule_exit);

MODULE_LICENSE("GPL");

MODULE_AUTHOR("zou");

MODULE_DESCRIPTION("Sample GPIO and Timer Interrupt Kernel Module");

  1. 外部IO中斷驗證

將驅動編譯成模塊,insmod加載模塊后。 由于驅動檢測GPIO0_D6上升沿有效,當給該引腳提供高電平時,會觸發中斷執行中斷處理函數。

wKgaomVEi0uAQ_CwAAA8UPgHinc576.png

圖3.1 觸發IO中斷

?

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • GPIO
    +關注

    關注

    16

    文章

    1213

    瀏覽量

    52210
  • 評估板
    +關注

    關注

    1

    文章

    552

    瀏覽量

    29370
  • LINUX內核
    +關注

    關注

    1

    文章

    316

    瀏覽量

    21686
  • RK3568
    +關注

    關注

    4

    文章

    520

    瀏覽量

    5128
收藏 人收藏

    評論

    相關推薦

    RK3568內置MCU開發介紹之一

    本文介紹RK3568內置的MCU的開發流程,首先介紹MCU程序的構建方法,然后介紹MCU核心與ARM CORTEX A55 AP核心之間的mailbox通信。 RK3568內置有4*cortex
    的頭像 發表于 12-01 16:09 ?567次閱讀
    <b class='flag-5'>RK3568</b>內置MCU開發介紹之一

    瑞芯微RK3568 USB驅動

    瑞芯微RK3568 USB驅動程序
    發表于 11-11 14:18 ?2次下載

    RK3568燒錄工具

    RK3568 燒錄工具
    發表于 11-11 14:16 ?5次下載

    RK3568開發板支持AMP雙系統

    RK3568開發板支持AMP雙系統
    的頭像 發表于 06-04 15:33 ?766次閱讀
    <b class='flag-5'>RK3568</b>開發板支持AMP雙系統

    基于HD-RK3568-CORE設計的HD-RK3568-OPS主板上新!

    HD-RK3568-OPS主板基于HD-RK3568-CORE 工業級核心板設計,支持標準OPS接口,具有即插即用、操作簡單的特點,適用于數字標牌、自助終端、教育一體機等應用場景。
    的頭像 發表于 04-19 18:08 ?1087次閱讀
    基于HD-<b class='flag-5'>RK3568</b>-CORE設計的HD-<b class='flag-5'>RK3568</b>-OPS主板上新!

    RK3568-GDB程序調試方法說明

    RK3568-GDB程序調試方法說明
    的頭像 發表于 01-19 16:16 ?1934次閱讀
    <b class='flag-5'>RK3568</b>-GDB程序調試方法說明

    RK3568-MQTT通信協議案例

    RK3568-MQTT通信協議案例
    的頭像 發表于 01-19 15:31 ?1865次閱讀
    <b class='flag-5'>RK3568</b>-MQTT通信協議案例

    RK3568-IgH EtherCAT主站開發案例

    RK3568-IgH EtherCAT主站開發案例
    的頭像 發表于 01-19 15:20 ?1896次閱讀
    <b class='flag-5'>RK3568</b>-IgH EtherCAT主站開發案例

    RK3568--Acontis EtherCAT主站開發案例

    RK3568--Acontis EtherCAT主站開發案例
    的頭像 發表于 01-19 14:59 ?930次閱讀
    <b class='flag-5'>RK3568</b>--Acontis EtherCAT主站開發案例

    RK3568--系統啟動階段LOGO顯示

    RK3568--系統啟動階段LOGO顯示
    的頭像 發表于 01-19 14:44 ?1191次閱讀
    <b class='flag-5'>RK3568</b>--系統啟動階段LOGO顯示

    RK3568---NPU開發案例

    RK3568---NPU開發案例
    的頭像 發表于 01-19 13:50 ?986次閱讀
    <b class='flag-5'>RK3568</b>---NPU開發案例

    RK3568-ISP圖像處理開發案例

    RK3568-ISP圖像處理開發案例
    的頭像 發表于 01-19 11:46 ?1137次閱讀
    <b class='flag-5'>RK3568</b>-ISP圖像處理開發案例

    RK3568-ARM+FPGA通信案例開發手冊 (一)

    RK3568-ARM+FPGA通信案例開發手冊 (一)
    的頭像 發表于 01-19 10:31 ?1224次閱讀
    <b class='flag-5'>RK3568</b>-ARM+FPGA通信案例開發手冊 (一)

    RK3568--基于AMP的多通道AD采集開發案

    RK3568--基于AMP的多通道AD采集開發案
    的頭像 發表于 01-19 10:03 ?1024次閱讀
    <b class='flag-5'>RK3568</b>--基于AMP的多通道AD采集開發案

    RK3568-視頻開發案例

    RK3568-視頻開發案例
    的頭像 發表于 01-18 15:51 ?903次閱讀
    <b class='flag-5'>RK3568</b>-視頻開發案例
    大发888娱乐游戏注册| 百家乐最新分析仪| 龙博百家乐官网的玩法技巧和规则 | 百家乐的最佳玩| 二爷百家乐官网的玩法技巧和规则 | 百家乐强对弱的对打法| 百家乐官网合| 波音百家乐官网现金网投注平台排名导航 | 英吉沙县| 全讯网123| 百家乐高科技出千工具| 太阳百家乐官网开户| 百家乐官网桌布| 老虎机破解方法| 网络百家乐怎样出千| 实战百家乐官网十大取胜原因百分百战胜百家乐官网不买币不吹牛只你能做到按我说的.百家乐官网基本规则 | 百家乐官网1个人| 百家乐官网如何写路| tt娱乐城网址| 威尼斯人娱乐网站| A8百家乐娱乐平台| 星期8百家乐官网娱乐城| 百家乐官网永利娱乐场| 百家乐官网桩闲落注点| 利博娱乐城| 世界顶级赌场酒店| 百家乐赌博讨论群| 百家乐视频百家乐| 新锦江百家乐官网的玩法技巧和规则 | 百家乐官网浴盆博彩通排名| 乌审旗| 吉祥娱乐城| 六合彩网站| 博彩策略| 大发888最新官方网址| 威尼斯人娱乐城赌博网站| 金矿百家乐的玩法技巧和规则| 棋牌百家乐赢钱经验技巧评测网| 菲律宾百家乐游戏| 百家乐官网网上真钱娱乐场开户注册| 澳门百家乐官网实战视频|