S5P6818点亮LED灯
S5P6818点亮LED灯
1.分析电路图
PCB板:印制电路板
sheet:原理图
FS6818底板原理图.pdf ----------》 底板对应的原理图
底板原理图提取码:7izu
FS6818核心板原理图.pdf ---------》 核心板对应的原理图
核心板原理图
提取码:6ikq
FS6818芯片手册
提取码:5naq
1.》 在PCB板上找到LED灯对应的器件所在位置,在LED灯器件的旁边
有一个器件对应的唯一的编号“RGBLED1”。
专业术语:开发板上白色的编号称为丝印,使用对器件进行标识。
每个器件的丝印在PCB板上都是唯一的。丝印在开发板原理图上,
具有唯一的对应关系。
2.》 在原理图上搜索丝印,找到LED灯对应的原理图。
专业术语:网络标号。
作用:网络标号相同的两个引脚具有电气连接属性,反映到PCB板上,
说明两个引脚通过导线连接。
三极管:
三极管特性:放大特性,开关特性。
NPN:基极为高电平时,CE导通,基极为低电平时,CE截止
PNP:基极为高电平时,EC截止,基极为低电平时,EC导通
MCU_CAM1_PCLK网络标号应该连接到SOC(S5P6818)的的一个GPIO引脚上。
在原理图底板上搜索“MCU_CAM1_PCLK”网络标号
在核心板原理图上继续搜索“MCU_CAM1_PCLK”网络标号,找到以下信息:
通过以上分析红色LED灯由SOC的GPIOA28引脚进行驱动。
编写程序让GPIOA28引脚输出高电平,点亮红色LED灯,
让GPIOA28引脚输出低电平,熄灭红色LED灯,
芯片的引脚是多功能复用引脚:
一个引脚具有多个功能,这样的引脚叫做多功能复用引脚。
使用这个引脚时,选择一个功能进行使用即可。
2.分析芯片手册
S5P6818芯片的内存映射图,在芯片手册15.3.3章节:
分析芯片手册的GPIO章节:
-
设置GPIO引脚为GPIO功能
-
设置GPIO引脚为输出功能
-
设置GPIO引脚输出高低电平
S5P6818总共有160个GPIO引脚,将这160个引脚分成5组,每组32个引脚,
分别为GPIOA,GPIOB,GPIOC,GPIOD,GPIOE。
1.GPIOxOUT寄存器分析
功能:设置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
功能:设置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寄存器详解
功能:设置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
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文件
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