基于ARM微处理器的数码管驱动设计.docx
《基于ARM微处理器的数码管驱动设计.docx》由会员分享,可在线阅读,更多相关《基于ARM微处理器的数码管驱动设计.docx(11页珍藏版)》请在冰豆网上搜索。
基于ARM微处理器的数码管驱动设计
嵌入式课程设计
课程设计名称:
基于ARM微处理器的数码管驱动设计
专业班级:
电科1103班
学生姓名:
张
学号:
2011160303
指导教师:
金广锋
11级电科专业课程设计任务书
学生姓名
张
专业班级
电科1103班
学号
2011160303
题目
基于ARM微处理器的数码管驱动设计
课题性质
A
课题来源
D
指导教师
金广锋
同组姓名
主要内容
1.利用ARM微处理器实现数码管显示驱动;
2.能够显示0123456789等数字,且循环显示;
3.通过按键改变循环显示速度;
任务要求
1.设计出具体电路,列出所用器件及布线图。
。
2.画出程序流程图,画出子程序或中断流程图。
3.说明系统工作原理,对系统进行调试。
4.写出课程设计报告。
参考文献
1.嵌入式系统有关教材
2.电路设计手册
3.其他资料
审查意见
指导教师签字:
教研室主任签字:
2014年11月28日
说明:
本表由指导教师填写,由教研室主任审核后下达给选题学生,装订在设计(论文)首页.
基于ARM微处理器的数码管驱动设计
1、设计要求
1、利用ARM微处理器实现数码管显示驱动;
2、能够显示0123456789等数字,且循环显示;
3、通过按键改变循环显示速度;
2、设计方案
本次试验选用的芯片为PXA270,使用的是PXA270集成试验箱。
基于IntelXScale架构的PXA270处理器,集成了存储单元控制器、时钟和电源控制器、DMA控制器、LCD控制器、AC97控制器、I2S控制器、快速红外线通信(FIR)控制器等外围控制器,可以实现丰富的外围接口功能。
其低电源运行模式以及动态电源管理技术可以有效的降低电源的功耗。
使用试验箱上的4X4的矩阵键盘作为输入,用来控制数码管显示的快慢速度,将需要输出的各个数码管状态从两个数码管中输出。
3、设计原理
1、数码管结构
七段数码管由8个发光二极管排列组成(包括小数点位)如下图所示:
这8个独立的二极管通常被命名:
a.b.c.d.e.f.g.h。
h表示小数点。
利用7段数码管能显示所有数字以及部分英文字母。
数码管有2种不同的形式:
一种是8个发光二极管的阳极都连一起,成为共阳极8段数码管如图所示:
共阳极8段数码管的8个发光二极管的正极一起接VCC,要控制数码管中的某一段亮,比如A段,只须要控制数码管的A脚为低电平就可以了,反之熄灭A段就控制A脚为高电平。
另一种是8个发光二极管的阴极都连在一起,称为共阴极数码管,如图所示:
共阴极8段数码管的8个发光二极管的正极一起接GND,要控制数码管中的某一段亮,比如A段,只须要控制数码管的A脚为高电平就可以了,反之熄灭A段就控制A脚为低电平。
2、数码管显示方式
数码管的显示方式有静态和动态之分。
分别介绍如下:
(1)静态相示方式:
当8段数码管显示一个字符时,该字符对应的发光二极管控制信号一直保持有效;静态显示方式的每个数码管都需要一组控制信号。
(2)动态显示方式:
动态的多组控制信号,轮流扫描这些数码管,十多个数码管可以同时动态
显示(相对人眼)。
该字符对应的发光二极管是轮流点亮的,即控制信号按一定的周期有效,在点亮过程中,点亮时间是很短暂的,所以视觉看到的依然是很稳定的。
3、数码管驱动电路设计
以共阳极数码管为例:
用处理器的8个GPIO分别控制数码管中的8段发光二极管,这样往GPIO的引脚送一个低电平就能点亮该引脚对应的一段数码管,由于发光二极管能承受的电流大多是毫安级的,因此还需要外接一个限流电阻。
vcc
在实际设计中,处理器一般不是直接用8个I/O脚来控制数码管的显示,而是通过外接一个译码器来控制。
最常用的译码器是BCD译码器。
如下图所示。
1
4、程序设计流程图
5、如何让驱动程序加载到内核
(1)添加步骤(括号内容为解释):
(以添加led.c驱动程序为例)
在确定了自己的代码位置的前提下,建立自己的源代码目录,文件,Makefile,Config.in等。
(对于本程序中Makefile文件和Config.in文件已有,只需添加相关内容即可,无需更改)
Makefile文件:
一个工程中的源文件不计其数,其按类型,功能,模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,或是进行更复杂的功能操作。
当执行make命令时,便会调用makefile文件,以告诉make命令需要怎样的去编译和连接程序。
Config.in文件:
该文件可理解为内核的配置脚本,在执行makemenuconfig命令时被调用,依靠各子目录的config.in文件,构成整个linux的配置菜单,在内核配置makemenuconfig时从config.in中读出菜单,用户选择后保存到.config的内核配置文件中。
在内核编译时,主makefile调用这个.config文件,就知道了用户的选择。
将自己的led.c源程序放入内核源码drive/char下
修改driver/charConfig.in文件,把自己的驱动加入内核配置系统中。
在文件中的适当位置(任意,决定了makemenuconfig窗口中的所在的位置)
添加内容:
dep_tristate‘s3c2410ledsupport’CONFIG_S3C2410_GPIO_LED$CONFIG_ARCH_S3C2410
代码解释:
只要定义了CONFIG_ARCH_S3C2410为y或是m(即在makemenuconfig之后的窗口中选择y或是m)character分类下就会出现s3c2410ledsupport选项,它对应了CONFIG_S3C2410_GPIO_LED的定义。
当定义s3c2410ledsupport为m,即把驱动程序编译为模块(不会编译到内核)生成.O文件,然后手动用insmod加载。
当定义s3c2410ledsupport为y,即把驱动程序生成.O文件并且连接到内核,启动时自动加载。
执行make编译时makefile文件会根据obj-m和obj-y编译并连接对应的源码。
如果在配置内核时被驱动编译为模块,则CONFIG_S3C2410_GPIO_LED被定义为m,在makefile脚本对应的obj-m中,就会编译led.o为内核可加载的模块
修改driver/char/makefile文件
添加内容:
obj-$(CONFIG_S3C2410_GPIO_LED)+=led.o
执行命令:
makemodules(在linux—2.4.18—2410cl下执行)
执行命令:
makemenuconfig
配置好后进入开发板执行命令:
insmodled.o
2测试驱动程序
(1)通常测试一个驱动程序都需要相应的应用程序,但对于一些只有标准输入输出例如:
open,close(release),read,write等调用的驱动程序,有简单的办法,即使用linux现有的命令例如:
cat,echo等实现对设备的访问和控制。
(2)通过编写应用程序来测试驱动程序
6、动态加载驱动
1)lsmod查看是否有驱动程序即.o文件
2)insmodled.o动态添加驱动
3)rmmodled删除驱动
详细步骤如下:
建终端,进入arm2410cl/kernel/linux-2.4.18-2410cl
行命令>#makemenuiconfig
在窗口中选中“characterdevice,进行相关配置后
执行命令>#makeclean(把环境清理干净)
makedep(添加相关依赖文件)
makemodules
进入driver/char目录下,查看是否生成.o文件
进入开发板cdhost/kernel/linux-2.4.18-2410cl/drivers/char
执行命令#insmodled.o
执行命令lsmod(查看驱动是否添加成功)
在开发板找到相应程序,进入该目录下,运行./led
将写好的控制源程序(由汇编程序和C程序共同构成),以及makefile文件,放到共享目录下的文件夹中。
进入开发板的相关目录下,执行make命令之后会生成led.bin文件
4、软件编程
Main.c
#include"cvtpxa270.h"
unsignedcharseg7table[21]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xf9,0xb0,0x92,0xf8,0x90};
voiddelay(intcount)
{
while(count--);
}
intMain(intargc,char*argv[])
{
inti;
intch;
intnum;
Uart_Select(FFUART);
Uart_Init(115200);
LibCommInit();
Uart_Printf("KeyboardTest\r\n");
for(i=0;i<0x15;i++)
{
ch=Key_GetKey();
switch(ch)
case1:
num=num-0.19;break;
case2:
num++;break;
case3:
num=1;break;/
default:
break;
*((unsignedchar*)0x04006000)=seg7table[i];
*((unsignedchar*)0x04007000)=seg7table[i];
delay(0xffffff*num);
}
for(i=0x15;i>=0x00;i--)
{
ch=Key_GetKey();
switch(ch)
case1:
num=num-0.19;break;
case2:
num++;break;
case3:
num=1;break;
default:
break;
*((unsignedchar*)0x04006000)=seg7table[i];
*((unsignedchar*)0x04007000)=seg7table[i];
delay(0xffffff*num);
}
return0;}
5、调试结果
在完成将上述程序烧入系统之后将会在试验箱上看到试验结果,数码管会依次显示数值,并且按下按键数码管的循环显示速度将会发生改变。
6、心得体会
这次课程设计虽然经历了很多的困难,但通过和老师以及同学的交流并查找资料,最终完成了课程设计。
通过这次课程设计,我学会了很多的东西。
一方面,通过这次课程设计,我学会并熟悉了PXA270,巩固了自己的嵌入式知识,通过电路的设计再一次熟悉了数字电路以及模拟电路的知识,并且锻炼了自己查找资料的能力,强化了自己的专业技能;另一方面,我也有了更多的和老师以及同学交流的机会,锻炼了自己的语言表达能力,从软实力上提高了自己,这对于找工作,以及今后的生活与学习都是很有帮助的。
通过这次课程设计,我觉得我应该努力的学好自己的专业课知识,这是对于人们生活的丰富大有帮助的,这就是科技,今后还要更加关注细节的处理,在生活中学习,在生活中实践。
7、参考文献
1、《UP-CUPS2410经典linux实验指导书》北京博创科技
2.、《嵌入式linux系统实例教程》李仁发主审人民邮电出版社
3、《嵌入式系统接口设计与linux驱动程序开发》刘淼编著