完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
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章节:
分别为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 $@ $ 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.结束 |
|
|
|
只有小组成员才能发言,加入小组>>
4527个成员聚集在这个小组
加入小组3340 浏览 0 评论
航顺(HK)联合电子发烧友推出“近距离体验高性能Cortex-M3,免费申请价值288元评估板
4269 浏览 1 评论
4296 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-26 11:38 , Processed in 0.515685 second(s), Total 44, Slave 37 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号