版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、定时中断技术一、 确定任务1、 掌握基本的字符设备的驱动程序设计。2、 掌握基本的文件操作。3、 掌握在操作系统下的定时器驱动程序的原理。二、 学习内容 1、 阅读S5PV210数据手册,熟悉计数器的原理。2、 编写定时中断的应用程序。3、 编写makefile文件。4、掌握ARM定时中断驱动程序的基本框架结构。三、基础知识1、 硬件原理:a) 原理图:(略)b) 系统框架图:由该图可知,在选取了PCLK作为时钟源后,需经过8BIT PRESCALER0分频器,而后,经过1/1或1/2或1/4或1/8或1/16分频器后,送到逻辑控制电路(Control LogicX)后,被送到引脚输出。所以,
2、对PWM的操作就是围绕设置时钟分频,得到合适的频率,然后,设置逻辑控制电路得到合适的脉宽。c) 寄存器简介:寄存器TCFG0用于配置PWM的预分频比,TCFG015:8八位用于配置计时器2、3、4(timer2、timer3、timer4)的预分频值。TCFG07:0八位用于配置计时器0、1的预分频值。寄存器TCFG1用于配置PWM的分频比。PWM控制寄存器TCON,设置启动PWM,装载寄存器,输出反相及寄存器自动装载等功能。TCNTB0是timer0的定时器计数寄存器(其他定时计数器功能类似这里不再赘述)。TCMPB0是timer0的定时器比较寄存器。TCNTO0是timer0的定时器计数观
3、察寄存器,可以从中读出当前计数寄存器中的值。TINT_CSTAT是定时器的中断使能控制器和中断状态寄存器。四、代码设计 1、 PWM输出的原理:PWM输出脚,默认为低电平,PWM计数器TCNTn的初始值等于TCNTBn,当TCNTn的值递减到等于TCMPBn的值时,PWM输出高电平,当PWM计数器的递减到0时,输出又变为低电平,如此周而复始。2、 驱动原理:该驱动实现为一个字符设备,通过ioctl函数来设置相关寄存器的值,以此来实现PWM波形的输出与禁止3、 驱动代码分析:(详细代码请查看附件)#define DEVICE_NAME "timer"#define DEVIC
4、E_ID1static atomic_ton; static irqreturn_t led_on_off(int irq , void *dev_id) /timer中断服务程序if(on.counter) /根据原子量的不同值设置led灯的亮和灭gpio_set_value(S5PV210_GPJ2(0),on.counter&0xf); atomic_dec(&on); else gpio_set_value(S5PV210_GPJ2(0),on.counter&0xf);atomic_inc(&on);return IRQ_HANDLED;static
5、void pwm_stop(void)unsigned long flags;unsigned long tcon;spin_lock_irqsave(&pwm_spin_lock, flags);tcon = _raw_readl(S3C2410_TCON);tcon &= (1<<(TCON_BASE+0); / S3C2410_TCON_T1START 停止timer_raw_writel(tcon, S3C2410_TCON);spin_unlock_irqrestore(&pwm_spin_lock, flags);static void pwm_
6、set_freq(unsigned long freq) tcon = _raw_readl(S3C2410_TCON); tcfg1 = _raw_readl(S3C2410_TCFG1); tcfg0 = _raw_readl(S3C2410_TCFG0); tcon &= S3C2410_TCON_T1START; /stop timer1 _raw_writel(tcon,S3C2410_TCON); tcfg0 &= S3C2410_TCFG_PRESCALER0_MASK;tcfg0 |= (255 - 1); tcfg1 &= S3C2410_TCFG1_
7、MUX1_MASK; tcfg1 |= S3C2410_TCFG1_MUX1_DIV2; _raw_writel(tcfg1, S3C2410_TCFG1); /设置分频值 _raw_writel(tcfg0, S3C2410_TCFG0); /设置预分频值 clk_p = clk_get(NULL, "pclk"); pclk = clk_get_rate(clk_p);/tcnt = (pclk/(tcfg0+1)/16)*freq; _raw_writel(tcnt, S3C2410_TCNTB(DEVICE_ID); /设置TCNT计数值_raw_writel(tc
8、nt/2,S3C2410_TCMPB(DEVICE_ID); /设置TCMP比较值 tcon |=S3C2410_TCON_T1RELOAD|S3C2410_TCON_T1MANUALUPD; /自动加载和手动更新 _raw_writel(tcon, S3C2410_TCON);tcon &=S3C2410_TCON_T1INVERT;/电平不反转_raw_writel(tcon,S3C2410_TCON); tcon |=S3C2410_TCON_T1RELOAD;tcon &=(S3C2410_TCON_T1MANUALUPD); /自动加载和禁止手动更新 _raw_wri
9、tel(tcon,S3C2410_TCON);tint = _raw_readl(S3C64XX_TINT_CSTAT); tint |= (0x1<<1); _raw_writel(tint,S3C64XX_TINT_CSTAT); /timer中断使能 tcon |=S3C2410_TCON_T1START; _raw_writel(tcon, S3C2410_TCON); /启动计时器static int gec210_pwm_open(struct inode *inode, struct file *file) ret = request_irq(IRQ_TIMER1,l
10、ed_on_off,IRQF_TIMER,DEVICE_NAME,"timer2"); /申请时钟中断。static int gec210_pwm_close(struct inode *inode, struct file *file)pwm_stop();/停止计时器。up(&lock);free_irq(IRQ_TIMER1,"timer2"); /释放timer中断return 0;static int gec210_pwm_ioctl(struct inode *inode, struct file *file, unsigned in
11、t cmd, unsigned long arg)switch (cmd) case PWM_IOCTL_SET_FREQ: pwm_set_freq(arg); /设置计数值case PWM_IOCTL_STOP:pwm_stop(); / 停止计数器return 0;static ssize_t gec210_pwm_read (struct file *filp, char _user *buff, size_t count, loff_t *offp)cnt = _raw_readl(S3C2410_TCNTB(DEVICE_ID); /计数初始值printk("TCNTB
12、: t%ldn",cnt);cnt = _raw_readl(S3C2410_TCNTO(DEVICE_ID);/计数实时值printk("TCNTO %ldn",cnt);ret = copy_to_user(buff,&cnt,count); /返回实时值到用户空间return ret ;static struct file_operations dev_fops = /操作方法.owner = THIS_MODULE,.open = gec210_pwm_open,.release = gec210_pwm_close, .ioctl = gec21
13、0_pwm_ioctl,.read = gec210_pwm_read,;static struct miscdevice misc = /misc设备结构.minor = MISC_DYNAMIC_MINOR,.name = DEVICE_NAME,.fops = &dev_fops,;static int _init dev_init(void)init_MUTEX(&lock);/初始化信号锁 s3c_gpio_cfgpin(S5PV210_GPJ2(0), S3C_GPIO_OUTPUT); /设置led灯ret = misc_register(&misc);
14、/注册misc设备static void _exit dev_exit(void)misc_deregister(&misc); /注销misc设备module_init(dev_init);module_exit(dev_exit);MODULE_LICENSE("GPL");MODULE_AUTHOR("GEC Inc.");MODULE_DESCRIPTION("S5PV210/S3C2410/S3C2440 PWM Driver");4、 驱动程序makefile请参照蜂鸣器实验编写。5、 测试程序和蜂鸣器大致相同,这
15、里不再分析。本实验设置预分频值255、分频值采用默认值1。通过执行测试程序最低可实现约0.03秒产生一次定时中断,例如./timer_irq_test on 2 约0.06秒的将产生一次中断。#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/ioctl.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <sys/select
16、.h>#include <sys/time.h>#include <errno.h>#include <limits.h>#define PWM_IOCTL_SET_FREQ 1#define PWM_IOCTL_STOP 0 void Usage(char *args)printf("Usage: %s <on/off> <freq>n",args);return ;int main(int argc , char *argv)int buzzer_fd;unsigned long freq;char *e
17、ndstr, *str;unsigned long counter=0;int ret ;if(argc=3)buzzer_fd = open("/dev/timer",O_RDWR); /注意: 打开设备为timer if(buzzer_fd<0)perror("open device:");exit(1);str = argv2;errno = 0;freq = strtol(str , &endstr, 0);if(errno = ERANGE &&(freq = LONG_MAX |freq =LONG_MIN)|(
18、errno !=0 && freq =0)perror("freq :");exit(EXIT_FAILURE);if(endstr =str)fprintf(stderr , "Please input a digits for freqn");exit(EXIT_FAILURE);if(!strncmp(argv1, "on" ,2)ioctl(buzzer_fd, PWM_IOCTL_SET_FREQ , freq );else if(!strncmp(argv1, "off", 3)ioct
19、l(buzzer_fd , PWM_IOCTL_STOP , freq);elseclose(buzzer_fd);exit(EXIT_FAILURE);else if(argc =2)buzzer_fd = open("/dev/timer",O_RDWR);if(buzzer_fd<0)perror("open device:");exit(1);if(!strncmp(argv1, "off", 3)ioctl(buzzer_fd , PWM_IOCTL_STOP , freq); /此处freq并无实际作用elseclose(buzzer_fd);exit(EXIT_FAILURE);else Usage(argv0);exit(EXIT_FAILURE);while(1)#if 0ret = read(buzzer_fd,&counter,sizeof(counter); /读取驱动传上来的TCNTO值if(ret <0)perror("read");exit(EXIT_FAILURE);printf("counter %dn",counter);#end
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- T/CI 544-2024低维半导体材料生长、表征及电子元器件制作流程
- T/CI 193-2023冻土工程测试及观测技术指南
- 阿片类药物的剂量滴定
- 金融业务沟通和销售技巧
- 艾滋丙肝梅毒的临床意义及实验室诊断
- T/CHBAS 58-2024钢中非金属夹杂物和碳化物智能金相检测方法
- 绩效测验与评价中心
- 2026年秋招:黑龙江机场管理集团试题及答案
- 2026年秋招:河北港口集团笔试题及答案
- 2026年秋招:海尔智家试题及答案
- 湖北省武汉市2027届高三上9月调研考试地理试卷( 含答案)
- 移动智慧家庭工程师(家客L3)等级认证备考试题及答案
- 2025绵阳东辰本部小升初数学考试试题库(含答案)
- 2026 年秋季校园传染病案例警示教育
- 2026银行业务创新研究与服务模式分析与发展方向研究报告
- 丰田TSC 7000G-2023中文版(丰田汽车电气电子部件环境测试标准)
- 县级管理档案实施方案
- 肠梗阻诊疗指南(2024版)
- 2026中国金融基础设施现代化建设与运营效率提升研究报告
- 《固态电力变压器第1部分技术规范》
- 医保局保密工作制度
评论
0/150
提交评论