裸机开发
开发板
复杂 嵌入式产品
裸机驱动的开发步骤(最简例子 LED灯控制)
1. 看电路图
a. 找到我要控制的设备
b. 找到设备在CPU侧的控制管脚(如GPX2_7)
2. 看芯片手册 (先看相关的中文文档,熟悉设备,再看手册)
a. 搜索电路图里对应控制管脚的名称(如GPX2)
b. 看目录找到对应的控制模块(如:6 General Purpose Input/Output (GPIO) Control)
c. 看该模块的overview 了解该模块的大概功能
d. 看控制寄存器(REGISTER DESCRIPTION) 重点,难点
注: 如果寄存器比较多什么办?
看技术支持提供的例子程序, 找到需要修改的寄存器(常常只有几个)。
部分厂商会提供配置软件,通过界面去配置功能, 我们只需使用配置好的寄存器值就可以了
3. 编程
a. 定义要控制的寄存器的宏 (与手册里的寄存器地址对应起来)
b. 设备初始化 (如设置GPIO为输出状态)
c. 把功能分成最基本的小块,逐个实现 如点亮灯-> 在灭灯-> 加延时->闪烁-> 跑马灯
SOC片上系统
LED 灯控制程序
.equ GPX2CON,0x11000C40
.equ GPX2DAT,0x11000C44
.section .text
.globl _start
_start:
@set Pin OutPut
ldr r0,=GPX2CON
ldr r1,[r0]
bic r1,#0xF0000000
orr r1,#0x10000000
str r1,[r0]
@set Pin High Level for led on
ldr r2,=GPX2DAT
ldr r3,[r2]
orr r3,#0x80
str r3,[r2]
loop_stop: b loop_stop
delay1s:
ldr r4,=0x1ffffff
delay1s_loop:
sub r4,r4,#1
cmp r4,#0
bne delay1s_loop
mov pc,lr
.end
Makefile 编译程序
CROSS = arm-none-linux-gnueabi- 注:指定交叉编译工具
CC=$(CROSS)gcc
LD=$(CROSS)ld
OBJCOPY=$(CROSS)objcopy
all: led.s
$(CC) -g -c -o led.o led.s
$(LD) led.o -Ttext 0x43e00000 -o led.elf
注: -Ttext 指定链接地址为 0x43e00000
$(OBJCOPY) -O binary -S led.elf led.bin
注:转换为 binary 格式的,这样在u-boot中才能直接运行
$(CROSS)objdump -D led.elf > led.dis
注:objdump -D 反汇编生成文件 led.dis
clean:
rm -f *.o *.elf *.bin *.dis
嵌入式Linux交叉开发环境硬件基本组成
• 开发主机(Host)
• 目标机(Target)
• 连接介质
Linux开发环境 搭建
1. 虚拟机与window建立文件共享
VM -> setting -> Options -> ShareFolder->add E盘 -> Always enable
$cd /mnt/hgfs/E 该目录就是共享目录
2. 交叉编译工具安装
拷贝gcc-4.6.4.tar.xz到linux系统中
$ tar xvf gcc-4.6.4.tar.xz
$ export PATH=xxx/gcc-4.6.4/bin:$PATH
xxx是 gcc-4.6.4解压后所在的目录
$ arm-n 按Tab键能补全为
arm-none-linux-gnueabi- 表示安装成功
3. 看到串口信息
连接串口线,安装串口驱动
打开超级终端 选择对应串口
串口设置为 115200 flow control = none
重上电能看到串口信息
4. 用串口传输文件
串口终端里输入
loadb 40001000
再选传送-> 发送文件->选择待发送的文件
如led.bin
选协议为kermit ,点传送
5. 运行裸机程序
go 40001000