开发板:

1.原理图

上图中,当按下POWER键后,VDD_5V和VDD_IO会产生5V和3.3V的电压,其中D26无须GPIO控制,为常亮状态,即我们所说的电源指示灯,D[22:25]对应的GPIO口如下:
| LED指示灯 | GPIO口 | 编号 | 动作 |
|---|---|---|---|
| D22 | GPJ_3 | LED1 | 1:灭,0:亮 |
| D23 | GPJ0_4 | LED2 | 1:灭,0:亮 |
| D24 | GPJ0_5 | LED3 | 1:灭,0:亮 |
| D25 | GPD0_1 | LED4 | 1:灭,0:亮 |
2.Datasheet相关
1.S5PV210 RISC微处理器用户手册:
S5PV210_UM_REV1.1.pdf
获取方式:可在CSDN搜索下载,也可以@大飞歌获取
2.应用手册(内部ROM启动):
S5PV210_iROM_ApplicationNote_Preliminary_20091126.pdf
获取方式:可网路搜索下载,也可以@大飞歌获取
中文文档地址:https://blog.csdn.net/I_feige/article/details/104848609
3.底板电路原理图:
x210bv3s.pdf
下载链接:https://download.csdn.net/download/i_feige/11877902
控制LED GPIO的寄存器设置详细参见以下章节(S5PV210_UM_REV1.1.pdf):
V210_ Book cover
errata
section 01_ overview
section 02_ system
section 03_ bus
section 04_ interupt
section 05_ memory
section 06_ dma
section 07_ timer
section 08_ connectivity _ storage
section 09_ mutimedia
section 10_ audio _ etc
section 11_ securty
section 12_ etc
2.2.7 PORT GROUP GPD0 CONTROL REGISTER
2.2.7.1 Port Group GPD0 Control Register ( GPD0CON , R / W , Address 0xE020_00A0)
2.2.7.2 Port Group GPD0 Control Register ( GPD0DAT , R / W , Address 0xE020_00A4)
2.2.7.3 Port Group GPD0 Control Register ( GPD0PUD , R / W , Address 0xE020_00A8)
2.2.7.4 Port Group GPD0 Control Register ( GPD0DRV , R / W , Address 0xE020_00AC)
2.2.7.5 Port Group GPD0 Control Register ( GPD0CONPDN , R / W , Address 0xE020_00B0)
2.2.7.6 Port Group GPD0 Control Register ( GPD0PUDPDN , R / W , Address 0xE020_00B4)
2.2.20 PORT GROUP GPJ0 CONTROL REGISTER
2.2.20.1 Port Group GPJ0 Control Register ( GPJ0CON , R / W , Address 0xE020_0240)
2.2.20.2 Port Group GPJ0 Control Register ( GPJ0DAT , R / W , Address 0xE020_0244)
2.2.20.3 Port Group GPJ0 Control Register ( GPJ0PUD , R / W , Address 0xE020_0248)
2.2.20.4 Port Group GPJ0 Control Register ( GPJ0DRV , R / W , Address 0xE020_024C)
2.2.20.5 Port Group GPJ0 Control Register ( GPJ0CONPDN , R / W , Address 0xE020_0250)
2.2.20.6 Port Group GPJ0 Control Register ( GPJ0PUDPDN , R / W , Address 0xE020_0254)
GPD0控制寄存器组的相关信息(部分摘取如下):
2.2.7 PORT GROUP GPD0 CONTROL REGISTER
有六个控制寄存器,分别是 GPD0CON、GPD0DAT、GPD0PUD、GPD0DRV、GPD0CONPDN 和
端口组 GPD0 控制寄存器中的 GPD0PUDPDN。
2.2.7.1 端口组 GPD0 控制寄存器 (GPD0CON, R/W, Address = 0xE020_00A0)
| GPD0CON | Bit | Description | Initial State |
|---|---|---|---|
| GPD0CON[3] | [15:12] | 0000 = Input 0001 = Output 0010 = TOUT_3 0011 ~ 1110 = Reserved 1111 = GPD0_INT[3] | 0000 |
| GPD0CON[2] | [11:8] | 0000 = Input 0001 = Output 0010 = TOUT_2 0011 ~ 1110 = Reserved 1111 = GPD0_INT[2] | 0000 |
| GPD0CON[1] | [7:4] | 0000 = Input 0001 = Output 0010 = TOUT_1 0011 ~ 1110 = Reserved 1111 = GPD0_INT[1] | 0000 |
| GPD0CON[0] | [3:0] | 0000 = Input 0001 = Output 0010 = TOUT_0 0011 ~ 1110 = Reserved 1111 = GPD0_INT[0] | 0000 |
2.2.7.2 端口组 GPD0 数据映射寄存器 (GPD0DAT, R/W, Address = 0xE020_00A4)
| GPD0DAT | Bit | Description | Initial State |
|---|---|---|---|
| GPD0DAT[3:0] | [3:0] | 当端口被配置为输入端口时,对应的位是引脚状态。 当端口配置为输出端口时,引脚状态与对应位相同。 当端口被配置为功能引脚时,将读取未定义的值。 | 0000 |
2.2.7.3 端口组 GPD0 上、下拉配置寄存器 (GPD0PUD, R/W, Address = 0xE020_00A8)
| GPD0PUD | Bit | Description | Initial State |
|---|---|---|---|
| GPD0PUD[n] | [2n+1:2n] n=0~3 | 00 = 上拉/下拉禁用 01 = 下拉启用 10 = 上拉启用 11 = 保留 | 0x0055 |
2.2.7.4 端口组 GPD0 驱动强度配置寄存器 (GPD0DRV, R/W, Address = 0xE020_00AC)
| GPD0DRV | Bit | Description | Initial State |
|---|---|---|---|
| GPD0DRV[n] | [2n+1:2n] n=0~3 | 00 = 1x 10 = 2x 01 = 3x 11 = 4x | 0x0000 |
2.2.7.5 端口组 GPD0 低功耗模式配置寄存器 (GPD0CONPDN, R/W, Address = 0xE020_00B0)
| GPD0CONPDN | Bit | Description | Initial State |
|---|---|---|---|
| GPD0[n] | [2n+1:2n] n=0~3 | 00 = Output 0 01 = Output 1 10 = Input 11 = Previous state | 0x00 |
2.2.7.6 端口组 GPD0 低功耗模式上拉/下拉寄存器 (GPD0PUDPDN, R/W, Address = 0xE020_00B4)
| GPD0PUDPDN | Bit | Description | Initial State |
|---|---|---|---|
| GPD0[n] | [2n+1:2n] n=0~3 | 00 = 上拉/下拉禁用 01 = 下拉启用 10 = 上拉启用 11 = 保留 | 0x00 |
例如设置GPD0_1 IO口为输出模式,拉高或者拉低(汇编语言实现):
#define GPD0CON 0xE02000A0
#define GPD0DAT 0xE02000A4
/* 初始化GPIO口(配置为输出模式),下面是比较规范的一种写法,也可参考代码实现(流水灯)相关部分 */
ldr r0,=GPD0CON //r0=0xE02000A0
ldr r1,[r0] //将r0地址处的数据读出,保存到r1中(零偏移)
orr r1,r1,#0x0010 //设置r1的第4位(置1),其他位保持不变[7:4]->0001=Output
str r1,[r0] //将r1中的内容传输到r0中数指定的地址内存中去
/* 点亮LED4,GPIO口输出低电平 */
ldr r0,=GPD0DAT //r0=0xE02000A4
ldr r1,[r0] //将r0地址处的数据读出,保存到r1中(零偏移)
bic r1,r1,#0x0002 //清除r1的第1位(置0),其他位保持不变[1]
str r1,[r0] //将r1中的内容传输到r0中数指定的地址内存中去
/* 熄灭LED4,GPIO口输出高电平 */
ldr r0,=GPD0DAT //r0=0xE02000A4
ldr r1,[r0] //将r0地址处的数据读出,保存到r1中(零偏移)
orr r1,r1,#0x0002 //设置r1的第1位(置1),其他位保持不变[1]
str r1,[r0] //将r1中的内容传输到r0中数指定的地址内存中去
3.代码
3-1.代码实现(流水灯,仅作演示)
/*******************************************************
* > File Name: start.S
* > Author: fly
* > Create Time: 2020年07月17日 星期五 07时56分19秒
******************************************************/
/*=====================================================
* 汇编点亮led灯:对应GPIO口输出低电平,点亮LED
* D22->GPJ0_3
* D23->GPJ0_4
* D24->GPJ0_5
* D25->PWMOUT1/GPD0_1
*====================================================*/
#define GPD0CON 0xE02000A0
#define GPD0DAT 0xE02000A4
#define GPD0PUD 0xE02000A8
#define GPJ0CON 0xE0200240
#define GPJ0DAT 0xE0200244
#define GPJ0PUD 0xE0200248
#define PS_HOLD_CONTORL 0xE010E81C
#define WTCON 0xE2700000
#define SVC_STACK 0xD0037D80
//#define CONFIG_SYS_ICACHE_OFF 1
.global _start
_start:
//给5v电源置锁
//LDR指令:从内存中将1个32位的字读取到目标寄存器中
//STR指令:将1个32位的字数据写入到指令中指定的内存单元中
//ORR指令:逻辑或操作指令
//BIC指令:位清除指令
//MOV指令:数据传送
ldr r0,=PS_HOLD_CONTORL //r0=0xE010E81C
ldr r1,[r0] //将r0地址处的数据读出,保存到r1中(零偏移)
orr r1,r1,#0x300 //设置r1的第8、9位,其他位保持不变
orr r1,r1,#0x1 //设置r1的第1位,其他位保持不变
str r1,[r0] //将r1中的内容传输到r0中数指定的地址内存中去
//关看门狗
ldr r0, =WTCON
mov r1, #0 //将立即数0传输到r1处
str r1, [r0]
//开/关iCache
// MRC指令:从协处理器寄存器传数据到ARM寄存器
// MCR指令:从ARM寄存器传数据到协处理器寄存器
mrc p15, 0, r0, c1, c0, 0
#ifdef CONFIG_SYS_ICACHE_OFF
bic r0, r0, #0x00001000 @ clear bit 12 (I) I-Cache
#else
orr r0, r0, #0x00001000 @ set bit 12 (I) I-Cache
#endif
mcr p15, 0, r0, c1, c0, 0
//设置栈,以便调用c函数
ldr sp, =SVC_STACK
led_init:
/* LED初始化 */
//把GPIO设置输出模式
ldr r0,=0x11111111
ldr r1,=GPJ0CON
str r0, [r1] //把GPJ0所有的IO设置为输出模式
ldr r0,=0x00000010
ldr r1,=GPD0CON
str r0,[r1] //把GPD0_1设置为输出模式
led_run:
/* LED流水灯 */
// 第1步:点亮LED1,其他熄灭
ldr r0, =~(1<<3) //r0=0xFFFFFFF7
ldr r1, =GPJ0DAT //r1=0xE0200244
str r0, [r1]
//熄灭LED4
ldr r0, =~(0<<1) //r0=0xFFFFFFFF
ldr r1, = GPD0DAT
str r0, [r1]
bl delay
// 第2步:点亮LED2,其他熄灭
ldr r0, =~(1<<4) //r0=0xFFFFFFEF
ldr r1, =GPJ0DAT
str r0, [r1]
bl delay
// 第3步:点亮LED3,其他熄灭
ldr r0, =~(1<<5) //r0=0xFFFFFFDF
ldr r1, =GPJ0DAT
str r0, [r1]
bl delay
//熄灭LED3/4/5,点亮LED4
ldr r0, = ((1<<3)|(1<<4)|(1<<5))
ldr r1, =GPJ0DAT
str r0, [r1]
ldr r0, =~(1<<1) //r0=0xFFFFFFFD
ldr r1, = GPD0DAT
str r0, [r1]
bl delay
bl led_run
half:
b half
/* 延时函数:delay*/
delay:
ldr r2,=9000000
ldr r3,=0x0
delay_loop:
//SUB指令:从寄存器Rn中减去shifter_operand表示的数值,
//并将结果保存在目标寄存器Rd中,并根据指令的执行结果
//设置CPSR中的相应标志位
//SUB { sub r2,r2,#1 //r2 = r2 - 1 //CMP指令:使用寄存器Rn的值减去shifter_operand的值, //根据操作的结果更新CPSR中相应的条件标志位,以便后面 //的指令根据相应的条件标志位来判断是否执行 //CMP { cmp r2, r3 bne delay_loop mov pc,lr 配套编译Makefile文件: # 将所有的.o文件链接成.elf文件,“-Ttext 0x0” # 表示程序的运行地址是0x0,由于目前编写的是位置 # 无关码,可以在任一地址运行 # 将elf文件抽取为可在开发板上运行的bin文件 # 将elf文件反汇编保存在dis文件中,调试程序会用 # 添加文件头 # 编译器版本:arm-2009q3 .PHONY: all clean tools CROSS ?= arm-linux- NAME := LED LD := $(CROSS)ld OC := $(CROSS)objcopy OD := $(CROSS)objdump CC := $(CROSS)gcc MK := ../../tools/mk_image/mkv210_image all:$(NAME).bin $(NAME).bin : start.o $(LD) -Ttext 0x0 -o $(NAME).elf $^ $(OC) -O binary $(NAME).elf $(NAME).bin $(OD) -D $(NAME).elf > $(NAME)_elf.dis $(MK) $(NAME).bin # 将当前目录下存在的汇编文件及C文件编译成.o文件 %.o : %.S
上一篇:S5PV210 | 微处理器启动流程
下一篇:S5PV210 | 裸机汇编LED闪烁实验
推荐阅读最新更新时间:2026-03-22 11:47
- RDR-142 - 35W电源
- i.MX RT1060 Evaluation Kit
- 使用 Embedded Planet 的 5CEFA9U27 的参考设计
- DC1369A-D、LTC2258-14 演示板、14 位 65 Msps ADC、LVDS 输出、5-170MHz
- LT3990EMSE-5 12V 降压转换器的典型应用
- 使用 Analog Devices 的 LTC1148 的参考设计
- LT1377IS8 具有直接反馈的正负转换器的典型应用
- 使用 NXP Semiconductors 的 TL431AI 的参考设计
- LT8304IS8E 18V 至 80Vin、5Vout 隔离反激式转换器的典型应用电路
- LT3512EMS 演示板,单片式高压隔离反激式转换器 36V VIN 75V,VOUT = 5V @ 500mA



S5PV210_iROM_ApplicationNote_Preliminary_20091126
嵌入式驱动开发-LED流水灯
200个电路DDB文件
非常经典的关于LLC的杨波博士论文
1CIS223-04TG3M






京公网安备 11010802033920号