1 .裸机程序开发所需的软硬件环境和常用软件工具
1.1. 硬件环境
- 九鼎创展科技X210开发板(s5pv210)如下图
- 硬件特性:
- 内核:ARM Cortex-A8 1GHz
- 主频:1GHz;
- 内存:512MB DDR2
- Flash:4GB inand
1 .2. 软件环境
操作系统
- Win7 X32\x64(宿主机)
- Ubuntu14.04(虚拟机)
交叉编译工具链
- ARM-2009q3(三星官方编译器)
- 管理工程Makefile
- (详细参考Makefile相关书籍)
- 1.2.4. SecureCRT
- (远程登入Ubuntu14.04,用来做终端交互软件,后续也做串口终端软件)
1.3.裸机程序烧录方式
- 1.3.1. USB方式
- DNW v0.60c软件(三星官方工具)
- 1.3.2. SD卡方式
- X210_Fusing_Tool.exe(九鼎官方烧入工具) Windows
- nand_fusing.sh (三星官方烧入脚本) linux
2.裸机之GPIO点亮LED
2.1.点亮LED的开发步骤
1. 分析硬件电路
目的为了知道LED在开发板上的实际连接方式和LED正常工作所需要的条件
2. 分析SOC的datasheet中相关寄存器
目的为了想要点亮LED,如何用软件去控制SOC中的接口设备帮忙点亮LED
3. 编写控制程序(源码)并用交叉编译工具生成二进制烧录文件
参考对应寄存器配置方式编写点亮LED的步骤
4. 选择合适的烧录方式把程序烧入到开发板中运行
验证编写的程序是否能让LED正确地工作起来
2.2. 分析硬件原理图
2.2.1. 硬件连接方式如下图
从原理图上可知LED都接在SOC的GPIO接口上,其中LED1~LED3接在GPJ0端口上,LED4接在GPD0端口上
2.2.2. LED工作条件
根据LED器件的物理特性可知LED要正常工作必须要一个合适的电压差(正极到负极),从原理图中可知LED正极接电源VDD_IO,负极接GPIO,所以只要让GPIO端口形成电压差就可以了.
2.3. 分析SOC的datasheet
- 2.3.1. GPIO接口的相关寄存器
从SOC的datasheet中可知GPJ0、GPD0端口都有六个寄存器,如下图
端口 | |||||||
---|---|---|---|---|---|---|---|
GPD0: | GPD0CON | GPD0DAT | GPD0PUD | GPD0DRV | GPD0CONPDN | GPD0PUDPDN | |
GPJ0: | GPJ0CON | GPJ0DAT | GPJ0PUD | GPJ0DRV | GPJ0CONPDN | GPJ0PUDPDN |
- 2.3.2. 配置对应端口的寄存器
从SOC的datasheet中可知,这六个寄存器的作用如下
寄存器名字 | 功能 | |
---|---|---|
GPD0CON: | (模式寄存器)引脚功能 | |
GPD0DAT: | (数据寄存器)引脚输入或输出的数据 | |
GPD0PUD: | (上下拉寄存器) | |
GPD0DRV: | (驱动能力寄存器) | |
GPD0CONPDN: | (功耗相关寄存器) | |
GPD0PUDPDN: | (功耗相关寄存器) | |
要点亮LED我们只需要用到模式寄存器和数据寄存器,把模式寄存器配置成输出模式,并向数据寄存器写入对应的数据
2.4. 编写控制程序
2.4.1. 根据任务需求编写让LED工作的步骤
第一步:设置引脚模式为输出模式(向GPxCON寄存器写入0001)
第二步:写入控制的数据(向GPxDAT寄存器写入0输出低电平,1输出高电平)2.4.2. 用汇编语言实现上述步骤,程序如下
/**********************************************
* 文件名: gpip_led.S
* 作 者: X_X_X
* 日 期: 2017-6-29 23:02
* 功 能: 用GPIO点亮4颗LED(效果4颗同时闪烁)
**********************************************/
#define GPJ0CON 0xE0200240 // 定义相关寄存器地址的宏
#define GPJ0DAT 0xE0200244
#define GPD0CON 0xE02000A0
#define GPD0DAT 0xE02000A4
.globl _start //.globl 把_start符号声明为外部链接属性
_start:
ldr r0, =GPJ0CON
ldr r1, =0x00111000 //配置GPJ0端口为输出模式(pin 3 pin 4 pin 5 )
str r1, [r0]
ldr r0, =GPD0CON
ldr r1, =0x0010 //配置GPD0端口为输出模式(pin 1 )
str r1, [r0]
blink:
ldr r0, =GPJ0DAT
ldr r1, =0x38 //熄灭 LED1 LED2 LED3(b0011 1000)
str r1, [r0]
ldr r0, =GPD0DAT
ldr r1, =0x2 //熄灭 LED4(b0010)
str r1, [r0]
bl delay //延时
ldr r0, =GPJ0DAT
ldr r1, =0x0 //点亮 LED1 LED2 LED3
str r1, [r0]
ldr r0, =GPD0DAT
ldr r1, =0x0 //点亮 LED4
str r1, [r0]
bl delay //延时
b blink //闪烁
b .
delay: //延时函数
ldr r2, =9000000 //循环初始化
ldr r3, =0x0
loop:
sub r2, r2, #1
cmp r2, r3
bne loop
mov pc, lr //函数返回, lr保存了进入函数之前的执行地址
- 2.4.3. 编译源程序得到二进制烧录文件
在SecureCRT终端中执行make编译指令并得到二进制gpio_led_usb.bin文件,如下图
2.5 烧入程序验证
- 用DNW软件把二进制.bin文件发送到开发板的0xd0020010地址上执行,效果如下