河南工业大学嵌入式课程设计课程设计题目:基于ARM微处理器的数码管驱动设计学院:信息科学与工程学院班级:电科1304姓名:学号:2013160304指导老师姓名:李智慧13级电科专业课程设计任务书基于ARM微处理器的数码管驱动设计一、设计要求1.1实验内容:1. 利用ARM微处理器实现数码管显示驱动;2.能够显示0 1 2 3 4 5 6 7 8 9等数字,且循环显示;3. 通过按键改变循环显示速度;1.2实验设备:硬件:PXA270 实验平台,PXA270 ARM 标准/增强型仿真器套件,PC 机。
软件:VMware Workstation、Ubuntu、win7。
二、设计方案本次试验选用的芯片为 PXA270 ,使用的是 PXA270集成试验箱。
基于 IntelXScale 架构的 PXA270处理器,集成了存储单元控制器、时钟和电源控制器、 DMA控制器、 LCD控制器、 AC97控制器、 I2S 控制器、快速红外线通信 (FIR) 控制器等外围控制器,可以实现丰富的外围接口功能。
其低电源运行模式以及动态电源管理技术可以有效的降低电源的功耗。
使用试验箱上的 4X4 的矩阵键盘作为输入,用来控制数码管显示的快慢速度,将需要输出的各个数码管状态从两个数码管中输出。
三、设计原理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)动态显示方式:动态的多组控制信号,轮流扫描这些数码管,十多个数码管可以同时动态显示(相对人眼)。
该字符对应的发光二极管是轮流点亮的,即控制信号按一定的周期有效,在点亮过程中,点亮时间是很短暂的,所以视觉看到的依然是很稳定的。
电平信号按照dp,g,e…a 的顺序组合形成的数据字称为该字符对应的段码,常用字3、数码管驱动电路设计以共阳极数码管为例:用处理器的 8 个 GPIO分别控制数码管中的 8 段发光二极管,这样往 GPIO的引脚送一个低电平就能点亮该引脚对应的一段数码管,由于发光二极管能承受的电流大多是毫安级的,因此还需要外接一个限流电阻。
在实际设计中,处理器一般不是直接用 8 个 I/O 脚来控制数码管的显示,而是通过外接一个译码器来控制。
最常用的译码器是 BCD译码器。
如下图所示。
4、程序设计流程图5、如何让驱动程序加载到内核( 1)添加步骤(括号内容为解释):(以添加 led.c 驱动程序为例)①在确定了自己的代码位置的前提下,建立自己的源代码目录,文件,Makefile ,Config.in 等。
(对于本程序中 Makefile 文件和 Config.in 文件已有,只需添加相关内容即可,无需更改);Makefile 文件:一个工程中的源文件不计其数,其按类型,功能,模块分别放在若干个目录中, makefile 定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,或是进行更复杂的功能操作。
当执行 make命令时,便会调用 makefile 文件,以告诉 make命令需要怎样的去编译和连接程序。
Config.in 文件:该文件可理解为内核的配置脚本,在执行 make menuconfig命令时被调用,依靠各子目录的 config.in 文件,构成整个 linux 的配置菜单,在内核配置 make menuconfig 时从 config.in 中读出菜单,用户选择后保存到.config 的内核配置文件中。
在内核编译时,主 makefile 调用这个 .config文件,就知道了用户的选择。
②将自己的 led.c 源程序放入内核源码 drive/char 下③修改 driver/charConfig.in 文件,把自己的驱动加入内核配置系统中。
在文件中的适当位置(任意,决定了 make menuconfig 窗口中的所在的位置)添加内容:dep_tristate ‘ s3c2410 led support ’CONFIG_S3C2410_GPIO_LED $ CONFIG_ARCH_S3C2410代码解释:只要定义了 CONFIG_ARCH_S3C2410 为 y 或是 m (即在 makemenuconfig 之后的窗口中选择 y 或是 m) character 分类下就会出现s3c2410led support 选项,它对应了 CONFIG_S3C2410_GPIO_LED 的定义。
当定义s3c2410 led support 为 m,即把驱动程序编译为模块(不会编译到内核)生成 .O 文件,然后手动用 insmod 加载。
当定义 s3c2410 led support 为 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⑤执行命令: make modules( 在 linux —2.4.18 —2410cl 下执行 )⑥执行命令: make menuconfig⑦配置好后进入开发板执行命令: insmod led.o( 2)测试驱动程序①通常测试一个驱动程序都需要相应的应用程序,但对于一些只有标准输入输出例如: open,close(release),read,write 等调用的驱动程序,有简单的办法,即使用 linux 现有的命令例如: cat,echo 等实现对设备的访问和控制。
②通过编写应用程序来测试驱动程序6、动态加载驱动1)lsmod 查看是否有驱动程序即 .o 文件2)insmod led.o 动态添加驱动3)rmmod led 删除驱动详细步骤如下:①建终端,进入 arm2410cl/kernel/linux-2.4.18-2410cl②行命令 >#make menuiconfig③在窗口中选中“ character device ,进行相关配置后④执行命令 >#make clean( 把环境清理干净 )⑤make dep ( 添加相关依赖文件 )⑥make modules⑦进入 driver/char 目录下,查看是否生成 .o 文件⑧进入开发板 cd host/kernel/linux-2.4.18-2410cl/drivers/char⑨执行命令 #insmod led.o⑩执行命令 lsmod ( 查看驱动是否添加成功 )在开发板找到相应程序,进入该目录下,运行 ./led将写好的控制源程序(由汇编程序和 C程序共同构成),以及 makefile 文件,放到共享目录下的文件夹中。
进入开发板的相关目录下,执行 make命令之后会生成led.bin 文件;四、设计程序Main.c#include "cvtpxa270.h"unsigned char seg7table[21] = { 0xc0,0xf9, 0xa4, 0xb0, 0x99, 0x92,0x82, 0xf8,0x80, 0x90,0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e,0xf9, 0xb0, 0x92, 0xf8, 0x90};void delay(int count){while(count --);}int Main(int argc, char* argv[]){int i;int ch;int num;Uart_Select(FFUART);Uart_Init(115200);LibCommInit();Uart_Printf("Keyboard Test\r\n");for(i=0;i<0x15;i++){ch=Key_GetKey();switch(ch){case 1:num=num-0.19;break;case 2:num++; break;case 3:num=1;break;default:break;*((unsigned char *) 0x04006000)= seg7table[i];*((unsigned char *) 0x04007000) = seg7table[i];delay(0xffffff*num);}for(i=0x15;i>=0x00;i--){ch=Key_GetKey();switch(ch)case 1:num=num-0.19;break;case 2:num++; break;case 3:num=1; break;default:break;*((unsigned char *) 0x04006000) = seg7table[i];*((unsigned char *) 0x04007000) = seg7table[i];delay(0xffffff*num);}return 0;}一、调试结果在完成将上述程序烧入系统之后将会在试验箱上看到试验结果,数码管会依次显示数值,并且按下按键数码管的显示频率将会改变。
六、心得体会通过这次课程设计,我学到了不少课本上学不到的知识,我加深了对嵌入式系列知识及其系统的认识,同时也锻炼了自己的动手能力。
此次综合课程设计主要涉及硬件和软件两方面的内容,通过这些我的硬件和软件开发能力都获得了提高,首先硬件方面,基本了解了电子产品的开发流程和所要做的工作,在这次课程设计中,不仅对于以前的上理论课中一些不清楚的地方有了新的认识,对于ARM 微处理器有了一定的了解,而且对于如何将理论转化成程序有了些更深刻的体会,编程中处理问题的能力也有所增强。