场景:拿到了一块开发板(S5PV210),板上面有四颗LED灯,怎样写程序用软件(汇编语言)去控制LED灯,让它亮起来/p>
准备:开发板(S5PV210)、DNW烧写工具、安装好DNW的usb驱动、在linux中(我用的是centos6.5 64位)中安装好交叉编译工具链arm-none-linux-gnueabi-*(这里的“*”代表gcc、g++等),开发板原理图(厂家自带)。
1、交叉编译工具的的安装
下载工具包arm-2009q3.tar.bz2包,
执行 tar -jxvf arm-2009q3.tar.bz2 解压后进去bin文件夹,可以看到很多以arm-none-linux-gnueabi-开头的可执行文件,这是工具已经安装完了。
检验能不能使用,执行arm-none-linux-gnueabi-gcc -v ,发现 错了(因为我的是64机,32位机不会 错)。
执行 yum -y install glibc.i686 和 yum -y install ncurses 后,再执行 arm-none-linux-gnueabi-gcc -v ,发现成功呢。
添加环境变量:vim /etc/profile 在最后一行中添加PATH=/usr/local/arm/arm-2009q3/bin:/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH(只需添加“=”后到第一个“:”之间的内容),执行 source /etc/profile 让修改生效。(当误改/etc/profile 后,使用export PATH=/usr/bin:/usr/sbin:/bin:/sbin:/usr/X11R6/bin 临时生效。)
执行 echo $PATH ,发现环境变量中已经有了。
为工具链arm-none-linux-gnueabi-* 做符 链接:进入/usr/local/arm/arm-2009q3/bin下,执行ln arm-none-linux-gnueabi-gcc -s arm-linux-gcc…后续的也照这个格式建立符 链接。之后随便找一个目录,执行 arm-linux-gcc -v ,能成功打印出版本信息gcc version 4.4.1字样,至此,交叉编译工具链安装完毕。
进入正文:
1、LED的物理特性
LED有两个极,正极和负极,当两极的电压差为5v时,LED灯亮,一般是正极5v,负极0v。电压太高会将LED击穿。
2、打开开发板原理图 D:开发版光盘资料X210V3S_AhardwareI210BV3I210BV3.pdf ,如下图:
(图2)
上图打开的是GPIO寄存器的菜单,程序控制硬件的关键是:寄存器。我们要操作的硬件是LED,就是操作LED对应的GPIO里相应的寄存器。由图1可知四颗LED对应的寄存器是GPJ0寄存器组和GPD0寄存器组。
GPJ0寄存器组中有以下寄存器:
GPJ0CON control寄存器。用来配置各引脚的工作模式。是一个控制开关。32位,有8个引脚,每个引脚展4位。由图2看出共有7中模式,其中0000代表input, 0001代表output
GPJ0DAT data寄存器。也有32位,但是8~31位未定义使用,只有0~7位有定义使用。具体定义如下:
When the port is configured as input port, the corresponding bit is the pin state. When the port is configured as output port, the pin state is the same as the corresponding bit.When the port is configured as functional pin, the undefined value will be read.
英文意思:当control寄存器的某个引脚配置为输入模式时,相应的位是引脚的状态,此时引脚为输入接口,数据通过引脚读入到data寄存器相应的位。比如说当你配置GPJ0的二 引脚GPJ0_2为高电平时,对应的data寄存器的二 位是1,如果配置GPJ0的二 引脚GPJ0_2为低电平时,对应的data寄存器的二 位是0。当control寄存器的某个引脚配置为输出模式时,此时引脚为输出接口,数据通过引脚输出data寄存器中相应的位。当data寄存器中的位为1,相应的引脚输出高电平,当为0是输出低电平。GPIO中的GPJ0组中的DAT寄存器的八个位就是负责接收这八个引脚的值或者往这八个引脚输出值,是该接收或者该输出,就得看CON寄存器的八个引脚配置脸色行事呢,算是理清呢。
GPJ0PUD (pull up down) 上拉下拉寄存器,控制引脚上的上下拉电阻。
GPJ0DRV (driver)控制引脚的驱动能力。
GPJ0CONPDN (power down)模式下的控制寄存器。
GPJ0PUDPDN (power down)模式下的上下拉配置寄存器。
注:在驱动LED点亮时,应该将GPIO配置为output模式。
进一步分析点亮LED的方法:
1、设置 GPIO中GPJ0组中的control寄存器模式为output模式(由图一可知,其实只设置GPJ0_3、GPJ0_4、GPJ0_5、PWMTOUT1(对应核心板上GPD0_1)
2、设置GPIO中GPJ0组中的data控制的相应的位为0。
由图2看出GPJ0的control寄存器对应的内存地址是0xE0200240,同理可查知dat的内存地址为0xE0200244。
开始编码:
为了方便演示,代码只做到控制前三颗LED灯。
Makefile内容:
mkv210_image.c内容(这个文件中的内容可以先不用明白):
write2sd内容:
led.S内容(S是大写,我是我们要编写点亮LED的真正代码):
编写上面led.S的文件,其他的三个先照搬就行,执行make 命令后,把得到的led.bin用dnw工具烧到开发板的0xd0020010地址中,可以看到前三颗LED灯亮起来呢。
简单的用汇编实现流水灯:
总结一下编程操控一个硬件的步骤:
1、分析硬件工作原理
2、分析原理图
3、分析数据手册
4、找到相对应的SFR
5、编码
6、烧录运行
文章知识点与官方知识档案匹配,可进一步学习相关知识云原生入门技能树容器编排(学习环境 k8s)安装kubectl8582 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!