ARM開發
1.寄存器:
控制寄存器、數據寄存器、狀態寄存器
2.linux內核:
進程管理、內存管理、文件系統、設備控制、網絡
3.嵌入式
專用的定制的計算機系統
4.DMA總線
主存儲器和外部設備(IO接口)之間直接進行數據傳輸的通道,不需要經過CPU
45.串口
2、3連接數據傳輸和接收端,5接地
6.指令集
CISC復雜指令集
RISC精簡指令集
7.ARM 處理器里面有37個寄存器
8.ARM工作模式
User、FIQ、IRQ、Supervisor、Abort、Undef、System
Mode位:處理器模式位
10000 User mode 10111 Abort mode
10001 FIQ mode; 11011 Undfined mode
10010 IRQ 11111 System mode;
10011 SVC mode;
9.
10.
MRS指令 mrs r0,cpsr 將cpsr賦值給r0
MSR指令 msr cpsr,r0 給cpsr賦值為r0
操作cpsr不能用mov指令
11.
cmp r0,#0
moveq r1,#0 cmp結果等于則執行該行
addgt r1,r1,#3 cmp比較結果大于則執行該行
12.
mov指令只能操作一個字節內或者通過一個字節內數字左移偶數位得到的數
and 按位與
orr 按位或
13.
bic r0,r1,#0x03 0x03:0000 0011 對r1的0位和1位清零
bic cpsr,#0xc0
bic不能直接操作cpsr
tst r0,#0x20 0x20::0010 0000 測試第六位是否為零
跳轉b、bl
14.
ldr r0,[r1] 將r1地址加載到r0寄存器
str r0,[r1,#12]! 有感嘆號,r1地址變為r1+12
str r0,[r1,#12] 無感嘆號,r1地址不變
LDRB 的指令格式與LDR相似,是將存儲器地址中的8位(1個字節)讀到目的寄存器中。
LDRH的指令格式也與LDR相似,它是將內存中的16位(半字)讀到目的寄存器中。
load意為加載、填充 加載填充寄存器 即為給寄存器賦值
store意為存儲 存儲寄存器 即為將寄存器的值存儲在其他地址
stmfd 滿增出棧
ldmfd 滿增入棧
15.
arm處理器一般使用小端模式
匯編里用@作注釋
arm 7種異常 對應5種模式 每個異常占用4個字節
b的跳轉范圍是2^24 也就是16M
ldr的跳轉范圍是2^32 也就是4G
bootloader引導程序 初始化硬件,加載操作系統
led2 GPX2_7
環境變量路徑 /etc/profile
環境變量格式PATH=$PATH:/home/ubuntu/gcc-4.6.4/bin
source /etc/profile 導入環境變量
export /etc/profile 顯示環境變量
16.三類寄存器:
配置寄存器
數據寄存器
狀態寄存器
17.
串口2初始化:
GPA1CON GPA1CON & ~0xff | 0x22 設置串口發送接收模式
ULCON2 0x3
UCON2 0x5
UBRDIV2 53 (115200波特率)
UFRACVAL2 4 (115200波特率)
18.
arm編譯指令
arm-none-linux-gnueabi-gcc
19.
無源蜂鳴器 內部無振蕩器,需要輸入方波使其產生蜂鳴
有源蜂鳴器 內部有振蕩器,只需要一個持續電壓信號即可使其產生蜂鳴
20.
疑難點:
1.在ARM處理器的匯編語言中,對指令語法格式中的的常數表達式有這樣的規定:“該常數必須對應8位位圖,即常數是由一個8位的常數循環移位偶數位得到的。”
比較下來, 我們可以這樣總結:
1) 判斷一個數是否符合8位位圖的原則, 首先看這個數的二進制表示中1的個數是否不超過8個. 如果不超過8個, 再看這n個1(n<=8)是否能同時放到8個二進制位中, 如果可以放進去, 再看這八個二進制位是否可以循環右移偶數位得到我們欲使用的數. 如果可以, 則此數符合8位位圖原理, 是合法的立即數. 否則, 不符合.
2) 無法表示的32位數, 只有通過邏輯或算術運算等其它途徑獲得了. 比如0xffffff00, 可以通過0x000000ff按位取反得到.
21.
別名:R11=fp;R12=ip;R13=SP;R14=LR;R15=PC
各種接口需學會查看芯片手冊和外圍電路圖,并學會參考芯片廠商的例程。