娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

Tiny 6410 按鍵中斷驅動筆記

發布者:huanhui最新更新時間:2024-09-13 來源: cnblogs關鍵字:Tiny  按鍵  中斷驅動 手機看文章 掃描二維碼
隨時隨地手機看文章

1. 先查看《Tiny6410SDK-1103 底板原理圖》,找到按鍵部分:

  從上圖可知,當按鍵按下時,相當于接地,即低電平,從而產生一個由高電平到低電平的跳變。

  Tiny6410的底板有8個按鍵:

  

2. 查看《Tiny6410-1170 CPU核心板原理圖》,找到EINT0的連接圖:

 

  從上圖可知:

  EINT0 接 GPN0

  EINT1 接 GPN1

  EINT2 接 GPN2

  ENIT3 接 GPN3

  EINT4 接 GPN4

  EINT5 接 GPN5

  EINT19 接 GPL11

  EINT20 接 GPL12

 

知識點:

由s3c6410外部觸發的中斷就是外部中斷,由s3c6410內部觸發的是內部中斷,像watch dog就是內部中斷,像key,wm9717觸發的就是外部中斷。

  外部中斷從外設到cpu的具體流程:

  外設------>GPIO------>VIC------>ARM1176

  我們編寫關于中斷的程序也是這個過程:

  配置外設------>配置GPIO------>配置VIC------>配置ARM協處理器

  其實就是要打造一個通路能夠讓中斷的電平變化能順順利利的傳送到ARM里!

3. 中斷設置流程

  外設都是連到GPIO上的。s3c6410具有187個多功能I/O端口,其實有127個用于外部中斷。這127個引腳可以分為10個分組:

  EINT0    GPN0--->GPN15        GPL8--->GPL14         GPM0--->GPM4

  EINT1    GPA0--->GPA7           GPB0--->GPB6

  EINT2    GPC0--->GPC7

  EINT3    GPD0--->GPD5

  EINT4    GPF0--->GPF14

  EINT5    GPG0--->GPG7

  EINT6    GPH0--->GPH9

  EINT7    GPO0--->GPO15

  EINT8    GPP0--->GPP14

  EINT9    GPQ0--->GPQ9

  每個引腳可以對應一個外部中斷。那么當外部中斷電平變化傳GPIO里,除了對應端口的哪幾個寄存器(CON,PUD,etc)GPIO里又有哪些寄存器會

  對這個中斷信號造成影響呢?看下面:

  EINTXCON :配置觸發方式,低電平,高電平,上升沿,下降沿。

  EINTXPEND :這個現在用不到,一會兒中斷處理程序會用到,這個是pending register.

  EINTXMASK :這里可以屏蔽某個外部中斷,要通過需要clear一下對應的中斷位。默認是全屏蔽的。

  EINTXFLTCON :這里設置濾波方式,可以去毛刺。

  我們這里要設置的是EINTXCON,EINTXMASK,EINTXFLTCON。這樣我們的中斷信號就可以順利通過GPIO了,然后就是VIC 向量中斷控制器了。

  上面說的這些外部中斷在GPIO里分成了九組,具體反應到VIC里他們占用中斷號如下:

No

Sources

Description

Group

0

 INT_EINT0

External interrupt 0 ~ 3 

VIC0

1

 INT_EINT1 

External interrupt 4 ~ 11  

VIC0

32

 INT_EINT2  

External interrupt 12 ~ 19     

VIC1

33

 INT_EINT3 

External interrupt 20 ~ 27    

VIC1

53

 INT_EINT4

External interrupt Group 1 ~ Group 9  

VIC1

 

  這里我們使用VIC,當然要先開啟VIC,這個是在協處理器里設置的 VE位

  mrc p15,0,r0,c1,c0,0

  orr r0,r0,#(1<<24)'

      mcr p15,0,r0,c1,c0,0

  主要是通過CP15協處理器特定的寄存器來控制VIC的使能:查看arm6410手冊,arm1176JZF-S.pdf 第3-14頁如下圖所示,

 

 

  因為op1=0,CRn=c1,CRm=c0,op2=0,跳轉到3-44頁圖所示,查看對應寄存器。

 

  首先,mrc  p15,0,r0,c1,c0,0將協處理器cp15中op1=0,CRn=c1,CRm=c0,

  op2=0所對應的寄存器的值傳給r0寄存器。

  其次,orr  r0,r0,#(1<<24)將上面得到的r0寄存器的值與1左移24位得到的值進行按位或運算,將得到的結果放入r0中。

  最后,mcr  p15,0,r0,c1,c0,0將運算后的r0的值重新放回cp15協處理器對應的寄存器當中。

  這樣我們的VIC就能用了。

  然后就是開啟總中斷:

  mrs r0,cpsr

     bic r0,r0,#0x80

     msr cpsr_c,r0

 

  然后是VIC的設置,幾個重要的寄存器:

  VICXINTSELECT:選擇中斷方式FIQ or IRQ。

  VICXVECTADDR:設置中斷處理程序的地址。

  VICXINTENABLE:使能GPIO傳過來的中斷信號。

  其實設置到這里外部中斷就能正確運行了,但是還有許多別的寄存器,比如設置什么優先級的。

  ARM得知來了個中斷,就和VIC進行一系列的握手,得到VICADDRESS,就開始執行我們的中斷處理程序了。最后要清除一下EINTXPEND和VICXADDRESS。


4. 程序實現:


inter.s :


.text

.code 32

.global _start

.global asm_handle_k1_irq

.extern interrupt_test

.extern handle_k1_irq


_start:


    @disable watch dog 

    ldr r0, =0x7E004000

    mov r1, #0

    str r1, [r0]    

 

    @enable vic 

    mrc p15,0,r0,c1,c0,0

    orr r0,r0,#(1<<24)

    mcr p15,0,r0,c1,c0,0


    @enable interrupt

    mrs r0,cpsr

    bic r0,r0,#0x80

    msr cpsr_c,r0


    ldr sp, = 0x0C001000


    @sp_irq mode 

    msr cpsr_cxsf,#0xd2

    ldr sp, = 0x0C001000

    @return back to svc mode

    msr cpsr_cxsf, #0x13


    bl interrupt_test


loop:

    b loop


asm_handle_k1_irq:

    stmfd sp!, {r0-r3,r12,lr}

    ldr lr,=int_return

    bl handle_k1_irq


int_return:

    ldmfd sp!, {r0-r3,r12,lr}

    subs pc,lr,#4


inter_func.c:


#define GPKCON0 *((volatile unsigned int*)0x7F008800)


#define GPKDAT *((volatile unsigned int*)0x7F008808)


#define GPKPUD *((volatile unsigned int*)0x7F00880C)


#define GPNCON *((volatile unsigned int*)0x7F008830)


#define GPNPUD *((volatile unsigned int*)0x7F008838)


#define EINT0CON0 *((volatile unsigned int*)0x7F008900)


#define EINT0MASK *((volatile unsigned int*)0x7F008920)


#define EINT0PEND *((volatile unsigned int*)0x7F008924)


#define EINT0FLTCON0 *((volatile unsigned int*)0x7F00891C)


#define VIC0INTSELECT *((volatile unsigned int*)0x7120000C)


#define VIC0VECTADDR  *((volatile unsigned int*)0x71200100)  


#define VIC0INTENABLE *((volatile unsigned int*)0x71200010)  


#define VIC0INTENCLEAR *((volatile unsigned int*)0x71200014)  


#define VIC0ADDRESS *((volatile unsigned int*)0x71200F00)  


#define VIC1ADDRESS *((volatile unsigned int*)0x71300F00) 


typedef void (isr) (void);


extern void asm_handle_k1_irq();


void led_init()

{


    //init gpkcon


    GPKCON0 &= 0x0000ffff;


    GPKCON0 |= 0x11110000;


    //set output


    //light led1


    GPKDAT = 0xffef;


    //set pull-up register


    //GPKPUD = 0x000aa00;


}


void handle_k1_irq()

{


    //reverse led1

    GPKDAT ^= 0x0010;


    // clear K1 irq  


    EINT0PEND = 1;

 

    //clear irq


    VIC0ADDRESS = 0;


    VIC1ADDRESS = 0;

}


void key_io_init()

{


    //configure k1 as Ext.Interrupt


    GPNCON &= (~0x03);


    GPNCON |= 0x02;


    GPNPUD &= ~(0x3);



    //configure k1 as falling edge trigged


    EINT0CON0 &= (~0x03);


    EINT0CON0 |= 0x3;


    //EINT0FLTCON0 |= 0x40;


    //Enable EINT0 irq


    EINT0MASK &= (~0x1);


    // Select INT_EINT0 mode as irq  


    VIC0INTSELECT = 0;


    // init the isr addr  


    isr** isr_array = (isr**)(0x71200100);


    isr_array[0] = (isr*)asm_handle_k1_irq;



    //EINT0PEND = 0xffffffff;  


    //VIC0INTENCLEAR = 0xffffffff;



    //enable 


    VIC0INTENABLE |= 0x01;


}



void interrupt_test()

{


    led_init();


    key_io_init();


}


makefile:


CC=arm-linux-gcc


LD=arm-linux-ld


OBJCOPY=arm-linux-objcopy      


CFLAG=-c


LDFLAG=-e _start -Ttext 0x0c000000


inter.bin: inter


    $(OBJCOPY) -O binary $< $@


inter: inter.o inter_func.o


    $(LD) $(LDFLAG) $? -o $@


inter.o:inter.s                


    $(CC) $(CFLAG) $< -o $@    


inter_func.o:inter_func.c          


    $(CC) $(CFLAG) $< -o $@


clean:


    rm *.o


    rm inter


rm inter.bin


5. 問題記錄    


(1) 設置GPNCON時,網上的文章寫成GPNCON &= (~0x2),實際上應該是GPNCON &= (~0x03),導致中斷無反應。


(2) 直接設置VIC向量的地址為中斷邏輯,忘記要在中斷模式下進行堆棧的保存與恢復,導致程序只能觸發一次中斷。


asm_handle_k1_irq:


    stmfd sp!, {r0-r3,r12,lr}


    ldr lr,=int_return


    bl handle_k1_irq @一開始直接作為VIC向量的地址


 


int_return:


    ldmfd sp!, {r0-r3,r12,lr}


    subs pc,lr,#4


關鍵字:Tiny  按鍵  中斷驅動 引用地址:Tiny 6410 按鍵中斷驅動筆記

上一篇:Tiny6410 LED 裸機驅動筆記
下一篇:S3c6410 平臺 Android系統的Wi-Fi調試記錄

推薦閱讀最新更新時間:2025-04-17 01:41

Tiny6410裸機編程-----WatchDog
WatchDog (看門狗) 本質上是一個定時計數器,當該計數器遞減到0時會產生一個通知(中斷或復位),主要用于解決嵌入式系統意外跑飛等運行不正常的問題。開發板一般在默認的情況下都會開啟WatchDog, 這樣當計數器遞減到0時系統就會復位。因為出現異常的可能性幾乎可以忽略,所以bootloader在開始執行時就會關掉開門狗。所以,對WatchDog的最經典操作就是:關閉。 2. Principle (1) WatchDog只使用PCLK時鐘 (Tiny6410在沒有初始化時鐘時,整個開發板由一個12MHz的外部晶振提供頻率,PCLK工作頻率也是12MHz); (2) PCLK 再經過一個8位分頻器Prescaler, 相
[單片機]
<font color='red'>Tiny</font><font color='red'>6410</font>裸機編程-----WatchDog
ARM-Linux驅動--ADC驅動中斷方式)
硬件平臺:FL2440 內核版本:2.6.28 主機平臺:Ubuntu 11.04 內核版本:2.6.39 原創作品,轉載請標明出處: http://blog.csdn.net/yming0221/archive/2011/06/26/6568937.aspx 這個驅動寫了好久,因為原來的Linux內核編譯的時候將觸摸屏驅動編譯進內核了,而觸摸屏驅動里的ADC中斷在注冊的時候類型選擇的是 IRQF_SAMPLE_RANDOM,不是共享類型,所以,自己寫的ADC驅動在每次open的時候,總提示ADC中斷注冊失敗。 解決方案: 重新配置內核,選擇觸摸屏驅動以模塊的形式編譯,而不是直接編譯進內核,這樣Linux在
[單片機]
ARM-Linux<font color='red'>驅動</font>--ADC<font color='red'>驅動</font>(<font color='red'>中斷</font>方式)
uClinux下中斷驅動的I/O方式
摘要 在開發數據流設備的驅動程序時,采用中斷驅動的I/O方式結合緩沖區的使用,可以將數據的接收和系統調用read隔離開來,提高設備在系統中的運行效率。本文在討論uClinux下中斷處理程序和底半部分的開發的基礎上,以一種電信E1線路和以太網互聯設備上數據流設備為例,講述中斷驅動的I/O方式的驅動程序開發。主要過程是在中斷期間填充數據到緩沖塊,并用鏈表將緩沖塊串接起來;在系統調用read期間從緩沖塊取走數據,再將緩沖塊放到自由鏈表中備用。涉及驅動程序中常用的阻塞式I/O和自旋鎖等技術應用。通過使用上述多種技術開發的數據流設備驅動程序,確保系統穩定高效的動作。 關鍵詞 uClinux 中斷驅動 I/O方式 引 言 在32位微處理器
[嵌入式]
Tiny210v2( S5PV210 )平臺下創建基本根文件系統
0. 概要介紹 ========================================================= 根文件系統的建立,可以有多種方式。 * 直接利用開發板供應商提供的根文件系統; * 利用開源社區的發行版,比如debian/ubuntu for arm; * 利用meego/tizen/moblin/android提供的根文件系統; * 自己建立。 其中最方便的還是利用別人已經完成的成果,避免重新發明輪子。 但如果別人已有的成果不能滿足自己需求,或者想要體驗一下根文件系統如何建立的話,還是需要自己來實踐一下。 在這里記錄一下我建立最小根文件系統的過程,以防忘記。 這個方法不一定是正統方法,只是一個可
[單片機]
tiny4412內核自帶led驅動分析
內核版本:linux-3.5 平臺:tiny4412 一、關于混雜設備 此版本內核led驅動使用的是混雜設備misc,具體misc.c的實現路徑:linux-3.5/drivers/char/misc.c 這就很大程度簡化了我們的驅動代碼,沒有發現ldd3中提到的各種字符設備注冊函數,而是發現了一個misc_register函數(共用的注冊函數),這說明led設備是作為雜項設備出現在內核中的,在內核中,misc雜項設備驅動接口是對一些字符設備的簡單封裝,他們共享一個主設備號,有不同的次設備號,共享一個open調用,其他的操作函數在打開后運用linux驅動程序的方法重載進行裝載。 二、關于gpio: 查找tiny441
[單片機]
<font color='red'>tiny</font>4412內核自帶led<font color='red'>驅動</font>分析
記錄Ok6410 sd 啟動uboot
1\參考資料https://github.com/SeanXP/ARM-Tiny6410/tree/master/no-os/sd-no-os/u-boot 2\參考資料https://blog.csdn.net/xinxin_2011/article/details/85228961 3編譯sd ram128版本的uboot make ARCH=arm CROSS_COMPILE=$(編譯器路徑)/arm-linux- forlinx_sd_ram128_config make ARCH=arm CROSS_COMPILE=$(編譯器路徑)/arm-linux- all -j8 4操作編譯出來的u-boot.bin cat
[單片機]
記錄Ok<font color='red'>6410</font> sd 啟動uboot
wince6.0+s3c6410攝像頭驅動修改
這段時間開發一個圖像識別的項目,基于WinCE6.0+s3c6410 系統,使用友堅恒天的6410 開發板。該開發板帶有OV9650 攝像頭接 口,但存在一個最大的問題,是攝像頭獲取的圖像太小,只能看到320*240 的圖像,我需要1280*1024 的圖像,所以只能修改。本想驅動能提供接 口,可以在應用程序中修改像素,但仔細分析驅動源代碼發現,攝像頭的像素是在驅動中設置死的,所以只能修改驅動。修改驅動的過程中走了很多彎路,不過今天 終于成功了,可以成功顯示640*480 和1280*1024 的圖像。 驅動中需要修改的文件主要有:setting.h ,OV9650_MODUAL.cpp, sensorformat.h, s3
[單片機]
s3c6410_時鐘初始化
參考: 1)《USER'S MANUAL-S3C6410X》第三章 SYSTEM CONTROLLER 2)u-boot/board/samsumg/smdk6410/lowlevel_init.S 1. PLL與CLK的關系: 詳細關系圖見用戶手冊122頁Figure 3-2 The block diagram of clock generator。 三種PLL:APLL,MPLL,EPLL 四種CLK:ACLK,HCLK,PCLK 1)APLL產生ACLK,,ACLK為CPU提供時鐘; 2)同步模式下APLL產生HCLK/PCLK,異步模式下MPLL產生HCLK/PCLK,HCLK為AXI/AHB總線上的外設提供時鐘,
[單片機]
s3c<font color='red'>6410</font>_時鐘初始化
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 陵水| 图们市| 沭阳县| 焉耆| 栾城县| 高尔夫| 乌海市| 新沂市| 来安县| 济源市| 江都市| 吴忠市| 宣汉县| 铜鼓县| 中西区| 南陵县| 鄂托克前旗| 陕西省| 思茅市| 大余县| 襄垣县| 五大连池市| 芜湖市| 奉节县| 东乌珠穆沁旗| 金平| 枣阳市| 洛浦县| 宁国市| 茌平县| 宜川县| 静乐县| 广宁县| 同德县| 定西市| 四子王旗| 台江县| 万宁市| 高要市| 仁化县| 宜兰市|