FS210开发平台板载LED灯控制实验 |
您所在的位置:网站首页 › 华清远见图标 › FS210开发平台板载LED灯控制实验 |
目 录 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 #include #include #include #include #include #include #include #include #include #include #include #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)) //以非阻塞和读写方式打开/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; } |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |