ARM裸机开发

开发板

本次课程使用的是4412开发板

CPU: exynos4412; RAM:2G*4 共8G ROM:4G EMMC

注意:很多硬件名字繁杂,在此明确一下,
主记忆体: 内存 == RAM == DDR
辅助记忆体:硬盘 == ROM == FLASH

裸机驱动的开发步骤

  1. 看电路图
    a. 找到要控制的设备
    b. 找到设备在CPU侧的控制管脚(如:GPX2_7)

  2. 看芯片手册(先看相关的中文文档,熟悉设备,再看手册)
    a. 搜索电路图里对应控制管脚的名称(如GPX2)
    b. 看目录找到对应的控制模块(如:6 General Purpose Input/Output (GPIO) Control)
    c. 看该模块的overview 了解该模块的大概功能
    d. 看控制寄存器(REGISTER DESCRIPTION) 重点,难点
    注: 如果寄存器比较多什么办?
    看技术支持提供的例子程序, 找到需要修改的寄存器(常常只有几个)。
    部分厂商会提供配置软件,通过界面去配置功能, 我们只需使用配置好的寄存器值就可以了

范例:
假设 现在要控制LED5的亮灭
1.查看商家提供的使用手册(范例中使用fs4412-dev-v0.pdf),找到LED设备

2.找到LED5灯对应的芯片端的管脚:XvSYS_OE/GPF3_5
3.查看4412芯片手册(范例中使用TOPEET_coreboard4412_scp.pdf),找到芯片中对应的管脚(XvSYS_OE/GPF3_5)

4.查看4412芯片手册(范例中这里使用SEC_Exynos 4412 SCP_Users Manual_Ver.0.10.00_Preliminary.pdf),查询GPF3,
直接查询GPF3_5可能会查不到结果。这里查询完可以看到有GPF3_CON控制端口和GPF3_DAT数据端口两个,都需要设置。

5.先查GPF3CON,查看到output的值=0x01,GPF3CON的地址= 0x1140_0000 + 0x01E0。

6.再查GPF3DAT,查看到GPF3DAT的地址= 0x1140_0000 + 0x01E4。

  1. 编程
    a. 定义要控制的寄存器的宏 (与手册里的寄存器地址对应起来)
    b. 设备初始化 (如设置GPIO为输出状态)
    c. 把功能分成最基本的小块,逐个实现 如点亮灯->灭灯->加延迟->闪烁->跑马灯

SoC(system on chip)片上系统

LED 灯控制程序(该程序为点亮LED2的程序 非上面范例说的LED5的程序。)

.text
@ Led control project
@ 2020/10/24 by LSY

.equ GPX2CON,0x11000C40
.equ GPX2DAT,0x11000C44

loop:
	@set LED control = OUTPUT
	ldr r0,=GPX2CON
	ldr r1,[r0]
	bic r1,#0x0F000000
	orr r1,#0x10000000
	str r1,[r0]
	
	@open led
	ldr r0,=GPX2DAT
	ldr r1,[r0]
	orr r1,#0x80
	str r1,[r0]
	bl delay1s

	@close led
	ldr r0,=GPX2DAT
	ldr r1,[r0]
	bic r1,#0x80
	str r1,[r0]
	bl delay1s
	b loop
	
delay1s:     
   ldr sp, =space_top
	stmfd sp!,{r0-r12,lr}
	ldr r5,=0x3FFFFFF
delay1s_loop:     
	sub r5,#1
	cmp r5,#0
	bne delay_loop
	ldmfd sp!,{r0-r12,pc}

.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交叉开发环境硬件基本组成

  1. 开发主机(Host)
  2. 目标机(Target)
  3. 连接介质

Linux交叉开发环境软件部分的搭建

  1. 虚拟机与window建立文件共享(也可利用VMTOOL直接将文件拖拽复制进linux虚拟机)
    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-  表示安装成功

  1. 看到串口信息
    连接串口线,安装串口驱动 (一般会自动安装 如果未成功安装可尝试安装包 已上传服务器)
    打开超级终端 选择对应串口 (win10没有超级终端。相关文件已打包上传服务器备份。)
    串口设置为 115200 flow control = none


    重上电能看到串口信息

  1. 用串口传输文件
    串口终端里输入
    loadb   40001000
    
    再选传送-> 发送文件->选择待发送的文件
    如led.bin
    选协议为kermit ,点传送
  2. 运行裸机程序
   go   40001000