日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]1實(shí)驗(yàn)?zāi)康模?)了解按鍵原理及其與S3C2410的接口電路設(shè)計(jì)(2)了解S3C2410芯片的外部中斷處理機(jī)制(3)掌握按鍵中斷驅(qū)動(dòng)的編寫(xiě)及測(cè)試過(guò)程2實(shí)驗(yàn)原理(1)按鍵的硬件原理在嵌入式系統(tǒng)中,按鍵的硬件原理比較簡(jiǎn)單,通過(guò)

1實(shí)驗(yàn)?zāi)康?p>

(1)了解按鍵原理及其與S3C2410的接口電路設(shè)計(jì)

(2)了解S3C2410芯片的外部中斷處理機(jī)制

(3)掌握按鍵中斷驅(qū)動(dòng)的編寫(xiě)及測(cè)試過(guò)程


2實(shí)驗(yàn)原理

(1)按鍵的硬件原理

在嵌入式系統(tǒng)中,按鍵的硬件原理比較簡(jiǎn)單,通過(guò)一個(gè)上拉電阻將處理器的外部中斷(或GPIO)引腳拉高,電阻的另一端連接按鍵并接地即可實(shí)現(xiàn)。如圖2-1所示:

2-1按鍵接口電路

仔細(xì)看圖2-1,不難知道,當(dāng)按鍵被按下時(shí),EINT0上將產(chǎn)生低電平,這個(gè)低電平將中斷CPU,CPU可以依據(jù)中斷判斷按鍵被按下。

(2)按鍵“消抖”

所有按鍵、觸摸屏等機(jī)械設(shè)備都存在一個(gè)固有的問(wèn)題,那就是"抖動(dòng)",按鍵從最初接通到穩(wěn)定接通要經(jīng)過(guò)數(shù)毫秒乃至數(shù)十毫秒,其間可能發(fā)生多次"接通―斷開(kāi)"的過(guò)程。因此僅僅依據(jù)中斷被產(chǎn)生就認(rèn)定有一次按鍵行為是很不準(zhǔn)確的。如果不消除"抖動(dòng)"的影響,一次按鍵可能被理解為多次按鍵。

消除按鍵抖動(dòng)影響的方法是:在判斷有鍵按下后,進(jìn)行軟件延時(shí)(如20ms,在延時(shí)過(guò)程中要屏蔽對(duì)應(yīng)中斷),再判斷鍵盤(pán)狀態(tài),如果仍處于按鍵按下?tīng)顟B(tài),則可以判定該按鍵被按下。圖2-2是典型的包含消抖功能的按鍵中斷處理流程。


圖2-2按鍵中斷處理流程

3實(shí)驗(yàn)任務(wù)

(1)編寫(xiě)按鍵中斷設(shè)備驅(qū)動(dòng)程序,驅(qū)動(dòng)程序中手動(dòng)定義設(shè)備名稱(chēng)及主設(shè)備號(hào)為213,實(shí)現(xiàn)與BUTTON設(shè)備相應(yīng)的端口配置,中斷的申請(qǐng),以及讀寫(xiě)設(shè)備的接口函數(shù)等。

(2)將驅(qū)動(dòng)編譯成模塊,并實(shí)現(xiàn)模塊的加載及卸載。

(3)編寫(xiě)驅(qū)動(dòng)的測(cè)試程序,在程序中實(shí)現(xiàn)打開(kāi)BUTTON設(shè)備和LED設(shè)備,主循環(huán)中不斷讀取按鍵的狀態(tài),當(dāng)按鍵按下時(shí),控制LED亮一段時(shí)間(1S左右)后滅掉。

4.實(shí)驗(yàn)步驟

以下操作都在nfs文件系統(tǒng)目錄(/home/kernel/rootfs/rootfs)下進(jìn)行,因此先執(zhí)行如下命令。獲取

cd /home/kernel/rootfs/rootfs

(1)編寫(xiě)led.c文件

建立led目錄:

mkdir usr/button

進(jìn)入button目錄,在該目錄下建立兩個(gè)子目錄driver和test,前者用來(lái)存放驅(qū)動(dòng)程序,后者用來(lái)存放驅(qū)動(dòng)測(cè)試程序:

cd usr/ button

mkdir driver test

進(jìn)入驅(qū)動(dòng)程序目錄,建立設(shè)備驅(qū)動(dòng)文件button.c:

cd driver

vi button.c

按鍵驅(qū)動(dòng)程序如下button.c所示:

/***************************頭文件***************************/

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

//***********************定義設(shè)備結(jié)構(gòu)體及相關(guān)宏***************************

#define DEVICE_NAME"button"http://定義設(shè)備名

#define DEVICE_MAJOR213//手動(dòng)定義BUTTON設(shè)備的主設(shè)備號(hào)為213

static int button_major = DEVICE_MAJOR ;

#define BUTTON_IRQ IRQ_EINT0//定義BUTTON對(duì)應(yīng)S3C2410的外部中斷0

#define BUTTON S3C2410_GPF0//定義BUTTON對(duì)應(yīng)S3C2410的GPF0端口

#defineBUTTON_EINT0 S3C2410_GPF0_EINT0

#defineBUTTON_INP S3C2410_GPF0_INP

#define BUTTON_UP0//按鍵抬起狀態(tài)

#define BUTTON_DOWN1//按鍵按下?tīng)顟B(tài)

#define BUTTON_X2//不確定狀態(tài),本實(shí)例中可理解為抖動(dòng)狀態(tài)

//定義BUTTON設(shè)備結(jié)構(gòu)體

struct button_dev

{

struct cdev cdev;//BUTTON設(shè)備對(duì)應(yīng)一個(gè)字符設(shè)備結(jié)構(gòu)體

int status;//按鍵狀態(tài)標(biāo)識(shí):抬起、按下、抖動(dòng)

};

static struct button_dev dev;

//*****************************函數(shù)聲明*********************************

void s3c2410_button_s3c2410_button_InitIO(void);//初始化IO端口的函數(shù)

/*

******************************s3c2410_button_InitIO**********************

*描述:初始化IO端口

*參數(shù):無(wú)

*返回值:無(wú)

*************************************************************************

*/

void s3c2410_button_InitIO(void)

{

s3c2410_gpio_cfgpin(BUTTON,BUTTON_EINT0); //配置按鍵中斷的端口為中斷功能

}

/*

******************************isr_button()*******************************

*描述:EINT0的中斷處理函數(shù),設(shè)置按鍵狀態(tài)為BUTTON_X

*參數(shù):irq :中斷號(hào); dev_id;regs;

*返回值:成功返回0

*在linux/interrupt.h中定義了typedef irqreturn_t (*irq_handler_t)(int, void *);

*************************************************************************

*/

static irqreturn_t isr_button(int irq,void *dev_id,struct pt_regs *regs)

{

disable_irq(0);//禁止中斷

dev.status = BUTTON_X;//將按鍵置為抖動(dòng)狀態(tài),說(shuō)明有按鍵中斷,但不一定有鍵按下

enable_irq(0);//使能中斷

return 0;

}

/*

**************************s3c2410_button_open()**************************

*描述:打開(kāi)設(shè)備函數(shù),向系統(tǒng)申請(qǐng)中斷

*參數(shù):struct inode *inode,struct file *filp

*返回值:失敗返回錯(cuò)誤代碼ret,成功返回0

*************************************************************************

*/

static int s3c2410_button_open(struct inode *inode,struct file *filp)

{

int ret;

ret=request_irq(BUTTON_IRQ,isr_button,IRQF_SAMPLE_RANDOM,DEVICE_NAME,NULL); //申請(qǐng)中斷

if(ret) {//申請(qǐng)失敗

printk("BUTTON_IRQ: could not register interruptn");

return ret;

}

return 0;

}

/*

************************s3c2410_button_release()*************************

*描述:注銷(xiāo)設(shè)備函數(shù),實(shí)現(xiàn)中斷釋放

*參數(shù):struct inode *inode,struct file *filp

*返回值:0

*************************************************************************

*/

static int s3c2410_button_release(struct inode *inode,struct file *filp)

{

free_irq(BUTTON_IRQ,NULL); //釋放中斷

return 0;

}

/*

**************************3c2410_button_ioctl()**************************

*描述:IO控制函數(shù),本實(shí)例中不做任何事

*參數(shù):cmd:用戶(hù)定義的IO控制命令; arg:傳遞用戶(hù)參數(shù)

*返回值:0

*************************************************************************

*/

static int s3c2410_button_ioctl(struct inode *inode,struct file *filp,

unsigned int cmd,unsigned long arg)

{

return 0;

}

/*

**************************s3c2410_button_read()**************************

*描述:讀函數(shù),讀取按鍵的狀態(tài)

*參數(shù):buffer:用來(lái)存儲(chǔ)按鍵狀態(tài);

count:用來(lái)記錄用戶(hù)讀取了多少個(gè)字符

*返回值:count:用戶(hù)讀取的字符數(shù)

*************************************************************************

*/

static ssize_t s3c2410_button_read(struct file *filp,char *buffer,size_t count,loff_t *ppos)

{

int ret = count;

if(dev.status = BUTTON_X){//如果按鍵狀態(tài)是BUTTON_X,說(shuō)明有按鍵中斷產(chǎn)生。

msleep(20);//延時(shí)20毫秒去除按鍵抖動(dòng)

disable_irq(0);//禁止中斷

s3c2410_gpio_cfgpin(BUTTON,BUTTON_INP); //配置按鍵中斷的端口為輸入功能

if(!s3c2410_gpio_getpin(BUT

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀(guān)點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

ARM系統(tǒng)幾乎都采用Linux的操作系統(tǒng),而且?guī)缀跛械挠布到y(tǒng)都要單獨(dú)構(gòu)建自己的系統(tǒng),與其他系統(tǒng)不能兼容,這也導(dǎo)致其應(yīng)用軟件不能方便移植,這一點(diǎn)一直嚴(yán)重制約了ARM系統(tǒng)的發(fā)展和應(yīng)用。GOOGLE開(kāi)發(fā)了開(kāi)放式的Andro...

關(guān)鍵字: Linux x86 ARM

隨著計(jì)算需求的多樣化,尤其是隨著移動(dòng)設(shè)備、嵌入式系統(tǒng)和云計(jì)算的興起,ARM 和 x86 架構(gòu)之間的爭(zhēng)論變得更加突出。ARM(高級(jí) RISC 機(jī)器)和 x86 代表兩種不同類(lèi)型的處理器架構(gòu),每種架構(gòu)都針對(duì)不同的工作負(fù)載和用...

關(guān)鍵字: Linux x86 ARM

從畫(huà)質(zhì)優(yōu)化 (NSS) 到幀率提升 (NFRU) 和光線(xiàn)追蹤(NSSD),Arm 計(jì)劃覆蓋移動(dòng)端圖形處理的多個(gè)維度,推動(dòng)邊緣 AI 圖形革命。而未來(lái)通過(guò)持續(xù)的技術(shù)迭代,Arm也將保持在移動(dòng)計(jì)算領(lǐng)域的技術(shù)領(lǐng)先,滿(mǎn)足手游、A...

關(guān)鍵字: ARM 神經(jīng)圖形技術(shù) GPU AI ML

7月31日消息,據(jù)媒體報(bào)道,芯片架構(gòu)提供商Arm Holdings首席執(zhí)行官Rene Haas宣布,公司正加大投入開(kāi)發(fā)自有芯片產(chǎn)品,此舉標(biāo)志著其從傳統(tǒng)IP授權(quán)模式向提供實(shí)體芯片的戰(zhàn)略重大轉(zhuǎn)變。

關(guān)鍵字: ARM META

7月28日消息,2025年,中國(guó)AI硬件市場(chǎng)規(guī)模將首次突破萬(wàn)億元大關(guān)。

關(guān)鍵字: AI ARM

受生成式 AI 驅(qū)動(dòng), RISC-V 芯片市場(chǎng)快速發(fā)展。預(yù)計(jì)到2030年,RISC-V SoC出貨量將達(dá)到1618.1億顆,營(yíng)收將達(dá)到927億美元。其中,用于AI加速器的RISC-V SoC出貨量將達(dá)到41億顆,營(yíng)收將達(dá)...

關(guān)鍵字: RISC-V CPU AI CUDA ARM 推理
關(guān)閉