当前位置: > 华清远见教育科技集团 > 嵌入式学习 > 讲师博文 > FS210开发平台板载LED灯控制实验
FS210开发平台板载LED灯控制实验
时间:2016-12-14作者:华清远见

目 录

1、实验目的 - 2 -
        2、实验设备 - 2 -
        3、实验内容 - 2 -
        4、实验步骤 - 3 -
        4.1 开发环境搭建 - 3 -
        4.1.1 安装Vmware虚拟机 - 3 -
        4.1.2修改环境变量 - 6 -
        4.2 编译led灯控制程序 - 6 -
        4.3拷贝文件 - 6 -
        4.4 执行程序 - 15 -
        5、参考代码 - 16 -

1、实验目的

通过实验学习在Linux文件系统中编程实现对FS210板载LED灯的控制;

2、实验设备

硬件设备:

FS210 嵌入式开发平台,pc机(windows XP 或 win 7操作系统),移动硬盘或U盘;

软件设备:

Win XP或Win 7 Vmware10.0虚拟机下的ubuntu 12.04开发环境,交叉编译工具链(已经集成到ubuntu开发环境中,具体路径在/home/linux/toolchain/toolchain-4.4.6/bin目录下)

3、实验内容

编写FS210 开发平台Linux文件系统下的LED灯的应用程序

4、实验步骤

4.1 开发环境搭建

4.1.1 安装Vmware虚拟机

安装环境:windows XP 或 win7

打开:

光盘“嵌入式CORTEXA8部分(1)”(光盘上有标注):工具软件\Windows\华清远见开发环境\VMware Workstation 安装程序;

该目录下有Vmware 10.0 的安装程序:

VMware-workstation-full-10.0.1-1379776.exe

点击按默认方式安装即可,安装过程会提示输入许可证密钥:5G2NA-DN001-GZ2T0-RV85P-8C6KW,安装完成后,会在操作系统桌面上出现 VMware Workstation的图标;

在PC机上将

光盘“嵌入式CORTEXA8部分(1)”:工具软件\Windows\华清远见开发环境\华清远见开发环境 V12B\Ubuntu_12.04_64-bit_farsight.7z

的压缩包解压,Ubuntu_12.04_64-bit_farsight.7z是已经制作好的Ubuntu 12.04 64位操作系统的镜像,该镜像已预安装好了嵌入式系统开发常用的工具,解压目录以用户实际操作目录为准,假设将其解压至E盘:在E盘中会出现Ubuntu_12.04_64-bit_farsight 的目录;

点击PC机桌面VMware 虚拟机程序的快捷方式打开虚拟机,会出现虚拟机的操作界面,如下图:

选择“打开虚拟机”,打开在步骤4.1.2解压至E盘的Ubuntu虚拟机镜像:Ubuntu_12.04_64-bit_farsight.vmx,如下图:

双击“Ubuntu_12.04_64-bit_farsight.vmx”,进入如下图的操作界面,点击“开启此虚拟机”:

等待虚拟机启动Ubuntu 12.04操作系统,系统起来后,如下图:

系统默认的用户名是linux,密码是:1

输入密码后,系统的状态如下图:

0020 打开桌面上的“终端”,在终端上输入命令“pwd”,可以查看当前所在目录,为“/home/linux”,在此目录下,输入命令“mkdir led_test”,创建“led_test”目录,存放或编写测试FS210板载LED灯的程序:

$ pwd

        终端显示:/home/linux

        $ mkdir led_test

        $ cd led_test

4.1.2修改环境变量

编写的led测试程序需要编译为arm格式的二进制可执行程序才能在FS210平台上运行,因此需要用到交叉工具链,并将它加入到环境变量中,这样, 就可在任意目录下编译程序了,交叉工具链的位置在如下目录:

/home/linux/toolchain/toolchain-4.4.6/bin

执行命令:

$ export PATH=$PATH:/home/linux/toolchain/toolchain-4.4.6/bin

export是将环境变量PATH 导出生效的命令,可以用echo命令检验有没有成功:

$ echo $PATH

终端显示:
        usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/jdk1.6.0_29/bin:/home/linux/toolchain/toolchain-4.4.6/bin

如果echo $PATH 命令执行后出现上述信息,说明已成功将交叉编译工具链添加进环境变量。

4.2 编译led灯控制程序

FS210板载有两个led灯,要求以流水灯的形式控制led灯,每隔1秒钟亮灭一次,并且能够以传参的方式控制灯1和灯2的开和关,将程序命名为led.c 放在/home/linux/led_test目录下,在此目录下执行:

$ arm-cortex_a8-linux-gnueabi-gcc led.c -o led

生成的led文件即是可在fs210 linux文件系统下运行的二进制程序。

4.3拷贝文件

需将led文件通过U盘或可移动盘拷至fs210 linux 文件系统中

把u盘插到pc机上,默认情况下windows操作系统会自动识别u盘,需要将u盘映射到虚拟机的ubuntu系统中去,映射之前的ubuntu 状态如下(注意右下角红色边框内的图标,灰色图标代表没有映射到虚拟机的外设图标):

右键点击灰色图标,选择“连接”,即可映射到虚拟机,映射后的虚拟状态如 下图所示(右下角红色边框内的灰色图标变亮,代表映射成功):

U盘映射成功后,在终端执行“mount”命令:

可以看到u盘被系统自动挂载到了/media目录下,名称是WORK(具体名称依据实际u盘而定);

把led文件拷贝到u盘中:

$ cp led /media/WORK/

下面需要将u盘中的led文件copy到fs210 linux 文件系统中,选择从sd卡启动系统,sd卡启动的拨码卡关位置如图所示:

在windows 下用串口终端来查看fs210平台的后台打印信息,需将串口线把fs210开发板和pc机连接起来,为了连接方便,用一根usb 转串口线,和白色直连串口线连接起来,下面是示意图:

这种连接方式需要在pc机的windows系统上装usb转串口的驱动,驱动的位置在

光盘“嵌入式CORTEXA8部分(1)”:工具软件\Windows\USB转串口驱动\CH340

目录下,点击安装即可;

U转串的驱动安装完成后,将fs210开发板按上图和pc机连接,右键点击“我的电脑”打开“管理”->“设备管理器”->“端口”:

可以看到usb转串口的端口号为com11(不同电脑,端口号可能不同,根据实际情况而定)

打开光盘“嵌入式CORTEXA8部分(1)”:工具软件\Windows\串口调试工具\PUTTY.EXE:

选择串口(Serial)连接方式:

选中第一步方框内的Serial,再点击第二步中的Serial,进入串口设置的对话框:

按照上图的参数配置串口即可,然后点击“open”,打开串口终端, 上电运行开发板,进入fs210 Linux 文件系统:

将u盘插到fs210开发板上的任一一个usb接口,在串口终端可以看到u盘的配置信息:

可以看到,红色方框内,u盘对应的设备节点是/dev/sda1(不同u盘,对应的节点名称不同,根据实际情况而定);

执行挂载命令:

$ mount -t vfat /dev/sda1 /mnt

将u盘挂载到/mnt 目录下

进入/mnt 目录,可以看到u盘中的文件

$ cd /mnt

把u盘中的led 文件拷到根文件系统中:

$ cp led /

拷贝完成后,执行:

$ umount /mnt

可以卸载u盘

至此,完成了led可执行二进制程序从虚拟机到fs210 linux 文件系统的拷贝。

4.4 执行程序

在串口终端,执行:

$ cd /

进入led程序所在目录(在前面,已经把led文件从u盘拷到了根目录) 改变led文件权限,赋予可执行权限

$ chmod 777 led

执行

$ ps

找到storage_manage 进程对应的进程号为1340

执行

$ kill 1340

杀死进程storage_manage 因为,它对led程序执行有影响,借此可以学习一下杀死已经存在进程的命令

执行

$ ./led 5

可以看到led 灯1和灯2 循环亮灭5次,后面数字代表led循环亮灭的次数,由用户指定

执行

$ ./led open 1

会打开 led灯1

执行

$ ./led close 1

会关闭 led灯1

执行

$ ./led open 2

会打开led 灯2

执行

$ ./led close 2

会关闭led灯2

5、参考代码

#include <stdio.h>
        #include <errno.h>
        #include <fcntl.h>
        #include <unistd.h>
        #include <stdlib.h>
        #include <string.h>
        #include <syscall.h>
        #include <sys/stat.h>
        #include <sys/types.h>
        #include <sys/ioctl.h>
        #include <linux/fs.h>
        #include <linux/ioctl.h>
        #define DEV_LED "/dev/led"
        //宏定义FS210 linux 文件系统中led灯对 应的设备节点

        #define LED_ON 1 // ioctrl 控制命令 打开led灯的命令
        #define LED_OFF 0 // ioctrl 控制命令 关闭led灯的命令

        int dev_led_fd; //定义/dev/led 对应的设备文件描述符

        int main (int argc ,char **argv)
        {
                int led_no; //定义led灯的编号
                int count = argv[1][0] -48; //定义流水灯亮灭的次数

                if ((dev_led_fd = open (DEV_LED, O_RDWR | O_NONBLOCK)) < 0 )
                //以非阻塞和读写方式打开/dev/led 设备节点
                {
                        printf ("Cann't open file /dev/led\n");
                        exit (-1);
                }
                printf ("open /dev/led is ok\n");
                if(argc == 2) //判断传给主函数的参数个数
                {

                        while (count--)
                        {
                                led_no = 1;
                                ioctl (dev_led_fd, LED_ON, led_no); //打开led灯1
                                sleep(1); //延时1秒钟
                                ioctl (dev_led_fd, LED_OFF, led_no); //关闭led灯1
                                led_no = 2;
                                sleep(1); //延时1秒钟
                                ioctl (dev_led_fd, LED_ON, led_no); //打开led灯2
                               &nbnbsp;sleep(1);
                                ioctl (dev_led_fd, LED_OFF, led_no) ;//关闭led灯2
                                sleep(1);

                        }
                }
                else if(argc == 3)
                {
                        if(argv[1][0] == 'o' || argv[1][0] == 'O')
                        //判断传入的参数是打开还是关闭 如果是字符'O' 代表打开led灯
  nbsp;                      ioctl (dev_led_fd, LED_ON, argv[2][0] - 48);
                        //根据传入的参数来决定是打开第一个led灯还是第二个led灯
                        else if(argv[1][0] == 'c' || argv[1][0] == 'C')
                        //如果是字符'C' 则代表关闭led灯
                        ioctl (dev_led_fd, LED_OFF, argv[2][0] - 48);
                        //根据传入的参数来决定是关闭第一个led灯还是第二个led灯
                        else
            nbsp;            {
                                printf("your input is incorrect,please try again\n");
                                return 0;
                        }
                }
                else
                printf("your input is incorrect,please try again\n");
                return 0;

        }

发表评论
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)