S5P6818
回帖(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.结束
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.结束
举报
更多回帖