正點原子Mini Linux C語言驅動LED燈

2021-10-06 08:08:58 字數 2088 閱讀 5574

現在終於可以使用習慣的c語言進行**的編寫了,但是在編寫主要c語言**之前,還是需要使用彙編進行一系列的準備操作,這和stm32每個專案的彙編啟動檔案相似。下面介紹詳細的方法:

二、c語言編寫

三、程式的編譯鏈結

四、其他知識鏈結

.global _start

_start

:/* 設定處理器進入svc模式 */

mrs r0, cpsr @ 讀取cpsr到r0

bic r0, r0, #0x1f @ 清除cpsr的bit4~0

orr r0, r0, #0x13 @ 設定為svc模式

msr cpsr, r0 @ 將設定好的r0寫入到cpsr

設定好了處理器模式之後,需要對sp指標進行設定(sp指標可以指向內如ram,也可以指向ddr,這裡將其指向了ddr)。設定棧大小為2mb = 0x200000,因為對於cortex-a7棧是向下增長的,為了使其不越界ddr起始位址0x80000000,這裡設定sp指標指向0x80200000。

/* 設定sp指標 */

ldr sp, = 0x80200000

這裡是c語言環境構建的最後一步,在設定好處理器模式並初始化了sp指標之後,就可以使用c語言了,這裡只需要進行一下跳轉,具體的話可是使用b指令轉跳到main函式。

b main			@ 跳轉到c語言main函式
這三段**都在一.s檔案下

在上述操作下,c語言的執行環境已經搭建完畢了,現在就可以編寫led的c**了,這個實驗很簡單,只包括乙個main.c和乙個main.**件,main.h裡面主要對暫存器位址進行巨集定義,在main.c中編寫具體main函式實驗led的點亮和閃爍。

這裡main.h的內容就不全部書寫出來,用到的就是彙編驅動led時的那些暫存器。這裡主要還是volatile這個關鍵字,在我學習32時沒有深入學習,因此在網上查閱了相關資料,大家可以參考用c語言巨集定義暫存器位址解釋 和 關鍵字 volatile

另外關於main.c的程式發開指南有詳解,這裡就不再贅述。

objs = start.o main.o		# 定義變數(

:= 和 = 有一些細微的差別,可自行查閱,在這裡都可以使用)

ledc.bin

: $(objs)

arm-linux-gnueabihf-ld -ttext 0x87800000 -o ledc.elf &^

arm-linux-gnueabihf-objcopy -o binary -s ledc.elf $@

arm-linux-gnueabihf-objdump -d -m arm ledc.elf > led.dis

%.o: %.s

arm-linux-gnueabihf-gcc -wall -nostdlib -c -o &@ $< # -wall -nostdlib 優化

%.o: %.s

arm-linux-gnueabihf-gcc -wall -nostdlib -c -o &@ $<

%.o: %.c

arm-linux-gnueabihf-gcc -wall -nostdlib -c -o &@ $<

clean

: rm -rf *.o ledc.bin ledc.elf ledc.dis

意義.text

**段,存放程式執行**的區域

.data

初始化的資料段,存放程式中已初始化的全域性變數

.bss

未初始化的資料段,存放程式中未初始化的全域性變數

.rodata

唯讀資料段,存放c語言中的字串和巨集定義常量

arm-linux-gnueabihf -t《鏈結檔名》 ledc.elf &^
例如 :arm-linux-gnueabihf -timx6ul.lds ledc.elf &^

這裡是一些指令的介紹:

arm-linux-gnueabihf-ld介紹

arm-linux-gnueabihf-objcopy介紹

arm-linux-gnueabihf-objdump介紹

正點原子Mini Linux UART串列埠簡單介紹

二 部分例程 uart,也就是非同步序列收發器,使用uart與外界相連最少只要三條線 txd 傳送 rxd 接收 和gnd 地線 uart串列埠的介面電平有ttl和rs 232兩種,在正電原子的這款mini linux開發板上有ch340晶元,可以實現usb和串列埠ttl訊號之間的轉換,這裡用到的是...

正點原子 Mini Linux BSP工程管理

靜態模式 其他疑問 模仿stm32驅動開發實驗中,主要是在.s檔案中新增了清除.bss段資料 未初始化的資料段 的 在.件下對時鐘,io暫存器組的基位址進行巨集定義,並構造了對應的結構體 注意暫存器位址的連續性 最後將各個外設的暫存器組基位址強轉為對應的結構體指標並進行巨集定義,這樣在主函式中就能像...

(正點原子例程)wifi實驗(7 16)

正點原子wifi實驗分析 fatfs檔案系統分為三個層 應用層 fatfs模組 fats模組提供底層介面驅動層。1.應用層只需要呼叫fats提供的介面函式,如f open f read f write和f close等。2.fatfs模組提供的是ff.c和ff.h.除非有必要,一般情況下只需要直接包...