ARM第一次实验报告

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

课程名称:数字信息技术专业实验实验题目:S3C2440的GPIO实验实验组成员:蒋虎2013141452147刘砚2013141452159陈泽2013141491043陈俊龙2013141452135陈若虚2013141452123一、实验目的1、熟悉ADS1.2+H-Jtag开发环境。2、掌握S3C2440GPIO寄存器的配置。3、掌握LED显示原理,按键触发原理。4、熟悉C语言编程。5、掌握ARM寄存器的位操作。二、实验仪器及器件硬件:EDA试验箱(包括FPGA核心板、单片机、mini2440ARM开发板)PC主机H-Jtag调试板软件:ADS1.2(ARM开发工具)ADS是全套的实时开发软件工具,包编译器生成的代码密度和执行速度优异。可快速低价地创建ARM结构应用。H-JTAG在线仿真器。三、实验要求1、课前了解mini2440开发板的原理图。2、通过芯片手册了解mini2440关于GPIO的配置3、理解实验原理四.实验原理1、LED部分1.1、管脚分配Led通过电源,限流电阻与ARM的I/O口相连,当I/O口为低电平时,电源会通过led限流电阻往ARM里灌电流,点亮led。反之I/O为高电平时,则led不会亮。注意亮灭之间要有一定的延时(大于人眼分辨率大概十几毫秒),以便人眼能够区分出亮灭。Mini2440led相关原理图如下:我们观察nLED_1,nLED_2,nLED_3,nLED_4分别接在了CPU的GPB5,GPB6,GPB7,GPB8管脚1.2、配置GPIO寄存器打开S3C2440的芯片手册(P284)我们需要做的事情是将GPB5,GPB6,GPB7,GPB8四个管脚设置为输出(在GPBCON寄存器中配置),并且输出低电平(在GPBDAT寄存器中配置)后面的源码中会涉及到这一步。这样LED就可以被点亮。2、按键部分2.1、管脚分配先观察按键部分的原理图发现mini2440的六个按键分别接在S3C2440芯片的GPG0,GPG3,GPG5,GPG6,GPG7,GPG11。2.2、配置GPIO寄存器同LED一样,只是我们的按键的GPIO要设置为输入,如何检测按键是否被按下,很简单,根据原理图可以发现,如果CPU检测到某个引脚为低电平,说明对应的按键被按下。所以我们需要配置GPG0,GPG3,GPG5,GPG6,GPG7,GPG11为输入(在GPGDAT寄存器中配置)。编程检测这几个引脚的电平值(在GPGDAT寄存器中检测)。后面的源码中会涉及到这一步。五、实验内容及步骤1、H-Jtag配置1.1,将实验箱打开,将H-Jtag小板的一端接入arm开发板的Jtag口,另一端插入电脑的并口。Arm开发板的JTAG调试版1.2,将arm的S2拨到norflash启动1.3,连接电源,拨动arm开发板S1开关,上电。1.4,安装H-jtag代理软件。1.5,打开安装好的H-jtag代理软件,做如下设置。Arm开发板的启动模式选择开关,可选中nandflash启动和nor这一步会出现无法找到器件,忽略该错误。1.6打开Setting-LPTJtagSetting做如下设置1321.7,设置InitScript13212这样我们的H-Jtag设置就全部完成啦!1.8,配置完成后,检测CPU点主菜单Operations(或control)-DetectTarget345这样我们的H-jtag就识别出了我们的ARM920T注意,如果没有出现这个画面,可能有如下错误容易被忽略:1),没有上电。2),S2没有拨到norflash启动。3),不使用并口扩展线再试一次。2使用ADS1.2仿真工具3,使用H­JTAG进行代码调试实验要求:记录实验现象。以同样的方式,执行Led_2,并观察现象。提示:每次关闭CodeWarrior或新建工程都需要点Edit菜单,选择“DebugRelSetting…”进行重新配置,为节省时间,可以直接在前一个工程的.mcp界面,选择之前的所有文件,然后删除,并将新工程的相关文件添加进去,此时只需重新make和debug就行了。(其实由于功能简单,其实只需要替换main.c函数就行,其他函数都一样)Led_1:LED1~4先依次点亮,然后熄灭,接着全亮,熄灭;此后重复此过程。Led_2:K1~K4按下,分别只点亮LED1~4,其他熄灭。4,源码分析源码1(led_1):流水灯实验。该实验主要需要掌握GPIO寄存器的配置,以及LED等显示原理system和uart源文件主要是对s3c2440的一系列初始化,包括管看门狗,初始化内存,初始化时钟,以及初始化串口。这里暂时不去深究。我主要分析main.c/*定义两个寄存器的地址*//*参考芯片手册P284*/#defineGPBCON(*(volatileunsignedlong*)0x56000010)#defineGPBDAT(*(volatileunsignedlong*)0x56000014)/*注意掌握C语言对指定地址进行读写的方法*//*初始化led*/voidled_init(void){/*设置GPB5,6,7,8为输出,参考芯片手册P284*/GPBCON&=~(0x3ff10);GPBCON|=(110)|(112)|(114)|(116);}/*这个函数可以点亮LED灯,参数n是用来选择点亮那盏灯,取值范围为1到4*/voidled_on(intn){/*先判断参数是否正确*/if(n=0&&n=5){return;}n+=4;/*向GPBDAT的5(6,7,8)位写入0,这样CPU的GPB5(GPB6,GPB7,GPB8)就可以输出低电平,从而点亮对应的LED灯*/GPBDAT&=~(0x1n);}/*这个函数可以关闭LED,结构和原理同led_on一样*/voidled_off(intn){if(n=0&&n=5){return;}n+=4;GPBDAT|=(0x1n);}/*点亮所有的LED*/voidall_leds_on(void){GPBDAT&=~(0xf5);}/*关闭所有的LED*/voidall_leds_off(void){GPBDAT|=(0xf5);}/*延时函数*/voiddelays(inttime){unsignedinti,j;for(i=time;i0;i--)for(j=1000;j0;j--);}/*主函数入口*/intMain(){intn;led_init();while(1){/*关闭所有的LED*/all_leds_off();/*依次点亮LED*/for(n=1;n=5;n++){led_on(n);/*延时*/delays(1000);}all_leds_off();delays(1000);/*点亮所有LED*/all_leds_on();delays(1000);}return0;}源码2(led_2):按键控制LED。分析led_2的mian.c发现中间多了对按键的初始化./*定义寄存器地址*/#defineGPBCON(*(volatileunsignedlong*)0x56000010)#defineGPBDAT(*(volatileunsignedlong*)0x56000014)#defineGPGCON(*(volatileunsignedlong*)0x56000060)#defineGPGDAT(*(volatileunsignedlong*)0x56000064)/*初始化按键*/Voidbuttons_init(){/*设置GPG0,3,5,6为输入*/GPGCON&=~((0x30)|(0x36)|(0x310)|(0x312));}/*查询法检测按键是否被按下*//*返回值0:按下,1:未按下-1:参数错误*/intis_button_pressed(intn){switch(n){case1:return(10)&(GPGDAT);break;case2:return(13)&(GPGDAT);break;case3:return(15)&(GPGDAT);break;case4:return(16)&(GPGDAT);break;default:return-1;}}intMain(){intn;all_leds_off();/*初始化led*/leds_init();/*初始化buttons*/buttons_init();while(1){for(n=1;n5;n++){if(!is_button_pressed(n)){/*有按键按下*/all_leds_off();/*点亮相应的灯*/led_on(n);}}}return0;}源码3(led_3):本节课要求基本要求:在led1的基础上,修改程序使LED灯以二进制递增的方式点亮;拓展要求:在基本要求的基础上,增加一个按键可以控制led亮灭的暂停及者继续。已经拓展了功能(添加按键控制LED亮灭的暂停与继续)的代码如下:#include2440addr.h#include2440lib.h#includeoption.h#includedef.h#includeuart.h#defineGPBCON(*(volatileunsignedlong*)0x56000010)#defineGPBDAT(*(volatileunsignedlong*)0x56000014)#defineGPGCON(*(volatileunsignedlong*)0x56000060)#defineGPGDAT(*(volatileunsignedlong*)0x56000064)voidbuttons_init(){/*设置GPG0,3,5,6为输入*/GPGCON&=~((0x30)|(0x36)|(0x310)|(0x312));}//按键初始化/*初始化led*/voidled_init(void){/*设置GPB5,6,7,8为输出*/GPBCON&=~(0x3ff10);GPBCON|=(110)|(112)|(114)|(116);}/*返回值0:按下,1:未按下-1:参数错误*/intis_button_pressed(intn){switch(n){case1:return(10)&(GPGDAT);break;case2:return(13)&(GPGDAT);break;default:return-1;}}voidall_leds_on(void){GPBDAT&=~(0xf5);}voidall_leds_off(void){GPBDAT|=(0xf5);}voiddelays(inttime){unsignedinti,j;for(i=time;i0;i--)for(j=1000;j0;j--);}intMain(){intn;led_init();buttons_init();while(1){/*关闭所有的LED*/all_leds_off();delays(1000);for(n=1;n=14;n++){GPBDAT-=(0x15);/*延时*/delays(1000);if(!is_button_pressed(1)){while(1){if(!is_button_pressed(2))break;}}}/*点亮所有LED*/all_leds_on();delays(1000);}return0;}六、实验结果分析实现现象:实验一:这些灯开始时都是熄灭的,首先LED1被点亮,然后LED2与LED1均被点亮,紧接着LED3,LED2,LED1均为点亮,随后LED4,LED3,LED2,LED1,这四盏灯均被点亮。马上,这四盏灯又全部熄灭了,最后这四盏灯又全部点亮,然后熄灭。又是LED1被点亮...这样周而复始的过程。实验二:当按下相

1 / 25
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功