IMX6ULL裸機第一次彙編點亮LED

2021-10-05 14:20:33 字數 3821 閱讀 4870

部落格介紹

硬體:正點原子linux開發板im6ull

開發環境:ubuntu下的vscode

功能:配置引腳gpio1_io03驅動led的亮滅。

參考:imx6ull串列埠手冊.pdf、i.mx6u 嵌入式 linux 驅動開發指南 v1.3.pdf

leds.s檔案

/*

檔案功能:使用彙編點燈

使用引腳:gpio1_io03*/

.global

_start

@全域性標號

_start:@1.

使能所有外設時鐘

@使能ccgr1所有時鐘

ldrr0,=

0x020c4068

@ccm_ccgr0

位址ldrr1,

=0xffffffff

@向ccm_ccgr0中寫入的資料,也就是設定時鐘引數

strr1,[

r0]@

將資料r1寫入ccm_ccgr0所在位址內

ldrr0,=

0x020c406c

@ccm_ccgr1

位址strr1,

[r0] ldrr0,

=0x020c4070

@ccm_ccgr2

位址strr1,

[r0] ldrr0,

=0x020c4074

@ccm_ccgr3

位址strr1,

[r0] ldrr0,

=0x020c4078

@ccm_ccgr4

位址strr1,

[r0] ldrr0,

=0x020c407c

@ccm_ccgr5

位址strr1,

[r0] ldrr0,

=0x020c4080

@ccm_ccgr6

位址strr1,

[r0]@

2.配置gpio1_io03模式

@設定引腳模式

操作暫存器

iomuxc_sw_mux_ctl_pad_gpio1_io03

位址0x020e0068

ldrr0,=

0x020e0068

@iomuxc_sw_mux_ctl_pad_gpio1_io03的位址

ldrr1,=

0x00000005

@設定為alt5模式

strr1,[

r0]@

寫入配置設定為gpio1_io03@3.

配置gpio1_io3的電器屬性

@配置引腳的電器屬性

操作暫存器

iomuxc_sw_pad_ctl_pad_gpio1_io3

位址0x020e02f4

ldrr0,=

0x020e02f4

@iomuxc_sw_mux_ctl_pad_gpio1_io03的位址

ldrr1,=

0x000090b0

@配置電器屬性暫存器為

strr1,[

r0]/

*bit16:

yhs:作為輸入有效,遲滯比較器0失能

bit14-15:

pus:設定上下拉與電阻大小

10上拉電阻

100k

bit13:

pue:作為輸入時使能或禁止上下拉0禁止

bit12:

pke:作為輸出時使能或禁止下拉1使能

bit11:

ode:作用輸出時使能開漏輸出

0關閉開漏輸出

bit6-7:

speed:io作用輸出時速度

10100

mhzbit3-5:

dse:輸出時設定驅動能力

110r0/6

bit0:

sre:設定壓擺率

0低壓擺率*/

@4.設定gpio1_io03引腳方向---輸入\輸出

@配置引腳方向為輸出

操作暫存器gpio1_gdir

位址0x0209c004

ldrr0,=

0x0209c004

ldrr1,[

r0]@

獲取原始資料

orrr1,r1

,#0x00000008

@將gpio1_gdir的bit3為設定為

1strr1,

[r0] @

寫入配置將gpio1_io03設定為輸出@5.

操作gpio1_io03引腳的控制暫存器

@操作引腳輸出高低電平

操作暫存器gpio1_dr

位址0x0209c000

ldrr0,=

0x0209c000

ldrr1,[

r0]@

獲取gpio1_dr暫存器資料

andr1,r1

,#0xfffffff7

@將gpio1_dr的bit3為設定為

0strr1,

[r0] @

寫入配置將gpio1_io03設定為低電平

loop:

bloop

@此處為乙個死迴圈,防止程式結束

makefile檔案

leb

.bin:leds.s

arm-linux-gnueabihf-gcc

-g-c

leds.s

-oled.o

arm-linux-gnueabihf-ld

-ttext

0x87800000

led.o-o

led.

elfarm-linux-gnueabilf-objcopy

-obinary

-s-g

led.

elfled

.bin

arm-linux-gnueabilf-objump

-dled

.elf

>

led.

dis

檔案將解釋:

編譯leds.s生成led.o

arm-linux-gnueabihf-gcc -g -c leds.s -o led.o

鏈結arm-linux-gnueabihf-ld -ttext 0x87800000 led.o -led.elf

轉換為二進位制檔案

arm-linux-gnueabilf-objcopy -o binary -s -g led.elf led.bin

反彙編 可以省略

arm-linux-gnueabilf-objump -d led.elf > led.dis

執行makefile檔案

將sd開插入電腦,在虛擬中使用命令:ls /dev/sd* ;檢視sd卡的碟符

使用正點原子提供的燒寫工具 imxdownload ; 為 imxdownload檔案 新增可執行許可權

燒錄:./imxdownload led.bin /dev/sdb

設定boot模式為sd卡啟動方式

插入sd卡

上電觀察

刪除第一步中的1.使能所有外設時鐘。程式程式依然能夠點亮led。

彙編第一次作業

通過對彙編第一章的學習,我複習了以往的知識,同時也收穫到了一些新知識。這章主要講述了以下幾個內容 計算機程式語言的演進,組合語言源程式的組成,計算機硬體系統的基本結構以及記憶體位址空間。計算機程式語言經歷了從機器語言到組合語言再到高階語言的三個階段.機器語言就是一些0,1組成的數字,然後計算機將之轉...

彙編實踐課第一次作業

第一次 1.求正數,負數的絕對值和and個數和 2.兩數相加 3.求出數字的回文數 4.求出陣列最大值的下標 找正數 含0 和負數的個數和絕對值和 include irvine32.inc data array dd 12,34,56,12,34,9,0,3,0,5,3,5 len dd array...

第一次小小滴研究彙編

因為想嘗試使用intel cpu的rdtsc指令來為程式計數,所以查閱了相關資料,嘗試後發現gcc下使用rdtsc指令不能獲得正確的結果,於是想看看c的 編譯成彙編的樣子 gcc下得這樣 g o main.s main.cpp s 微軟的cl編譯器得這樣 cl.exe fas main.cpp gc...