新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > s3c2440硬件篇之一:GPIO

        s3c2440硬件篇之一:GPIO

        作者: 時間:2016-11-21 來源:網絡 收藏
        S3C2440共有130個I/O 端口,共分為GPA,GPB,...,GPJ.對于這幾組GPIO引腳,他們的寄存器是相似的:
        GPxCON:用于配置(configure),選擇引腳的功能。
        GPxDAT:用于讀/寫數據。
        GPxUP:確定是否使用內部上拉電阻。(沒有GPAUP寄存器。)
        PORTB~PORTJ在寄存器操作方面完全相同。GPxCON中每兩位控制一根引腳:00表示輸入,01表示輸出,10表示特殊功能,11保留不用。
        一。使用匯編代碼點亮一個LED。參照韋東山大哥的,上圖是從韋大哥的書中截圖的,而我的開發板對應的是GPF接口。僅此區別。
        (1)led_on.S匯編代碼。

        @******************************************************************************
        @ File:led_on.S
        @ 功能:LED點燈程序,點亮LED1
        @******************************************************************************

        .text@偽代碼指令,指定下面開始是代碼段,
        .global _start
        _start:
        LDR R0,=0x56000050 @ R0設為GPFCON寄存器。此寄存器
        @ 用于選擇端口F各引腳的功能:.
        @ 是輸出、是輸入、還是其他
        MOVR1,#0x00000001
        STRR1,[R0] @ 設置GPF0為輸出口,位[1:0]=0b01

        LDR R0,=0x56000058 @ R0設為GPFUP寄存器。此寄存器
        @ 用于選擇端口F使能禁止上拉的功能:
        MOVR1,#0x00000000
        STRR1,[R0] @ 使能GPF0上拉

        LDR R0,=0x56000054 @ R0設為GPFDAT寄存器。此寄存器
        @ 用于讀/寫端口F各引腳的數據
        MOVR1,#0x00000000 @ 此值改為0x00000001,
        @ 可讓LED1熄滅
        STRR1,[R0] @ GPF0輸出0,LED1點亮

        MAIN_LOOP:
        B MAIN_LOOP

        本文引用地址:http://www.104case.com/article/201611/319469.htm

        (2)Makefile文件:

        led_on.bin:led_on.S
        arm-linux-gcc-g-c-o led_on.o led_on.S
        arm-linux-ld-Ttext 0x0000000-g led_on.o-o led_on_elf
        arm-linux-objcopy-O binary-S led_on_elf led_on.bin
        clean:
        rm-f led_on.bin led_on_elf*.o

        其中:arm-linux-ld-Ttext 0x0000000-g led_on.o-o led_on_elf:指定了代碼段的運行地址為0x0000_0000,并指定生成連接文件led_on_elf,由于沒有定義數據段和BSS段的起始地址,它們唄依次放在代碼段的后面。arm-linux-objcopy-O binary-S led_on_elf led_on.bin:由連接文件生產可執行文件led_on.bin,下載進開發板即可觀察到led1點亮了。

        重要說明:玩單片機的時候我們一般是把程序下載到單片機的自身帶的flash中,而s3c2440不是這樣的,我們是把程序下載到它的外部存儲器中,如Norflash或者NandFlash.只有s3c2440是不能運行的,它的最小系統包括了,SDRAM(即內存),FLASH(Nand或者Nor,即相當于硬盤)。我們把程序下載到NandFlash中而不是CPU本身,那么當選擇從NandFlash啟動CPU的時候(即OM0,OM1設置為00的時候)S3C2440會自動根據內部的硬件結構將NandFlash中的前4K代碼復制到S3C2440的內部RAM中,此時內部RAM的地址為0,程序將從0開始執行。

        一。使用C語言點亮一個LED。
        (1)crt0.S

        @******************************************************************************
        @ File:crt0.S
        @ 功能:通過它轉入C程序
        @******************************************************************************

        .text
        .global _start
        _start:
        ldr r0,=0x56000010 @ WATCHDOG寄存器地址
        movr1,#0x0
        strr1,[r0]@ 寫入0,禁止WATCHDOG,否則CPU會不斷重啟

        ldr sp,=1024*4 @ 設置堆棧,注意:不能大于4k,因為現在可用的內存只有4K
        @ nand flash中的代碼在復位后會移到內部ram中,此ram只有4K
        blmain @ 調用C程序中的main函數
        halt_loop:
        b halt_loop

        (2)len_on.c

        #defineGPFCON(*(volatileunsignedlong*)0x56000050)
        #defineGPFDAT(*(volatileunsignedlong*)0x56000054)
        #defineGPFUP(*(volatileunsignedlong*)0x56000058)

        intmain()
        {
        GPFCON=0x00000004;// 設置GPF1為輸出口, 位[3:2]=0b01
        GPFUP=0x0;//使能上拉
        GPFDAT=0x00000000;// GPF1輸出0,LED1點亮

        return0;
        }


        (3)Makefile:

        led_on.bin:crt0.S led_on.c
        arm-linux-gcc-g-c-o crt0.o crt0.S
        arm-linux-gcc-g-c-o led_on.o led_on.c
        arm-linux-ld-Ttext 0x0000000-g crt0.o led_on.o-o led_on_elf
        arm-linux-objcopy-O binary-S led_on_elf led_on.bin
        arm-linux-objdump-D-m arm led_on_elf>led_on.dis
        clean:
        rm-f led_on.dis led_on.bin led_on_elf*.o


        比較疑惑的一點是crt0.S中blmain @ 調用C程序中的main函數,怎么實現的,我是這么理解的,arm-linux-ld連接生成了led_on_elf文件,這是一個文件。



        關鍵詞: s3c2440硬件GPI

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 济宁市| 唐海县| 越西县| 镇江市| 宣化县| 许昌市| 阿拉善右旗| 广丰县| 得荣县| 镇雄县| 白银市| 平定县| 曲沃县| 江西省| 武平县| 安溪县| 启东市| 卢龙县| 壤塘县| 南江县| 烟台市| 萝北县| 北辰区| 比如县| 光泽县| 定远县| 南投市| 青州市| 津南区| 桂东县| 吕梁市| 无棣县| 阿克苏市| 诸城市| 勐海县| 中西区| 正蓝旗| 兰西县| 象山县| 郑州市| 汝州市|