嵌入式文档

上传人:碎****木 文档编号:229367627 上传时间:2021-12-25 格式:DOCX 页数:9 大小:21.89KB
返回 下载 相关 举报
嵌入式文档_第1页
第1页 / 共9页
嵌入式文档_第2页
第2页 / 共9页
嵌入式文档_第3页
第3页 / 共9页
亲,该文档总共9页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《嵌入式文档》由会员分享,可在线阅读,更多相关《嵌入式文档(9页珍藏版)》请在金锄头文库上搜索。

1、基于S3C2410 嵌入式Linux 系统PWM 驱动程序的设计摘要:嵌入式系统是软件和硬件的结合体,而驱动程序是协调软件与硬件的交点, 其质量直接关系到嵌入式系统的使用效率。文中以脉宽调制器( PWM)控制蜂鸣器为例,通过分析 S3C2410 微处理器 PWM 的硬件配置,阐述由 Linux 操作系统所构建的嵌入式系统的驱动程序的设计方法。关键词:嵌入式系统;S3C2410;Linux;驱动程序;PWMAbstract: An embedded system is a combination of hardware and software, and the driver is the in

2、tersection of the coordination of software and hardware, and its quality is directly related to the efficiency of embedded systems. Text in the pulse width modulator (PWM) control the buzzer, for example, by analyzing the S3C2410 microprocessor PWM hardware configuration, the design method described

3、 by the Linux operating system for embedded systems built drivers.Keywords: Embedded systems; S3C2410; Linux; drivers; PWM0 引言随着嵌入式系统在各个领域的广泛应用,能在嵌入式设备上运行的操作系统也多种多样。而 Linux 操作系统以其可应用于多种硬件平台、内核高效稳定、源码开放、软件丰富、网络通信和文件管理机制完善等优良特性,已成为嵌入式系统领域中的一个研究热点。操作系统是通过各种驱动程序来驾驭硬件设备的,它为用户屏蔽了各种各样的外部设备。然而嵌入式 Linux 操作系统

4、驱动程序的编写却是相当复杂的,因为他不仅涉及到了软件和硬件两部分还和 Linux 系统的内核有关。文中以脉宽调制器(PWM)控制蜂鸣器发声为例,通过分析 S3C2410 微处理器 PWM 的硬件配置,阐述由 Linux 操作系统所构建的嵌入式系统的驱动程序的设计方法。1 S3C2410 脉宽调制器(PWM)的配置S3C2410 为三星公司所生产。其 CPU 核心是由Advanced RISC Machines (ARM) 有限公司设计的 16/32 位 ARM920T RISC 处理器。它包含了丰富的内部设备。在此主要介绍 PWM 定时器的配置及使用。1.1 B 端口控制寄存器(GPBCON)

5、该寄存器通过配置可使 GPB0 口,GPB1 口,GPB2 口,GPB3 口为定时器 0,1, 2,3 的输出端口。表 1 列出了有关端口配置。表 1 B 端口控制寄存器 bit07GPBCONGPB0(bit1:0)GPB1(bit3:2)GPB2(bit5:4)GPB3(bit7:6)功能配置00=输入,01=输出10=定时器 0 输出11=保留00=输入,01=输出10=定时器 1 输出11=保留00=输入,01=输出10=定时器 2 输出11=保留00=输入,01=输出10=定时器 3 输出11=保留本例利用 GPB0,GPB1 作为输出端口对蜂鸣器进行控制。代码为 GPBCON|=0

6、X05。1.2 定时器计数缓冲区寄存器( TCNTBn)定时器比较缓冲区寄存器(TCMPBn)定时器 n 使能时,TCNTBn 寄存器中的初始计数值将会装入递减计数器。TCMPBn 寄存器的作用是控制脉冲宽度。当递减计数器的值减少到和比较寄存器的值相等时,定时器的输出逻辑电平将会取反。图 1 为利用两个寄存器改变脉冲宽度的示意图。图 1 调整占空比示意图图 1 说明:T1 周期时,TCNTBn 设置为 80,TCMPBn 设置为 40。T2 周期时,TCNTBn 设置为 150,TCMPBn 设置为 50。1.3 定时器控制寄存器(TCON)该寄存器用于控制定时器的运行方式,因其位数比较多现仅

7、就用到的定时器0 的设置进行说明,见表 2。表 2 定时器控制寄存器 bit04TCON 位描述初始状态40:不设置死区;1:设置死区030:定时器 0 计数值装入一次;1:计数值自动装入020:输出值不变;1:输出值翻转010:无操作;1:手动更新 TCNTBn 和 TCMPBn000:定时器 0 停止;1:定时器 0 运行01.4 定时器配置寄存器 0(TCFG0)与定时器配置寄存器 1(TCFG1)寄存器 0 定义了定时器的预分频值。定时器输入频率=PCLK/预分频值/分频值预分频值得范围为 0255定时器配置寄存器 0 详细设置见表 3。表 3定时器配置寄存器 0bit031TCFG0

8、 位描述初始状态31:24保留位0x0023:16这八位为死区长度的设置0x0015:8这八位是定时器 2,3,4 的预分频值0x007:0这八位是定时器 0,1 的预分频值0x00定时器配置寄存器 1 配置分频值,该值只能取 2,4,8,16。其详细配置见表 4。表 4 定时器配置寄存器 1 bit031TCFG1 位31:2423:2019:1615:1211:87:43:0描述 保留位DMA 请求选择0000=不选0001=定时器 10011=定时器 20100 定时器 30101=定时器 40110=保留选择定时器 4 的输入0000=1/20001=1/4 0010=1/80011=

9、1/1601xx=外部 TCLK1选择定时器 3 的输入0000=1/20001=1/4 0010=1/80011=1/1601xx=外部 TCLK1选择定时器 2 的输入0000=1/20001=1/4 0010=1/80011=1/1601xx=外部 TCLK1选择定时器 1 的输入0000=1/20001=1/4 0010=1/80011=1/1601xx=外部 TCLK0选择定时器 4 的输入0000=1/20001=1/4 0010=1/80011=1/1601xx=外部 TCLK0初始状态00000000000000000000000000000000本例中将死区值设置为 0,定时

10、器 0,1 的预分频值为 2,定时器 0 的分频值为 2。两个寄存器的配置代码如下:TCFG0 &=(0X00ff0000); TCFG0|=2;TCFG1 &=(0Xf);2 驱动程序的设计设备驱动程序是控制设备动作的核心模块,如设备的打开,关闭,读,写等, 用来控制设备上的数据传输。按照所要实现的功能,本例驱动程序主要由以下几部分组成。2.1 驱动程序的注册与注销驱动程序的注册就是将设备驱动程序的地址登记在设备表的相应表项中。登记后,只要知道设备的主设备号,就可以找到该设备的驱动函数。在关闭设备时, 要从内核中注销设备。本例驱动程序的注册函数主要代码如下:int _int s3c2410_

11、pwm_init(void)int ret;ret = register_chrdev(DEVICE_MAJOR,DEVICE_NAME,&s3c2410_pwm_fops); if(ret 0)DPRINTK(DEVICE_NAME “cant get major numbern”); Return ret;其中 register_chrdev()函数为向系统申请主设备号。DEVICE_NAME()为指向驱动程序名字的字符指针,DEVICE_MAJOR 为申请的主设备号,如果此参数为 0,则系统会自动分配一个未使用的主设备号作为函数的返还值。S3c2410_pwm_fops 是一个指向跳转表

12、的指针,利用这个跳转表完成对设备函数的调用。当从系统中卸载一个驱动程序时,应该注释主设备号。注释函数的主要代码如下:void _exit s3c2410_pwm_exit(void)unregister_chrdev(DEVICE_MAJOR,DEVICE_NAME);本模块主要由 unregister_chrdev()完成,参数是要释放的主设备号和相应的设备名。在 Linux 中,分别使用 module_init()和 module_exit()两个宏来注册驱动程序的初始化函数和注销函数。例如: module_init(s3c2410_pwm_init) 和module_exie(s3c24

13、10_pwm_exit)。2.2 file_operations 结构体在 Linux 内核中使用 file_operations 结构访问驱动程序的函数。file_operations 结构是一个定义在中的函数指针表。在 前 面 已 经 介 绍 unregister_chrdev 调 用 中 有 一 个 参 数 是s3c2410_pwm_fops,它就是指向 file_operations 结构的指针。这个结构的每一项都指向由驱动程序定义的处理相应用户请求的函数。用户可以直接调用这些函数使用,对于那些用不到的操作,该结构可以包含 NULL 指针。本例中的结构体定义为:static struc

14、t file_operations s3c2410_pwm_fops= owner: THIS_MODULE,/*所属的设备模块*/open: s3c2410_pwm_open,/*打开设备(应用程序执行 open)*/ ioctl: s3c2410_pwm_ioctl,/*控制设备(应用程序执行 ioctl)*/release: s3c2410_pwm_release,/*关闭设备(应用程序执行 close)*/结构体 file_operations 的初始化使用了 GNC C 的语法。在 GNC C 中,允许使用冒号(:)为特定的结构体成员定义初始化值。2.3 接口函数下面将分别介绍本例中所用到的接口函数。2.3.1 open()函数open()函数是驱动程序初始化并打开外部设备的。此外, open 还要增加设备数,以防止文件在关闭前模块被卸载。本例中的 open()函数:static int s3c2410_pwm_open(struct inode *inode,struct file *file)if(use=0) GPBCON &=0X0F;GPBCON |=0X0A;TCFGO &=0X00FF0000; TCFG0 |=2;TCFG1 &=0X0F; TCNTB0 =PWM_TCNTB0;TCNTB0 =PWM_TCNTB0/2; TCON &=0X

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 教育/培训

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