在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應用 > 第3課: 點亮開發(fā)板led燈

            第3課: 點亮開發(fā)板led燈

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

            我們寫的程序分成2種:

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

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

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

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

            1外部存儲控制器 發(fā)送復雜的時序信號來控制SDRAM,有了它就比較方便擴展SDRAM

            2LCD controller 工作在800X480

            3 4個DMA通道 3個串口通道

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

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

            6支持SD MMC

            7 2個USB接口,1個USB控制器

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

            9 8個10bit的ADC模擬信號轉(zhuǎn)換

            10 RTC日歷功能

            11 camera 功能

            12 130個i/o管腳 24個外部中斷源

            13電源控制(normal slow idle slepp )

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

            2440比2410多了camera與ac97

            cp15控制MMU和cache

            AHB高速設(shè)備

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

            APB低速設(shè)備

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

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

            下面來看第一個 130個I/O管腳(pin)

            共有9組 從GPA到GPJ(見數(shù)據(jù)手冊274頁)

            有9個配置寄存器GPACON~GPJCON

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

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

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

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

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

            .text
            .global _start
            delay:@這個是延遲程序,閃爍當中的間隔
            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相應位置0
            ldrr4,=0x500000
            bldelay

            strr3,[r0] @滅燈,把相應位置1
            ldrr4,=0x500000
            bldelay

            subsr2,r2,#1
            bneloop

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

            接下來就是寫makefile

            light.bin:light.o//要編譯成light。bin 需要依賴.o
            arm-linux-ld -Ttext 0x00000000 light.o -o light.elf //我們這里不寫連接文件,而是用Ttext的形式,指定程序開始的段(text)
            arm-linux-objcopy -O binary -S light.elf light.bin//把elf文件轉(zhuǎn)化成2進制文件。正真的作用是定位地址和引入符號表。
            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仿真槍,通過jtag口燒入內(nèi)存0x0(因為連接文件定的入口在那)當然也可以通過網(wǎng)絡(luò)下載等其他方法燒寫內(nèi)存SDRAM,不過沒有jtag給力 =。=!。記得燒寫的時候用arm920t cp15 2 0把mmu和i-cache關(guān)了,這個東西的使用件使用手冊。

            之后給出C程序的代碼。C寫起來比較方便。主張用C。我們寫.h .c .s .lds makefile5個文件。其中crt0.s是用來引入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符號入口
            halt_loop:
            b halt_loop

            之后寫頭文件

            #define GPECON (*(volatile unsigned int *)0x56000040) @volatile是用來讓編譯器不編譯GPECON寄存器的,免得它被當初常量,它可是會變化的需要一直從寄存器中讀取。
            #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ū)懲旰螅_始寫連接腳本lds文件。

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

            來看下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



            關(guān)鍵詞: 點亮開發(fā)板led

            評論


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

            關(guān)閉