嵌入式实习报告.docx
《嵌入式实习报告.docx》由会员分享,可在线阅读,更多相关《嵌入式实习报告.docx(38页珍藏版)》请在冰点文库上搜索。
嵌入式实习报告
嵌入式实习报告
——基于Linux的嵌入式系统
学生:
某某
学校:
*****大学
学号:
*************
带队老师:
某某
时间:
2011年7月11日——2011年7月22日
摘要
国内普遍认同的嵌入式系统定义为:
以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。
可以这样认为,嵌入式系统是一种专用的计算机系统,作为装置或设备的一部分。
通常,嵌入式系统是一个控制程序存储在ROM中的嵌入式处理器控制板。
事实上,所有带有数字接口的设备,如手表、微波炉、录像机、汽车等,都使用嵌入式系统,有些嵌入式系统还包含操作系统,但大多数嵌入式系统都是是由单个程序实现整个控制逻辑。
关键词:
嵌入式,裁剪,操作系统,控制逻辑。
1.实习的目的及意义
实习是一种实践。
是理论联系实际,应用和巩固所学专业知识的一项重要环节,是培养我们能力和技能的一个重要手段。
通过实习,我们可以更广泛的直接接触社会,了解社会需要,加深对社会的认识,增强对社会的适应性,将自己融合到社会中去,培养自己的实践能力,缩短我们从一名大学生到一名工作人员之间的思想与业务距离,为我们毕业后社会角色的转变打下基础。
同时通过运用所学的专业知识进行观察,也锻炼了提出、分析并解决问题的能力。
此次嵌入式实习,让我们了解了嵌入式系统和嵌入式技术,以及嵌入式系统的应用领域和近年来在国内外的发展。
华中科技大学工程实训中心自主研发的ARM9开发板,以及他们自己总结的经验让我们获益良多,使我们在短时间内进入了嵌入式的精彩世界。
2嵌入式系统开发与应用概述
2.1嵌入式的意义
嵌入式作为现今的热门领域,涵盖了微电子技术、电子信息技术、计算机软件和硬件等多项技术领域的应用。
大到航空航天、石油化工、能源控制、核电站以及机器人系统,小到日常使用的智能手机、数字电视、掌上电脑等,嵌入式技术正在我们的生活中占据着越来越重要的地位。
2.2ARM9实验开发板功能介绍
1)MY-2410-1开发板简介
华中科技大学工程实训中心现代创新基地在总结多年嵌入式教学和科研成果的基础上,自主研发了ARM9实验开发板,其型号为MY-2410-1。
具有高性能、稳定可靠、接口丰富、体积小等优良特性。
MY-2410-1的设计遵循了S3C2410嵌入式芯片的特点,其设计理念参考了当前市场上众多的开发板及嵌入式单板机的优点,并融入最新掌上电脑、手持设备的特点,提供红外接口。
因此是一款单板机和开发板两用的嵌入式电脑平台。
2)开发板硬件资源
MY-2410-1开发板实物图如下:
图1MY-2410-1开发板实物图
a.MemoryController
b.NandFlash
c.UART
d.Interrupt
e.Timer
MemoryController
SDRAM:
S3C2410提供了外接ROM、SRAM、SDRAM、NORFlash、NANDFlash的接口。
S3C2410外接存储器的空间被分为8BANKS,每BANK容量为128M:
当访问BANKx(x从0到7)所对应的地址范围x*128M到(x+1)*128M-1SDRAM使用BANK6,它的物理起始地址为6*128M=0x30000000。
NandFlash
当OM1、OM0都是低电平--即开发板插上BOOTSEL跳线时,S3C2410从NANDFlash启动:
NANDFlash的开始4k代码会被自动地复制到内部SRAM中。
我们需要使用这4k代码来把更多的代码从NANDFlash中读到SDRAM中去。
NANDFlash的操作通过NFCONF、NFCMD、NFADDR、NFDATA、NFSTAT和NFECC六个寄存器来完成。
在开始下面内容前,请打开S3C2410数据手册和NANDFlashK9F1208U0M的数据手册。
UART
UART的寄存器有11X3个(3个UART)之多,我选最简单的方法来进行本实验,用到的寄存器也有8个。
不过初始化就用去了5个寄存器,剩下的3个用于接收、发送数据。
Interrrupt
SUBSRCPND和SRCPND寄存器表明有哪些中断被触发了,正在等待处理(pending);SUBMASK(INTSUBMSK寄存器)和MASK(INTMSK寄存器)用于屏蔽某些中断。
使用中断的步骤:
a.中断向量:
在中断向量设置好当FIQ或IRQ被触发时的跳转函数,IRQ、FIQ的中断向量地址分别为0x00000018、0x0000001c
b.对于IRQ,在跳转函数中读取INTPND寄存器或INTOFFSET寄存器的值来确定中断源,然后调用具体的处理函数
c.对于FIQ,因为只有一个中断可以设为FIQ,无须判断中断源
d.中断处理函数进入和返回
Timer几个重要寄存器介绍
1、TCFG0和TCFG1:
分别设为119和0x03这连个寄存器用于设置“ControlLogic”的时钟,计算公式如下:
TimerinputclockFrequency=PCLK/{prescalervalue+1}/{dividervalue}
对于TIMER0,prescalervalue=TCFG0[7:
0],dividervalue由TCFG1[3:
0]确定(0b000:
2,0b001:
4,0b010:
8,0b0011:
16,0b01xx:
使用外部TCLK0)。
对于本实验,TIMER0时钟=12MHz/(119+1)/(16)=6250Hz
2、TCNTB0:
设为3125
3、在6250Hz的频率下,此值对应的时间为0.5S
3、TCON:
TIMER0对应bit[3:
0]:
bit[3]用于确定在TCNT0计数到0时,是否自动将TCMPB0和TCNTB0寄存器的值装入TCMP0和TCNT0寄存器中
bit[2]用于确定TOUT0是否反转输出(本实验未用)
bit[1]用于手动更新TCMP0和TCNT0寄存器:
在第一次使用定时器前,此位需要设为1,此时TCMPB0和TCNTB0寄存器的值装入TCMP0和TCNT0寄存器中
bit[0]用于启动TIMER0
4、TCONO0:
只读寄存器,用于读取当前TCON0寄存器的值
3)烧写和调试程序用到的软件
Sjf2410(利用JTAG接口烧写FLASH),调试代理软件H-JTAG,ADS1.2开发软件,banyan(Daemon.exe),NandPgm-0.2.0.exe,DNW等
2.3MY-2410-1开发板原理图简介
上面是几张简要电路原理图,有助于我们开发设计程序,在后期的项目开发中尤为重要。
2.4嵌入式应用领域及前景
1.工业控制:
基于嵌入式芯片的工业自动化设备将获得长足的发展,目前已经有大量的8、16、32位嵌入式微控制器在应用中,网络化是提高生产效率和产品质量、减少人力资源主要途径,如工业过程控制、数字机床、电力系统、电网安全、电网设备监测、石油化工系统。
就传统的工业控制产品而言,低端型采用的往往是8位单片机。
但是随着技术的发展,32位、64位的处理器逐渐成为工业控制设备的核心,在未来几年内必将获得长足的发展。
2.交通管理:
在车辆导航、流量控制、信息监测与汽车服务方面,嵌入式系统技术已经获得了广泛的应用,内嵌GPS模块,GSM模块的移动定位终端已经在各种运输行业获得了成功的使用。
目前GPS设备已经从尖端产品进入了普通百姓的家庭,只需要几千元,就可以随时随地找到你的位置。
3.信息家电:
这将称为嵌入式系统最大的应用领域,冰箱、空调等的网络化、智能化将引领人们的生活步入一个崭新的空间。
即使你不在家里,也可以通过电话线、网络进行远程控制。
在这些设备中,嵌入式系统将大有用武之地。
4.家庭智能管理系统:
水、电、煤气表的远程自动抄表,安全防火、防盗系统,其中嵌有的专用控制芯片将代替传统的人工检查,并实现更高,更准确和更安全的性能。
目前在服务领域,如远程点菜器等已经体现了嵌入式系统的优势。
5.POS网络及电子商务:
公共交通无接触智能卡(ContactlessSmartcard,CSC)发行系统,公共电话卡发行系统,自动售货机,各种智能ATM终端将全面走入人们的生活,到时手持一卡就可以行遍天下。
6.环境工程与自然:
水文资料实时监测,防洪体系及水土质量监测、堤坝安全,地震监测网,实时气象信息网,水源和空气污染监测。
在很多环境恶劣,地况复杂的地区,嵌入式系统将实现无人监测。
7.机器人:
嵌入式芯片的发展将使机器人在微型化,高智能方面优势更加明显,同时会大幅度降低机器人的价格,使其在工业领域和服务领域获得更广泛的应用。
这些应用中,可以着重于在控制方面的应用。
就远程家电控制而言,除了开发出支持TCP/IP的嵌入式系统之外,家电产品控制协议也需要制订和统一,这需要家电生产厂家来做。
同样的道理,所有基于网络的远程控制器件都需要与嵌入式系统之间实现接口,然后再由嵌入式系统来控制并通过网络实现控制。
所以,开发和探讨嵌入式系统有着十分重要的意义。
嵌入式实习内容简介
3.1ARM9及芯片概述
ARM920T原理图
1)RISC型处理器结构
ARM采用RISC结构,在简化处理器结构,减少复杂功能指令的同时,提高了处理器的速度。
考虑到处理器与存储器打交道的指令执行时间远远大于在寄存器内操作的指令执行时间,RISC型处理器采用了Load/Store(加载/存储)结构,即只有Load/Store指令可与存储器打交道,其余指令都不允许进行存储器操作。
2)Thumb指令集
虽然ARM处理器本身是32位设计,但考虑到RISC型处理器的指令功能相对较弱,新型的ARM体系结构中定义了16位的Thumb指令集。
Thumb指令集比通常的8/16位CISC/RISC处理器有更好的代码密度,而芯片面积只增加6%,却可以使程序存储器更小。
3)多处理器状态模式
ARM体系结构定义了7种处理器模式:
用户、快中断、中断、管理、终止、未定义和系统模式,大大提高了ARM处理器的效率。
4)两种处理器工作状态
ARM状态(执行32位ARM指令)
Thumb状态。
(执行16位Thumb指令)
5)嵌入式在线仿真调试
ARM体系结构的处理器芯片都嵌入了在线仿真ICE-RT逻辑,便于通过JTAG来仿真调试芯片,省去了价格昂贵的在线仿真器。
6)灵活方便的接口
ARM体系结构具有协处理器接口,允许接16个协处理器。
既可以使基本的ARM处理器内核尽可能小,方便地扩充ARM指令集,也可以通过未定义指令来支持协处理器的软件仿真。
7)低电压功耗的设计
考虑到ARM处理器主要用于手持式嵌入式系统中,在设计中就十分注意功耗的设计。
3c2410内部结构图
Samsung公司推出的16/32位RISC处理器S3C2410A,为手持设备和一般类型应用提供了低价格、低功耗、高性能小型微控制器的解决方案。
为了降低整个系统的成本,S3C2410A提供了以下丰富的内部设备:
分开的16KB的指令Cache和16KB数据Cache,MMU虚拟存储器管理,LCD控制器(支持STN&TFT),支持NANDFlash系统引导,系统管理器(片选逻辑和SDRAM控制器),3通道UART,4通道DMA,4通道PWM定时器,I/O端口,RTC,8通道10位ADC和触摸屏接口,IIC-BUS接口,IIC-BUS接口,USB主机,USB设备,SD主卡&MMC卡接口,2通道的SPI以及内部PLL时钟倍频器。
S3C2410A采用了ARM920T内核,0.18um工艺的CMOS标准宏单元和存储器单元。
它的低功耗、精简和出色的全静态设计特别适用于对成本和功耗敏感的应用。
同样它还采用了一种叫做AdvancedMicrocontrollerBusArchitecture(AMBA)新型总线结构。
S3C2410A的显著特性是它的CPU核心,是一个由AdvancedRISCMachines(ARM)有限公司设计的16/32位ARM920TRISC处理器。
ARM920T实现了MMU,AMBABUS和Harvard高速缓冲体系结构。
这一结构具有独立的16KB指令Cache和16KB数据Cache,每个都是由8字长的行(line)构成。
3.2Flash、vivi、U_boot、linux烧录及其他实验
例烧写wince
1.最开始先插上JTAG线,USB线,串口线。
2.CMD命令行里输入sjf2410.exe/f:
vivi_my2410.bin选0,选0,选0烧写完成后选2退出(这一步中会安USB驱动,如USB驱动安装文档中所述安装方法)
3.关掉电源开关,拔掉JTAG线,并将BOOTSEL短接帽插上(从NANDFLASH启动)——关键的一步
4.打开“超级终端”,COM1口,设置为波特率115200,数据位8,无校验,1位停止位,数据流控制无——关键
5.按住PC的空格键,同时打开开发板电源,此时进入VIVI
6.说明:
JTAG线可以用来监控程序(如2410mon.vivi等)烧写到flash中去。
当板子上有了监控程序后,又可以通过串口或USB口来和PC机通信
下面在VIVI的命令行中输入
bonpart0192k1216k(对flash分区)
loadflashviviu(通过USB重新烧写vivi)
打开DNW.exe选择ivi_my2410.bin并传输
loadflashebootu(通过USB烧写EBOOT.NB0)
打开DNW.exe选择EBOOT.nb0并传输
loadflashwinceu(通过USB烧写nk.bin)
打开DNW.exe和nk.bin并传输
这样EBOOT.nb0和nk.bin都烧到板子上了说明:
nb0文件可以直接在flash上运行,而bin文件只能在ram中运行。
像上面EBOOt.nb0就是在flash上运行,而后它把nk.bin复制到ram中运行。
实验结果如下图:
3.3相关程序的初级学习
如:
2410lib接口函数
voidDelay(inttime);//WatchdogTimerisused.延时
0
void*malloc(unsignednbyte);//分配内存
voidfree(void*pt);//释放内存
voidPort_Init(void);//初始化端口
voidUart_Select(intch);//选择串口
voidUart_TxEmpty(intch);
voidUart_Init(intmclk,intbaud);//串口初始化
charUart_Getch(void);//从串口读取一个字符(阻塞)
charUart_GetKey(void);//从串口读取一个字符(非阻塞)
intUart_GetIntNum(void);//从串口读取一个数字
voidUart_SendByte(intdata);//从串口发送一个字节
voidUart_Printf(char*fmt,...);//从串口输出的printf
voidUart_SendString(char*pt);
voidTimer_Start(intdivider);//WatchdogTimerisused.
intTimer_Stop(void);//WatchdogTimerisused.
voidLed_Display(intdata);
voidChangeMPllValue(intm,intp,ints);
voidChangeClockDivider(inthdivn,intpdivn);
voidChangeUPllValue(intm,intp,ints);
主程序模板
//FileName:
2410test.c
//Function:
S3C2410TestMainMenu
//Program:
Shin,OnPil(SOP)
//Date:
June13,2003
//Version:
0.0
//History
//====================================================================
#include
#include
#include"def.h"
#include"option.h"
#include"2410addr.h"
#include"2410lib.h"
#include"2410slib.h"
#include"uart0.h"
#include"mmu.h"
voidIsr_Init(void);
voidHaltUndef(void);
voidHaltSwi(void);
voidHaltPabort(void);
voidHaltDabort(void);
externvoid__rt_lib_init(void);
voidTemp_Function(void){;}
//===================================================================
voidMain(void)
{
inti=0;
//Led_Display(15);
MMU_Init();//初始化MMU单元
#ifADS10
__rt_lib_init();//forADS1.0
#endif
//ChangeClockDivider(0,0);//1:
1:
1
//ChangeClockDivider(0,1);//1:
1:
2
//rCLKDIVN|=(1<<2);//1:
4:
4
//ChangeClockDivider(1,0);//1:
2:
2
ChangeClockDivider(1,1);//1:
2:
4
//ChangeMPllValue(0xa1,0x3,0x3);//FCLK=50.7MHz
//ChangeMPllValue(0x7f,0x2,0x2);//FCLK=101.25MHz
//ChangeMPllValue(0x96,0x5,0x1);//FCLK=135428571Hz
//ChangeMPllValue(0x2a,0x1,0x0);//FCLK=200MHz
//ChangeMPllValue(0x5c,0x1,0x1);//FCLK=200MHz
//ChangeMPllValue(0x5c,0x4,0x0);//FCLK=200MHz
//ChangeMPllValue(0x8e,0x7,0x0);//FCLK=200MHz
ChangeMPllValue(0xa1,0x3,0x1);//FCLK=202.8MHz
//ChangeMPllValue(0x66,0x1,0x1);//FCLK=220MHz
//ChangeMPllValue(0x69,0x1,0x1);//FCLK=226MHz
//ChangeMPllValue(0x96,0x2,0x1);//FCLK=237MHz
//ChangeMPllValue(0x7d,0x4,0x0);//FCLK=266MHz
Port_Init();//IO端口初始化
Isr_Init();//设中断
Uart_Init(0,115200);//COM口初始化
//SavethewastedpowerconsumptiononGPIO.
rIISPSR=(2<<5)|(2<<0);//IIS_LRCK=44.1Khz@384fs,PCLK=50Mhz.
rGPHCON=rGPHCON&~(0xf<<18)|(0x5<<18);//CLKOUT0,1=OUTPUTtoreducethepowerconsumption.
Uart_Printf("\n\nhellodenggs\n");
while
(1)
{
Uart_Printf("hello\n");//串口返回调试信息
Delay(2000);//延时
i++;
if(i>15)i=0;
Led_Display(i);//控制四个LED显示
}
}
//===================================================================
voidIsr_Init(void)
{
pISR_UNDEF=(unsigned)HaltUndef;
pISR_SWI=(unsigned)HaltSwi;
pISR_PABORT=(unsigned)HaltPabort;
pISR_DABORT=(unsigned)HaltDabort;
rINTMOD=0x0;//All=IRQmode
//rINTCON=0x5;//Non-vectored,IRQenable,FIQdisable
rINTMSK=BIT_ALLMSK;//Allinterruptismasked.
rINTSUBMSK=BIT_SUB_ALLMSK;//Allsub-interruptismasked.<-April01,2002SOP
//rINTSUBMSK=~(BIT_SUB_RXD0);//EnableRx0Defaultvalue=0x7ff
//rINTMSK=~(BIT_UART0);//EnableUART0Defaultvalue=0xffffffff
//pISR_UART0=(unsigned)RxInt;//pISR_FIQ,pISR_IRQmustbeinitialized
}
//===================================================================
voidHaltUndef(void)
{
Uart_Printf("Undefinedinstructionexception.\n");
while
(1);
}
//==========================