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
各种接口需学会查看芯片手册和外围电路图,并学会参考芯片厂商的例程。