深圳市航顺芯片技术研发有限公司
直播中

刘丹

7年用户 1506经验值
私信 关注
[问答]

如何利用S5P6818点亮LED灯?

如何利用S5P6818点亮LED灯?

回帖(1)

文甘翀

2021-9-29 15:07:13
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.exeCROSS_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)ldCC        = $(CROSS_COMPILE)gccNM  = $(CROSS_COMPILE)nmOBJCOPY = $(CROSS_COMPILE)objcopyOBJDUMP = $(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  $@ $ $(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.结束
举报

更多回帖

发帖
×
20
完善资料,
赚取积分