一、分析LED的原理图
二、裸机编程的思路
分析原理图,理解硬件的控制原理—>找到控制LED的GPIO—>查找CPU的使用手册,找到控制GPIO的寄存器—>理解寄存器的控制原理—>编写程序,通过寄存器的地址来访问寄存器。
三、寄存器
CPU使用:SEC_S5P6818X_Users_Manual_preliminary_Ver_0.00.pdf (S5P6818说明手册)
1、引脚功能配置寄存器
可以将一个引脚配置成普通的GPIO,引脚的功能对应关系,需要查看手册的第二章。
2、设置GPIO为输入/输出模式
3、GPIO输出电平的设置寄存器
当一个普通GPIO设置成输出后,可以通过这个寄存器设置输出的电平
4、检测GPIO输出的电平寄存器
当一个引脚配置成输入引脚后,通过这个寄存器读取引脚输入的电平
四、LED控制程序的流程(以GPIOE13控制D7为例)
寄存器分析:
1、将控制引脚配置成普通的GPIO
(0xC001E020) GPIOEALTFN0[27:26] = 00b
2、将GPIO配置成输出模型
(0xC001E004) GPIOEOUTENB[13]=1b
3、让GPIO输出低电平,LED亮
(0xC001E000) GPIOEOUT[13] = 0b
4、让GPIO输出高电平,LED灭
(0xC001E000) GPIOEOUT[13] = 1b
六、编译裸机程序步骤
1、写程序和Makefile文件
程序:
#define GPIOEOUT 0xC001E000)
#define GPIOEOUTENB 0xC001E004)
#define GPIOEALTFN0 0xC001E020)
#define GPIOEALTFN1 0xC001E024)
void delay(unsigned value);
void _start(void)
}
void delay(unsigned value)
Makefile 文件程序
led.bin: demo1.o
arm-none-linux-gnueabi-ld -Ttext 0x40000000 -o led.elf $^
arm-none-linux-gnueabi-objcopy -O binary led.elf led.bin
arm-none-linux-gnueabi-objdump -D led.elf > led.dis
%.o : %.S
arm-none-linux-gnueabi-gcc -o $@ $< -c -nostdlib
%.o : %.c
arm-none-linux-gnueabi-gcc -o $@ $< -c -nostdlib
clean:
rm *.o *.elf *.bin *.dis -f
Makefile 详解图片:
2、Ubuntu上编译程序
将写好的C程序和Makefile放在一个文件里面,放在Ubuntu的共享目录里,然后用make进行编译生成一些文件。(arm-none-linux-gnueabi-gcc)
3、将编译好的led.bin 文件传入到开发板中
注意:
1、因为Linux系统中不能跑裸机程序,所以需要在u-boot中跑程序(即开发板启动后,需进入u-boot界面,在进入Linux操作系统前按键使进入u-boot界面)
2、uboot中是否有网卡驱动?
(有网卡驱动时是这样显示的)
如果没有,需要更新系统。
下载程序有问题
1)uboot网卡驱动是否安装
2)uboot的IP设置是否正确
3)关闭wifi
4)windows防火墙
5)tftp服务器是否有问题。
3、只能用tftp软件进行传输,所以需要在u-boot界面中配置好IP地址。
4、GPIO口的配置
设置GPIO功能的寄存器有两个
首先可以打印出当前IP信息:
X6818# printenv
gatewayip=192.168.7.1
ipaddr=192.168.7.5 ---->GEC6818开发板的IP
netmask=255.255.254.0
serverip=192.168.7.3 ---->TFTP服务器的IP
设置IP信息:
setenv ----->设置环境变量
X6818# setenv bootdelay 5
X6818# setenv ipaddr 192.168.7.5
X6818# setenv serverip 192.168.7.3
X6818# setenv gatewayip 192.168.7.1
X6818# saveenv
Saving Environment to MMC...
Writing to MMC(2)... done
使用tftp将led,bin下载到GEC6818上的DDR3内存的0x40000000地址上。
X6818# tftp 0x40000000 led.bin //一般需要传两次
4)执行这个裸机程序
X6818# go 0x40000000
## Starting application at 0x40000000 ...
5、现象
可以用裸机编程点亮cortex A53 开发板的LED灯!
下面是按键点灯的代码:
#define GPIOAALTFN1 0xC001A024)
#define GPIOAOUTENB 0xC001A004)
#define GPIOAPAD_28 (0xC001A018) & (1<<28))
#define GPIOBALTFN1 0xC001B024)
#define GPIOBALTFN0 0xC001B020)
#define GPIOBOUTENB 0xC001B004)
#define GPIOBPAD_31 (0xC001B018) & (1<<31))
#define GPIOBPAD_30 (0xC001B018) & (1<<30))
#define GPIOBPAD_9 (0xC001B018) & (1<<9))
#define GPIOCALTFN0 0xC001C020)
#define GPIOCALTFN1 0xC001C024)
#define GPIOCOUTENB 0xC001C004)
#define GPIOCOUT 0xC001C000)
#define GPIOEOUT 0xC001E000)
#define GPIOEOUTENB 0xC001E004)
#define GPIOEALTFN0 0xC001E020)
#define GPIOEALTFN1 0xC001E024)
void delay(unsigned value);
void _start(void)
}
if( GPIOBPAD_30 == 0 )
}
if( GPIOAPAD_28 == 0 )
}
if( GPIOBPAD_9 == 0 )
}
}
}
void delay(unsigned value)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)