江苏大学ARM课程设计.docx
- 文档编号:24457127
- 上传时间:2023-05-27
- 格式:DOCX
- 页数:42
- 大小:1.96MB
江苏大学ARM课程设计.docx
《江苏大学ARM课程设计.docx》由会员分享,可在线阅读,更多相关《江苏大学ARM课程设计.docx(42页珍藏版)》请在冰豆网上搜索。
江苏大学ARM课程设计
江苏大学课程设计
嵌入式系统
班级:
学号:
姓名:
指导老师:
曹清华
课程设计时间:
2014.7.3---2014.7.10
江苏大学
第一章数码管显示
1.1实验目的
1)了解ARM体系结构和编程方法。
2)了解八段数码管的知识。
3)了解系统的硬件寻址方式。
1.2实验任务与要求
将八段码程序源码进行修改,最终显示学号后四位,将源码写进实验报告。
1.3设计步骤
1)编译源程序
启动ADS,对目标代码进行编译并生成bin文件,在ADS的项目管理器中选择DebugRel或Release编译项。
编译项目设置如图:
编译设置完成后,进行编译,注意要求与下图一致:
2)烧写目标代码到Flash中
打开实验台电源,启动桌面上的FlashWrite:
打开菜单中的File,选择LoadConfiguration项,装载PXA270的配置文件,PXA270.cfg文件在C:
\Banyan-us\example中:
然后点击Initialize:
上图为连接正常的弹出窗口,确认连接正常,点击Detect:
如正常,应能自动搜索到板载的norFlash芯片,然后点击program按钮,按图中的设置:
目标文件位于项目文件所在文件夹中,烧写起始地址为0,烧写选项按上图设置。
然后点击Start按钮,开始烧写。
烧写结束,重新启动实验板,烧写到Flash中的程序会自动运行,我们可以观察到数码管上的数字。
参考代码如下:
#include
#defineLED_CS2(*((volatileunsignedshortint*)(0x10300000)))//LED1andLED2
#defineLED_CS3(*((volatileunsignedshortint*)(0x10400000)))//LED3andLED4
intmain(void)
{
LED_CS2=0x4079;//10
LED_CS3=0x7824;//27
return0;
}
1.4实验结果
数码管显示如图:
第二章MMC/SD卡驱动程序设计
2.1实验目的
1)了解PXA27X微处理器GPIO的功能
2)了解MMC卡驱动程序的架构及编程方法
3)掌握MMC卡的使用方法
2.2实验任务与要求
1)理解基于Linux的嵌入式系统交叉开发环境,对嵌入式系统的开发流程有详细的了解;
2)掌握开发工具链的构建方法,能独立进行系统开发操作;
3)掌握Linux的常用命令,在linux系统下能熟练的使用这些常用命令;
4)熟悉linux内核的知识以及原理,掌握定制Linux内核的方法;
5)基于Linux操作系统,以及XSBase270ARM实验开发平台一套,把MMC存储卡挂载目标板上并进行文件的复制操作。
2.3硬件结构与设计原理
1)目标板的MMC卡硬件接口
目标板的MMC/SD卡的硬件接口如图2.1所示,根据PXA27x的MMC/SD/SDIO控制器的信号功能以及PXA27x的GPIO的功能分配,命令控制线MMCMD与GPIO112相连,此时引脚GPIO112必须配置成转换功能1(AlternateFunction1)的输入或输出方式(具体参考PXA27X开发手册),时钟端MMCLK利用了通用IO口GPIO32转换功能1输出方式,4位总线MMDAT0到MMDAT3分别与GPIO111、GPIO110、GPIO109和GPIO92相连,都时使用了通用IO口的转换功能1的输入或输出方式。
图2.2为MMC/SD卡的供电电路图。
图1.1目标板的MMC/SD卡的硬件接口
图1.2MMC/SD卡的供电电路图
2)PXA270的MMC/SD/SDIO控制器
PXA270的MMC/SD/SDIO控制器在访问PXA270处理器的软件与MMC存储堆和支持MMC、SD及SDIO通信协议之间充当联结作用。
PXA27x的MMC控制器协议规范遵守多媒体卡系统规范V3.2(MultiMediaCardSystemSpecificationVersion3.2);MMC/SD/SDIO控制器采用标准的MMC传输协议或串行通信接口SPI协议模式。
访问PXA270的软件使用MMC传输协议或SPI模式作为与MMC控制器通信的协议。
目标板的SD驱动程序采用了MMC通信传输协议。
3)MMC卡的通信协议
主机与MMC卡的所有通信都是由主机发起,主机发出广播和点对点两种类型通信命令,在广播通信命令中,主机发出的命令被所有的卡接受,只有部分命令需要响应;而在点对点通信命令中,命令被发送到具体地址的卡中,并由该卡对所接受的命令做出响应。
2.4设计步骤
2.4.1Bootloader移植与下载
1)源代码安装
先将D:
\emdor\EELiod_V4_SDK目录下的Linux-2.4复制到虚拟机里root的主文件夹中,然后用如下指令进行解压:
利用上述命令解压后,bootloader源代码解压到当前目录中Boot-XSBase270文件夹中。
2)源代码分析移植与编译
在解压的目录里进行make编译。
[root@localhostBootLoader]$cdBoot-XSBase270
root@ubuntu:
Boot-XSBase270#makeclean
[root@localhostBoot-XSBase270]$make
编译完成后,在当前目录下会生成bootloader映象文件boot。
3)下载
打开实验台电源,启动FlashWrite,烧写D:
\emdor\EELiod_V4_SDK\Linux-2.4\images\中的boot文件。
2.4.2Linux内核移植与下载
1)Linux内核源代码安装
内核解压:
2)Linux内核源代码分析与移植
Linux提供三个不同的命令进行Linux的配置,效果完全一样:
makeconfig控制台命令行方式配置命令
makemenuconfig文本菜单方式配置命令
makexconfigX窗口图形界面方式配置命令
其他部分命令:
Makemrproper命令清除所有的旧的配置和旧的编译目标文件等。
Makedep命令搜索Linux编译输出与源代码之间的依赖关系、并生成依赖文件。
Makeclean清除以前构造内核时生成的所有目标文件、模块文件和临时文件。
MakezImage编译Linux内核,生成压缩的内核映像文件。
3)Linux内核编译与下载
把共享目录/linux-2.4.21-51Board_EDR.tar.gz压缩包复制到根目录的/tmp中,解压。
内核配置
Linux针对MMC/SD内核配置的步骤:
(1)在主菜单下选择Loadablemodulesupport--->[*]EnableLoadablemoduLeSupport
利用模块可将不常用的设备驱动或功能作为模块放在内核外部,必要时动态地调用。
操作结束后从内存中删除,这样可以有效地使用内存,同时也可减小了内核的大小。
模块可以自行编译并具有独立的功能,即使需要改变模块的功能,也不用对整个内核进行修改。
文件系统,设备驱动,二进制格式等很多功能都支持模块。
一定要选择[*]。
(按空格键)
[]SetversioninformationonallSymbolsformodules
利用这个功能能够让内核使用其它内核版本模块或没有包含在此kernel的特殊的模块。
一般选择[N]。
[*]KernelmoduleLoader
这个设置使kernel对模块处于常备状态。
在不使用Insmod或rmmod命令情况下,kernel程序自动将需要。
执行的模块调用到内存中,一定时间内不使用该模块时自动将其从内存删除,一般要选择[*]。
(2)再回到主菜单下选择Generalsetup―――>选择“Supportforhot-pluggabledevices”,出现“MMC/SDdevicedrivers”:
点击“MMC/SDdevicedrivers”,进入下一页选择:
用向下的箭头,选择LoadanAlternaeConfigurationFile选项。
输入配置文件名arch\arm\def‐configs\xsbase270,退出并保存。
配置完成后,重新编译内核,需要输入以下指令:
生成的zImage存放路径为:
将zImage拷贝到tftpboot文件夹下:
内核烧写
重新打开一个终端,输入命令:
root@ubuntu:
~#minicom
然后重启开发板电源,
看到Boot启动信息后按任意键启动Boot的OperationMenu,我们需要用这个boot内嵌工具下载内核。
然后再提示信息Pleaseenteryourselection后面输入2,获取本地IP地址:
可以看到OperationMenu菜单上方显示:
Myipaddressis192.168.0.50,则表示板载Linux与Ubuntu服务器连接成功。
输入3,下载内核文件ZImage(在Ubuntu的文件系统的/tftpboot/目录中)下载成功后选择4,烧写内核。
2.4.3课程设计功能模块程序设计与交叉编译
1)MMC/SD卡模块注册初始化:
staticint__devinitmmc_pxa_module_init(void)
{
intret=-ENODEV;
#ifdefCONFIG_ARCH_RAMSES
RAMSES_MMC_ON();
udelay(1000);
#endif
host=mmc_register(MMC_REG_TYPE_HOST,&pxa_mmc_controller_tmpl_rec,
sizeof(pxa_mmc_hostdata_rec_t));//registertheSDdevice
if(!
host){
MMC_DEBUG(MMC_DEBUG_LEVEL0,"failedtoregisterwithMMCcore\n");
gotoerror;
}
ret=0;
error:
returnret;
}
2)设备文件操作接口定义
staticmmc_controller_tmpl_rec_tpxa_mmc_controller_tmpl_rec={
owner:
THIS_MODULE,
name:
"PXA250",
block_size_max:
PXA_MMC_BLKSZ_MAX,
nob_max:
PXA_MMC_NOB_MAX,
probe:
pxa_mmc_probe,
init:
pxa_mmc_init,
remove:
__devexit_p(pxa_mmc_remove),
update_acq:
pxa_mmc_update_acq,
init_card_stack:
pxa_mmc_init_card_stack,
check_card_stack:
pxa_mmc_check_card_stack,
setup_card:
pxa_mmc_setup_card,
stream_read:
pxa_mmc_stream_read,
read_block:
pxa_mmc_read_block,
read_mblock:
pxa_mmc_read_mblock,
stream_write:
pxa_mmc_stream_write,
write_block:
pxa_mmc_write_block,
write_mblock:
pxa_mmc_write_mblock
};
3)MMC接口初始化
staticintpxa_mmc_init(mmc_controller_tctrlr)
{
intret=-ENODEV;
pxa_mmc_hostdata_thostdata=(pxa_mmc_hostdata_t)ctrlr->host_data;
/*1.allocatebuffer*/
hostdata->iobuf.iodata=kmalloc(PXA_MMC_IODATA_SIZE,GFP_ATOMIC);//2K
if(!
hostdata->iobuf.iodata){
ret=-ENOMEM;
gotoerror;
}
/*2.initializeiobuf*/
hostdata->iobuf.blksz=PXA_MMC_BLKSZ_MAX;/*currentblocksizeinbytes1024*/
hostdata->iobuf.bufsz=PXA_MMC_IODATA_SIZE;/*buffersizeforeachtransfer*/
hostdata->iobuf.nob=PXA_MMC_BLOCKS_PER_BUFFER;/*numberofblocks*/
/*3requestirq*/
if(request_irq(IRQ_MMC,pxa_mmc_irq,0,"MMC",ctrlr)){
MMC_ERROR("failedtorequestIRQ_MMC\n");
gotoerror;
}
/*4initGPIOaboutMMC/SD/SDIO*/
init_gpio();
CKEN|=CKEN12_MMC;/*enableMMCunitclock*/
ret=0;
gotoout;
error:
kfree(hostdata->iobuf.iodata);
out:
returnret;
}
4)GPIO初始化函数
staticvoidinit_gpio(void)
{
GPCR1|=0x1;//clearpin32
GPDR1=GPDR1|(1<<0);//configpin32asoutput
GAFR1_L=(GAFR1_L&0xfffffffc)|(2<<0);//)pin32isusedforfunction2->MMCLK
//MMDAT0PIN92
GPSR2|=0x10000000;//pin92configuredasanoutput,setpinlevelhigh(one).
GPDR2|=0x10000000;//pin92asoutput
//GPDR2=GPDR2&~(1<<28);
GAFR2_U=(GAFR2_U&0xfcffffff)|(1<<24);//pin32isusedforfunction1->MMDAT<0>
//MMDAT1PIN109
GPSR3|=(1<<13);
GPDR3|=(1<<13);
GAFR3_L=(GAFR3_L&0xf3ffffff)|(1<<26);
//MMDAT2PIN110
GPSR3|=(1<<14);
GPDR3|=(1<<14);
GAFR3_L=(GAFR3_L&0xcfffffff)|(1<<28);
//MMDAT3PIN111
GPSR3|=(1<<15);
GPDR3|=(1<<15);
GAFR3_L=(GAFR3_L&0x3fffffff)|(1<<30);
//MMCMDPIN112
GPSR3|=0x00010000;
GPDR3|=0x00010000;
//GPDR3=GPDR3&~(1<<16);
GAFR3_U=(GAFR3_U&0xfffffffc)|(1<<0);//function1
GPSR3|=0x0000e000;//PIN111-PIN109
GPDR3|=0x0000e000;
GAFR3_L=(GAFR3_L&0x03ffffff)|0x54000000;
}
5)SD移除操作函数
//removetheMMCthenfreesystemresource
staticvoidpxa_mmc_remove(mmc_controller_tctrlr)
{
pxa_mmc_hostdata_thostdata=(pxa_mmc_hostdata_t)ctrlr->host_data;
kfree(hostdata->iobuf.iodata);/*1)freebuffer(s)*/
free_irq(IRQ_MMC,ctrlr);/*1)releaseirq*/
CKEN&=~CKEN12_MMC;/*disableMMCunitclock*/
}
6)读数据块操作
staticintpxa_mmc_read_block(mmc_controller_tctrlr,mmc_data_transfer_req_ttransfer)
{
intret=-ENODEV;
u16argh=0UL,argl=0UL;
/*sendCMD16(SET_BLOCK_LEN)whenrequestedblocksizeisnotthedefault
*forthecurrentcard*/
if(transfer->blksz!
=ctrlr->stack.selected->info.read_bl_len){
argh=transfer->blksz>>16;
argl=transfer->blksz;
if((ret=pxa_mmc_stop_bus_clock(ctrlr)))
gotoerror;
MMC_CMD=CMD(16);/*SET_BLOCK_LEN*/
MMC_ARGH=argh;
MMC_ARGL=argl;
MMC_CMDAT=MMC_CMDAT_R1;
MMC_DEBUG(MMC_DEBUG_LEVEL3,"CMD16(0x%04x%04x)\n",argh,argl);
if((ret=pxa_mmc_complete_cmd(ctrlr,MMC_R1,FALSE)))
gotoerror;
}
/*CMD17(READ_SINGLE_BLOCK)*/
argh=transfer->addr>>16;
argl=transfer->addr;
if((ret=pxa_mmc_stop_bus_clock(ctrlr)))
gotoerror;
MMC_CMD=CMD(17);/*READ_SINGLE_BLOCK*/
MMC_ARGH=argh;MMC_ARGL=argl;
MMC_CMDAT=MMC_CMDAT_R1|MMC_CMDAT_READ|MMC_CMDAT_BLOCK|MMC_CMDAT_DATA_EN;
MMC_NOB=1;
MMC_BLKLEN=transfer->blksz;
MMC_DEBUG(MMC_DEBUG_LEVEL3,"CMD17(0x%04x%04x)\n",argh,argl);
if((ret=pxa_mmc_complete_cmd(ctrlr,MMC_R1,FALSE)))
gotoerror;
/*transferthedatatothecallersuppliedbuffer*/
if((ret=pxa_mmc_read_buffer(ctrlr,transfer->blksz))<0)//transfer->blksz
gotoerror;
if((ret=pxa_mmc_copy_from_buffer(ctrlr,transfer->type,transfer->buf,ret))<0)
gotoerror;
transfer->buf+=ret;
transfer->cnt-=ret;
transfer->nob-=1;
pxa_mmc_set_state(ctrlr,PXA_MMC_FSM_END_IO);
if((ret=pxa_mmc_complete_io(ctrlr,transfer->cmd,transfer->mode)))
gotoerror;
ret=0;
error:
returnret;
}
7)写数据块操作
staticintpxa_mmc_write_block(mmc_controller_tctrlr,mmc_data_transfer_req_ttransfer)
{
intret=-ENODEV;
u16argh=0UL,argl=0UL;
/*sendCMD16(SET_BLOCK_LEN)whenrequestedblocksizeisnotthedefault*forthecurrentcard*/
if(transfer->blksz!
=ctrlr->stack.selected->info.read_bl_len){
argh=transfer->blksz>>16;
argl=transfer->blksz;
if((ret=pxa_mmc_stop_bus_clock(ctrlr)))
gotoerror;
MMC_CMD=CMD(16);/*SET_BLOCK_LEN*/
MMC_ARGH=argh;
MMC_ARGL=argl;
MMC_CMDAT=MMC_CMDAT_R1;
MMC_DEBUG(MMC_DEBUG_LEVEL3,"CMD16(0x%04x%04x)\n",argh,argl);
if((ret=pxa_mmc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 江苏 大学 ARM 课程设计