日韩一区二区三区精品,欧美疯狂xxxxbbbb牲交,热99re久久免费视精品频,人妻互换 综合,欧美激情肉欲高潮视频

嵌入式開發(fā)學(xué)習(xí)(8)<一步一步點(diǎn)亮LED燈>

發(fā)布者:TranquilSilence最新更新時間:2024-11-19 來源: cnblogs關(guān)鍵字:嵌入式開發(fā)  點(diǎn)亮LED燈 手機(jī)看文章 掃描二維碼
隨時隨地手機(jī)看文章

場景:拿到了一塊開發(fā)板(S5PV210),板上面有四顆LED燈,怎樣寫程序用軟件(匯編語言)去控制LED燈,讓它亮起來?

準(zhǔn)備:開發(fā)板(S5PV210)、DNW燒寫工具、安裝好DNW的usb驅(qū)動、在linux中(我用的是centos6.5 64位)中安裝好交叉編譯工具鏈arm-none-linux-gnueabi-*(這里的“*”代表gcc、g++等),開發(fā)板原理圖(廠家自帶)。

1、交叉編譯工具的的安裝

  下載工具包arm-2009q3.tar.bz2包,

  執(zhí)行 tar -jxvf  arm-2009q3.tar.bz2 解壓后進(jìn)去bin文件夾,可以看到很多以arm-none-linux-gnueabi-開頭的可執(zhí)行文件,這是工具已經(jīng)安裝完了。

  檢驗(yàn)?zāi)懿荒苁褂?,?zhí)行arm-none-linux-gnueabi-gcc -v ,發(fā)現(xiàn)報(bào)錯了(因?yàn)槲业氖?4機(jī),32位機(jī)不會報(bào)錯)。

  執(zhí)行 yum -y install glibc.i686 和 yum -y install ncurses 后,再執(zhí)行 arm-none-linux-gnueabi-gcc -v ,發(fā)現(xiàn)成功呢。

  添加環(huán)境變量:vim /etc/profile 在最后一行中添加PATH=/usr/local/arm/arm-2009q3/bin:/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH(只需添加“=”后到第一個“:”之間的內(nèi)容),執(zhí)行 source /etc/profile 讓修改生效。(當(dāng)誤改/etc/profile 后,使用export PATH=/usr/bin:/usr/sbin:/bin:/sbin:/usr/X11R6/bin 臨時生效。)

  執(zhí)行 echo $PATH ,發(fā)現(xiàn)環(huán)境變量中已經(jīng)有了。

  為工具鏈arm-none-linux-gnueabi-* 做符號鏈接:進(jìn)入/usr/local/arm/arm-2009q3/bin下,執(zhí)行l(wèi)n arm-none-linux-gnueabi-gcc -s arm-linux-gcc...后續(xù)的也照這個格式建立符號鏈接。之后隨便找一個目錄,執(zhí)行 arm-linux-gcc -v ,能成功打印出版本信息gcc version 4.4.1字樣,至此,交叉編譯工具鏈安裝完畢。

進(jìn)入正文:

  1、LED的物理特性

    LED有兩個極,正極和負(fù)極,當(dāng)兩極的電壓差為5v時,LED燈亮,一般是正極5v,負(fù)極0v。電壓太高會將LED擊穿。

  2、打開開發(fā)板原理圖 D:開發(fā)版光盤資料X210V3S_AhardwareI210BV3I210BV3.pdf ,如下圖:

  

  圖中一個三角塊代表一顆LED,一共有五顆。三角的平面端是LED的正極,尖角端是LED的負(fù)極。最下面一顆,正極接5v電壓,負(fù)極接地,所以開發(fā)板一加電,這顆LED就會亮起來。上面四顆是我們要關(guān)注的,正極接直流IO電流(我們不可改變),負(fù)極接SoC的引腳GPJ0_3、GPJ0_4、GPJ0_5、GPD0_1,這是我們要關(guān)注的。

由上分析得出,LED的正極已經(jīng)定了(5v)。我們只能通過SoC中編程來控制負(fù)極輸出頂電平(0v)LED即可點(diǎn)亮。

 

 

                

                                                  (圖1)

  3、GPIO的概念引入。

  GPIO general purpose input output 通用功能輸入輸出。朱友鵬老師的理解:芯片上的部分引腳。我的理解:人通過程序操作CPU的接口。

  功能特點(diǎn):可以通過編程控制工作的模式和電壓高低等。上面的四顆LED就是接在GPIO上面。

  4、打開數(shù)據(jù)手冊E:BaiduNetdiskDownload開發(fā)版光盤資料X210V3S_ADataSheetS5PV210_UM_REV1.1.pdf ,找到GPIO,如下圖

  

                                     ?。▓D2)

上圖打開的是GPIO寄存器的菜單,程序控制硬件的關(guān)鍵是:寄存器。我們要操作的硬件是LED,就是操作LED對應(yīng)的GPIO里相應(yīng)的寄存器。由圖1可知四顆LED對應(yīng)的寄存器是GPJ0寄存器組和GPD0寄存器組。

GPJ0寄存器組中有以下寄存器:

  GPJ0CON    control寄存器。用來配置各引腳的工作模式。是一個控制開關(guān)。32位,有8個引腳,每個引腳展4位。由圖2看出共有7中模式,其中0000代表input,                    0001代表output

  GPJ0DAT  data寄存器。也有32位,但是8~31位未定義使用,只有0~7位有定義使用。具體定義如下:

  When the port is configured as input port, the corresponding bit is the pin state. When the port is configured as output port, the pin state is the same as the corresponding bit.When the port is configured as functional pin, the undefined value will be read.

  英文意思:當(dāng)control寄存器的某個引腳配置為輸入模式時,相應(yīng)的位是引腳的狀態(tài),此時引腳為輸入接口,數(shù)據(jù)通過引腳讀入到data寄存器相應(yīng)的位。比如說當(dāng)你配置GPJ0的二號引腳GPJ0_2為高電平時,對應(yīng)的data寄存器的二號位是1,如果配置GPJ0的二號引腳GPJ0_2為低電平時,對應(yīng)的data寄存器的二號位是0。當(dāng)control寄存器的某個引腳配置為輸出模式時,此時引腳為輸出接口,數(shù)據(jù)通過引腳輸出data寄存器中相應(yīng)的位。當(dāng)data寄存器中的位為1,相應(yīng)的引腳輸出高電平,當(dāng)為0是輸出低電平。GPIO中的GPJ0組中的DAT寄存器的八個位就是負(fù)責(zé)接收這八個引腳的值或者往這八個引腳輸出值,是該接收或者該輸出,就得看CON寄存器的八個引腳配置臉色行事呢,算是理清呢。

  GPJ0PUD (pull up down) 上拉下拉寄存器,控制引腳上的上下拉電阻。

  GPJ0DRV (driver)控制引腳的驅(qū)動能力。

  GPJ0CONPDN (power down)模式下的控制寄存器。

  GPJ0PUDPDN  (power down)模式下的上下拉配置寄存器。
  注:在驅(qū)動LED點(diǎn)亮?xí)r,應(yīng)該將GPIO配置為output模式。

進(jìn)一步分析點(diǎn)亮LED的方法:

  1、設(shè)置 GPIO中GPJ0組中的control寄存器模式為output模式(由圖一可知,其實(shí)只設(shè)置GPJ0_3、GPJ0_4、GPJ0_5、PWMTOUT1(對應(yīng)核心板上GPD0_1)

  2、設(shè)置GPIO中GPJ0組中的data控制的相應(yīng)的位為0。

  由圖2看出GPJ0的control寄存器對應(yīng)的內(nèi)存地址是0xE0200240,同理可查知dat的內(nèi)存地址為0xE0200244。

開始編碼:

  為了方便演示,代碼只做到控制前三顆LED燈。

  Makefile內(nèi)容:


led.bin: led.o

        arm-linux-ld -Ttext 0x0 -o led.elf $^

        arm-linux-objcopy -O binary led.elf led.bin

        arm-linux-objdump -D led.elf > led_elf.dis

        gcc mkv210_image.c -o mkx210

        ./mkx210 led.bin 210.bin

        

%.o : %.S

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


%.o : %.c

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


clean:

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


mkv210_image.c內(nèi)容(這個文件中的內(nèi)容可以先不用明白):


/*

 * mkv210_image.c的主要作用就是由usb啟動時使用的led.bin制作得到由sd卡啟動的鏡像210.bin

 *

 * 本文件來自于友善之臂的裸機(jī)教程,據(jù)友善之臂的文檔中講述,本文件是一個熱心網(wǎng)友提供,在此表示感謝。

 */

/* 在BL0階段,Irom內(nèi)固化的代碼讀取nandflash或SD卡前16K的內(nèi)容,

 * 并比對前16字節(jié)中的校驗(yàn)和是否正確,正確則繼續(xù),錯誤則停止。

 */

#include

#include

#include


#define BUFSIZE                 (16*1024)

#define IMG_SIZE                (16*1024)

#define SPL_HEADER_SIZE         16

//#define SPL_HEADER              'S5PC110 HEADER  '

#define SPL_HEADER              '****************'


int main (int argc, char *argv[])

{

    FILE        *fp;

    char        *Buf, *a;

    int        BufLen;

    int        nbytes, fileLen;

    unsigned int    checksum, count;

    int        i;

    

    // 1. 3個參數(shù)

    if (argc != 3)

    {

        printf('Usage: %s n', argv[0]);

        return -1;

    }


    // 2. 分配16K的buffer

    BufLen = BUFSIZE;

    Buf = (char *)malloc(BufLen);

    if (!Buf)

    {

        printf('Alloc buffer failed!n');

        return -1;

    }


    memset(Buf, 0x00, BufLen);


    // 3. 讀源bin到buffer

    // 3.1 打開源bin

    fp = fopen(argv[1], 'rb');

    if( fp == NULL)

    {

        printf('source file open errorn');

        free(Buf);

        return -1;

    }

    // 3.2 獲取源bin長度

    fseek(fp, 0L, SEEK_END);                                // 定位到文件尾

    fileLen = ftell(fp);                                    // 得到文件長度

    fseek(fp, 0L, SEEK_SET);                                // 再次定位到文件頭

    // 3.3 源bin長度不得超過16K-16byte

    count = (fileLen < (IMG_SIZE - SPL_HEADER_SIZE))

        ? fileLen : (IMG_SIZE - SPL_HEADER_SIZE);

    // 3.4 buffer[0~15]存放'S5PC110 HEADER  '

    memcpy(&Buf[0], SPL_HEADER, SPL_HEADER_SIZE);

    // 3.5 讀源bin到buffer[16]

    nbytes = fread(Buf + SPL_HEADER_SIZE, 1, count, fp);

    if ( nbytes != count )

    {

        printf('source file read errorn');

        free(Buf);

        fclose(fp);

        return -1;

    }

    fclose(fp);


    // 4. 計(jì)算校驗(yàn)和

     // 4.1 從第16byte開始統(tǒng)計(jì)buffer中共有幾個1

    // 4.1 從第16byte開始計(jì)算,把buffer中所有的字節(jié)數(shù)據(jù)加和起來得到的結(jié)果

    a = Buf + SPL_HEADER_SIZE;

    for(i = 0, checksum = 0; i < IMG_SIZE - SPL_HEADER_SIZE; i++)

        checksum += (0x000000FF) & *a++;

    // 4.2 將校驗(yàn)和保存在buffer[8~15]

    a = Buf + 8;                            // Buf是210.bin的起始地址,+8表示向后位移2個字,也就是說寫入到第3個字

    *( (unsigned int *)a ) = checksum;


    // 5. 拷貝buffer中的內(nèi)容到目的bin

    // 5.1 打開目的bin

    fp = fopen(argv[2], 'wb');

    if (fp == NULL)

    {

        printf('destination file open errorn');

        free(Buf);

        return -1;

    }

    // 5.2 將16k的buffer拷貝到目的bin中

    a = Buf;

    nbytes    = fwrite( a, 1, BufLen, fp);

    if ( nbytes != BufLen )

    {

        printf('destination file write errorn');

        free(Buf);

        fclose(fp);

        return -1;

    }


    free(Buf);

    fclose(fp);


    return 0;

}


write2sd內(nèi)容:


#!/bin/sh

sudo dd iflag=dsync oflag=dsync if=210.bin of=/dev/sdb seek=1

  led.S內(nèi)容(S是大寫,我是我們要編寫點(diǎn)亮LED的真正代碼):


/*

 *文件名:led.s

 *作者:airduce

 *描述:S5PV210開發(fā)板裸機(jī)學(xué)習(xí)第一個程序。

 */

 _start:

    //第一步:把0X11111111寫入0xE0200240(GPJ0CON)位置

    ldr r0, =0x11111111  //這里如果是#代表指令,如果是=帶表是偽指令

    ldr r1, =0xE0200240

    str r0, [r1]         //寄存器間接尋址。功能室吧r0中的數(shù)寫入r1中的數(shù)為地址的內(nèi)存中去

    //第二步:0x0寫入0xE0200244(GPJ0DATA)位置

    ldr r0, =0x0

    ldr r1, =0xE0200244

    str r0, [r1]         //把0寫入到GPJ0DATA寄存器中,引腳即輸出低電平,LED點(diǎn)亮。

flag:

    b flag                 //這兩行寫了一個死循環(huán)(不然程序只執(zhí)行一遍)


編寫上面led.S的文件,其他的三個先照搬就行,執(zhí)行make 命令后,把得到的led.bin用dnw工具燒到開發(fā)板的0xd0020010地址中,可以看到前三顆LED燈亮起來呢。


簡單的用匯編實(shí)現(xiàn)流水燈:


#define GPJ0CON  0xE0200240  //LED1、LED2、LED3所對應(yīng)的GPJ0組的control寄存器地址

#define GPJ0DAT  0xE0200244  //LED1、LED2、LED3所對應(yīng)的GPJ0組的data寄存器地址

#define GPD0CON  0xE02000A0  //LED4所對應(yīng)的GPD0組的control寄存器地址

#define GPD0DAT  0xE02000A4  //LED4所對應(yīng)的GPD0組的data寄存器地址

.global _start

 _start:

    ldr r0, =0x11111111    //設(shè)置GPJ0的CON寄存器的模式為output(這里只是統(tǒng)統(tǒng)搞為1,其實(shí)還可以更精確)

    ldr r1, =GPJ0CON

    str r0, [r1]


    ldr r0, =0x11111111    //設(shè)置GPD0的CON寄存器的模式為output(這里只是統(tǒng)統(tǒng)搞為1,其實(shí)還可以更精確)

        ldr r1, =GPD0CON

        str r0, [r1]


flash:         //循環(huán)開始

    ldr r0, =0<<3 | 1<<4 | 1<<5    //設(shè)置第一顆LED亮,第二、三顆滅可以寫成~(1<<3)   

    ldr r1, =GPJ0DAT

    str r0, [r1]

[1] [2]
關(guān)鍵字:嵌入式開發(fā)  點(diǎn)亮LED燈 引用地址:嵌入式開發(fā)學(xué)習(xí)(8)<一步一步點(diǎn)亮LED燈>

上一篇:嵌入式開發(fā)學(xué)習(xí)(6)
下一篇:嵌入式開發(fā)學(xué)習(xí)(10)<匯編寫啟動代碼之設(shè)置棧、調(diào)用c語言、開關(guān)看門狗和開關(guān)iCache>

推薦閱讀最新更新時間:2025-08-06 06:37

樹莓派玩轉(zhuǎn)STM32開發(fā)(三)——先從點(diǎn)亮一個LED燈開始
在開始正式寫代碼之前,首先要解決一件事,那就是我們該如何去寫這代碼。 在樹莓派搭建的Linux環(huán)境中,使用基于Xorg的桌面環(huán)境在本地開啟圖形化界面開發(fā)太耗費(fèi)系統(tǒng)資源,這個方案首先不考慮。不過還剩下兩種其他可行的方案,一是直接通過終端遠(yuǎn)程登陸進(jìn)行開發(fā),開發(fā)工作全部在文本模式下進(jìn)行;另一種則使用Samba服務(wù)將Linux的文件系統(tǒng)掛載到Windows中,然后在Windows上面使用圖形化界面的IDE開發(fā)。 如果你比較Geek,你可能會嘗試遠(yuǎn)程登陸的方式,通過Vim或者Emacs兩大神器之一進(jìn)行開發(fā)。不過他們兩者對新手不夠友好,具體可以自己體驗(yàn)一下,不過網(wǎng)上有個段子: 問:如何生成一個隨機(jī)字符串? 答:讓新手退出vim. 而且在沒
[單片機(jī)]
如何通過控制寄存器來點(diǎn)亮LED燈
學(xué)習(xí)本章時,配合《STM32F4xx中文參考手冊》 通用I/O(GPIO) 章節(jié)一起閱讀,效果會更佳,特別是涉及到寄存器說明的部分。關(guān)于建立工程時使用KEIL5的基本操作,請參考前面的章節(jié)。 7.1 GPIO簡介 GPIO是通用輸入輸出端口的簡稱,簡單來說就是STM32可控制的引腳,STM32芯片的GPIO引腳與外部設(shè)備連接起來,從而實(shí)現(xiàn)與外部通訊、控制以及數(shù)據(jù)采集的功能。STM32芯片的GPIO被分成很多組,每組有16個引腳,如型號為STM32F4IGT6型號的芯片有GPIOA、GPIOB、GPIOC至GPIOI共9組GPIO,芯片一共176個引腳,其中GPIO就占了一大部分,所有的GPIO引腳都有基本的輸入輸出功能。 最基
[單片機(jī)]
如何通過控制寄存器來<font color='red'>點(diǎn)亮</font><font color='red'>LED燈</font>
1、換種思路學(xué)Proteus之新建工程并點(diǎn)亮一顆LED燈
軟件版本:Proteus 8.9 SP0 說明:其他版本的Proteus軟件在操作上會略有差異,請大家參考“Help”幫助文檔 1、從零開始新建一個工程 雙擊 打開軟件,進(jìn)入到整個軟件的主界面 點(diǎn)擊“File- New Project” 彈出的對話框中“Name”欄改好工程的名字,我這里寫的是“LED”;“Path”欄中點(diǎn)擊“Browse”選擇好要保存的路徑(或者直接將路徑復(fù)制過來粘貼都可以);然后點(diǎn)擊“Next”。 這里要你選擇原理圖模板,我這里保持默認(rèn)的“Landscape A3”即可,點(diǎn)擊“Next” 這里保持默認(rèn)“Do not create a PCB layout(不創(chuàng)建PCB板)”,點(diǎn)擊“Next
[單片機(jī)]
1、換種思路學(xué)Proteus之新建工程并<font color='red'>點(diǎn)亮</font>一顆<font color='red'>LED燈</font>
51單片機(jī)點(diǎn)亮LED燈、流水燈
2-1點(diǎn)亮一個LED燈 1.首先在keil中新建一個工程,這里需要注意,將所寫的工程可以統(tǒng)一一個地方進(jìn)行存儲,這樣方便查找。之后再右擊添加新文件 2.首先右擊代碼行,引用文件 3.之后再編寫主函數(shù) 4.以其中亮一個LED燈為例,編寫程序如下: P2=0xFE;//1111 1110 轉(zhuǎn)換成十六進(jìn)制0x表示前綴代表的是十六進(jìn)制數(shù) P2=0xFE;//1111 1110 下載程序后到STC-ISP中選擇單片機(jī)的型號,串口號,打開相應(yīng)的程序文件,進(jìn)行下載編程 5.實(shí)現(xiàn)效果 6.當(dāng)然,也可以加上循環(huán)語句表示讓其一直循環(huán)下去,實(shí)現(xiàn)效果是一樣的 通過點(diǎn)亮第一個LED燈,可以知道以八個一組為例改變010
[單片機(jī)]
51單片機(jī)<font color='red'>點(diǎn)亮</font><font color='red'>LED燈</font>、流水燈
uboot-2011.12移植到S3C2440(二)——點(diǎn)亮LED燈,the very beginning。
一般的,在初始的時候,u-boot沒有任何調(diào)試手段。為了得到u-boot的內(nèi)部運(yùn)行狀態(tài),使能LED是一個最好的選擇。這里不包括使用仿真器。 ldr r0, =GPBUP #設(shè)置為上拉 ldr r1, orr r1, r1, #0xe0 str r1, ldr r0, =GPBCON #設(shè)置為IO功能 ldr r1, orr r1, r1, #0x5400 str r1, ldr r0, =GPBDAT #輸出全部為1 ldr r1, =0xffffffff str r1,
[單片機(jī)]
STM32F429--固件庫點(diǎn)亮LED燈
文件說明 bsp_led.c負(fù)責(zé)LED的初始化配置 bsp_led.h負(fù)責(zé)外設(shè)LED函數(shù)的聲明,以及宏定義,提高移植性 main.c實(shí)現(xiàn)功能點(diǎn)亮LED 代碼 1.mai.c #include stm32f4xx.h #include bsp_led.h int main(void) { while(1) { LED_GPIO_Config(); } } 2.bsp_led.c #include bsp_led.h void LED_GPIO_Config(void) { //定義一個結(jié)構(gòu)體指針對象 GPIO_InitStruct來調(diào)用成員 GPIO_InitType
[單片機(jī)]
jz2440裸機(jī)開發(fā)與分析: 點(diǎn)亮LED燈之C語言1
存儲過程分析 開辟一塊內(nèi)存用來存放寄存器地址,之后間接的修改寄存器內(nèi)部的數(shù)值 c語言代碼 按照常規(guī)先寫主函數(shù)點(diǎn)亮LED燈 int main() { unsigned int *pGPFCON = (unsigned int *)0x56000050; unsigned int *pGPFDAT = (unsigned int *)0x56000054; /* 配置GPF4為輸出引腳 */ *pGPFCON = 0x100; /* 設(shè)置GPF4輸出0 */ *pGPFDAT = 0; return 0; } 之前有MDK寫到這里就可以了,MDK的啟動代碼最主要的目的為CPU分配各種模式下
[單片機(jī)]
jz2440裸機(jī)開發(fā)與分析: <font color='red'>點(diǎn)亮</font><font color='red'>LED燈</font>之C語言1
51單片機(jī)自學(xué)筆記(四)——點(diǎn)亮LED燈、流水燈
LED燈 LED全稱為半導(dǎo)體發(fā)光二極管,是采用半導(dǎo)體材料制成的,是一種直接將電能轉(zhuǎn)換為光能,電信號轉(zhuǎn)換為光信號的發(fā)光器件。其特點(diǎn)是功耗低、高亮度、色彩艷麗、抗振動、壽命長(正常發(fā)光時長8—10萬小時)、冷光源等,是真正的“綠色照明”。實(shí)物圖: LED在電路圖中的符號為: 它具有二極管的基本特性,即正向?qū)ǎ聪蚪刂?。要想點(diǎn)亮LED需要從正向流過工作電流。 不同LED小燈的工作壓降不同,普通發(fā)光二極管的工作壓降范圍為:1.6—2.1V。工作電流為:1—20mA。 點(diǎn)亮單片機(jī)中LED燈 單片機(jī)中LED模塊原理圖: 通過觀察電路原理圖可以得出:要點(diǎn)亮開發(fā)板上LED小燈只需要控制P2口輸出低電平即可(即給P2口賦值“0
[單片機(jī)]
51單片機(jī)自學(xué)筆記(四)——<font color='red'>點(diǎn)亮</font><font color='red'>LED燈</font>、流水燈
小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved