• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > S5PV210的中斷應用實例

    S5PV210的中斷應用實例

    作者: 時間:2016-01-20 來源:電子產品世界 收藏

      實驗程序可以從四個方面設計:一是啟動程序的設計,主要是對工作模式的配置和中斷服務程序的設計;二是初始化程序,包括中斷控制器的初始化、GPIO引腳的配置;三是主程序設計;最后編寫Makefile,編譯生成目標文件。下面就從這四方面編寫測試代碼以及代碼的詳解。

    本文引用地址:http://www.czjhyjcfj.com/article/201601/286015.htm

      1.啟動程序start.S

      前面已介紹過,本身的固化代碼(iROM)在上電后配置好IRQ中斷的棧,以及系統模式所使用的棧,所以在啟動代碼中可以不用設置這些棧(如果重新配置也可以),所以實驗的啟動程序比較簡單,主要是當中斷發生時先保存現場,跳到中斷服務程序執行中斷處理,處理結束再恢復現場。具體代碼示例如下:

      01 .text

      02 .global _start/*聲明一個全局的標號*/

      03 .global IRQ_handle

      04_start:

      06mrs r0,cpsr

      07bic r0,r0,#0x00000080/*使能IRQ中斷bit[7]=0 */

      08msr cpsr,r0

      09bl main

      10 halt_loop:

      11bhalt_loop/*死循環,不讓程序跑飛*/

      12

      13 IRQ_handle:

      14sub lr, lr, #4/*計算返回地址*/

      15stmdb sp!, {r0-r12, lr} /*保存用到的寄存器*/

      16bl irq_handler/*跳到中斷服務函數*/

      17ldmia sp!, {r0-r12, pc}^/*中斷返回, ^表示將spsr的值復制到cpsr */

      2.初始化階段

      初始化階段重點講下外部中斷控制寄存器的配置方法,以及中斷向量控制寄存器的設置,關于LED相關的引腳配置不作重復介紹。

      ……

      08 #define GPH0CON*((volatile unsigned int *)0xE0200C00)

      09 #define GPH0DAT*((volatile unsigned int *)0xE0200C04)

      10 #define EXT_INT_0_CON*((volatile unsigned int *)0xE0200E00)

      11 #define EXT_INT_0_MASK*((volatile unsigned int *)0xE0200F00)

      12

      13 #define VIC0IRQSTATUS*((volatile unsigned int *)0xF2000000)

      14 #define VIC0INTSELECT*((volatile unsigned int *)0xF200000C)

      15 #define VIC0INTENABLE*((volatile unsigned int *)0xF2000010)

      16 #define VIC0VECTADDR0*((volatile unsigned int *)0xF2000100)

      17 #define VIC0VECTADDR1*((volatile unsigned int *)0xF2000104)

      18 #define VIC0ADDRESS*((volatile unsigned int *)0xF2000F00)

      19

      20 extern void IRQ_handle(void);

      ……

      38 //配置中斷引腳

      39 void init_key(void)

      40 {

      41//配置GPIO引腳為中斷功能

      42GPH0CON &= ~(0xFF<<0);

      43GPH0CON |= (0xFF<<0); // key1:bit[3:0];key2:bit[7:4]

      44//配置EXT_INT[0]、EXT_INT[1]中斷為下降沿觸發

      45EXT_INT_0_CON &= ~(0xFF<<0);

      46EXT_INT_0_CON |= 2|(2<<4);

      47//取消屏蔽外部中斷EXT_INT[0]、EXT_INT[1]

      48EXT_INT_0_MASK &= ~0x3;

      49 }

      50//清中斷掛起寄存器

      51 void clear_int_pend()

      52 {

      53EXT_INT_0_PEND |= 0x3; // EXT_INT[0]、EXT_INT[1]

      54 }

      55 //初始化中斷控制器

      56 void init_int(void)

      57 {

      58//選擇中斷類型為IRQ

      59VIC0INTSELECT = ~0x3; //外部中斷EXT_INT[0]、EXT_INT[1]為IRQ

      60//清VIC0ADDRESS

      61VIC0ADDRESS = 0x0;

      62//設置EXT_INT[0]、EXT_INT[1]對應的中斷服務程序的入口地址

      63VIC0VECTADDR0 = (int)IRQ_handle;

      64VIC0VECTADDR1 = (int)IRQ_handle;

      65//使能外部中斷EXT_INT[0]、EXT_INT[1]

      66VIC0INTENABLE |= 0x3;

      67 }

      68 //清除需要處理的中斷的中斷處理函數的地址

      69 void clear_vectaddr(void)

      70 {

      71VIC0ADDRESS = 0x0;

      72 }

      73 //讀中斷狀態

      74 unsigned long get_irqstatus(void)

      75 {

      76return VIC0IRQSTATUS;

      77 }

      3.主程序

      開發板上電后就會跳到主程序main執行,主程序main中主要是對各初始化函數的調用,另外main.c中還定義了一個中斷處理函數,也就是當相應的中斷發生后,CPU需要跳過去執行的具體內容,這里主要是點燈或滅燈。

      01 extern void init_leds(void);//其他源文件中定義的函數在此聲明

      02 extern void clear_int_pend();

      03 extern void led1_on_off();

      04 extern void led2_on_off();

      05 extern void init_key(void);

      06 extern void init_int(void);

      07 extern void clear_vectaddr(void);

      08 extern unsigned long get_irqstatus(void);

      09 void irq_handler()

      10 {

      11volatile unsigned char key_code = get_irqstatus() & 0x3;// VIC0's status

      12clear_vectaddr();/*清中斷向量寄存器*/

      13clear_int_pend();/*清pending位*/

      14if (key_code == 1)/* key1 */

      15led1_on_off();

      16else if (key_code == 2) /* key2 */

      17led2_on_off();

      18else

      19{

      20led1_on_off();

      21led2_on_off();

      22}

      23 }

      24 int main(void)

      25 {

      26int c = 0;

      27

      28init_leds();/*初始化GPIO引腳*/

      29init_key();/*初始化按鍵中斷*/

      30init_int();/*初始化中斷控制器、使能中斷*/

      31

      32while (1);

      33 }

      4.編寫Makefile

      01 objs := start.o init.o main.o

      02

      03 int.bin: $(objs)

      04arm-linux-ld -Ttext 0xD0020010 -o int.elf $^

      05arm-linux-objcopy -O binary -S int.elf $@

      06arm-linux-objdump -D int.elf > int.dis

      07

      08 %.o : %.c

      09arm-linux-gcc -c -O2 $< -o $@

      10

      11 %.o : %.S

      12arm-linux-gcc -c -O2 $< -o $@

      13

      14 clean:

      15rm -f *.o *.elf *.bin *.dis

      將以上編寫好的源代碼上傳到宿主機上編譯生成可執行的目標文件int.bin,然后燒寫到開發板上電測試。

      實驗最終結果是:當按下“KEY1”,LED1燈會被點亮或熄滅;當按下“KEY2”,LED2燈會被點亮或熄滅。



    關鍵詞: ARM S5PV210

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 深圳市| 江源县| 西平县| 新疆| 林西县| 仪陇县| 淳化县| 三门峡市| 汝阳县| 阜新| 垣曲县| 枣阳市| 高邑县| 鄂伦春自治旗| 晋宁县| 许昌市| 阿克苏市| 高唐县| 佛山市| 乌拉特中旗| 马鞍山市| 松江区| 海伦市| 都匀市| 航空| 轮台县| 黔东| 资阳市| 白银市| 双柏县| 丰城市| 江达县| 海伦市| 沧源| 阜宁县| 诏安县| 京山县| 文成县| 巢湖市| 阿鲁科尔沁旗| 修武县|