嵌入式课程---嵌入式Linux的直流电机驱动开发
文章目录
- 实验环境准备
- 步骤简要说明:
- 第一步:测试三个系统是否连通
- 第二步:编写并编译好驱动程序和测试驱动的程序
- 编写直流电机驱动程序dc_motor.c
- 编写驱动程序的Makefile文件
- 编写驱动测试程序dcMotor_test.c
- 编写测试驱动程序的Makefile文件
- 第三步:编译生成dc_motor.ko与dcMotor_test二进制执行文件
- 第四步:将dc_motor.ko文件与dcMotor_test文件挂载到实验箱板子
- 第五步:在实验箱装载驱动并使用程序进行测试
实验环境准备
实验材料:GEC6818实验箱、电脑、
实验环境:VMware下Linux系统、arm-linux-交叉编译环境,windows系统、secureCRT平台
步骤简要说明:
因为需要用到Linux系统环境,所以在Windows下装了个虚拟机,使用虚拟机的环境来开发驱动,并编写了测试驱动的程序,然后把驱动与测试驱动的两个文件传送到实验箱中,接着在实验箱上测试驱动是否可用
第一步:测试三个系统是否连通
- 禁用pc机无线网卡、关闭所有防火墙、使用网线连接PC机与实验箱
- 设置pc机的IP地址(192.168.1.160)、子网掩码(255.255.255.0)
- 设置虚拟机IP地址,在终端下输入:
ifconfig eth0 192.168.1.170
- 设置实验箱IP地址,在secureCRT下,输入:
ifconfig eth0 192.168.1.180
- 然后三个系统之间互相ping一下,看是否能ping通,注意,一定要ping通才能做接下来的实验
第二步:编写并编译好驱动程序和测试驱动的程序
编写直流电机驱动程序dc_motor.c
/*---------------------------------------*功能描述: 直流电机驱动 *创建者: 粤嵌技术部*创建时间: 2017,01,01---------------------------------------*修改日志:*修改内容:*修改人:*修改时间:----------------------------------------*//**************************************************头文件*************************************************/#include <linux/kernel.h>#include <linux/module.h>#include <linux/miscdevice.h>#include <linux/fs.h>#include <linux/types.h>#include <linux/moduleparam.h>#include <linux/slab.h>#include <linux/ioctl.h>#include <linux/cdev.h>#include <linux/delay.h>#include <linux/gpio.h>#include <mach/gpio.h>#include <mach/platform.h>#include <asm/gpio.h>#define DEVICE_NAME "dc_motor" //设备名字 //电机管脚static int motor_gpios[] = {(PAD_GPIO_C + 24),(PAD_GPIO_C + 25),};#define MOTOR_NUM ARRAY_SIZE(motor_gpios) //电机的数量/**************************************************电机初始化*************************************************/static void motor_init(void){gpio_set_value(motor_gpios[0], 0);gpio_set_value(motor_gpios[1], 0);}/**************************************************电机正传*************************************************/static void motor_foreward(void){gpio_set_value(motor_gpios[0], 1);gpio_set_value(motor_gpios[1], 0);}/**************************************************电机反转*************************************************/static void motor_rollback(void){gpio_set_value(motor_gpios[1], 1);gpio_set_value(motor_gpios[0], 0);}/**************************************************电机设备打开*************************************************/static int gec6818_motor_open(struct inode *inode, struct file *filp){printk(DEVICE_NAME ":open\n");motor_init();return 0;}/**************************************************电机控制程序*************************************************/static long gec6818_motor_ioctl(struct file *filp, unsigned int cmd,unsigned long arg){switch(cmd) {case 0:if (arg > MOTOR_NUM) {return -EINVAL;}motor_init();printk("Motor Stop.\n");break;case 1:if (arg > MOTOR_NUM) {return -EINVAL;}motor_rollback();printk("Motor Rollback.\n");break;case 4:if (arg > MOTOR_NUM) {return -EINVAL;} motor_foreward();printk("Motor Foreward.\n");break;default:return -EINVAL;}return 0;}/**************************************************文件操作集*************************************************/static struct file_operations gec6818_motor_dev_fops = {.owner = THIS_MODULE,.unlocked_ioctl = gec6818_motor_ioctl,.open = gec6818_motor_open};/**************************************************杂项设备*************************************************/static struct miscdevice gec6818_motor_dev = {.minor = MISC_DYNAMIC_MINOR,.name = DEVICE_NAME,.fops = &gec6818_motor_dev_fops,};/*********************************************************************驱动的初始化函数--->从内核中申请资源(内核、中断、设备号、锁....)********************************************************************/static int __init gec6818_motor_dev_init(void){int ret;int i;for (i = 0; i < MOTOR_NUM; i++) {ret = gpio_request(motor_gpios[i], "MOTOR");if (ret) {printk("%s: request GPIO %d for MOTOR failed, ret = %d\n", DEVICE_NAME,motor_gpios[i], ret);return ret;}gpio_direction_output(motor_gpios[i], 0);}gpio_set_value(motor_gpios[0], 0);gpio_set_value(motor_gpios[1], 0);ret = misc_register(&gec6818_motor_dev);printk(DEVICE_NAME"\tinitialized\n");return ret;}/******************************************************************驱动退出函数 --->将申请的资源还给内核*****************************************************************/static void __exit gec6818_motor_dev_exit(void) {int i;for (i = 0; i < MOTOR_NUM; i++) {gpio_free(motor_gpios[i]);}misc_deregister(&gec6818_motor_dev);}module_init(gec6818_motor_dev_init); //驱动的入口函数会调用一个用户的初始化函数module_exit(gec6818_motor_dev_exit); //驱动的出口函数会调用一个用户的退出函数//驱动的描述信息: #modinfo *.ko , 驱动的描述信息并不是必需的。MODULE_AUTHOR("kaoyangou"); //驱动的作者MODULE_DESCRIPTION("Dc_Motor of driver"); //驱动的描述MODULE_LICENSE("GPL"); //遵循的协议
编写驱动程序的Makefile文件
INSTALLDIR = /home/Helloifneq ($(KERNELRELEASE),)obj-m:=dc_motor.oelseKERNELDIR:=/home/Hello/demo/6818GEC/kernelCROSS_COMPILE:=/home/Hello/demo/6818GEC/prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi-PWD:=$(shell pwd)default:mkdir -p $(INSTALLDIR)$(MAKE) ARCH=arm CROSS_COMPILE=$(CROSS_COMPILE) -C $(KERNELDIR) M=$(PWD) modulescp --target-dir=$(INSTALLDIR) dc_motor.koclean:rm -rf *.o *.order .*.cmd *.ko *.mod.c *.symversendif
编写驱动测试程序dcMotor_test.c
/*---------------------------------------*功能描述: 直流电机测试程序*创建者: 粤嵌技术部*创建时间: 2015,01,01---------------------------------------*修改日志:*修改内容:*修改人:*修改时间:----------------------------------------*//**************************************************头文件*************************************************/#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/ioctl.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#define PATH "/dev/dc_motor" //绝对路径/**************************************************主函数*************************************************/int main(void){int fd;unsigned int val;fd = open(PATH, O_RDWR); //打开设备,成功返回0if (fd < 0) {perror("Failed to open!\n");exit(1);}do{ printf(" Please select how to operate the DC motor.\n");printf("0 ->Stop\n");printf("1 -> Rollback\n");printf("4 -> Foreward\n");printf("9 -> Exit!\n");scanf("%d", &val);if(val == 9) break;ioctl(fd, val, 0);}while(1);close(fd);return 0;}
编写测试驱动程序的Makefile文件
## Makefile for Linux application test example.##---------------------------------------------------------------# Linux application Makefile sample# make -- the optical output without debug info# make clean -- clean the object file(s)# make install -- install the execute file(s) to INSTALLDIR#---------------------------------------------------------------# History:# INSTALLDIR = /home/Hello#--------------------------------- /* execute file(s) */TESTFILE = dcMotor_test#--------------------------------- /* object file(s) */SRCFILE = dcMotor_test.c#--------------------------------- /* header file(s) */TESTFILE_H =CROSS = arm-none-linux-gnueabi-CC = $(CROSS)gccAS = $(CROSS)asLD = $(CROSS)ldCFLAGS += -O2 -Wallall: $(TESTFILE)$(TESTFILE): $(SRCFILE) $(TESTFILE_H) Makefilemkdir -p $(INSTALLDIR) $(CC) $(CFLAGS) -o $@ $@.ccp --target-dir=$(INSTALLDIR) $(TESTFILE)clean:rm -f $(TESTFILE)
第三步:编译生成dc_motor.ko与dcMotor_test二进制执行文件
- 将驱动程序dc_motor.c与其对应Makefile文件放在同一目录下,然后在该目录下执行命令make,生成目标文件dc_motor.ko
注意:Makefile中可能制定了生成的二进制执行文件安装路径:INSTALLDIR = 某某某- 将驱动程序dcMotor_test.c与其对应Makefile文件放在同一目录下,然后在该目录下执行命令make,生成目标文件dcMotor_test
注意:Makefile中可能制定了生成的二进制执行文件安装路径:INSTALLDIR = 某某某
需要知道的是,以上的编译属于交叉编译,Makefile文件中已指定相应的交叉编译器
第四步:将dc_motor.ko文件与dcMotor_test文件挂载到实验箱板子
- 将dc_motor.ko文件与dcMotor_test文件统一放在虚拟机的nfs_share目录上
- 在secureCRT命令框使用mount命令进行挂载,命令中的ip地址是虚拟机的ip地址
mount -o nolock,tcp 192.168.1.170:/home/Hello/nfs_share /mnt
第五步:在实验箱装载驱动并使用程序进行测试
- 在secureCRT中输入命令lsmod,然后回车,在返回的消息中如果找到有dc_motor字眼的一行,则使用rmmod dc_motor进行卸载原有驱动,确保实验箱系统不存在直流电机的驱动程序
lsmod //查看已存在驱动rmmod dc_motor //卸载dc_motor直流电机的驱动
- 进入到目录 /mnt,然后插入驱动dc_motor.ko,因为刚才把自己制作的驱动挂载到了/mnt目录下
insmod dc_motor.ko
- 测试,输入命令打开直流电机
./dcMotor_test
然后,选择1或4选项,发现直流电机转动,实验成功!
嵌入式课程---嵌入式Linux的直流电机驱动开发相关推荐
- 嵌入式课程设计linux,嵌入式系统课程设计--基于U盘的linux操作系统的构建
嵌入式系统课程设计--基于U盘的linux操作系统的构建 1 课程设计报告课程设计报告 课程名称课程名称 嵌入式系统课程设计嵌入式系统课程设计 设计题目设计题目基于基于 U盘的盘的 linux 操作系 ...
- 嵌入式课程设计linux,嵌入式课程设计报告
一. 基础内容 1 .Linux内核移植实验 问题回答 1. 交叉编译环境包括哪些工具,它的作用是什么? 答:GNU的交叉编译器,包括以下组件: (1). Gcc交叉编译器,即在宿主机上开发编译目标上 ...
- linux 直流电机驱动设计,嵌入式Linux直流电机驱动.PPT
嵌入式Linux直流电机驱动.PPT 嵌入式Linux直流电机驱动实验 开发平台中直流电机驱动的实现 S3C2410芯片自带定时器,所以控制部分省去了三角波产生电路.脉冲调制电路和PWM信号延迟及信号 ...
- 视频教程-初级玩转Linux+Ubuntu(嵌入式开发基础课程)-嵌入式
初级玩转Linux+Ubuntu(嵌入式开发基础课程) 6年嵌入式开发经验,在多家半导体公司从事芯片测试.验证.Linux驱动开发都工作.熟悉芯片设计流程.熟悉产品平台方案开发流程. 王利涛 ¥39. ...
- 嵌入式Linux结课报告,嵌入式课程报告.doc
嵌入式课程报告 嵌入式系统及应用设计报告 题 目 嵌入式Linux系统移植 专 业 电子与通信工程 姓 名 王文平 学 号 1320610012 一.硬件设备介绍 此次实验用的板子是友善之臂的Mini ...
- alin的学习之路:嵌入式课程设计总结(基于Linux的Qt版MP3播放器)
嵌入式课程设计总结(基于Linux的Qt版MP3播放器) 废话不多写直接上图上代码,其中有很多不规范的地方,希望大佬们指正. 1.课设题目 设计一个MP3播放器,要求:使用Linux下的madplay ...
- 用linux设计99乘法表,嵌入式课程设计九九乘法表
<嵌入式课程设计九九乘法表>由会员分享,可在线阅读,更多相关<嵌入式课程设计九九乘法表(8页珍藏版)>请在人人文库网上搜索. 1.安阳师范学院计算机与信息工程学院嵌入式系统课程 ...
- linux嵌入式主要学什么,学嵌入式linux,用什么开发板,请大家推荐一下
搞个嵌入式linux培训班的课程来看下,就知道要学什么了 C语言基础.C++基础.数据结构.操作系统原理.Linux应用基础.电子电路基础 开课前一周:入学基础测试与辅导(C语言.C++.linux基 ...
- 嵌入式 Linux 与物联网软件开发 ——C 语言内核深度解析
C 语言是嵌入式 Linux 领域的主要开发语言. 对于学习嵌入式.单片机.Linux 驱动开发等技术来说,C 语言是必须要过的一关.C 语言学习的特点是入门容易.深入理解难.精通更是难上加难.很多用 ...
最新文章
- 编写Java程序最容易犯的21种错误
- #celery#周期性任务
- C#LeetCode刷题之#852-山脉数组的峰顶索引(Peak Index in a Mountain Array)
- 父组件更新prop_如何在ReactJS中更新组件的prop —哦,是的,有可能
- 力扣114. 二叉树展开为链表(C++,解释一下别人的思路)
- VI中的多行删除与复制
- mysql:Cannot load driver class: com.mysql.jdbc.Driver
- 机器学习初学者入门实践:怎样轻松创造高精度分类网络
- SSH集成项目,使用注解方式,竟然还有这样的问题!!
- 汉字书写解码_汉字密码 | 500个字根即可解码10万个汉字,《说文解字》的神功...
- VS2010旗舰版安装图解
- matlab版深度学习入门之旅----体验过后的个人记录
- Windows系统微软拾色器小工具
- azure kinect 深度相机原理
- Springboot连接Redis超时问题解决
- 从软件工程师到有赞新零售技术负责人,34岁李星专访
- BZOJ 5442: [Ceoi2018]Global warming
- Python自动切换wifi
- 使用EndNote在Word中插入参考文献的格式设置
- xmlhttp的实际使用