<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > ARM系統(tǒng)中觸摸屏的中斷處理方法

          ARM系統(tǒng)中觸摸屏的中斷處理方法

          作者: 時間:2017-06-04 來源:網(wǎng)絡(luò) 收藏

          隨著嵌入式微處理器性能的提高,集成的外圍接口設(shè)備越來越多,而外圍設(shè)備與處理器之間多采用方式進(jìn)行通信,即使在沒有操作系統(tǒng)的情況下,也常需要對多個外圍設(shè)備的處理例程進(jìn)行動態(tài)加載,從而實現(xiàn)對多個外圍設(shè)備的集中動態(tài)管理。同時,功能可以解決CPU內(nèi)部運(yùn)行速度遠(yuǎn)遠(yuǎn)快于外部總線速度而產(chǎn)生的等待延時問題。因此,嵌入式微處理器的應(yīng)用設(shè)計中,中斷處理通常是系統(tǒng)的核心任務(wù)之一。

          本文引用地址:http://www.ex-cimer.com/article/201706/348428.htm

            
          1 觸摸屏

            (1)觸摸屏簡介

            隨著多媒體信息查詢的與日俱增,人們越來越關(guān)注觸摸屏。觸摸屏具有堅固耐用、反應(yīng)速度快、節(jié)省空間、易于交流等許多優(yōu)點(diǎn),作為一種最新的電腦輸入設(shè)備,它是目前最簡單、方便、自然的方式。它賦予多媒體嶄新的面貌,是極富吸引力的全新多媒體交互設(shè)備。觸摸屏由觸摸檢測部件和觸摸屏控制器組成。觸摸檢測部件安裝在顯示器屏幕前面,用于檢測用戶觸摸位置,接收信息后送至觸摸屏控制器;觸摸屏控制器的主要作用是從觸摸點(diǎn)檢測裝置上接收觸摸信息,并將它轉(zhuǎn)換成觸點(diǎn)坐標(biāo)后送給CPU,同時能接收CPU發(fā)來的命令并加以執(zhí)行。按照觸摸屏的工作原理和傳輸信息的介質(zhì),觸摸屏可以分為4種,即電阻式、電容感應(yīng)式、紅外線式以及表面聲波式。這里采用的是四線電阻屏。

            (2)S3C2410A觸摸屏控制器

            S3C2410A觸摸屏的外接電路主要是控制上下兩層導(dǎo)電層的通斷情況以及取電壓,取電壓之后還需要將這個模擬量轉(zhuǎn)換成數(shù)字量,這部分工作主要是靠S3C2410A芯片中的模數(shù)轉(zhuǎn)換器來實現(xiàn)的。即觸摸屏的功能實現(xiàn)實際上分兩部分,分別是觸摸屏的外接電路部分和S3C2410A芯片自帶的A/D轉(zhuǎn)換控制部分。

            
          2 ARM嵌入式操作系統(tǒng)中斷處理方法

            在嵌入式系統(tǒng)中外部設(shè)備的功能主要是靠中斷機(jī)制來實現(xiàn)的。因此,ARM作為嵌入式微處理器的典型代表,為保證系統(tǒng)的和穩(wěn)定性,建立了一套完整的異常處理機(jī)制。

            2.1 S3C2410A中斷寄存器

            每個寄存器在中斷處理流程中所扮演的角色是不同的,中斷流程如圖1所示。

            2.2 中斷與中斷服務(wù)程序

            中斷的硬件邏輯將檢測到的中斷,以某種方式指向中斷服務(wù)程序的地址,該地址在頭文件中以宏定義的形式出現(xiàn)。用戶在自己的程序中,將中斷服務(wù)程序的地址賦給該指針,從而將中斷與中斷服務(wù)程序聯(lián)系起來。

            為了方便使用高級語言編寫異常處理函數(shù),ARM編譯器對異常處理函數(shù)作了特定的擴(kuò)展,只要使用關(guān)鍵字__irq,編譯出來的函數(shù)就滿足異常響應(yīng)對現(xiàn)場保護(hù)和恢復(fù)的需要。

            在ADS編譯器中,__irq專門用來聲明IRQ中斷服務(wù)程序。如果用__irq來聲明一個函數(shù),那么該函數(shù)就是IRQ中斷服務(wù)程序,編譯器會自動在函數(shù)內(nèi)部增加中斷現(xiàn)場保護(hù)代碼。


          3 中斷方式實現(xiàn)觸摸屏驅(qū)動

            3.1 中斷寄存器的設(shè)置與使能

            S3C2410A的觸摸屏是帶子中斷的內(nèi)部中斷。當(dāng)中斷發(fā)生后,SUBSRCPND相應(yīng)位置1,如果沒有被INTSUBMSK屏蔽,那么SRCPND相應(yīng)位置1,如果沒有被INTMSK屏蔽,就進(jìn)一步設(shè)置INTMOD。這里采用IRQ中斷方式,所以SRCPND可以有多位置1(FIQ只能有1位),經(jīng)過PRIORITY選出一個優(yōu)先級高的,然后把INTPND相應(yīng)位置1(只能選出1位),進(jìn)入IRQ,讓CPU處理。

            首先必須弄清楚SUBSRCPND與SRCPND之間的關(guān)系,幾個SUBSRCPND可能對應(yīng)同一個SRCPND。經(jīng)過不斷總結(jié),得出的對應(yīng)關(guān)系如表1所列。從表中可知,觸摸屏要用到SUBSRCPND中的INT_TC位,即SUBSRCPND[9]。這里定義變量:

            #define BIT_SUB_TC(0x19)

            與之對應(yīng)的是SRCPND中的INT_ADC位,即SRCPND[31],又定義變量:

            #define BIT_ADC(0xl31)

            INTMOD與PRIORITY采用默認(rèn)設(shè)置。因此,可以把觸摸屏的中斷過程寫為:

            3.2 觸摸屏中斷與觸摸屏中斷程序

            首先使能ARM芯片的中斷向量。當(dāng)有IRQ中斷到來,CPU會自動到0x18地址處取指。0x18處的指令是CPU根據(jù)中斷源算好的。這里觸摸屏的中斷INT-ADC來了,那么0x18處的指令就是跳轉(zhuǎn)到地址0x9c處。然后就執(zhí)行“ldr pc,=HandlerINT_ADC”這條指令。這條指令的執(zhí)行結(jié)果就是跳轉(zhuǎn)到“HandlerINT_ADC”處執(zhí)行。

            那么“HandlerINT_ADC”處又是什么指令呢?從訪問絕對地址的內(nèi)存位置“#define pISR_ADC(*(unsigned*)(ISR_STARTADDRESS+0x9c))”可知,“HandlerINT_ADC”處的地址就是_ISR_STARTADDRESS+0x9C。

          上述語句把無符號整數(shù)_ISR_STARTADDRESS+0x9c強(qiáng)制轉(zhuǎn)換為指針,指向RAM,通過語句“pISR_ADC=(int)touchscreen;”對它進(jìn)行訪問,touchscreen即為所定義的觸摸屏中斷程序,該中斷服務(wù)程序必須使用“__irq關(guān)鍵字進(jìn)行聲明。這樣,用戶在自己的程序中,將中斷服務(wù)程序的地址賦給該指針,從而將觸摸屏的中斷與觸摸屏的中斷程序聯(lián)系起來。整個觸摸屏中斷與觸摸屏中斷程序的聯(lián)系如圖2所示。


            
          結(jié)語

            本文完成了觸摸屏相關(guān)中斷寄存器的設(shè)置,并編寫了觸摸屏的中斷處理程序,采用編寫“__irq”函數(shù)的方法實現(xiàn)了基于中斷的觸摸屏控制。在實際應(yīng)用中,該程序設(shè)計簡單可靠,觸摸點(diǎn)坐標(biāo)值讀取準(zhǔn)確,且無粘滯現(xiàn)象,達(dá)到了預(yù)期效果。



          關(guān)鍵詞: 中斷 實時性 人機(jī)交互

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();