基于UT-S3C6410 ARM11的超声波驱动

上传人:飞*** 文档编号:46007320 上传时间:2018-06-20 格式:DOC 页数:17 大小:474.50KB
返回 下载 相关 举报
基于UT-S3C6410 ARM11的超声波驱动_第1页
第1页 / 共17页
基于UT-S3C6410 ARM11的超声波驱动_第2页
第2页 / 共17页
基于UT-S3C6410 ARM11的超声波驱动_第3页
第3页 / 共17页
基于UT-S3C6410 ARM11的超声波驱动_第4页
第4页 / 共17页
基于UT-S3C6410 ARM11的超声波驱动_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《基于UT-S3C6410 ARM11的超声波驱动》由会员分享,可在线阅读,更多相关《基于UT-S3C6410 ARM11的超声波驱动(17页珍藏版)》请在金锄头文库上搜索。

1、基于基于UT-S3C6410UT-S3C6410 ARM11ARM11的超声波驱动的超声波驱动在网上搜了一下,发现没有基于 ARM11 超声波模块的驱动,所以在这里献上自己所写的两个驱动,一个是基于中断,另一个基于 IO 的,两个都不算太理想,但是有总比没有强,我只是给广大 ARM 爱好者一个开头或铺垫,在我的基础上更改写出更好的驱动,首先来看一下超声波模块一些参数。这里用的是 HC-SR04 超声波测距模块可提供 2cm-400cm 的非接触式距离感测功能, 测距精度可达高到 3mm;模块包括超声波发射器、接收器与控制电路。图* 实物图图* 系统原理图3、电气参数:电气参数HCHC- -S

2、SR04R04 超声波模块 工作电压DC 5 V 工作电流15mA工作频率40Hz 最远射程4m 最近射程2cm 测量角度15 度 输入触发信号10uS 的 TTL 脉冲 输出回响信号输出 TTL 电平信号,与射程成比例 规格尺寸45*20*15mm4、超声波时序图:图二、 超声波时序图 超生波模块的具体参数就不详细介绍了,先来看第一基于中断的驱动。/* 分割线 */* A simple kernel module: “UltraDriver“* The initial developer of the original code is Sun Xue* . All Rights Reserv

3、ed.*/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define DEVICE_NAME“ultrasonic“ /*模块名称*/ #define DEVICE_MAJO

4、R 210/*预设主设备号*/#define TIME2INT IRQ_TIMER2/*定时器2中断*/ #define EINT8 IRQ_EINT(8) #define EINT9 IRQ_EINT(9)#define EINT10 IRQ_EINT(10) #define EINT11 IRQ_EINT(11) #define EINT12 IRQ_EINT(12) #define EINT13 IRQ_EINT(13) #define EINT14 IRQ_EINT(14) #define EINT15 IRQ_EINT(15)int flag = 0;static char *dev

5、ice_name = DEVICE_NAME; static int device_major = DEVICE_MAJOR;static struct semaphore lock;/*设备结构体*/ struct device_dev struct cdev cdev;/*cdev结构体*/ int data2; ; struct device_dev *device_devp;/*设备结构体指针*/void timerinit(void) /unsigned long tcon; unsigned long tcnt; unsigned long tcfg1; unsigned long

6、 tcfg0; unsigned long cstat;struct clk *clk_p; unsigned long pclk; unsigned long freq = 5;/频率unsigned tmp;/*IO Config*/ tmp = readl(S3C64XX_GPPPUD); tmp = (tmp /设置GPP0 和GPP1口上拉 1010writel(tmp, S3C64XX_GPPPUD);tmp = readl(S3C64XX_GPPCON); tmp = (tmp /设置GPP0 和GPP1口为输出 0101 writel(tmp, S3C64XX_GPPCON);

7、tmp = readl(S3C64XX_GPPDAT); tmp = (tmp /清零GPP0 和GPP1 writel(tmp, S3C64XX_GPPDAT);/*Time 01 io config*/ /tmp = readl(S3C64XX_GPFCON); /tmp = (tmp if (down_trylock( ret = request_irq(EINT8, start_time, IRQF_TRIGGER_RISING, DEVICE_NAME, NULL);/中断申 请 if(ret private_data; /*获得设备结构体指针*/*分析和获取有效的写长度*/ if(

8、size != 4)/每次必须写4Byte return ret; /*用户空间-内核空间*/ if (copy_from_user(dev-data, buf, size) ret = - EFAULT; printk(KERN_INFO “Write data0 is :%d n“, dev-data0);timerstart(); while(flag = 0) printk(“wait for flag !n“); if(flag = 1) printk(“Success !n“); else printk(“Time Out !n“); timerend();return ret;

9、static int ultrasonic_read(struct file *filp, char _user *buf, size_t size, loff_t *ppos) return 0; static int ultrasonic_close(struct inode *inode, struct file *file) up( free_irq(EINT8, NULL);/释放中断 free_irq(EINT9, NULL);/释放中断 free_irq(TIME2INT, NULL); timerend(); printk(“IOPWM Driver Release Calle

10、d!n“); return 0; static struct file_operations device_fops = .owner = THIS_MODULE,.open = ultrasonic_open, .write = ultrasonic_write, .read = ultrasonic_read,.release = ultrasonic_close, ;/*初始化并注册cdev*/ static void device_setup_cdev(struct device_dev *dev, int index) int err, devno = MKDEV(device_ma

11、jor, index);cdev_init( dev-cdev.owner = THIS_MODULE; err = cdev_add( if (err) printk(KERN_NOTICE “Error %d adding ultrasonic %dn“, err, index); /*驱动加载和卸载*/ static int _init device_init(void) int ret = 0; dev_t devno = MKDEV(device_major, 0); init_MUTEX(printk(“ULTRASONIC DRIVER MODULE INIT BEGIN !n“

12、); printk(KERN_INFO “model name:%sn“,device_name); printk(KERN_INFO “model major:%dn“,device_major);/* 申请设备号*/ if (device_major) ret = register_chrdev_region(devno, 1, device_name);/申请1个设备号 else /* 动态申请设备号 */ ret = alloc_chrdev_region(/动态申请1个设备号 device_major = MAJOR(devno); if (ret cdev); /*注销cdev*/

13、kfree(device_devp); /*释放设备结构体内存*/ unregister_chrdev_region(MKDEV(device_major, 0), 1); /*释放设备号*/ module_init(device_init); module_exit(device_exit);/*模块信息*/ MODULE_AUTHOR(“Sun Xue“); MODULE_VERSION(“V1.0“); MODULE_LICENSE(“Dual BSD/GPL“);/模块许可证声明 MODULE_DESCRIPTION(“S3C6410 Ultrasonic Driver“);/模块描述

14、 MODULE_ALIAS(“Ultrasonic Driver“);/模块别名/* 分割线 */基于IO的驱动/* A simple kernel module: “UltraDriver“* The initial developer of the original code is Sun Xue* . All Rights Reserved.*/#include #include #include #include #include #include #include #include #include #include #include #include #include #inclu

15、de #include #include #include #include #include #include #include #include #include #include #include #include #define DEVICE_NAME“ultrasonic“ /*模块名称*/ #define DEVICE_MAJOR 210/*预设主设备号*/#define TIME1INT IRQ_TIMER1/*定时器1中断*/int flag = 0;static char *device_name = DEVICE_NAME; static int device_major = DEVICE_MAJOR;static struct semaphore lock;/*设备结构体*/ struct device_dev struct cdev cdev;/*cdev结构体*/ int data2; ; struct device_dev *device_devp;/*设备结构体指针*/void timerinit(void) /unsigned long tcon; u

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号