欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

S5P6818点亮LED灯

程序员文章站 2022-06-08 22:13:30
...

S5P6818点亮LED灯

1.分析电路图

PCB板:印制电路板

sheet:原理图

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

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

1.》 在PCB板上找到LED灯对应的器件所在位置,在LED灯器件的旁边

有一个器件对应的唯一的编号“RGBLED1”。

专业术语:开发板上白色的编号称为丝印,使用对器件进行标识。

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

具有唯一的对应关系。

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

专业术语S5P6818点亮LED灯网络标号。

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

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

S5P6818点亮LED灯

S5P6818点亮LED灯

三极管:

三极管特性:放大特性,开关特性。

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

PNP:基极为高电平时,EC截止,基极为低电平时,EC导通

S5P6818点亮LED灯

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

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

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

S5P6818点亮LED灯

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

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

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

芯片的引脚是多功能复用引脚:

一个引脚具有多个功能,这样的引脚叫做多功能复用引脚。

使用这个引脚时,选择一个功能进行使用即可。

2.分析芯片手册

S5P6818点亮LED灯

S5P6818点亮LED灯

S5P6818芯片的内存映射图,在芯片手册15.3.3章节:

S5P6818点亮LED灯

分析芯片手册的GPIO章节:

S5P6818点亮LED灯

  1. 设置GPIO引脚为GPIO功能

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

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

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

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

S5P6818点亮LED灯

S5P6818点亮LED灯

1.GPIOxOUT寄存器分析

S5P6818点亮LED灯

功能:设置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引脚输出低电平。

2.GPIOxOUTENB

S5P6818点亮LED灯

功能:设置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引脚为输出模式,

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

3.GPIOAALTFN0和GPIOAALTFN1寄存器详解

S5P6818点亮LED灯

功能:设置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即可。

S5P6818点亮LED灯

在修改寄存器中的值是,需要保证其他的位不变。其他的位对应着其他的引脚,

其他的引脚有其他的功能,程序运行时不可以随意修改。

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

2.C语言点灯实现循环闪烁


// 寄存器的声明
#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)

Makefile文件

# 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      aaa@qq.com"
	@$(CC) $(CFLAGS) -c -o  aaa@qq.com $<
%.o: %.c
	@echo "  CC      aaa@qq.com"
	@$(CC) $(CFLAGS) -c -o  aaa@qq.com $<
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文件

S5P6818点亮LED灯

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串口工具

S5P6818点亮LED灯

S5P6818点亮LED灯

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

S5P6818点亮LED灯

6》下载程序

S5P6818点亮LED灯

S5P6818点亮LED灯

S5P6818点亮LED灯

S5P6818点亮LED灯

7》观察LED灯到的现象

5.结束