Arm 裸机开发 LED
逻辑开发步骤

- 看电路图
- 看芯片手册
- 编程
点灯
电路图:
fs4412-dev-v0.pdf
TOPEET_coreboard4412_scp.pdf
SEC_Exynos 4412 SCP_Users Manual_Ver.0.10.00_Preliminary.pdf
找到led
Tip 如果没有模拟电路数字电路基础可以去补充一下
我们的灯叫发光二极管
默认二极管是不导通的,想要发光必须在引脚输出高电平
- CHG_COK
- CHG_FLT
- XvVSYNC_LDI
- XvSYS_OE
加三极管的作用
导通后发光二极管就能接地了,就可以亮了。
如果电阻是1K 3.3V / 1K = 3.3毫安左右
一个是3.3一百个有可能会把cpu烧掉
电流越大,发热越厉害,所以一般情况下不直接接设备
都会中间加一个三极管,三极管的作用为了实现弱电流控制大电流
1、3脚基极 ,2、3脚发射极
基极可以获得比较小的电流,小的电流导通,会控制2、3脚导通
看图
先搜索有没有特殊的链接
没有的话我们继续找核心板电路图
由于cpu引脚太多,所以需要两个电路图比较
要想让灯点亮,就需要输出一个高电平
芯片手册
接下来需要查询芯片手册
SEC_Exynos 4412 SCP_Users Manual_Ver.0.10.00_Preliminary.pdf
描述CPU如何工作的
Arm开发的难点就在芯片手册
看目录
介绍设备
地址映射
看门狗
实时时钟
音频子系统
第一次接触首先看产品介绍
这个cpu在音视频和手机方面比较擅长
看文字比较枯燥,可以直接看框图
电灯
芯片手册控制管脚的部分
GPIO 通用输入输出设备控制
有304个管脚,手册将他们分组
我们这次灯的管脚,寻找一下寄存器
寻找我们的 GPX2_7 

GPX2通过四个寄存器管理(特殊功能寄存器)
cpu内部有很多内容
通过不同的组和地址规划

我们主要看CON和DAT
寻找一下寄存器详细描述
base address 是一个基地址
基地址+偏移量操作
我们注意看CON后面的数字
这些GPX2有七个管脚

刚好对应我们的手册,所以我们控制这个
控制七号引脚
这里引脚复用的概念
对应不同寄存器,对应功能设置不同值
这里我们输出一个高电平来点亮
6.2.3.202 GPX2CON
Base Address: 0x1100_0000
Address = Base Address + 0x0C40, Reset Value = 0x0000_0000
0x0 = Input
0x1 = Output
0x2 = Reserved
0x3 = KP_ROW[7]
0x4 = Reserved
0x5 = ALV_DBG[19]
0x6 to 0xE = Reserved
0xF = WAKEUP_INT2[7]
输出高电平低电平,我们需要另外一个寄存器来表示 GPX2DAT
0-7对应八个引脚,我们这次输出高电平,把七号位设为1就可以
6.2.3.203 GPX2DAT
Base Address: 0x1100_0000
Address = Base Address + 0x0C44, Reset Value = 0x00
如果引脚设为1就是高电平
设置
我们首先设置为输出模式
Output
如果我们直接进行赋值
@设置led灯的配置寄存器 GPX2CON为输出
ldr r0, =0x11000C40
mov r1, #0x10000000
str r1, [r0]会导致改变其他参数,这不是我们想要的
如果这样会导致别人一使用我们的程序,可能其他程序就会出问题
汇编代码:
.text
@设置led灯的配置寄存器 GPX2CON为输出
ldr r0, =0x11000C40
ldr r1, [r0] @先读
bic r1, #0xf0000000 @清零
orr r1, #0x10000000
@现在将它写回去
str r1, [r0]
@只改变最高的四位,其他位置我们不去影响
@##设置LED输出高电平 GPX2DAT##@
ldr r0, =0x11000C44
ldr r1, [r0]
orr r1, #0x80 @1000 0000
str r1, [r0]
@这样就将我们的引脚打开并输出高电平
.end
Linux下编译
我们的编译要放在Linux里面做
创建一个文件
touch led.s复制我们上面的代码
编译
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 0x40001000 -o led.elf
$(OBJCOPY) -O binary -S led.elf led.bin
$(CROSS)objdump -D led.elf > led.dis
clea:
rm -f *.o *.elf *.bin *.dis
这里不能使用gcc编译,因为我们gcc是x86的
x86只能在x86运行,arm上是不能使用x86上面的编译器的
所以我们需要使用arm交叉工具编译链
gcc-4.6.4.tar.xz
解压
tar -xvf gcc-4.6.4.tar.xz交叉编译工具链在bin
使用这个编译可以在arm下运行
arm-none-linux-gnueabi-gcc -g -c -o led.o led.s 我们可以使用makefile
为了方便,把gcc的路径添加到系统里面
export PATH=xxx/gcc-4.6.4/bin:$PATH这个只是暂时设置,如果需要一直设置,需要在文件中修改
~/.bashrc
接下来看看makefile
OBJCOPY=$(CROSS)objcopy 用于转换格式
-c 停在预处理编译不做链接部分
-Ttext 指定链接地址 如果不设置,则从0开始
-o 输出
$(OBJCOPY) -O binary -S led.elf led.bin 转换成 二进制文件 生成led.bin
$(CROSS)objdump -D led.elf > led.dis 反汇编的操作 反向的得到汇编程序
生成文件:
make烧写

一个地方编译,一个地方运行:交叉编译
使用串口或者网线就可以进行传输
我们这次使用串口线,串口接到com2
usb端接电脑
超级终端

安装驱动
这样表示驱动安装成功了,并且串口可用
设置波特率115200,将数据流控制改为无
把文件通过串口线传到板子
板子上预装了一个uboot
所以上电就可以看见信息
写入命令
loadb 40001000
选择传送--->发送文件
协议改为Kermit
选择我们的led.bin
发送
成功后,我们go一下
go 0x40001000灯点亮了
如果我们想点灭呢?
我们把orr改成bic指令就可以
.text
@设置led灯的配置寄存器 GPX2CON为输出
ldr r0, =0x11000C40
ldr r1, [r0] @先读
bic r1, #0xf0000000 @清零
orr r1, #0x10000000
@现在将它写回去
str r1, [r0]
@只改变最高的四位,其他位置我们不去影响
@##设置LED输出高电平 GPX2DAT##@
ldr r0, =0x11000C44
ldr r1, [r0]
bic r1, #0x80 @1000 0000
str r1, [r0]
@这样就将我们的引脚打开并输出低电平
.end
闪烁
.text
@设置led灯的配置寄存器 GPX2CON为输出
ldr r0, =0x11000C40
ldr r1, [r0] @先读
bic r1, #0xf0000000 @清零
orr r1, #0x10000000
@现在将它写回去
str r1, [r0]
@只改变最高的四位,其他位置我们不去影响
loop:
@##设置LED输出高电平 GPX2DAT##@
ldr r0, =0x11000C44
ldr r1, [r0]
orr r1, #0x80 @1000 0000
str r1, [r0]
bl delay1s
ldr r0, =0x11000C44
ldr r1, [r0]
bic r1, #0x80 @1000 0000
str r1, [r0]
bl delay1s
b loop
delay1s:
ldr r4,=0x1ffffff
delay1s_loop:
sub r4,r4,#1
cmp r4,#0
bne delay1s_loop
mov pc,lr
.end