




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、PWM控制LED一、 确定任务1、掌握基本的字符设备的驱动程序设计。2、掌握基本的文件操作。3、掌握在操作系统下的PWM驱动程序的原理。二、 学习内容 1、阅读S5PV210数据手册,熟悉PWM的原理。2、编写PWM输出的应用程序。3、编写makefile文件4、下载并调试PWM输出的应用程序。三、基础知识a) 原理图:b) 系统框架由该图可知,在选取了PCLK作为时钟源后,需经过8BIT PRESCALER0分频器,而后,经过1/1或1/2或1/4或1/8或1/16分频器后,送到逻辑控制电路(Control LogicX)后,被送到引脚输出。所以,对PWM的操作就是围绕设置时钟分频,得到合适
2、的频率,然后,设置逻辑控制电路得到合适的脉宽。c) 寄存器简介:寄存器TCFG0用于配置PWM的预分频比,TCFG015:8八位用于配置计时器2、3、4(timer2、timer3、timer4)的预分频值。TCFG07:0八位用于配置计时器0、1的预分频值。寄存器TCFG1用于配置PWM的分频比。PWM控制寄存器TCON,设置启动PWM,装载寄存器,输出反相及寄存器自动装载等功能。TCNTB1是timer1的定时器计数寄存器。TCMPB1是timer1的定时器比较寄存器。TCNTO1是timer1的定时器计数寄寄存器,可以从中读出当前计数寄存器中的值。四、代码设计 1、 PWM输出的原理:P
3、WM输出脚,默认为低电平,PWM计数器TCNTn的初始值等于TCNTBn,当TCNTn的值递减到等于TCMPBn的值时,PWM输出高电平,当PWM计数器的递减到0时,输出又变为低电平,如此周而复始。2、 驱动原理:该驱动实现为一个字符设备,通过ioctl函数来设置相关寄存器的值,以此来实现PWM波形的输出与禁止3、 驱动代码分析:(详细代码请查看附件)#include <linux/module.h>#include <linux/kernel.h>#include <linux/fs.h>#include <linux/init.h>#incl
4、ude <linux/delay.h>#include <linux/poll.h>#include <linux/interrupt.h>#include <linux/gpio.h>#include <asm/irq.h>#include <asm/io.h>#include <asm/uaccess.h>#include <mach/regs-gpio.h>#include <mach/hardware.h>#include <plat/regs-timer.h>#in
5、clude <mach/regs-irq.h>#include <asm/mach/time.h>#include <linux/clk.h>#include <linux/cdev.h>#include <linux/device.h>#include <linux/miscdevice.h>/*210平台头文件*/#include <linux/platform_device.h>#include <plat/gpio-cfg.h>#include <mach/gpio.h>#def
6、ine TCFG0 0xE2500000 #define TCFG1 0xE2500004 #define TCON 0xE2500008 #define TCNTB0 0xE250000C #define TCMPB0 0xE2500010 #define TCNTO0 0xE2500014#defineTCNTB1 0xE2500018 #define TCMPB1 0xE250001C #define TCNTO1 0xE2500020 /* 声明unsigned int指针* 用于保存寄存器映射后的地址*/unsigned int *rTCFG0; unsigned int *rTCF
7、G1; unsigned int *rTCON; unsigned int *rTCNTB0; unsigned int *rTCMPB0; unsigned int *rTCNTO0; unsigned int *rTCNTB1; unsigned int *rTCMPB1; unsigned int *rTCNTO1; unsigned long tcnt;#define DEVICE_NAME "pwm_led"#define PWM_IOCTL_SET_HOLLOW 0#define PWM_IOCTL_SET_FREQ 1static struct semapho
8、re lock;/ set_register( rGPH2CON , 0x1, 0xf , 0 );/* * 自定义set_register函数,作用如下:*mmap_addr = *mmap_addr &( ( clear_flag << pos );*mmap_addr = *mmap_addr | (value << pos);*/*mmap_addr:映射后寄存器地址 value:要设置的值 clear_flag:清除标志 pos:清除位置*/unsigned int set_register( unsigned int *mmap_addr , uns
9、igned int value ,unsigned int clear_flag ,unsigned char pos) unsigned int register_value_org; /寄存器原来的值 unsigned int register_value; /*读取寄存器的值*/ register_value = ioread32( mmap_addr ); register_value_org = register_value; /* * 清除register_value对应位的值 * 如:register_value = register_value & (0x3 <&
10、lt; 4); * 既是将register_value第4、5位清零 */ register_value = register_value & (clear_flag << pos); /*设置register_value对应位的值*/ register_value = register_value | value << pos; /*将register_value的值写入mmap_addr寄存器中*/ iowrite32( register_value , mmap_addr ); return register_value_org; /返回原来寄存器的值/*
11、 freq: pclk/50/16/65536 pclk/50/16 * if pclk = 50MHz, freq is 1Hz to 62500Hz * human ear : 20Hz 20000Hz */void PWM_Set_hollow(unsigned long hollow)/ unsigned int tcmpb0;/ unsigned int tcmpb1;/tcmpb0 = (hollow & 0xffff); /chj/tcmpb1 = (hollow & (0xffff<<16)>>16); /chj/ printk(&quo
12、t;<3>tcmpb0:%dn",tcmpb0);/ printk("<3>tcmpb1:%dn",tcmpb1);/ _raw_writel(tcmpb0, rTCMPB0);/ _raw_writel(tcmpb1, rTCMPB1);/* switch(hollow)case 2: _raw_writel(tcnt/2, rTCMPB1); break;case 4: _raw_writel(tcnt/4, rTCMPB1); break;case 8: _raw_writel(tcnt/8, rTCMPB1); break;case
13、 16: _raw_writel(tcnt/16, rTCMPB1); break;case 32: _raw_writel(tcnt/32, rTCMPB1); break;case 64: _raw_writel(tcnt/64, rTCMPB1); break;case 128: _raw_writel(tcnt/128, rTCMPB1); break;case 256: _raw_writel(tcnt/256, rTCMPB1); break;default:break;*/_raw_writel(tcnt/hollow, rTCMPB1); static void PWM_Set
14、_Freq( unsigned long freq )unsigned long tcon;unsigned long tcfg1;unsigned long tcfg0;struct clk *clk_p;unsigned long pclk;/set GPB0 as tout0, pwm output/s3c2410_gpio_cfgpin(S3C2410_GPB0, S3C2410_GPB0_TOUT0);/s3c2410_gpio_cfgpin(S3C2410_GPB1, S3C2410_GPB1_TOUT1);/chj/s3c_gpio_cfgpin(S5PV210_GPD0(0),
15、S3C_GPIO_SFN(2);s3c_gpio_cfgpin(S5PV210_GPD0(1),S3C_GPIO_SFN(2);/tcon = _raw_readl(S3C2410_TCON);/tcfg1 = _raw_readl(S3C2410_TCFG1);/tcfg0 = _raw_readl(S3C2410_TCFG0);tcon = _raw_readl(rTCON); tcfg1 = _raw_readl(rTCFG1); tcfg0 = _raw_readl(rTCFG0);/prescaler = 50/tcfg0 &= S3C2410_TCFG_PRESCALER0
16、_MASK;/tcfg0 |= (50 - 1); tcfg0 &= 0x00; tcfg0 |= (50 - 1); /mux = 1/16/tcfg1 &= 0x0000000f;tcfg1 &= (0x0000000f<<4); /chj/tcfg1 |= 0x00000003;tcfg1 |= 0x00000003<<4; /chj_raw_writel(tcfg1, rTCFG1);_raw_writel(tcfg0, rTCFG0);clk_p = clk_get(NULL, "pclk");pclk = clk_
17、get_rate(clk_p);tcnt = (pclk/50/8)/freq;/ printk("<3>pclk:%ldn",pclk);/ printk("<3>tcnt:%ldn",tcnt);/ printk("<3>tcnt:%ldn",tcnt);/_raw_writel(tcnt, rTCNTB0); _raw_writel(tcnt, rTCNTB1); /chj/_raw_writel(tcnt/2, rTCMPB0);_raw_writel(tcnt/2, rTCMPB1); /
18、chj tcon &= 0x10;tcon &= (0xf<<8); /chj/tcon |= 0xb; /disable deadzone, auto-reload, inv-on, update TCNTB0&TCMPB0, start timer 0tcon |= (0xf<<8); /chj_raw_writel(tcon, rTCON);/tcon &= 2; /clear manual update bittcon &=(2<<8); /chj_raw_writel(tcon, rTCON);static
19、void PWM_Stop(void)/s3c2410_gpio_cfgpin(S3C2410_GPB0, S3C2410_GPIO_OUTPUT);/s3c2410_gpio_cfgpin(S3C2410_GPB1, S3C2410_GPIO_OUTPUT); /chj/s3c2410_gpio_setpin(S3C2410_GPB0, 0);/s3c2410_gpio_setpin(S3C2410_GPB1, 0);/s3c_gpio_cfgpin(S5PV210_GPD0(0),S3C_GPIO_SFN(1); / s3c_gpio_cfgpin(S5PV210_GPD0(1),S3C_
20、GPIO_SFN(1);/s3c_gpio_setpin(S5PV210_GPD0(0), 0); / s3c_gpio_setpin(S5PV210_GPD0(1), 0);unsigned long tcon;tcon = _raw_readl(rTCON);tcon &= (0x1<<8); /chj_raw_writel(tcon, rTCON);static int s3c24xx_pwm_open(struct inode *inode, struct file *file)/*if (!down_trylock(&lock) return 0;else
21、 return -EBUSY;*/return 0;static int s3c24xx_pwm_close(struct inode *inode, struct file *file)PWM_Stop();/up(&lock); return 0;static int s3c24xx_pwm_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)/printk("ioctl pwm: %x %lxn", cmd, arg);switch (cmd) ca
22、se PWM_IOCTL_SET_FREQ: if (arg = 0) return -EINVAL; PWM_Set_Freq(arg); break;case PWM_IOCTL_SET_HOLLOW: PWM_Set_hollow(arg); break;default: break;return 0;static struct file_operations dev_fops = .owner = THIS_MODULE, .open = s3c24xx_pwm_open, .release = s3c24xx_pwm_close, .ioctl = s3c24xx_pwm_ioctl
23、,;static struct miscdevice misc = .minor = MISC_DYNAMIC_MINOR,.name = DEVICE_NAME,.fops = &dev_fops,;static int _init dev_init(void)int ret;init_MUTEX(&lock);ret = misc_register(&misc);printk (DEVICE_NAME"tinitializedn");/*将GPIO的物理地址映射到内核空间中*/rTCFG0 = ioremap( TCFG0 , 4 ); rTCF
24、G1 = ioremap( TCFG1 , 4 ); rTCON = ioremap( TCON , 4 ); /rTCNTB0 = ioremap( TCNTB0 , 4 ); /rTCMPB0 = ioremap( TCMPB0 , 4 ); rTCNTB1 = ioremap( TCNTB1 , 4 );rTCMPB1 = ioremap( TCMPB1 , 4 ); /rTCNTO0 = ioremap( TCNTO0 , 4 ); rTCNTO1 = ioremap( TCNTO1 , 4 ); return ret;static void _exit dev_exit(void)PWM_Stop();/up(&lock);/*解除GPIO映射*/ iounmap(rTCFG0);iounmap(rTCFG1);iounmap(rTCON);/iounmap(rTCNTB0);/iounmap(rTCMPB0);iounmap(rTCNTB1);iounmap(rTCMPB1);/iounmap(rTCNTO0);iounmap(rTCNTO1);misc_deregister(&misc);module_init(dev_init);module_exit(dev_e
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 湖北艺术职业学院《机械制造工艺学课程设计》2023-2024学年第二学期期末试卷
- 济南护理职业学院《人力资源管理(Ⅲ)》2023-2024学年第二学期期末试卷
- 闽江学院《广告学》2023-2024学年第二学期期末试卷
- 洛阳科技职业学院《媒体与社会》2023-2024学年第二学期期末试卷
- 仰恩大学《住宅建筑设计原理》2023-2024学年第二学期期末试卷
- 陕西师范大学《路桥工程施工与养护管理》2023-2024学年第二学期期末试卷
- 贵州财经大学《信号与系统A(双语)》2023-2024学年第二学期期末试卷
- 青岛工程职业学院《中级公司金融》2023-2024学年第二学期期末试卷
- 生命教育:悦纳他人是一种智慧
- 2024年液压破碎锤项目资金申请报告代可行性研究报告
- 2025年中考英语高频词汇变形归纳《背诵版+默写版》
- 2025年人力资源管理专业知识考试试题及答案
- 仓储物流管理试题及答案
- 《儿童常见病预防》课件
- 护士招考三基试题及答案
- 2024年湖南省城步苗族自治县事业单位公开招聘医疗卫生岗笔试题带答案
- 《陆上风力发电建设工程质量监督检查大纲》
- 正确解读检验报告单 ppt课件
- 八年级数学(下)专题复习3--图形与坐标部分
- 氮气(MSDS)安全技术说明书
- 除尘风机安装使用 安全技术措施
评论
0/150
提交评论