网站大量收购闲置独家精品文档,联系QQ:2885784924

嵌入式系统设计与开发教程 课件 第5章 基于Linux的驱动程序设计-2.ppt

嵌入式系统设计与开发教程 课件 第5章 基于Linux的驱动程序设计-2.ppt

  1. 1、本文档共20页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

编写PWM驱动以及测试程序开发板的BEEP灯电路在Exynos4412中,一共有5个32位定时器,这些定时器课发送中断信号给ARM处理器,另外,定时器0、1、2、3包含了脉冲宽度调制(PWM),并可驱动其对应的I/O引脚。每个定时器都有一个独立的32位递减计数器,定时器启动后,计数缓冲寄存器(TCNTBn)将初始值加载到递减计数器,定时器时钟驱动递减计数器,当递减计数器达到零,自动产生计时器中断请求,同时相应TCNTBn的值自动重新加载,开始下一个循环。但是,如果定时器停止,如清除TCONn的定时器使能位,TCNTBn的值将不会重新加载到计数器中。每个定时器都有一个独立的32位比较缓冲寄存器(TCMPBn)。当递减计数器与定时器控制逻辑中比较寄存器的值相匹配时,PWM输出会产生由低到高的电平跳变,因此,比较寄存器决定PWM输出的开启时间或关闭时间。1、初始化定时器n对应的计数缓冲寄存器TCNTBn为159,定时器n对应的计数比较缓冲寄存器TCMPBn为109。2、启动定时器n:设置定时器n的启动位为1,并手动更新为为零。此时寄存器TCNTBn的值159自动加载到内部的递减寄存器中,并开始递减计数,同时输出引脚TOUTn输出低电平。3、当递减寄存器的值递减到109(TCMPBn的数值)时,定时器n对应的电平输出引脚TOUTn从低电平翻转到高电平。4、当递减寄存器的值递减到0时,计数缓冲寄存器TCNTBn的值159重新被加载到定时器的递减器,定时器n对应的电平输出引脚TOUTn重新输出低电平,这样流程重复进行,引脚TOUTn就输出占空比可控的PWM波。值得注意的是,修改计数缓冲寄存器TCNTBn或比较缓冲寄存器TCMPBn的值,只能在下一个PWM周期起作用,不影响当前周期PWM的占空比。PWM驱动源程序文件(pwm_dev.c)设计,关键步骤为:pwm_dev_open:主要实现对PWM的寄存器进行初始化工作,pwm_dev_release:主要实现停止PWM波形的输出,pwm_dev_ioctl:分别设置了四个命令实现PWM的启动,停止,设置分频系数以及设置频率。在驱动加载时,即pwm_dev_init函数中,将实例化的文件操作结构体pwm_ops与设备号关联并注册到内核中,同时生成对应的设备文件。#includelinux/module.h#includelinux/kernel.h#includelinux/init.h#includelinux/platform_device.h#includelinux/fb.h#includelinux/err.h#includelinux/slab.h#includelinux/delay.h#includelinux/gpio.h#includemach/gpio.h#includeplat/gpio-cfg.h?MODULE_LICENSE(GPLv2);?#defineDEVICE_NAME pwm//定义设备的名字为pwm#defineDEVICE_NUM 1staticintmajor=0;//主设备号,次设备号staticintminor=0;?structcdevpwm_dev_cdev;staticstructclass*pwm_class;pwm_dev.c?#defineNS_IN_1HZ 0x6400//100MHz/256/16?#defineBUZZER_PMW_GPIO EXYNOS4_GPD0(0)//蜂鸣器GPIO配置?#defineTIMER_BASE 0X139D0000void__iomem *timer_base;#defineTCFG0 (void__iomem *)(timer_base+0X00)#defineTCFG1 (void__iomem *)(timer_base+0X04)#defineTCON (void__iomem *)(timer_base+0X08)#defineTCNTB1 (void__iomem *)(timer_base+0X0C)#defineTCMPB1 (void__iomem *)(timer_base+0X10)?#definePWM_ON _IO(K,0)#definePWM_OFF _IO(K,1)#definePWM_SET_PRE _IOW(K,2,int)#definePWM_SET_FREQ _IOW(K,3,int)/

文档评论(0)

balala11 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档