沈颂林ARM实验报告打印版3.docx
- 文档编号:14158078
- 上传时间:2023-06-21
- 格式:DOCX
- 页数:46
- 大小:79.72KB
沈颂林ARM实验报告打印版3.docx
《沈颂林ARM实验报告打印版3.docx》由会员分享,可在线阅读,更多相关《沈颂林ARM实验报告打印版3.docx(46页珍藏版)》请在冰点文库上搜索。
沈颂林ARM实验报告打印版3
中南大学实验报告
——ARM嵌入式系统实验
学院:
地球科学与信息物理学院
专业班级:
生医0902班
姓名:
沈颂林
学号:
0405090422
指导老师:
李凌云
小组成员:
吴慧英、刘佳女
一.实验内容基本介绍---------------------------2
1.C和ARM汇编混合编程实验
2.外部中断应用实验
3.串口通信应用实验
4.看门狗定时器应用实验
5.Norflash应用实验
6.Nandflash应用实验
7.TFT液晶屏显示实验
2.关键内容解释-------------------------------8
3.程序代码和注解-----------------------------12
4.实验心得-----------------------------------27
一.实验内容基本介绍
1.C和ARM汇编混合编程实验
实验目的
1.熟悉ADS开发环境、AXD及Multi_ICE调试环境。
2.掌握简单的ARM汇编指令的使用方法。
3.掌握S3C2410A的I/O控制寄存器的配置。
4.掌握ARM汇编指令和C语言相互调用的方法
实验设备
PC机、ARM仿真器、2410实验箱、串口线。
实验内容
1.熟悉ARM开发环境的建立。
2.使用ARM汇编和C语言设置GPIO口的相应寄存器。
2.外部中断应用实验
实验目的
1.掌握向量中断控制器的设置;
2.掌握外部中断引脚功能设置及外部中断的工作模式设置;
3.了解中断服务函数的编写。
4.熟悉ARM9微控制器的GPIO控制。
实验设备
同实验1(略)
实验内容
设置P0.16低电平触发外部中断0,短接JP3的P0.16端口,当按键KEY1按下后,P0.16输入低电平触发外部中断,取反LED,观察LED现象。
五、实验步骤
1.启动ADS1.2,使用ARMExecutableImageforlpc2103工程模板建立一个工程VICDef_C。
2.在工程的user的main.c中编写实验程序,然后调试。
4.选用DebugInRAM生成目标,然后编译连接工程。
5.将EasyARM2103开发板上的JP3的P0.16端口短接。
6.选择【Project】->【Debug】,启动AXD进行JTAG仿真调试。
7.在中断服务程序中设置断点,全速运行程序,观察现象。
8.单步/全速运行程序,观察程序是否正确运行。
9.编写程序,实现按键控制流水灯,4个LED灯轮流点亮。
当按键按下并松开时,LED1亮,1秒后LED2亮直到4个灯全亮,之后全部熄灭,重新循环。
当再次按下按键时停止流水灯显示,并全部熄灭。
3.串口通信应用实验
内容:
当通信距离较近时,只需使用少数几根信号线就可实现数据通信。
最简单的情况只需三
根线(发送线、接收线、信号地线)便可实现全双工异步串行通信。
无Modem时,最大通信距离按如下方式计算:
RS-232C标准规定,当误码率小于4%
时,要求导线的电容值应小于2500PF。
对于普通导线,其电容值约为170PF/M。
则允许距
离L=2500PF/(170PF/M)=15M
这一距离的计算,是偏于保守的,实际应用中,当使用9600bps,普通双绞屏蔽线时,
距离可达30~35米。
零Modem的最简单连线(3线制)
下图是零MODEM方式的最简单连接(即三线连接),图中的2号线与3号线交叉连接
是因为在直连方式时,把通信双方都当作数据终端设备看待,双方都可发也可收。
在这种方
式下,通信双方的任何一方,只要请求发送RTS有效和数据终端准备好DTR有效就能开始
发送和接收。
图串口3线连接方法
(1)RTS与CTS互联:
只要请求发送,立即得到允许
(2)DTR与DSR互联:
只要本端准备好,认为本端立即可以接收(DSR、数传机准
备好)
4.看门狗定时器应用实验
实验目的
1.了解watchdog的作用
2.掌握S3C2410A的watchdog定时器的使用方法
实验内容
1.实现看门狗复位
2.编程实现看门狗喂狗
实验设备
1.S3C2410A实验箱
2.ADS1.2集成开发环境,ARM仿真器、串口连接线
实验原理
1看门狗功能简述
嵌入式系统运行时受到外部干扰或者系统错误,程序有时会出现“跑飞”,导致整个系
统瘫痪。
为了防止这一现象的发生,在对系统稳定性要求较高的场合往往要加入看门狗
(watchdog)电路。
看门狗的作用就是当系统“跑飞”而进入死循环时,恢复系统的运行。
2看门狗的工作原理
其基本原理为:
设本系统程序完整运行一周期的时间是Tp,看门狗的定时周期为Ti,
Ti>Tp,在程序正常运行时,定时器就不会溢出,若由于干扰等原因使系统不能在Tp时刻
修改定时器的记数值,定时器将在Ti时刻溢出,引发系统复位,使系统得以重新运行,从
而起到监控的作用。
3S3C2410A的看门狗
S3C2410A的看门狗定时器有两个功能:
作为常规时钟,并且可以产生中断;
作为看门狗定时器使用,当时钟计数减为0(超时)时,它将产生一个128个时钟
71
周期(PCLK)的复位信号。
主要特性如下:
通用的中断方式的16bit定时器。
当计数器减到0(发生溢出),产生128个PCLK周期的复位信号。
下图为看门狗的电路示意图,看门狗时钟使用PCLK作为他的时钟源,PCLK通过预分
频产生适合的看门狗时钟。
看门狗模块包括一个预比例因子放大器,一个是四分频器,一个16bit计数器。
看门狗
的时钟源来自PCLK,为了得到较宽范围的看门狗信号,PCLK先被预分频,之后再经过分
频器分频。
预分频比例因子的分频值,都可以由看门狗控制器(WTCON)决定,预分频值
的有效范围从0到256-1。
分频因子可以选择16、32、64或者128。
看门狗定时器记数值的计算公式如下:
t_watchdog=1/[PCLK/(prescalervalue+1)/Division_factor]
看门狗的定时周期为T=WTCH×t_watchdog
一旦看门狗定时器被允许,看门狗定时器数据寄存器(WTDAT)的值不能被自动的装
载到看门狗计数器(WTCNT)中。
因此,看门狗启动前要将一个初始值写入看门狗计数器
(WTCNT)中。
调试环境下的看门狗
当S3C2410A用嵌入式ICE调试的时候,看门狗定时器的复位功能不能启动,看门狗
定时器能从CPU内核信号判断出当前CPU是否处于调试状态,如果看门狗定时器确定当前
模式是调试模式,尽管看门狗能产生溢出信号,但是仍然不会产生复位信号。
S3C2410A相关寄存器
WTCON――看门狗定时器控制寄存器
看门狗控制寄存器能够禁止或者允许看门狗时钟,从四个不同的时钟源中挑选时钟信
号,允许或禁止中断,并且能允许或禁止看门狗时钟输出。
如果用户想要使用看门狗作为普
通时钟,应该中断使能,禁止看门狗定时器复位。
72
WTDAT――看门狗定时器数据寄存器
WTDAT用于设置看门狗定时器的超时时间值,在初始化看门狗过程中,WTDAT的值
不会自动加载到定时计数器中,首次使用定时器超时值为其初始值即0x8000,以后该寄存
器的值会被自动加载到WTCNT寄存器中。
WTCNT――看门狗定时器计数寄存器
WTCNT为看门狗定时器工作的时间计数器的当前计数值,注意在初始化看门狗操作
后,看门狗数据寄存器(WTDAT)的值不能自动装载到看门狗计数寄存器(WTCNT)中,
所以看门狗被允许之前应高初始化看门狗计数寄存器的值。
实验程序
由于看门狗是对系统的复位或者中断的操作,所以不需要外围的硬件电路。
要实现看门
狗的功能,只需要对看门狗的寄存器组进行操作。
即对看门狗的控制寄存器(WTCON)、
看门狗数据寄存器(WTDAT)、看门狗计数寄存器(WTCNT)的操作。
设计流程如下:
设置看门狗中断操作,包括全局中断和看门狗中断的使能,看门狗中断向量的定义。
73
对看门狗控制寄存器(WTCON)的设置,包括设置预分频比例因子、分频器的分
频值、中断使能和复位使能等。
对看门狗数据寄存器(WTDAT)和看门狗计数寄存器(WTCNT)的设置。
启动看门狗定时器。
5.Norflash应用实验
1.连接好实验环境,将仿真器的一端通过并口连接到PC机,将仿真器的另一端通过JTAG
先连接到2410实验箱的JTAG接口。
2.将串口线一端接到PC机,另一端接到2410实验箱的UART0接口(即P1口);打开串
口超级终端dnw.exe,设置串口BaudRate为115200,选择COM1。
3.将核心板上JP1接口的短路帽去掉,选择从norflash启动。
147
4.打开ADSCodeWarrior,在ADSCodeWarrior中打开实验工程2410_NorFlash.mcp;并
对工程进行编译。
5.打开仿真器驱动程序Multi-ICEserver,并加载配置文件ARM920T.cfg。
6.打开ARM的开发环境AXDDebugger,在AXDDebugger中加载可执行映象文件
_NorFlash.axf。
7.执行映象文件,并在串口输出中观察norflash的实验结果。
可以看到norflash擦除最后
一个sector,检查擦除的结果,向最后一个sector写入数据;然后读出写入的数据。
注:
若没有Multi-ICE调试,可以采用下面方法测试程序:
1.重起2410实验箱,实验箱会执行flash中的BIOS程序,打开dnw.exe超级终端。
2.在dnw中,输入“0”,选择“USBdownloadfile”,在PC上安装USB驱动。
3.点击“USBPort”“Transmit”选择2410_NorFlash目录下的可执行映象文件
2410_NorFlash.bin将该文件下载到SDRAM。
4.下载结束后,会提示是否要立即运行,这时输入“Y”,执行2410_NorFlash.bin。
5.在dnw中观察实验结果。
实验结果
通过串行口可以读出SST39VF1601的ID,并向SST39VF160写入数据,然后再读出写入
的数据。
6.Nandflash应用实验
1、实验目的
1.了解nandflash存储器及K9F1208U0Mnandflash器件。
2.掌握S3C2410A对K9F1208U0Mnandflash编程。
2、实验内容
1.编写程序,实现向nandflash的某个块写数据,然后从这个块读出数据。
3、实验设备
1.2410开发板。
2.ADS1.2集成开发环境,ARM仿真器。
3.串口连接线。
1.连接好实验环境,将仿真器的一端通过并口连接到PC机,将仿真器的另一端通过JTAG
线连接到2410的JTAG接口。
2.将串口线一端接到PC机,另一端接到2410的UART0接口(即P1口);打开串口超级
终端dnw.exe,设置串口BaudRate为115200,选择COM1。
3.打开ADSCodeWarrior,在ADSCodeWarrior中打开实验工程2410_NAND.mcp;并对工
程进行编译。
4.将JP1短接,选择从nandflash启动。
171
5.打开仿真器驱动程序Multi-ICEserver,并加载配置文件ARM920T.cfg。
6.打开ARM的开发环境AXDDebugger,在AXDDebugger中加载可执行映象文件
2410_NAND.axf。
7.执行映象文件,将nandflash的最后一个block擦除,并向nandflash最后一个block的
第一个page写入数据,最后将写入的数据读出,通过串口观察读出的数据是否是写入
的数据。
注:
若没有Multi-ICE调试,可以采用下面方法测试程序:
1.重起2410,开发板会执行flash中的BIOS程序,打开dnw.exe超级终端。
2.在dnw中,输入“0”,选择“USBdownloadfile”,在PC上安装USB驱动。
3.点击“USBPort”“Transmit”选择2410_NAND目录下的可执行映象文件
2410_NAND.bin将该文件下载到SDRAM。
4.下载结束后,会提示是否要立即运行,这时输入“Y”,执行2410_NAND.bin。
5.在dnw中观察实验结果。
实验结果
向Nandflash最后一个block的最后一个page写数据,再读出,并通过串口显示读出的
数据。
7.TFT液晶屏显示实验
实验目的
了解TFT型彩色LCD彩色显示屏的工作原理和接口。
掌握S3C2410A和LCD显示屏的接口原理。
掌握LCD彩色及绘制简单的图形的编程。
实验内容
编写程序,实现再任意位置画长方形的功能以及显示图片。
实验设备
2410开发板。
ADS1.2集成开发环境,ARM仿真器。
串口连接线。
实验步骤
1.连接好实验环境,将仿真器的一端通过并口连接到PC机,将仿真器的另一端通过JTAG
先连接到2410的JTAG接口。
2.将串口线一端接到PC机,另一端接到2410的UART0接口(即P1口);打开串口超级
终端dnw.exe,设置串口BaudRate为115200,选择COM1。
3.打开ADSCodeWarrior,在ADSCodeWarrior中打开实验工程2410_FTFLCD.mcp;并对
工程进行编译。
4.打开仿真器驱动程序Multi-ICEserver,并加载配置文件ARM920T.cfg。
5.打开ARM的开发环境AXDDebugger,在AXDDebugger中加载可执行映象文件
2410_FTFLCD.axf。
6.执行映象文件,在TFTLCD上观察实验结果。
注:
若没有Multi-ICE调试,可以采用下面方法测试程序:
1.重起2410,开发板会执行flash中的BIOS程序,打开dnw.exe超级终端。
2.在dnw中,输入“0”,选择“USBdownloadfile”,在PC上安装USB驱动。
3.点击“USBPort”“Transmit”选择2410_FTFLCD目录下的可执行映象文件
2410_FTFLCD.bin将该文件下载到SDRAM。
4.下载结束后,会提示是否要立即运行,这时输入“Y”,执行2410_FTFLCD.bin。
5.在LCD上观察实验结果。
8、实验结果
在LCD上显示矩形框和图片。
二.关键内容解释
在用户的应用程序之前,需要由专门的一段汇编语言代码来完成对系统的初始化,这类启动代码直接面对处理器内核和硬件控制器进行编程,内容包括:
中断向量表
初始化存储器系统
初始化堆栈
初始化有特殊要求的断口,设备
初始化用户程序执行环境
改变处理器模式
呼叫主应用程序
//启动代码类似于电脑中的BIOS,它从系统上电开始接管CPU,依次需要负责初始化CPU在各种模式下的堆栈空间、设定CPU的内存映射、对系统的各种控制寄存器做初始化、对CPU的外部存储器进行初始化、设定各外围设备的基地址、创建正确的中断向量表、为C代码执行创建ZI区,然后进入到C代码。
//在C代码中继续对时钟、串行通信接口进行初始化,然后打开系统中断允许位。
最后进入到应用代码中执行,执行期间响应各种不同的中断信号并调用预先设置好的中断服务程序处理这些中断。
中断向量表
//ARM要求中断向量表必须放置在从0x0000000地址开始,连续32字节的空间内。
每当一个中断发生以后,ARM处理器便强制把PC指针置为向量表中对应中断类型的地址值。
因为每个中断只占据向量表中1个字的存储空间,因此只能放置一条ARM指令,程序要跳转到存储器的其他地方,再执行中断处理。
初始化堆栈
//ARM有7种执行状态,每一种状态的堆栈指针寄存器(SP)都是独立的。
因此,对程序中需要用到的每一种模式都要给SP定义一个堆栈地址。
方法是改变状态寄存器内的状态位,使处理器切换到不同的状态,让后给SP赋值。
注意:
不要切换到User模式进行User模式的堆栈设置,因为进入User模式后就不能再操作CPSR回到别的模式了,可能会对接下去的程序执行造成影响。
初始化应用程序执行环境
//一个ARM映像文件由RO,RW和ZI三个段组成,其中RO为代码段,RW是已初始化的全局变量,ZI是未初始化的全局变量。
//映像一开始总是存储在ROM/Flash里面的,其RO部分即可以在ROM/Flash里面执行,也可以转移到速度更快的RAM中执行;而RW和ZI这两部分是必须转移到可写的RAM里去。
应用程序执行环境的初始化,就是完成必要的从ROM到RAM的数据传输和内容清零。
//实验中使用到的scatter文件:
RuninRAM.sct
LR10x30000000
{;loadregion
ER10x300000000x0300000
{;loadaddress=executionaddress
S3C2410A.o(RESET,+First)
*(+RO)
}
RAM0x303000000x3D00000
{;RWdata
*(+RW+ZI)
}
}
调用主应用程序
//当所有的系统初始化工作完成之后,就需要把程序流程转入主应用程序。
;EntertheCcode
IMPORT__main
LDRR0,=__main
BXR0
切换处理器工作状态
//进入THUMB状态,可以通过执行BX指令,同时将操作数寄存器的状态位
(0位)置1来实现。
当从异常(IRQ,FIQ,UNDEF,ABORT,SWI等)返回时,只要进入异常处理前处理器处于THUMB状态,也会自动进入THUMB状态。
//进入ARM状态,可以通过执行BX指令,并且操作数寄存器的状态位(0位)
清零来实现。
当处理进入异常(IRQ,FIQ,RESET,UNDEF,ABORT,SWI等),PC值保持在异常模式下的链接寄存器中,并从异常向量地址处开始执行处理程序。
使用内存映射技术实现虚拟空间到物理空间的映射。
嵌入式系统程序存放在ROM/Flash中,系统断电后程序得到保存。
由于SDRAM的速度比ROM/Flash快,所以通常把异常中断向量表放在RAM中。
在系统加电时,将ROM/Flash映射为地址0x0,这样可以进行初始化处理。
完成后将SDRAM映射为地址0x0,并将系统程序加载到SDRAM中运行,这样利用内存映射机制满足了系统需要。
//最终的实验主程序
intmain()
{
//实验主程序
initsetting();
testmusic();
Eint_Init();
Enable_Eint();
uartprint();
watchdog_test();
nandflash_test2();
norflashtest();
LCD_test3();
mainrun();
}
2410lib.c的函数:
1.Delay(inttime)
//实现延时功能,可以延时time*100us;
2.Port_Init(void)
端口进行初始化功能,对7组I/O端口进行管理,设置控制寄存器GPnCON,设置端口上拉寄存器GPnUP,除了端口A外,其余端口都有上拉寄存器。
然后设置了外部中断寄存器EXTINTn(EINT[7:
0],EINT[15:
8],EINT[23:
16])。
3.Uart_Init(intpclk,intbaud)
对串口进行初始化,Uart单元提供3个独立的异步串行通信接口。
首先禁止3个channel的FIFO功能,即设置rUFCONn[0]=0(n=0,1,2);然后禁止AFC自动流控功能,即设置rUMCONn[4]=0(n=0,1);对于Uart0,1,2分别进行设置,如设置Uart0的通信格式为正常串口通信模式,即rULCON0[7:
0]=0x03;设置串口的接受、发送模式为轮询模式串口的时钟源为pclk,即设置rUCON0=0x245;最后根据baud和pclk计算出rUBRDIVn的值。
rUBRDIVn=((int)(pclk/16./baud)-1)
比特率由一个专用的Uart比特率分频寄存器(rUBRDIVn)控制,由于设置为rUCONn[10]=0,用pclk=PCLK作比特率发生,而一般比特率都选用115200bit/s,这样很容易得到rUBRDIVn的值。
4.Uart_Select(intch)
//实现选择串口的功能,ch取值有0,1,2。
5.Uart_Getch(void)
//接收输入的单个字符
6.Uart_GetString(char*string)
//接收输入的字符串,调用到Uart_Getch(void)函数
7.Uart_SendByte(intdata)
//输出单个字符,遇上输入是回车则换行
8.Uart_SendString(char*pt)
//输出字符串,调用到Uart_SendByte(intdata)函数
9.Uart_Printf(char*fmt,...)
//可以输出多组字符串,调用了Uart_SendString(char*pt)函数
10.ChangeMPllValue(intmdiv,intpdiv,intsdiv)
//设置MPLL的值
11.ChangeUPllValue(intmdiv,intpdiv,intsdiv)
//设置UPLL的值
12.ChangeClockDivider(inthdivn,intpdivn)
//设置时钟分频器,即三个时钟设置为F:
H:
P的分频关系
//hdivn,pdivnFCLK:
HCLK:
PCLK
//0,01:
1:
1
//0,11:
1:
2
//1,01:
2:
2
//1,11:
2:
4;如果FCLK=400MHz,则HCLK=200MHz,PCLK=100MHz。
S3C2410X有两个PLL(MPLL和UPLL),MPLL用于CPU及其他外围器件,UPLL用于USB。
用于产生FCLK,HCLK和PCLK三种频率,FCLK是CPU提供
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 沈颂林 ARM 实验 报告 打印