arm-4-裸板开发
程序鏈接(運行)地址和程序地址
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換成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.htmlldr 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: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
makefile
然后再燒寫運行
使用button控制
找到button的引腳,再找到值,在找到地址
在芯片手冊里面找到
修改makefile
特別注意的事情是,因為死循環(huán)太占用資源而且不方便,所以通常不采用這種輪詢的方式,而是采用中斷的方式
總結(jié)
以上是生活随笔為你收集整理的arm-4-裸板开发的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt C++ 命名空间namespace
- 下一篇: android音乐播放器完整教程,and