日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

arm-4-裸板开发

發(fā)布時間:2023/12/10 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 arm-4-裸板开发 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

程序鏈接(運行)地址和程序地址

ld文件就是鏈接文件,鏈接地址是指程序運行的地址在哪里(運行的時候,放到內(nèi)存里去運行),程序地址是指程序儲存在哪里

在芯片手冊中找到gpio,控制地址,設(shè)置接口,最核心的就是start.s文件

make – 燒錄到sd卡(自帶的工具) – evm設(shè)置 – 上電
使用minitool

200000是鏈接地址

使用sd卡,可以將程序拷貝到0x0000,沒有superboot也可以運行
使用minitool,可以將程序拷貝到0x2000,必須要有superboot才可以運行
那么其中到底發(fā)生了什么事情呢,為什么他們兩個有差異

arm啟動順序

1.看文檔
2.看文檔,芯片手冊-overview

dmz:隔離區(qū)

sfrs;特殊寄存器


這塊叫什么呢?

這塊叫boot area 啟動區(qū),裸板程序就在這里,因為irom里面有一塊固化代碼,包含了看門狗等,這也就是為什么裸板不用看門狗,把程序放在這里,他就直接跑起來了

外設(shè)總線尋址地址

控制器–onenand


所以有boot就燒到20000,沒有就燒到0000(起始地址)

看看啟動了

gpio和boot啟動

rom里面的固有程序會把硬盤中的第一段bootloader程序(16k校驗)搬到芯片內(nèi)部iram,如果運行成功,就搬第二段,全成功了就啟動os,再把os轉(zhuǎn)到內(nèi)存里

1.啟動irom上面的code
2.搬bl1到iram
3.搬bl2到ram
4.bl2啟動os kernel
5…os kernel 到dram

裸板程序是在iram上運行的
superboot是在第6步完成,superboot實際上幫忙完成了2,3兩步驟



因為有一個16k的偏移,所以才會是D002001![在這里插入圖片描述](https://img-blog.csdnimg.cn/40a8b542841d4acebbaeff6d9c223f1e.png

GPIO

怎么操作GPIO呢,那我們的led燈來舉例:
打開芯片手冊和電路圖,在電路圖里面搜索led,在芯片手冊里面搜索

在芯片手冊中可以找到組

在芯片手冊中找到位置

寄存器有8個,每個4位,也就是總共要有21位
燈亮的地址是0001
四個燈要亮就是0000 0000 0000 0000 0001 0001 0001 0001
轉(zhuǎn)換成16進制就是0x0000 1111

0xe地址,我們看一下,他的程序儲存在哪里

儲存在這里,sfrs特殊寄存器里

我們知道了啟動位置之后,就可以開始實驗:
實驗?zāi)繕?biāo):
1.使用匯編來進行裸板程序點亮led
2.用c完成實驗一
3.通過key來控制led的點亮
4.優(yōu)化程序,makefile,控制看門狗和cache緩存

1.使用匯編來進行裸板程序點亮led

需要做:
1.把0xE0200280設(shè)置成0x00001111的開燈模式
2.把0xE0200284設(shè)置成0x00, 所有位設(shè)置成0,低電平

mov r0,0xE0200280 這樣是不行的,因為mov是只能操縱寄存器內(nèi)部的,不能涉及到外部的存儲器

ldr可以用于內(nèi)部和外部寄存器的交換

ldr和mov的區(qū)別: https://blog.csdn.net/heybeaman/article/details/79236462https://www.cnblogs.com/zhiminyu/p/15629073.html

ldr r0,#0xE0200280 這個意思是吧#0xE0200280里面的值讀取到r0
所以也不行
改成:
ldr r0 ,= 0xE0200280 //這個意思就是把0xE0200280賦值到r0

mov r1 ,#0x00001111

str r1,[r0] //把r1的值存到r0的地址里面去

完整代碼:
ldr r0 ,= 0xE0200284
mov r1 , 0x000011111
str r1,[r0]

編譯make文件—生成bin文件—基于匯編文件
編譯,鏈接參見鏈接文件,去頭(binary是二進制的意思)

燒錄bin文件,連接開發(fā)板,打開minitool和開發(fā)板

2.使用c語言

凡是和寄存器相關(guān)的地址,都要用到volatile,防止被修改優(yōu)化

1.#define JPGCON ( * (volatile unsigned long * )0xE0200280)
(volatile unsigned long * )0xE0200280 指向地址
* (volatile unsigned long * )0xE0200280 指向地址的值

2.#define JPGDAT ( * (volatile unsigned long * )0xE0200284)

#define JPGCON ( * (volatile unsigned long * )0xE0200280)#define JPGDAT ( * (volatile unsigned long * )0xE0200284)int main (){JPGCON = 0x00001111;JPGDAT = 0x00;return 0;}

修改匯編代碼
源代碼:

.text.global _start_start:LDR R0 ,= 0xE0200280MOV R1 , 0x00001111STR R1,[R0]LDR R0 ,= 0xE0200284MOV R1 , 0x00STR R1,[R0]`loop: B loop

修改后的代碼

.text.global _start_start:BL mainB loop/*LDR R0 ,= 0xE0200280MOV R1 , 0x00001111STR R1,[R0]LDR R0 ,= 0xE0200284MOV R1 , 0x00STR R1,[R0]`loop: B loop/*

在makefile中加入c的東西:


make,燒錄

3.制作一個蜂鳴器的程序

匯編代碼

.text .global _start _start:BL main_loop:B _loop

電路圖找到蜂鳴器–


通過引腳在芯片手冊找到io口

在芯片手冊,找到控制寄存器以及數(shù)字寄存器地址值

完善下思路

開始編寫main。c

#define GPD0CON ( * (volatile unsigned long * )0xE020_00A0) #define GPD0DAT ( * (volatile unsigned long * )0xE020_00A4) int main (){GPD0CON |= 1<<0; //把引腳變成輸出,最后一位變成1while(1) //死循環(huán),一直響{buzzer_on(); //控制電平高delay(0x5000); //延遲buzzer_off(); //控制低電平delay(0x5000); //延遲}return 0;} void buzzer_on(void) {GPD0DAT |= 1<<0 ; //1<<0的意思是1左移0位 *1<<2 = 100//|=就是或者,只要有一位是1,就是1,這里的意思是,把最后一位變成1,為什么不直接是1呢,因為這樣子就可以指定哪一位是1 }void buzzer_off(void) {GPD0DAT &= ~(1<<0) ;~取反,1就是0 }void delay(unsigned long count) {volatitle unsigned long i = count;while (i--); }``

makefile

然后再燒寫運行

使用button控制
找到button的引腳,再找到值,在找到地址

在芯片手冊里面找到

#define GPD0CON ( * (volatile unsigned long * )0xE020_00A0) #define GPD0DAT ( * (volatile unsigned long * )0xE020_00A4) #define GPH0CON ( * (volatile unsigned long * )0xE020_0C40) #define GPH0DAT ( * (volatile unsigned long * )0xE020_0C44) int main (){GPD0CON |= 1<<0; //把引腳變成輸出GPH0CON &= ~(1<<0)while(1) //死循環(huán),一直待命{if(GPH0DAT &1<<0))//按鍵的電平如果為0001:1&1 = 1則buzzer_off();else//按鍵的電平如果為0000:0&1 = 0則buzzer_on();}return 0;} void buzzer_on(void) {GPD0DAT |= 1<<0 ; //1<<0的意思是1左移0位 *1<<2 = 100//|=就是或者,只要有一位是1,就是1,這里的意思是,把最后一位變成1,為什么不直接是0x01呢,因為這樣子就可以指定哪一位是1 }void buzzer_off(void) {GPD0DAT &= ~(1<<0) ;//~取反,1就是0 }void delay(unsigned long count) {volatitle unsigned long i = count;while (i--); }

修改makefile

特別注意的事情是,因為死循環(huán)太占用資源而且不方便,所以通常不采用這種輪詢的方式,而是采用中斷的方式

總結(jié)

以上是生活随笔為你收集整理的arm-4-裸板开发的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。