资讯详情

S5P6818点亮LED灯

S5P6818点亮LED灯

1.分析电路图

:印制电路板

:原理图

FS6818底板原理图.pdf ----------》 对应底板的原理图 底板原理图提取码7:izu

FS6818核心板原理图.pdf ---------》 核心板对应的原理图 核心板原理图 提取码:6ikq FS6818芯片手册 提取码:5naq

在PCB板上找到LED灯对应器件的位置在LED灯具旁边

与设备对应的唯一编号RGBLED1”。

开发板上的白色编号称为丝印,用于识别设备。

每个器件的丝印在PCB板是唯一的。丝印在开发板原理图上,

对应关系是唯一的。

在原理图上搜索丝印,找到LED灯对应的原理图。

在这里插入图片描述网络标号。

:网络标号相同的两个引脚具有电气连接属性,反映在PCB板上,

说明两个引脚通过导线连接。

:放大特性,开关特性。

:基极高电平时,CE导通,基极低电平时,CE截止

:基极高电平时,EC截止日期,基极低电平时,EC导通

MCU_CAM1_PCLK应连接到网络标号SOC(S5P6818)的的一个GPIO引脚上。

在原理图底板上搜索MCU_CAM1_PCLK”网络标号

继续搜索核心板原理图MCU_CAM1_PCLK网络标号,找到以下信息:

红色通过以上分析LED灯由SOC的GPIOA28引脚驱动。

编写程序让GPIOA28引脚输出高电平,点亮红色LED灯,

让GPIOA28引脚输出低电平,熄灭红色LED灯,

引脚有多种功能,称为多功能复用引脚。

使用此引脚时,选择功能使用。

2.分析芯片手册

  1. 设置GPIO引脚为GPIO功能

  2. 设置GPIO引脚是输出功能

  3. 设置GPIO引脚输出高低电平

S5P6818总共有160个GPIO将这160个引脚分成5组,每组32个引脚,

分别为GPIOA,GPIOB,GPIOC,GPIOD,GPIOE。

:设置GPIO引脚输出高低电平

GPIOAOUT地址 = 基地址 偏移地址 = 0xC001_A000

GPIOAOUT这个寄存器管理这个GPIOA这组32个引脚。引脚编号为0-31

因此:

GPIOAOUT[0] -----》GPIOA0

GPIOAOUT[1] -----》GPIOA1

GPIOAOUT[2] -----》GPIOA2

。。。

GPIOAOUT[28] -----》GPIOA28

。。。

GPIOAOUT[31] -----》GPIOA31

GPIOAOUT寄存器对应的地址0xC001_A000,

为这个地址的28位写1,GPIOA28引脚输出高电平,

给这个地址的28位写0,GPIOA28引脚输出低电平。

功能:设置GPIO引脚是输入模式的输出模式

GPIOAOUTENB地址 = 基地址 偏移地址 = 0xC001_A004

GPIOAOUTENB这个寄存器管理这个GPIOA这组32个引脚。引脚编号为0-31

因此:

GPIOAOUTENB[0] -----》GPIOA0

GPIOAOUTENB[1] -----》GPIOA1

GPIOAOUTENB[2] -----》GPIOA2

。。。

GPIOAOUTENB[28] -----》GPIOA28

。。。

GPIOAOUTENB[31] -----》GPIOA31

GPIOAOUTENB寄存器对应的地址0xC001_A004,

为这个地址的28位写1,GPIOA28引脚为输出模式,

写0个地址的28位写0,GPIOA28引脚是输入模式。

功能:设置GPIO引脚功能选择寄存器

GPIOAALTFN0地址 = 基地址+偏移地址 = 0xC001_A020

GPIOAALTFN1地址 = 基地址+偏移地址 = 0xC001_A024

GPIOAALTFN0这个寄存器管理着GPIOA这一组的[15:0]引脚。

GPIOAALTFN1这个寄存器管理着GPIOA这一组的[31:16]引脚。

因此:

GPIOAALTFN0[1:0] -----》GPIOA0

GPIOAALTFN0[3:2] -----》GPIOA1

。。。。。。

GPIOAALTFN0[31:30] -----》GPIOA15

GPIOAALTFN1[1:0] -----》GPIOA16

GPIOAALTFN1[3:2] -----》GPIOA17

。。。。。。

GPIOAALTFN1[31:30] -----》GPIOA31

GPIOAALTFN1寄存器对应的地址0xC001_A024,

给这个地址的[25:24]位写0b00,GPIOA28引脚为GPIO功能,

在S5P6818芯片手册中搜索GPIOA28即可。

3.编写代码

1.汇编点灯

.text
	.global _start
_start:

	/* 1. 设置GPIOA28引脚为GPIO功能 */
	@ GPIOAALTFN[25:24] = 00    0xC001A024[25:24] = 00
	ldr r0, =0xC001A024
	ldr r1, [r0]
	bic r1, r1, #(0x3 << 24)
	@ and r1, r1, #(~(0x3 << 24))
	str r1, [r0]

	/* 2. 设置GPIOA28引脚为输出模式 */
	@ GPIOAOUTENB[28] = 1    0xC001A004[28] = 1
	ldr r1, =0xC001A004
	ldr r2, [r1]
	orr r2, r2, #(0x1 << 28)
	str r2, [r1]
	
	/*3.设置GPIOE13为GPIO功能*/
	@GPIOEALTFN[27:26] = 00    0xC001E020[27:26] ==0
	ldr r2, = 0xC001E020
	ldr r3, [r2]
	bic r3, r3, #(0x3 << 26)
	str r3, [r2]
	
	/*4.设置GPIOE13引脚为输出模式*/
	@ GPIOEOUTENB[13] = 1    0xC001E004[13] = 1
	ldr r3, =0xC001E004
	ldr r4, [r3]
	orr r4, r4,#(0x1 << 13)
	str r4,[r3]
	
	/*5.设置GPIOB12为GPIO功能*/
	@GPIOBOUTENB[25:24]=10  0Xc001B020[25:24]=10
	ldr r4, =0xC001B020
	ldr r5,[r4]
	bic r5,r5,#(0x3 << 24)
	orr r5,r5,#(0x2 << 24)
	str r5,[r4]
	/*6.设置GPIOB12引脚为输出功能*/
	@ GPIOEOUTENB[12] = 1    0xC001B004[12] = 1
	ldr r5, =0xC001B004
	ldr r6, [r5]
	orr r6 , r6 ,#(0x1 << 12)
	str r6, [r5]
loop:
	/* 红. 设置GPIOA28引脚输出高电平 */
	@ GPIOAOUT[28] = 1    0xC001A000[28] = 1
	ldr r4, =0xC001A000
	ldr r5, [r4]
	orr r5, r5, #(0x1 << 28)
	str r5, [r4]
	bl delay1s
	/* 红. 设置GPIOA28引脚输出低电平 */
	@ GPIOAOUT[28] = 0    0xC001A000[28] = 0
	ldr r6, =0xC001A000
	ldr r7, [r6]
	bic r7, r7, #(0x1 << 28)
	str r7, [r6]
	bl delay1s
	/*绿.设置GPIOE13引脚输出高低电平*/
	@GPIOEOUT[13] ==1 0xC001E000
	ldr r0, = 0xC001E000
	ldr r1, [r0]
	orr r1,r1,#(0x1 << 13)
	str r1,[r0]
	bl delay1s
	ldr r0, = 0xC001E000
	ldr r1, [r0]
	bic r1,r1,#(0x1 << 13)
	str r1,[r0]
	bl delay1s
	/*蓝.设置GPIOB12引脚输出高低电平*/
	@GPIOBOUT[12]==1 0xC001B000
	ldr r0, =0xC001B000
	ldr r1,[r0]
	orr r1,r1,#(0x1<<12)
	str r1,[r0]
	bl delay1s
	ldr r0, =0xC001B000
	ldr r1,[r0]
	bic r1,r1,#(0x1<<12)
	str r1,[r0]
	bl delay1s
	b loop




@ 1s的延时函数
delay1s:
	ldr r3, =0x1000000
	mm:
	cmp r3, #0
	subne r3, r3, #1
	bne mm
	mov pc, lr

	.end


// 寄存器的声明
#define GPIOAOUT (*(volatile unsigned int *)0xC001A000)
#define GPIOAOUTENB (*(volatile unsigned int *)0xC001A004)
#define GPIOAALTFN0 (*(volatile unsigned int *)0xC001A020)
#define GPIOAALTFN1 (*(volatile unsigned int *)0xC001A024)

#define GPIOBOUT (*(volatile unsigned int *)0xC001B000)
#define GPIOBOUTENB (*(volatile unsigned int *)0xC001B004)
#define GPIOBALTFN0 (*(volatile unsigned int *)0xC001B020)
#define GPIOBALTFN1 (*(volatile unsigned int *)0xC001B024)

#define GPIOEOUT (*(volatile unsigned int *)0xC001E000)
#define GPIOEOUTENB (*(volatile unsigned int *)0xC001E004)
#define GPIOEALTFN0 (*(volatile unsigned int *)0xC001E020)
#define GPIOEALTFN1 (*(volatile unsigned int *)0xC001E024)

//枚举灯的开和关
typedef enum{ 
        
	LED_OFF = 0,
	LED_ON ,
}stu_t;     

//延迟函数
void delay_ms(unsigned int ms)
{ 
        
	unsigned int i,j;
	for(i = 0; i < ms; i++)
		for(j = 0; j < 1800; j++);
}

//GPIO初始化
void hal_led_init(void)
{ 
        
// GPIO引脚为GPIO功能
	// GPIOA28为GPIO功能
	GPIOAALTFN1 = GPIOAALTFN1 &(~(0x3 << 24));//24:25---00
	//GPIOB12为GPIO功能
	GPIOBALTFN0 = GPIOBALTFN0 &(~(0x3 << 24));//24:25---10
	GPIOBALTFN0 = GPIOBALTFN0 | (0x2 << 24);
	//GPIOE13为GPIO功能
	GPIOEALTFN0 = GPIOEALTFN0  &(~(0x3 << 26));//26:27---00
	
// GPIO引脚为输出功能 
	// GPIOA28为输出模式
	GPIOAOUTENB = GPIOAOUTENB  |(0x1 << 28);//28位置1
	//GPIOB12为输出模式
	GPIOBOUTENB = GPIOBOUTENB   |(0x1 << 12);//12位置1
	//GPIOE13为输出模式
	GPIOEOUTENB = GPIOEOUTENB   |(0x1 << 13);//13位置1
}

//点亮红灯函数
void hal_red_led_stutes(stu_t stu)
{ 
        
	// GPIOA28
	if (stu == LED_ON){ 
        
		//点亮 
	GPIOAOUT |=  (0x1 << 28);
	}
	else { 
        
		// 熄灭
	GPIOAOUT &= (~(0x1 << 28));
	}
}

//点亮绿灯函数
void hal_green_led_stutes(stu_t stu)
{ 
        
	//GPIOE13
	if (stu == LED_ON)
	{ 
        
	GPIOEOUT |=  (0x1 << 13);
	}
	else
	{ 
        
	GPIOEOUT &= (~(0x1 << 13));
	}
}

//点亮蓝灯函数
void hal_blue_led_stutes(stu_t stu)
{ 
        	
	//GPIOB12
	if(stu == LED_ON)
	{ 
        
	GPIOBOUT |= (0x1 << 12));
	}
	else
	{ 
        
	GPIOBOUT &= (~(0x1 << 12);
	}
}

//主函数
int main()
{ 
        
	hal_led_init();
	while(1)
	{ 
        
// 三色LED灯交替闪烁
	// 红
	hal_red_led_stutes(LED_ON);
	delay_ms(500); 
	hal_red_led_stutes(LED_OFF);
	delay_ms(500); 
	// 绿
	hal_green_led_stutes(LED_ON);
	delay_ms(500); 
	hal_green_led_stutes(LED_OFF);
	delay_ms(500); 
	//蓝
	hal_blue_led_stutes(LED_ON);
	delay_ms(500); 
	hal_blue_led_stutes(LED_OFF);
	delay_ms(500); 
	}
	return 0;
}

#define uint32_t unsigned int 
typedef struct{ 
        
	uint32_t OUT;
	uint32_t OUTENB;
	uint32_t DETMODE0;
	uint32_t DETMODE1;
	uint32_t INTENB;
	uint32_t DET;
	uint32_t PAD;
	uint32_t RSVD;
	uint32_t ALTFN0;
	uint32_t ALTFN1;
}gpio_t;

#define GPIOA (*(volatile gpio_t*)0xC001A000)
#define GPIOB (*(volatile gpio_t*)0xC001B000)
#define GPIOC (*(volatile gpio_t*)0xC001C000)
#define GPIOD (*(volatile gpio_t*)0xC001D000)
#define GPIOE (*(volatile gpio_t*)0xC001E000)

# CORTEX-A53 PERI DRIVER CODE
# VERSION 2.0
# ATHUOR www.hqyj.com
# MODIFY DATE
# 2019.04.12  Makefile
# SHELL=C:/Windows/System32/cmd.exe
CROSS_COMPILE = arm-none-linux-gnueabi-
NAME = interface
#=============================================================================#
CFLAGS += -g -Wall -O0 -mabi=apcs-gnu -mfpu=neon -mfloat-abi=softfp -fno-builtin \
			-nostdinc -I./common/include      		                                       
LD	= $(CROSS_COMPILE)ld
CC	= $(CROSS_COMPILE)gcc
NM  = $(CROSS_COMPILE)nm
OBJCOPY = $(CROSS_COMPILE)objcopy
OBJDUMP = $(CROSS_COMPILE)objdump
#============================================================================#
OBJSss 	:= $(wildcard start/*.S) $(wildcard common/src/*.S) $(wildcard *.S)\ $(wildcard start/*.c) $(wildcard common/src/*.c) \ $(wildcard src/*.c) $(wildcard *.c) OBJSs := $(patsubst %.S,%.o,$(OBJSss)) OBJS := $(patsubst %.c,%.o,$(OBJSs)) %.o: %.S @echo " AS $@" @$(CC) $(CFLAGS) -c -o $@ $< %.o: %.c @echo " CC $@" @$(CC) $(CFLAGS) -c -o $@ $< all:clean $(OBJS) @echo " LD Linking $(NAME).elf" @$(LD) $(OBJS) -T map.lds -o $(NAME).elf @echo " OBJCOPY Objcopying $(NAME).bin" @$(OBJCOPY) -O binary $(NAME).elf $(NAME).bin @echo " MAP Generating $(NAME).map" @$(NM) $(NAME).elf > $(NAME).map @echo " OBJDUMP Objdumping $(NAME).dis" @$(OBJDUMP) -DS $(NAME).elf > $(NAME).dis distclean clean: @rm -rf $(OBJS) *.elf *.bin *.dis *.map @echo " CLEAN complete." 

3.代码完成直接make,生成.bin文件

4.下载调试

1》拷贝led灯的可执行文件.bin文件到windows

2》 开发板硬件连接

​ a. 电源线插上

​ b.串口线,USB端链接电脑,串口端链接开发板的UART0端口

3》设置开发板的启动方式

​ EMMC启动 :1-ON 2-OFF 3-ON

​ SD/TF卡启动:1-OFF 2-OFF 3-OFF

4》打开SecureCRT串口工具

5》开发板上电,在串口工具上会打印很多信息,最后出现一个倒计时,在倒计时减到0之前按任意键,进入一下界面。

6》下载程序

7》观察LED灯到的现象

5.结束

标签: 丝印j3的三极管

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台