新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 第3課: 點(diǎn)亮開(kāi)發(fā)板led燈

        第3課: 點(diǎn)亮開(kāi)發(fā)板led燈

        作者: 時(shí)間:2016-11-11 來(lái)源:網(wǎng)絡(luò) 收藏
        我們學(xué)習(xí)的是ARM周邊外設(shè)的控制,但外設(shè)有很多

        我們寫的程序分成2種:

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

        無(wú)操作系統(tǒng)的直接驅(qū)動(dòng)

        有操作系統(tǒng)的寫出設(shè)備驅(qū)動(dòng)

        以下介紹下主要的設(shè)備:

        1外部存儲(chǔ)控制器 發(fā)送復(fù)雜的時(shí)序信號(hào)來(lái)控制SDRAM,有了它就比較方便擴(kuò)展SDRAM

        2LCD controller 工作在800X480

        3 4個(gè)DMA通道 3個(gè)串口通道

        4 2個(gè)SPI 串行數(shù)據(jù)接口(我們的板子無(wú)) IIC總線(板子上無(wú))

        5 2種音頻總線IIS音頻與AC97音頻

        6支持SD MMC

        7 2個(gè)USB接口,1個(gè)USB控制器

        8 4個(gè)PWM定時(shí)器,1個(gè)內(nèi)部定時(shí)器,看門狗定時(shí)器

        9 8個(gè)10bit的ADC模擬信號(hào)轉(zhuǎn)換

        10 RTC日歷功能

        11 camera 功能

        12 130個(gè)i/o管腳 24個(gè)外部中斷源

        13電源控制(normal slow idle slepp )

        14我們板子上有獨(dú)立網(wǎng)卡芯片控制RJ45

        2440比2410多了camera與ac97

        cp15控制MMU和cache

        AHB高速設(shè)備

        ============

        APB低速設(shè)備

        2440內(nèi)部有個(gè)功能可以單獨(dú)關(guān)閉某個(gè)外設(shè)

        我們是通過(guò)控制特殊的寄存器來(lái)控制外設(shè)的。

        下面來(lái)看第一個(gè) 130個(gè)I/O管腳(pin)

        共有9組 從GPA到GPJ(見(jiàn)數(shù)據(jù)手冊(cè)274頁(yè))

        有9個(gè)配置寄存器GPACON~GPJCON

        有9個(gè)內(nèi)容寄存器GPADAT~GPJDAT

        我們寫的led燈是GPE12和GPE13這2個(gè)引腳控制的兩個(gè)燈。

        根據(jù)數(shù)據(jù)手冊(cè)來(lái)看,CPECON控制的引腳是可以復(fù)用的,工具GPECON中設(shè)置的值來(lái)改變它的功能,它可以是I/O port功能也可以是其他功能。

        在這里我們要點(diǎn)亮燈,就要讓GPECON設(shè)置到out port。然后改變CPEDAT中的數(shù)據(jù)到0.可以點(diǎn)亮燈。當(dāng)GPEDAT中的響應(yīng)位為地位時(shí),由于和高位產(chǎn)生電壓差從而產(chǎn)生電流,點(diǎn)亮燈泡。如果要熄滅燈的話,就把GPEDAT相應(yīng)位置1.

        以下用匯編和C各寫一個(gè)LED2個(gè)燈閃爍的驅(qū)動(dòng)。

        .text
        .global _start
        delay:@這個(gè)是延遲程序,閃爍當(dāng)中的間隔
        nop
        nop
        nop
        subs r4,r4,#1
        bne delay
        movpc,lr

        _start:
        ldr r0,=0x56000040 @r0 = GPECONs address
        ldr r1,=0x5000000
        str r1,[r0] @set GPECON register
        ldr r0,=0x56000044 @r0 = GPEDATs address

        movr2,#10 @set the times of loop
        ldr r3,=0x3000 @r3 is the mask to turn off led
        mov r1,#0
        loop:
        strr1,[r0] @亮燈,把GPEDAT相應(yīng)位置0
        ldrr4,=0x500000
        bldelay

        strr3,[r0] @滅燈,把相應(yīng)位置1
        ldrr4,=0x500000
        bldelay

        subsr2,r2,#1
        bneloop

        haltloop: @如果程序不在最后一直循環(huán)的話將不能執(zhí)行
        bhaltloop

        接下來(lái)就是寫makefile

        light.bin:light.o//要編譯成light。bin 需要依賴.o
        arm-linux-ld -Ttext 0x00000000 light.o -o light.elf //我們這里不寫連接文件,而是用Ttext的形式,指定程序開(kāi)始的段(text)
        arm-linux-objcopy -O binary -S light.elf light.bin//把elf文件轉(zhuǎn)化成2進(jìn)制文件。正真的作用是定位地址和引入符號(hào)表。
        arm-linux-objdump -D -b binary -m arm light.bin >light.dis //把light.bin反匯編,也可以把light.elf反匯編

        light.o:light.s
        arm-linux-gcc -c light.s -o light.o
        clean:
        rm -f light.o light.elf light.bin light.dis

        之后我使用openjtag仿真槍,通過(guò)jtag口燒入內(nèi)存0x0(因?yàn)檫B接文件定的入口在那)當(dāng)然也可以通過(guò)網(wǎng)絡(luò)下載等其他方法燒寫內(nèi)存SDRAM,不過(guò)沒(méi)有jtag給力 =。=!。記得燒寫的時(shí)候用arm920t cp15 2 0把mmu和i-cache關(guān)了,這個(gè)東西的使用件使用手冊(cè)。

        之后給出C程序的代碼。C寫起來(lái)比較方便。主張用C。我們寫.h .c .s .lds makefile5個(gè)文件。其中crt0.s是用來(lái)引入C程序的。

        .text
        .globl _start
        _start:
        ldrr0, =0x53000000 @ WATCHDOG close
        movr1, #0x0
        strr1, [r0]
        ldr sp, =1024*4 @set stack,but the capitcy of cache is only 4k

        bl main @跳轉(zhuǎn)到C的main符號(hào)入口
        halt_loop:
        b halt_loop

        之后寫頭文件

        #define GPECON (*(volatile unsigned int *)0x56000040) @volatile是用來(lái)讓編譯器不編譯GPECON寄存器的,免得它被當(dāng)初常量,它可是會(huì)變化的需要一直從寄存器中讀取。
        #define GPEDAT (*(volatile unsigned int *)0x56000044)

        #define GPE12_out (1<<(12*2))
        #define GPE13_out (1<<(13*2))

        之后就是C文件

        #include"led.h"
        void wait(int time)
        {
        do{
        time--;
        }
        while(time>0);
        }

        int main()
        {
        int i=10;
        GPECON = GPE12_out|GPE13_out;
        do{
        GPEDAT = 0;
        wait(300000);
        GPEDAT = (3<<12);
        wait(300000);
        i--;}
        while(i>0);
        return 0;
        }

        主程序?qū)懲旰螅_(kāi)始寫連接腳本lds文件。

        SECTIONS {
        . = 0x00;//從0x00開(kāi)始作為入口
        .text : { *(.text) }//段名稱起名.text 內(nèi)容是 所有的.text段
        .rodata ALIGN(4) : {*(.rodata)}// ALIGN(4)4字節(jié)對(duì)齊
        .data ALIGN(4) : { *(.data) }
        .bss ALIGN(4) : { *(.bss) *(COMMON) }
        }

        來(lái)看下makefile

        CFLAGS := -Wall -Wstrict-prototypes -g -fomit-frame-pointer -ffreestanding
        led.bin:led.elf
        arm-linux-objcopy -O binary -S led.elf led.bin
        arm-linux-objdump -D -m arm led.elf > led.dis
        led.elf:led.o crt0.o
        arm-linux-ld -Tleds.lds crt0.o led.o -o led.elf
        led.o:led.c led.h
        arm-linux-gcc $(CFLAGS) -c led.c -o led.o
        crt0.o:crt0.s
        arm-linux-gcc $(CFLAGS) -c crt0.s -o crt0.o
        clean:
        rm -f led.bin led.dis led.elf led.o crt0.o



        評(píng)論


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

        關(guān)閉
        主站蜘蛛池模板: 宣汉县| 遂昌县| 桦甸市| 安龙县| 昆明市| 天祝| 文成县| 崇阳县| 中江县| 金平| 崇文区| 彭阳县| 留坝县| 岑巩县| 新竹市| 勃利县| 岳阳市| 嘉祥县| 那坡县| 北流市| 寿宁县| 马公市| 鄱阳县| 沽源县| 镇坪县| 浮梁县| 夏河县| 虹口区| 瓮安县| 滦平县| 枞阳县| 城口县| 历史| 临泉县| 剑河县| 麻栗坡县| 肇东市| 冀州市| 大同县| 霍城县| 临夏市|