當(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)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車(chē)的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車(chē)技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車(chē)工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車(chē)。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車(chē) 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶(hù)希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱(chēng),數(shù)字世界的話(huà)語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱(chēng)"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉