嵌 入 式 系 统 实 验 报 告
指导教师
学科专业
班 级
学 号
姓 名
2014年X月
前 言
20世纪七十年代单片机出现式样嵌入式微处理器微控制器规模应嵌入式系统已30年发展历史全世界行业广泛应嵌入式系统产品研制应已成国信息化带动工业化工业化促进信息化发展新国民济增长点十年发展嵌入式系统已程度改变生活工作娱乐方式改变加速嵌入式系统具数种类类具独特性例MP3数码相机印机汽车中更具嵌入式系统汽车更轻快更干净更容易驾驶机顶盒高清电视游戏机智玩具交换机路器数控设备仪表汽车电子家电控制系统医疗仪器航天航空设备等等典型嵌入式系统事实带点智家电(全动洗衣机电脑电饭煲…)嵌入式系统嵌入式系统广泛适应力样性视听工作场甚健身设备中处嵌入式系统
高端嵌入式系统工业软件发展 实际该行业先进科学技术前掌握关换言国该行业科学技术水关学研究嵌入式系统具重意义
学期嵌入式系统学程中2410RP实验开发台进行诸嵌入式基础实验报告中中两具代表性实验原理容结果驱动测试程序写出目 录
实验 数码显示 1
11 实验目 1
12 实验容 1
13 实验原理 1
131 LED发光原理 1
132 八段LED显示器 1
133 芯片zlg7289A介绍 2
134 数码连接电路 3
14 实验步骤 3
15 实验源代码解释说明 4
16 总结 11
实验二 LED点阵驱动实验 12
21 实验目 12
22 实验容 12
23 实验原理 12
231 8X8点阵数码发光原理 12
232 数码连接电路 12
233 IO接口 13
24 实验步骤 13
25 实验源代码解释说明 14
26 实验结果 19
27 总结 19
实验 数码显示
11 实验目
学串转换相关知识编写驱动程序
12 实验容
1) 解数码显示工作原理
2) 掌握数码驱动编写测试程
3) zlg7289A驱动程序进行编写
4) 驱动数码显示学号
13 实验原理
131 LED发光原理
LED(Light Emitting Diode)发光二极种半导体固体发光器件利固体半导体置引线架子然四周环氧树脂密封起保护部芯线作LED抗震性
发光二极核心部分p型半导体n 型半导体组成晶片图示p型半导体n型半导体间渡层称pn结某半导体材料PN结中注入少数载流子数载流子复合时会余量光形式释放出电直接转换光PN结加反电压少数载流子难注入发光种利注入式电致发光原理制作二极发光二极通称LED处正工作状态时(两端加正电压)电流LED阳极流阴极时半导体晶体发出紫外红外颜色光线光强弱电流关
图11 LED发光原理图
132 八段LED显示器
八段LED显示器8发光二极组成图12图13示基中7长条形发光排列成日字形贺点形发光显示器右角作显示数点显示种数字部份英文字母LED显示器两种形式:种8发光二极阳极连起称阳极LED显示器种8发光二极阴极连起称阴极LED 显示器
阴阳结构LED显示器笔划段名安排位置相二极导通时相应笔划段发亮发亮笔划段组合显示种字符8笔划段hgfedcba 应字节(8位)D7 D6 D5 D4 D3 D2 D1 D08位二进制码表示欲显示字符字形代码例阴LED显示器阴极接(零电)阳极hgfedcba段0111011时显示器显示P字符阴极LED 显示器P字符字形码73H果阳LED显示器阳极接高电显示P字符字形代码应10001100(8CH)里必须注意:产品方便接线常规方法应字段位关系时字形码必须根接线行设计
图12 LED数码组成图
图13 LED数码原理图
133 芯片zlg7289A介绍
zlg7289A片具串行接口时驱动8位阴式数码64独立LED智显示驱动芯片该芯片时连接达64 键键盘矩阵单片完成LED显示﹑键盘接口全部功zlg7289A部含译码器直接接受BCD码16进制码时具2 种译码方式参文外具种控制指令消隐﹑闪烁﹑左移﹑右移﹑段寻址等zlg7289A具片选信号方便实现8位显示64键键盘接口
芯片zlg7289A典型应:仪器仪表工业控制器条形显示器控制面板
芯片zlg7289A特点:
1)串行接口需外围元件直接驱动LED
2)位独立控制译码译码消隐闪烁属性
3))循环左移 循环右移指令
4)具段寻址指令方便控制独立LED
5)64键键盘控制器含抖动电路
134 数码连接电路
图14 数码连接电路
14 实验步骤
1) 连接号宿PC机台S3C2410RP目标板
2) 编写数码驱动程序spi_ledc文件
3) 启动系统终端设置S3C2410RP目标板址
4) 宿PC机根目录挂载S3C2410RP目标板mnt目录
5) 加载驱动程序
6) 执行测试程序
15 实验源代码解释说明
A 头文件keypadh
#ifndef __KEYPAD_H__
#define __KEYPAD_H__
Keypad 扫描码
#define KEYPADNUMLK 0x33
#define KEYPADDIV 0x34
#define KEYPADMUL 0x35
#define KEYPADSUB 0x3d
#define KEYPADADD 0x2e
#define KEYPADENTER 0x1e
#define KEYPADDOT 0x15 DEL
#define KEYPAD0 0x14 INS
#define KEYPAD1 0x1b END
#define KEYPAD2 0x1c DOWN
#define KEYPAD3 0x1d PDN
#define KEYPAD4 0x23 LEFT
#define KEYPAD5 0x24
#define KEYPAD6 0x25 RIGHT
#define KEYPAD7 0x2b HOME
#define KEYPAD8 0x2c UP
#define KEYPAD9 0x2d PUP
#endif
头文件定义嵌入式开发板输入键盘键逻辑址
B 驱动程序源文件spi_ledc
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define HR_DEBUG 1
#define IRQ_spi_led_INT IRQ_EINT4
#define GPIO_SimpleINT_EINT4 (GPIO_MODE_ALT0 | GPIO_PULLUP_EN | GPIO_F4)
#define ONEBIT 0x1
#define KEYPADCSDIS (GPGDAT |(ONEBIT << 3))
#define KEYPADCSEN (GPGDAT &~(ONEBIT << 3))
#define KEYPADDIRMO (GPBDAT &~(ONEBIT << 0))
#define KEYPADDIRMI (GPBDAT |(ONEBIT << 0))
#define spi_led_MAJOR 104 定义led_ary_MAJOR设备设备号
devfs_handle_t spi_led_handle 系统支持devfs数结构
int spi_led_temp_count0 定义系统全局变量防止文件重开
static int DELAY_TIME100 时间延迟100
int putcToKBCTL(u8 c)
{
u32 i
KEYPADCSEN
KEYPADDIRMO
udelay(60)
while((SPSTA1 & ONEBIT)0) wait while busy
SPTDAT1 c write left justified data
while((SPSTA1 & ONEBIT)0) wait while busy
KEYPADCSDIS
i SPRDAT1
return(i)
} 功概:数写入指定寄存器中
int spi_ledInit()
{
int t
char dummy (char)0xff
printk(GPGCONx\nGPGCON)
GPGCON & ~((0x3<<6)|(0x3<10)|(0x3<<12)|(0x3<<14))
GPGCON | ((0x1<<6)|(0x3<10)|(0x3<<12)|(0x3<<14))
printk(GPGCONx\nGPGCON)
KEYPADCSDIS 设置高电
setup Dir signal (KEYBOARD) CPU>7289
GPBCON & ~(0x3 << 0) 清GPB0端口数
GPBCON | (ONEBIT << 0) 设置端口GPB0_PWR_OK信号输出
rGPDDAT &~(ONEBIT << 0) _PWR_OK t置 0
KEYPADDIRMO 设置SPI(串行外设接口)寄存器
中断模式分频模式高电时钟形式B正常模式
rSPCON1(ONEBIT<<5)|(ONEBIT<<4)|(ONEBIT<<3)|(0x0<<2)|(ONEBIT<<1)
查询模式分频模式高电时钟形式A正常模式
SPCON1 (0<<5)|(ONEBIT<<4)|(ONEBIT<<3)|(0x0<<2)|(0<<1)
* 开发者必须根PCLK时钟变化正确调节分频器值*
SPPRE1 255
* 99121K 203M42(255+1) PCLK5075Mhz
FCLK203Mhz SPICLK99121Khz*
putcToKBCTL(0xbf) 传送初始化指令
printk(Key Pad Init complete\n) 显示键盘初始化成功
putcToKBCTL(0xc8) 第数码址0xc8
putcToKBCTL(0x01) 设置第数码显示数值1
KEYPADCSDIS
putcToKBCTL(0xc9) 第二数码址0xc9
putcToKBCTL(0x02) 设置第二数码显示数值2
KEYPADCSDIS
putcToKBCTL(0xca) 第三数码址0xca
putcToKBCTL(0x09) 设置第三数码显示数值9
KEYPADCSDIS
putcToKBCTL(0xcb) 第三数码址0xcb
putcToKBCTL(0x00) 设置第三数码显示数值0
KEYPADCSDIS
return(1)
} 函数实现LED数码初始化返回值1时完成系统初始化
u8 readKBValue(void)
{
unsigned char i
KEYPADCSEN
KEYPADDIRMO
udelay(60)
while((SPSTA1 & ONEBIT)0) wait while busy
SPTDAT1 0x15 传送读取键值命令
while((SPSTA1 & ONEBIT)0) wait while busy
udelay(30)delay 30us
KEYPADDIRMI
SPTDAT1 0xff 传送读取键值命令
while((SPSTA1 & ONEBIT)0) wait while busy
i SPRDAT1
printk(x\ni)
KEYPADCSDIS
KEYPADDIRMO
return(i)
} 函数实现功读取键盘输入值
ssize_t spi_led_read (struct file * * buf size_t count loff_t * f_ops)
{
return count
}
函数返回:读取数长度count
功概:字符性设备进行读操作
* SimpleD Write *
ssize_t spi_led_write (struct file * char * buf size_t count loff_t * f_ops)
{
printk(s3c2410 device operation\n)
return count
}
函数返回:写入数长度count
功概:字符性设备进行写入操作
* SimpleD Ioctl *
ssize_t spi_led_ioctl (struct inode * inode struct file * file
unsigned int cmd long data)
{
printk(s3c2410 device ioctl operation\n)
} 函数重新定义IO口控制操作
* SimpleD device open *
ssize_t spi_led_open (struct inode * inode struct file * file)
{
return 0
} 户态调函数时应核态次函数调
* SimpleD device close *
ssize_t spi_led_release (struct inode * inode struct file * file)
{
return 0
}定义核态release函数户态调close函数时release函数调
struct spi_led_ops {
open spi_led_open
read spi_led_read
write spi_led_write
ioctl spi_led_ioctl
release spi_led_release
}
结构体头文件 linuxfsh中定义存储驱动核模块提供设备进行种操作函数指针
static void IRQ_spi_led_interrupt(int nr void *devid struct pt_regs *regs)
{
u8 ui8ScanCode
ui8ScanCodereadKBValue()
HR_del_pre_scancode(ui8ScanCode)
} 定义静态函数IRQ_spi_led_interrupt请求中断
static int __init HW_spi_led_init(void)
{
int ret ENODEV
int delay
set_external_irq(IRQ_spi_led_INTEXT_FALLING_EDGE GPIO_PULLUP_EN)
set_gpio_ctrl(GPIO_SimpleINT_EINT4)
ret request_irq(IRQ_spi_led_INT IRQ_spi_led_interrupt SA_INTERRUPT
spi_led NULL)
if (ret) {
printk(KERN_INFO request SimpleINT IRQ failed (d)\n IRQ_spi_led_INT)
return ret
}
ret devfs_register_chrdev(spi_led_MAJOR spi_led &spi_led_ops)
if( ret < 0 ){
printk ( s3c2410 init_module failed with d\n ret)
return ret
}
else
{
printk(KERN_INFO S3c2410 spi_led register success\n)
}
spi_led_handle devfs_register( NULL spi_led DEVFS_FL_DEFAULT
spi_led_MAJOR 0 S_IFCHR &spi_led_ops NULL)
spi_ledInit()
return ret
} 驱动程序进行硬件设备初始化
int __init s3c2410_spi_led_init(void) {
int ret ENODEV
ret HW_spi_led_init()
if (ret)
return ret
return 0
} 模块初始化程序开始执行函数module_init()调
int init_module()
{
s3c2410_spi_led_init()
} 函数insmod加载模块驱动时候动调负责进行设备驱动程序初始化工作init_module 返回0表示初始化成功返回负数表示失败
void cleanup_module()
{
devfs_unregister_chrdev( spi_led_MAJOR spi_led )
devfs_unregister( spi_led_handle )
free_irq(IRQ_spi_led_INT NULL)
} 函数卸载模块驱动时调负责进行设备驱动程序清工作
16 总结
通次实验学Linux系统常操作命令解LED数码工作原理时嵌入式系统更明确解认识通实验中实际操作体验基嵌入式开发基流程老师指导完成LED数码显示控制显示学号四位1290
实验二 LED点阵驱动实验
21 实验目
编写针总线操作硬件驱动程序
22 实验容
1) 解LED点阵显数码示工作原理
2) 掌握LED点阵驱动编写测试
3) 编写针硬件LED点阵驱动程序测试
4) 驱动LED点阵显示姓名
23 实验原理
231 8X8点阵数码发光原理
图21中出8X8点阵需64发光二极组成发光二极放置行线列线交叉点应某列置1电某行置0电相应二极亮实现根柱形亮法图21示应列根竖柱者应列根横柱实现柱形亮法述:
图21 LED点阵等效电路图
232 数码连接电路
系统电路图22示显示部分8X8发光二极点阵常见发布消息显示汉字点阵式LED显示屏通常干块LED点阵显示模块组成8X8显示点阵模块块64独立发光二极减少引脚便封装种LED显示点阵模块采阵列形式排布行列线交点处接显示LED(LED 点阵显示模块显示驱动采动态驱动方式次点亮行LED(阳形式LED显示点阵模块)列 LED(阴形式LED显示点阵模块)图22示显示驱动原理图中点阵阴总线锁存芯片74573点阵显示模块提供列驱动电流8行信号集电极开路门驱动器7407控制行线列线挂总线微处理器通总线操作完成LED点阵显示模块LED显示点亮暗控制
图22 LED点阵硬件连接电路
233 IO接口
开发板整LED显示模块作IO进行控制电路原理图22示DATA[07]DATA[815]分应系统数线低16位LED_LOCK信号系统总线写信号址信号简单逻辑组合板载CPLD完成控制该显示模块IO址0x08000000
24 实验步骤
1) 连接号宿PC机台S3C2410RP目标板
2) 编写LED点阵驱动程序
3) 编写LED点阵显示测试程序testc编译
4) 启动Linux系统终端设置S3C2410RP目标板址
5) 宿PC机根目录挂载S3C2410RP目标板mnt目录
6) 加载LED点阵驱动程序
7) 执行测试程序
25 实验源代码解释说明
A驱动程序源文件led_aryc
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define led_ary_MAJOR 102 定义led_ary_MAJOR设备设备号102
#define VERSION 2410RPled_aryV100070820
unsigned long ioremap_addr
void showversion(void)
{printk(*********************************************\n)
printk(\t s \t\n VERSION)
printk(*********************************************\n\n)
} 函数显示该设备版型号
devfs_handle_t dev_handle 系统支持devfs数结构注册handle存储设备
int led_ary_temp_count0 定义系统变量防止文件重开
ssize_t led_ary_read (struct file * * buf size_t count loff_t * f_ops)
{char tmp[1]
printk(s3c2410 device operation\n)
tmp[0]inb(ioremap_addr)
copy_to_user(buftmp1)
return count
} 函数实现字符型设备进行读取操作
ssize_t led_ary_write (struct file * char * buf size_t count loff_t * f_ops)
{outw(countioremap_addr)
printk(s3c2410 device write operation\n)
return count
} 函数实现字符性设备进行写操作
述两函数实现户空间核空间数交换检查户空间指针效性
ioctl()函数实现读写外控制
ssize_t led_ary_ioctl (struct inode * inode struct file * file
unsigned int cmd long data)
{printk(s3c2410 device ioctl operation\n)
} 函数重新定义实现IO口控制操作
ssize_t led_ary_open (struct inode * inode struct file * file)
{return 0
} 户态调open函数时应核态次函数调
ssize_t led_ary_release (struct inode * inode struct file * file)
{return 0
} 户态调close函数时release函数调
struct led_ary_ops {
open led_ary_open
read led_ary_read
write led_ary_write
ioctl led_ary_ioctl
release led_ary_release
} 结构体头文件 linuxfsh中定义存储驱动核模块提供设备进行种操作函数指针指出设备驱动程序提供入口点位置
static int __init HW_led_ary_init(void)
{ int ret ENODEV
showversion()
ret devfs_register_chrdev(led_ary_MAJOR led_ary &led_ary_ops) *字符设备led_ary进行注册*
if( ret < 0 ){
printk ( s3c2410 init_module failed with d\n ret)
return ret
}
else
{printk(KERN_INFO S3c2410 led_ary register success\n)
}
dev_handle devfs_register( NULL led_ary DEVFS_FL_DEFAULT
led_ary_MAJOR 0 S_IFCHR &led_ary_ops NULL)* 注册devfs 设备*
printk(GPACONx\nGPACON)
printk(BWSCONx\nBWSCON)
ioremap_addrioremap(0x180000020x0f)* IO址空间映射核虚拟址空间*
outw(0x00ffioremap_addr)*IO读取数*
return ret
} 函数驱动程序进行硬件设备初始化
int __init s3c2410_led_ary_init(void) {
int ret ENODEV
ret HW_led_ary_init()
if (ret)
return ret
return 0
} 模块初始化程序开始执行函数module_init()调
int init_module()
{
s3c2410_led_ary_init()
} insmod加载模块时候动调该函数负责进行设备驱动程序初始化工作init_module返回0表示初始化成功返回负数表示失败
void cleanup_module()
{devfs_unregister_chrdev( led_ary_MAJOR led_ary )*字符设备解注册*
devfs_unregister( dev_handle )
} 模块卸载时调该函数负责进行设备驱动程序清工作
B LED点阵显示设置程序文件testc:
include
#include
#include
#include
#include
#include
#include
int main() 程序入口
{int fd
int iret
int buf
fdopen(devled_aryO_RDWR) 获取LED点阵驱动程序加载情况
if (fd<0)
{ fd0表示设备驱动正常开启
printf(Open device SimpleD error\n)}
else
{ fd1设备驱动已开启
printf(Open device SimpleD success\n)}
for()LED点阵进行赋值控制发光二极亮灭终实现点阵中显示出王字
{
buf0Xfe3e 点阵第行进行赋值(点阵中低位前高位)
write(fd&bufbuf)
buf0Xfd08 点阵第二行进行赋值
write(fd&bufbuf)
buf0Xfb08
write(fd&bufbuf)
buf0Xf73e
write(fd&bufbuf)
buf0Xef08
write(fd&bufbuf)
buf0Xdf08
write(fd&bufbuf)
buf0Xbf7f
write(fd&bufbuf)
buf0X7f00
write(fd&bufbuf)
}
return 0
}
26 实验结果
27 总结
通次实验学LED点阵工作原理解LED点阵点逻辑址分布时嵌入式系统更明确认识通实验中实际操作解基嵌入式开发基流程老师指导完成LED点阵显示控制显示姓王
文档香网(httpswwwxiangdangnet)户传
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档