嵌入式实验报告

实验一 ARM 开发环境

一.实验目的

1. 了解嵌入式系统的开发过程,熟悉嵌入式系统的开发特点。

2. 了解嵌入式系统开发环境的功能与组成,了解开发嵌入式系统使用的几种调试工具,熟悉JTAG 调试技术的原理、工具和连接方法。

3. 了解ADS 、SDT 等集成开发工具的功能与特点,熟悉并掌握它们的使用方法。

二.实验内容

本次实验配置ADS 集成开发环境,新建一个简单的工程文件,并编译这个工程文件。学习ARM 仿真器的使用和开发环境的设置。用超级终端下载已经编译好的文件到S3C44B0开发板上运行并观察结果。

三.实验设备及工具

硬件:ARM 嵌入式开发平台、用于ARM7TDMI 的JTAG 仿真器、PC 机、串口线。

软件:PC 机操作系统win98、Win2000 或WinXP 、ARM SDT 2.51 或ADS1.2 集 成开发环境、仿真器驱动程序、超级终端通讯程序 。

四.实验步骤

1. 新建一个工程

首先运行ADS 的项目管理器CodeWarrior 。双击CodeWarrior 的应用程序图标并运行,打开如图1.1所示的项目管理界面。在图1.1中,执行File 菜单中的“New... ”命令,打开如图1.2所示的新建对象对话框。

在图1.2中,选择ARM Executable Image项,表示新建一个可执行的ELF 格式的映像项目文件。在右边的Project name 栏目中填入新建项目的名称,如本次实验填入LED 。在Location 栏目的右边,单击“Set ”按钮,所打开的图1.3中选择项目文件存放的文件夹,如实验选择D 盘的LEDtest 文件夹。

图1.1 项目管理界面

图1.2 新建对象对话框

图1.3 选择项目文件存放的文件夹

新建一个项目后,在项目所在的文件夹下产生了一个名为LED 的目录,其下目录的led.mcp 就是新产生的项目文件名,该项目文件管理着整个嵌入式工程中的所有文件。

新的项目建立完成后,将出现如图1.4所示的项目管理主窗口。在该窗口中的空白处单击鼠标右键,并在弹出的菜单中执行Create Group命令,然后再弹出的对话框中,输入一个文件夹的名字,如Initial, 这样就在项目中建立了一个文件夹,可以把与本项目相关的初始化文件放在此文件夹中。然后再图1.5所示的窗口中的Initial 文件夹上单击鼠标右键,在弹出的菜单中执行Add Files...命令,将与本项目相关的初始化文件添加到Initial 文件夹中。再在空白处单击鼠标右键,在弹出的菜单中执行Add Files...命令,将本项目的主函数代码文件main.c 添加进项目。添加文件完成后的窗口如图1.6所示。

图1.6中的项目Led.mcp 中,在Initial 文件夹下是一些44B0的初始化文件,其中44binit.s 是一个ARM7类型的汇编语言源代码文件,在这里程序对外围进行初始化,定义了44B0芯片的一部分寄存器地址、44B0的工作模式、内存配置、初始化各种异常向量(包括了IRQ 和FIQ 中断向量)和堆栈以及一些C 语言的变量,并提供系统上电、复位及异常处理的入口点。44B0芯片可外接8个Bank 的存储器(ROM 和RAM ),Memcfg.s

源代码文件对外部存储空间进行配置。

OPTION.S 汇编语言源代码文件对定义了一些宏,包括RAM 的起始地址,中断入口表地址、RAM 类型、系统主频、PLL 控制字等。44BLIB_A.S汇编语言源代码文件中定义了一个ChangeMemCon 函数(虽然没有使用)。44blib.c 是一个C 语言源代码文件,里面定义了其他各个文件所要调用的函数,如延时、I/O初始化、串口初始化、输入输出、PLL 设置、波特率设置等的函数,该文件由用户自行编写。Bspinit.c 是用户自己编写的一个C 语言文件,里面用Bsp_Init函数封装了项目所有初始化需要调用的函数,这样在Main 函数中只需要调用Bsp_Init函数即进行了所有的初始化。一些头文件,如44B.H 文件中定义了44B0芯片的寄存器地址宏定义,OPTION.h 文件中定义了C 程序使用的一些反映系统工作方式的基本宏定义,Def.h 文件中定义了一些数据类型的缩写。在进行44B0的项目的时候,最重要的是包含44binit.S 与44blib_a.S这两个文件,如果需要串口输出等辅助功能,就包含进44blib.c 文件,然后再加入自己的文件。44binit.S 、44blib_a.S这些启动文件都由三星公司提供,建议用户不要进行修改。

另外,在Initial 文件夹下存在的一些头文件如44b.h 、44blib.h 、def.h 和option.h 等,对基于S3C44B0微处理器的嵌入式系统而言,这些头文件都基本是一样的,用户可以直接从别的项目拷贝过来使用。

图1.4项目管理主窗口

图1.5 将相关文件添加进项目

图1.6添加文件完成后的窗口

双击main.c 文件,可打开查看源代码,如图1.7所示。

图1.7 查看main.c 源代码

在图1.7中,首先包含了3个头文件,这3个头文件在前面的章节已经进行了介绍。在Main ()函数中,首先调用的是Bsp_Init()函数,Bsp_Init()函数封装了项目所有初始化需要调用的函数,包括S3C44B0芯片的各个端口的初始化和PLL 锁相环的初始化。我们知道,S3C44B0芯片要正常工作,首先需要对其时钟进行初始化。S3C44B0X 有71个多功能输入\输出管脚,构成了7个I/O接口,包括两个9位的输入/输出接口(E 和F )、两个8位的输入/输出接口(D 和G )、一个16位的输入/输出接口(C )、一个10位的输出接口(A )和一个11位的输出接口(B )。由于每个I/O接口管脚是多路复用的,比如对E 口而言,它的第1位PE1有3个功能,一个功能是输入I/O,一个功能是输出I/O,一个功能是串行口0的TxD 功能引脚。所以在使用S3C44B0芯片的端口前,首先需要确定每个管脚的功能。Bsp_Init()函数就起这个作用。在我们的项目程序中,需要用E 端口去输出高、低电平控制LED 灯的闪烁,因此需要将E 端口初始化为I/O输出功能。

2. 工程设置

在图1.7中,单击Edit 菜单项,在下拉菜单中执行“DebugRel Settings... ”命令,此时会弹出如图1.8所示的“DebugRel Settings”对话框。在图1.8的“DebugRel Settings ”对话框左侧用鼠标单击“Target Settings ”项后,可在右侧的“Target Settings ”栏中的“Linker ”子项中选择“ARM linker ”, 然后再“Post-linker ”子项中选择“ARM fromELF”,

这就使得工程在链接后可以直

接调用“From ELF”产生的以.bin 结尾的可执行的二进制代码文件。

图1.8 设置“Target Settings”项

在图1.8的“DebugRel Settings”对话框左侧用鼠标单击“ARM Linker”项目,然后在右侧的“ARM Linker ”栏中选择“Output ”页,在“Linktype ”项中选择“Simple ”, 在“Simple image ”项中的“Rose Base ”子项中填入“0xc008000”, 在“RW Base”子项中填入“0xc5f800”, 其他项保持默认值。如图1.9所示。

图1.9设置“ARM Linker”项的“Output ”页

在图1.9中的“DebugRel Settings”对话框左侧用鼠标单击“ARM Linker”项目,然后在右侧的“ARM Linker ”栏中选择“Layout ”页,在“Place at the beginning of the image”栏中的“Object/symbol”项中填入“44binit.o ”. 在“Section ”项中填入“Init ”, 表示当程序开始执行时,从“44binit ”文件的“Init ”段开始执行。如图1.10所示。

图1.10 设置“ARM Linker”项的“Layout ”页

当系统上电开始运行或者复位时,程序将从44binit.s 这个文件的Init 段开始运行。如图1.11所示。

图1.11 44binit.s 汇编程序语言文件

由于在图1.8的“Target Setttings”项中的“Post-linker ” 子项中选择了“ARM fromELF ”, 表示工程在链接后可以直接调用“fromELF ”产生以.bin 结尾的可执行的二进制代码文件,因此需要对图1.10中的“ARM fromELF”项进行设置。在图1.10“DebugRel Settings ”对话框左侧用鼠标单击“ARM fromELF”项目,然后在右侧的“Output format ”栏中选择“Plain binary ”, 在“Output file name ”栏中填入产生的可执行二进制代码文件的存放目录,及文件名。如图1.12所示。

图1.12 设置“ARM fromELF”项

至此,所有与本项目相关的设置就完成了。

3. 工程编译

回到如图1.7所示的窗口,在该窗口中执行“Project ”菜单下的“Make ”子菜单命令。Make 的行为包括以下过程:

编译和汇编源程序文件,产生与源文件相对应的以.o 为扩展名的目标对象文件;

连接对象文件和库,产生可执行映像文件Led.asf, 该文件可用于纯软件的调试或用JTAG 接口对目标板进行硬件调试;

产生可以直接写到Flash 的二进制可执行文件Led.bin 。

图1.13 执行Project 菜单下的Make 子菜单命令

Make 完成之后,将弹出错误和警告“Errors&Warnings”对话框来报告出错和警告情况。如果存在错误,在图1.14中,用鼠标单击错误信息提示,这时在“Errors&Warnings”对话框下面将直接定位到出错的位置;如果用鼠标双击错误信息提示,则窗口将直接切换到源代码文件中出错的地方,同时鼠标在此闪烁,用户可进行错误查找和修改,如图1.15所示。

图1.14 错误和警告的具体信息

图1.15错误查找和修改

回到图1.7,查看Main( )函数源代码,在Bsp_Init( )函数后面加上一个分号,重新编译、链接一次,可以看到,在D :\LEDtest 文件夹下产生了一个文件名为Led.bin 的二进制文件,该文件可以直接写如Flash 存储器中运行。同时在D :\LEDtest\LED\LED_Data\DebugRel文件夹下产生了一个文件名为LED.axf 的文件,该文件可以用于目标系统的硬件和软件调试。

4. 工程调试

通过串口打印信息调试

在进行带有目标板的项目调试时,建议用户购买一套开发套件,在购买的嵌入式开发套件中,一般都带有与开发板对应的Boot Loader,Boot Loader中提供了启动、引导、下载、烧写、串口通信、网络通信、设置日期、时间、设置工作频率等多种功能。Boot Loader启动后随即进入shell 模式。用户要启动任何功能都必须输入特定的命令行。该shell 模式类似DOS 操作环境,用户可以通过各种命令与目标板进行交互。ARM-44B0开发板的BootLoader 提供的用户命令如下:

用户命令 功能说明

help 显示Boot Loader命令列表

date 显示、设置开发板时钟的当前日期 chguart 选择串口(UART0/UART1)

setbaud 设置串口通讯波特率

load 通过Kermit 协议从串口下载程序 run 运行下载到目标板上程序

defset 默认设置系统参数

首先利用串口连接线将目标板的串口与PC 机上的COM1口连接起来,使用Windows 操作系统自带的串口通信终端与目标板进行交互。打开PC 机上的超级终端的步骤如下:在计算机上用鼠标点击[开始][程序

]

[附件] [通讯[超级终端]

图1.16 打开PC 上的超级终端

图1.17拨号连接对话框

图1.18“连接描述”对话框 图1.19“连接到”对话框

在图1.19中单击“确定”按钮,此时会弹出如1.20所示的“COM1属性”设置对话框,在每秒位数栏选择“115200”,在数据位栏选择“8”,在奇偶校验栏选择“无”,在停止位选择“1”,在数据流控制栏选择“无”,或者单击“还原为默认值”按钮。如图1.20所示。

图1.20 “COM1”设置对话框

在图1.20中单击“确定”按钮,此时会弹出如图1.21所示的超级终端窗口,现在按目标板上的复位按钮,如果串口连接且设置正确,此时会出现如图1.21中的提示信息,然后按照目标板Bootloader 所提供的命令进行交互。

图1.21 超级终端窗口

Main( )函数首先对芯片和目标板进行初始化,然后加入串口提示信息打印函数,例如以下代码:

void Main(void)

{

int i;

rSYSCFG=CACHECFG;

Port_Init();

Isr_Init();

Uart_Init(0,115200);

Uart_Select(0);

Delay(0); //calibrate Delay()

Uart_Printf("\n come here once ");

„„ ;其他应用程序代码

Uart_Printf("\n come here second time ");

„„ ;其他应用程序代码

Uart_Printf("\n come here third time ");

„„ ;其他应用程序代码

Uart_Printf("\n come here fourth time");

„„ ;其他应用程序代码

while (1);

}

在各个串口输出信息语句Uart_Printf之间,插入用户代码,通过串口输出的信息可以看出应用程序的运行情况和位置。

将项目工程按照以上进行编译后,按照如下的步骤将产生的以.bin 结尾的目标文件通过串口传输到目标板:首先在图超级终端窗口中的,单击[传送]菜单项目,执行[发送文件(S )„]命令,如图1.22所示。

图1.22 执行“发送文件(S )... ”命令

图1.23 “发送文件”对话框

此时会弹出如图1.23所示的“发送文件”对话框,在文件名栏中选择需要传送的目标代码文件,此处是位于C 盘的hello.bin 文件。在协议栏中选择Kermit, 然后单击“发送”按钮。

图1.24 超级终端中打印的调试信息

五.实验小结和体会

通过这次实验,我对ARM 的集成开发环境有了更深入的了解。熟悉了嵌入式系统的开发过程和开发特点。掌握了ADS1.2的使用方法,学会了使用超级终端将已编译好的文件下载到实验板上,并且了解了开发嵌入式系统使用的几种调试工具,并为以后的嵌入式程序开发打下基础。

实验二 串口通信实验

一、实验目的

1. 掌握ARM 的串行口工作原理。

2. 学习编程实现ARM 的UART 通讯 。

3. 掌握CPU 利用串口通讯的方法。

二.实验内容

学习串行通讯原理,了解串行通讯控制器,阅读ARM 芯片文档,掌握ARM 的 UART相关寄存器的功能,熟悉ARM 系统硬件的UART 相关接口。编程实现ARM 和计算机实现串行通讯。

ARM 监视串行口,将接收到的字符再发送给串口(计算机与开发板是通超级终端通讯的),即按PC 键盘通过超级终端发送数据,开发板将接收到的数据再返送给PC ,在超级终端上显示。

三.实验设备及工具

硬件:ARM 嵌入式开发板、用于ARM7TDMI 的JTAG 仿真器、PC 、串口线。

软件:PC 机操作系统win98、Win2000 或WinXP 、ARM SDT 2.51 或ADS1.2 集 成开发环境、仿真器驱动程序、超级终端通讯程序。

四.实验原理及说明

4.1异步串行I /O

异步串行方式是将传输数据的每个字符一位接一位(例如先低位、后高位) 地传送。 数据的各不同位可以分时使用同一传输通道, 因此串行I /O 可以减少信号连线,最少用一对线即可进行。效率较低。首先要分割成位,再按位组成字符。为了恢复发送的信息,双方必须协调工作。

图2.1 串行通信字符格式

图2.1给出异步串行通信中一个字符的传送格式。开始前,线路处于空闲状态, 送出连续“1”。传送开始时首先发一个“0”作为起始位,然后出现在通信线上的是字符的二进制编码数据。每个字符的数据位长可以约定为5 位、6 位、7 位或8 位,一般采用ASCII 编码。

4.2 串行接口的物理层标准

图2.2 EIA RS-232C 标准

图2.2 RS-232C接口通信的连接

4.3 S3C44B0的UART 单元

两个独立的异步串行I/O口,每个通讯口均可工作在中断模式或DMA 模式,也即UART 能产生内部中断请求或DMA 请求在CPU 和串行I/O口之间传送数据。

S3C4510B 的UART 单元特性包括:

1) 波特率可编程

2) 支持红外发送与接收

3) 1~2个停止位

4) 5、6、7或8个数据位 5) 奇偶校验

和实验有关的寄存器:

1.UART 线性控制寄存器ULCONn

2.UART 控制寄存器UCONn

3发送寄存器UTXH 和接收寄存器URXH 4。

4. 波特率分频寄存器UBRDIV

图2.3 ULCON寄存器

图2.4 ULCON功能定义

图2.5 UCON功能定义

使用UART0通信需要两个引脚,分别为:

连接方式如下:

S3C44B0的I/O电压为3.3V (可承受5V ),连接时须注意电平的匹配。与PC 机相连时,由于PC 机串口是RS232电平,所以连接时需要使用RS232转换器。

五.实验步骤

1.新建工程文件。

2.定义与UART 有关的各个寄存器地址和一些特殊的位命令。 3.编写串口驱动函数:

4.在主函数中实现将从串口0 接收到的数据发送到串口0(Main.c ): 文件如下:

Main 函数如下:

#include "option.h" #include "def.h" #include "44b.h" #include "44blib.h"

void Main(void) {

U8 which_key;

rSYSCFG=CACHECFG; // Using 8KB Cache//

Port_Init();

Led_Display(0x0);

rPCONG=0x00ff; //EINT7~0 rPUPG=0x0; //pull up enable Beep(0);

while(1) {

while((rPDATG & 0xf0)==0xf0); which_key=rPDATG&0xf0; switch(which_key) {

case 0xe0:

Led_Display(1); Beep(1); break; case 0xd0: Led_Display(2); Beep(0); break; case 0xb0: Led_Display(3); break; case 0x70: Led_Display(0); break; default : break; }

} }

5. 编译生成二进制目标文件

6. 通过超级终端下载到S3C44B0实验板上,如图2.6所示。

图2.6 通过超级终端下载程序

7. 按程序的要求在PC 键盘上通过超级终端发送数据,开发板将接收到的数据再返送给PC ,在超级终端上显示。

图2.7 实验结果在超级终端上的显示

六.实验小结和体会

此次实验让我熟悉了如何控制串行口通讯,掌握ARM 的串行口工作原理,学习并编程实现S3C4410的UART 串口通讯,学习并掌握S3C4410寄存器的配置方法。实现查询方式串口的收发功能,实现实验装置通PC 平台的串口通信,接受PC 平台发送出的字符,并将该字符重新返回给PC 平台。实验中进一步熟悉ADS 的操作环境,提高了自己阅读ARM 芯片文档的能力,获得了不少编写嵌入式程序的经验。

实验三 综合实验—按键控制LED

一.实验目的

1. 通过实验了解ARM 的中断方式和原理。 2. 通过实验掌握ARM 的编程方法。

二.实验内容

掌握ARM 中断工作原理,了解S3C44B0X 的中断寄存器,掌握常用的中断的编程方法。

编写中断处理程序实现:

电路上面,4 个 1×4 键盘分别接在外部中断 4,5,6,7 上。

三.实验设备及工具

硬件:嵌入式实验平台一套、仿真器一个、PC 机一台。

软件:Windows 98/2000/NT/XP 操作系统、仿真器驱动程序、ADS 开发软件一套。

四.实验原理及说明

S3C44B0X 的中断控制器可以接受来自30 个中断源的中断请求。这些中断

源来自DMA,UART,SIO 等芯片内部外围或外部引脚。在这些中断源中,有4 个外部中断(EINT4/5/6/7)是逻辑“或“的关系。中断控制器的任务是在片内外围和外部中断源组成的多重中断发生时,选择其中一个中断,通过FIQ 或IRQ 向ARM7TMDI 内核发出中断请求。实际最初的ARM7TMDI 内核只有FIQ (快速中断请求)和IRQ(通用中断请求)2 种中断,其他中断都是各个芯片厂家在设计芯片的时候定义的。对这些中断根据其优先级高低来进行处理。例如,如果定义

所有的中断为IRQ 中断(通过中断模式设置),并且同时有10个中断发出请求,那么可以通过读中断优先级寄存器来确定哪一个中断将被优先执行。一般的中断模式在进入所需的服务程序之前,需要很长的中断反应时间。为了解决这个问题,S3C440X 提供了一种新的中断模式。叫做中断向量模式。它具有CISC 结构为控制器的特征,能够降低中断反应时间。也就是说,S3C44B0X 的中断控制器硬件本身直接提供了对向量中断服务的支持。当众多中断源请求中断时,硬件优先级逻辑会判断哪一个中断将被执行;同时,硬件逻辑自动执行0x18(或0x1c) 地址到各个中断源向量地址的跳转指令;然后再由中断源向量进入相应的中断处理程序。与原来软件实现的方法相比,这种方法可以显著的减少中断反应时间。 4.1

中断控制器的操作

1) 程序状态寄存器的F 位到1 位

如果CPSR 程序状态寄存器的F 位被置位1,那么CPU 将不接受来自中断控制器的FIQ ;如果CPSR 程序状态控制器的I 位被置为1,那么CPUJ 将不接受来自中断控制器的IRQ 。因此,为了使能FIQ 和IRQ ,必须先将CPSR 程序状态寄存器的F 位和I 位清0,并且中断屏蔽寄存器的INTMSK 中相应的位也要清0。

2)中断模式(INTMOD )

ARM7TMDI 提供了2 种中断模式,FIQ 和IRQ 模式。所有中断源在中断请求时都要确定使用了哪一种中断模式。

3)中断挂起寄存器(INTPND )

用于指示对应的中断是否被激活。如果挂起位被置位1,那么无论标志I 和标志F 是否被清0,都会执行相应的中断服务程序。中断挂起寄存器为只读寄存器,所以在中断服务程序中必须加入I_ISPC 和F_ISPC 写1 的操作来清除挂起条件。

4) 中断屏蔽寄存器(INTMSK)

当INTMSK 寄存器的屏蔽位为1 时,对应的中断被禁止;当INTMSK 寄存器的屏蔽位为0 时,对应的中断正常执。如果一个中断的屏蔽位为1,那么在该中断发出请求的时候挂起位还是会被置位1。如果中断屏蔽寄存器的GLOBAL 位被设置为1,那么中断挂起位在中断请求时还会被设置,但所有的中断请求都不会被受理 。

4.2中断源

在30 个中断源中,有26 个中断源单独提供中断控制器,4 个外部中断(ENT4/5/6/7)是逻辑“或“的关系,他们共享同一个中断控制器。另外2 个UART 错误中断(UERROR0/1)也是共同一个中断控制器。

4.3中断控制专用寄存器

1) 中断控制寄存器(见表5-1 和5-2) 表4-1 中断控制寄存器

2) 中断挂起寄存器

中断挂起寄存器INTPND 共有26 位,每一位对应一个中断源,当中断请求产生时,相应的位被置为1。该寄存器为只读寄存器,所以在中断服务程序中必须加入I-ISPC 和F-ISPC 写1 的操作来清除挂起条件。如果有几个中断源同时发出中断请求,那么不管他们是否被屏蔽,他们相应的挂起位都会被置1。只是优先级寄存器会根据其优先级该地来响应当前优先级最高的中断。

表4-2 中断挂起寄存器

3)中断模式寄存器

中断模式寄存器INTMOD 共有26 位,每一位对应一个中断源。当中断源的模式位设置为1,对应的中断会由ARM7TDMI 的内核以FIQ 模式处理。相反地,当模式位设置为0 时,中断会以IRQ 模式处理。

4) 中断屏蔽寄存器

在中断屏蔽寄存器INTMSK 中,除了全屏蔽位global mask 外,其余的26 位都分别对应一个中断源。当屏蔽位为1 时,对应的中断源被屏蔽;当屏蔽位为0 时,该中断可以正常使用。如果全屏蔽位global mask 被设置为1,则所有的中断都不执行。如果使用向量中断模式,在中断服务程序中改变了中断屏蔽寄存器INTMSK 的值,那么并不能屏蔽相应的中断过程,因为该中断在中断屏蔽寄存器之前已经被中断挂起寄存器INTPND 锁定了。要解决这个问题,就必须在改变中断寄存器后,再清除相应的挂起位INTPND 。

表4-3中断屏蔽寄存器

5) RQ 向量模式相关寄存器

表4-4RQ 向量模式相关寄存器

S3C44B0X 中的优先级产生模块包含5 个单元,1 个主单元和4 个从单元。每一优先级产生单元管理6 个中断源。主优先级产生单元管理4 个从单元和2 个中断源。每个从单元有4 个可编程优先级中断源(sGn )和2 个固定优先级中断源(kn ). 这4 个中断源的优先级是由I_PSLV 寄存器决定的。另外2 个固定优先级中断源在6 个中断源的优先级最低。主单元可以通过I_PMST 寄存器来决定4 个从单元和2 个中断源的优先级。这2 个中断源INT_RTC 核INT_ADC 在26 个中断源中的优先级最低。如果几个中断源同时发生中断请求,那么I_ISPR 寄存器可以显示当前具有最高优先级的中断源。 6) IRQ/FIQ 中断源挂起清0寄存器

通过对IRQ/FIQ 中断挂起清0 寄存器I_ISPC/F_ISPC 相应的位写1 来清除中断挂起位INTPND 。

表4-5 IRQ/FIQ 中断源挂起清0寄存器

五.实验步骤

1.新建工程文件。

2.将“按键控制LED 实验”所需要的头文件添加到工程中。 文件如下:

图3.1工程包含的文件

3. 编写主函数,实现实验要求的功能。 Main( )函数如下:

#include "..\inc\uTypes.h" #include "..\inc\44b0x.h" #include "..\inc\console.h" #include "..\inc\sysUtils.h"

//申明函数

void IoConfig (void); void KeyLedTest (void);

//我们用这个片编存储我们的IRQ ISR入口地址 U32 pIrqStart = 0; U32 pIrqFinish = 0; U32 pIrqHandler = 0;

U32 g_pTopOfROM = 0; U32 g_pBaseOfROM = 0;

U32 g_pBaseOfBSS = 0;

U32 g_pBaseOfZero = 0;

U32 g_pEndOfBSS = 0;

extern U32 GetBaseOfROM (void);

extern U32 GetEndOfROM (void);

extern U32 GetBaseOfBSS (void);

extern U32 GetBaseOfZero (void);

extern U32 GetEndOfBSS (void);

int main(void)

{

//int i;

sysUtilsSetPllValue (24, 6, 1);

IoConfig ();

console_init (115200);

printf ("\n\nITSN - 44B0 board Test programe version 1.0.\n\n");

//熄灭所有的LED 灯

sysUtilsLightLed (LED_ALL, FALSE);

g_pTopOfROM = GetEndOfROM ();

g_pBaseOfROM = GetBaseOfROM ();

g_pBaseOfBSS = GetBaseOfBSS ();

g_pBaseOfZero = GetBaseOfZero ();

g_pEndOfBSS = GetEndOfBSS ();

printf ("g_pTopOfROM = 0x%08x.\n", g_pTopOfROM);

printf ("g_pBaseOfROM = 0x%08x.\n", g_pBaseOfROM);

printf ("g_pBaseOfBSS = 0x%08x.\n", g_pBaseOfBSS);

printf ("g_pBaseOfZero = 0x%08x.\n", g_pBaseOfZero);

printf ("g_pEndOfBSS = 0x%08x.\n", g_pEndOfBSS);

printf ("&g_pTopOfROM = 0x%08x.\n", &g_pTopOfROM);

printf ("&g_pBaseOfROM = 0x%08x.\n", &g_pBaseOfROM);

printf ("&g_pBaseOfBSS = 0x%08x.\n", &g_pBaseOfBSS);

//KeyLedTest程序是一个死循环

KeyLedTest ();

return 0;

}

/********************************************************************函数名称: IoConfig

功 能: 初始化IO 口

参 数: 无

返回 值: 无

********************************************************************/ void IoConfig (void)

void IoConfig (void)

{

// PORT A GROUP

/* BIT 9 8 7 6 5 4 3 2 1 0 */

/* A24 A23 A22 A21 A20 A19 A18 A17 A16 A0 */

/* 0 1 1 1 1 1 1 1 1 1 */

rPCONA = 0x1ff;

// PORT B GROUP

/* BIT 10 9 8 7 6 5 4 3

1 0 */

/* /CS5 /CS4 /CS3 /CS2 /CS1 nWBE3 nWBE2 /SRAS SCLK SCKE */

/* EXT NIC 8019 IDE D12 NC NC Sdram Sdram Sdram */

/* 1, 1, 1, 1, 1, 0, 0, 1, 1, 1 */

rPDATB = 0x04f;

rPCONB = 0x3cf;

//PORT C GROUP

//BUSWIDTH=16 */ /* PC15 14 13 12 11 10 9 8 */ /* o o RXD1 TXD1 o o o o */ /* NC NC Uart1 Uart1 NC NC NC NC */ /* 01 01 11 11 01 01 01 01 */

/* PC7 6 5 4 3 2 1 0 */ /* o o o o o o o o */ /* NC NC NC NC LED LED LED LED */ /* 01 01 01 01 01 01 01 01 */ rPDATC = 0x0000; //All IO is low

rPCONC = 0x5f555555;

rPUPC = 0x3000; //PULL UP RESISTOR should be enabled to I/O

//PORT D GROUP

/* PORT D GROUP(I/O OR LCD)

/* BIT7 6 5 4 3 2 1 0 */ 2 /SCASSdram 1, */

/* VF VM VLINE VCLK VD3 VD2 VD1 VD0 */ /* 01 01 01 01 01 01 01 01 */ rPDATD= 0x55;

rPCOND= 0xaaaa;

rPUPD = 0x00;

//These pins must be set only after CPU's internal LCD controller is enable

/////////////////////////////////////////////////////

//PORT E GROUP

/* Bit 8 7 6 5 4 3 2 1 0 */

/* ENDLAN o o TOU2 o o RXD0 TXD0 FOUT */

/* 00 01 01 10 01 01 10 10 11 */

rPDATE = 0x157; //Beep = 10

rPCONE = 0x596b;

rPUPE = 0xff;

//PORT F GROUP

/* Bit8 7 6 5 4 3 2 1 0 */

/* IISCLK IISDI IISDO IISLRCK Input Input Input IICSDA IICSCL */

/* 100 100 100 100 00 00 00 10 10 */

rPDATF = 0x0;

rPCONF = 0x24900a;

rPUPF = 0x1d3;

//PORT G GROUP

/* BIT7 6 5 4 3 2 1 0 */ /* EINT7 EINT6 EINT5 EINT4 EINT3 EINT2 EINT1 EINT0 */ /* KEY3 KEY2 KEY1 KEY0 NIC EXT IDE USB */ /* 11 11 11 11 11 11 11 11 */ rPDATG = 0xff;

rPCONG = 0x0000;

rPUPG = 0x00; //should be enabled

rSPUCR= 0x4;//0x7; //D15-D0 pull-up disable

//rSPUCR= 0x6; //D15-D0 pull-up enable

rSYSCFG = 0x0e; //使用8K 字节的指令缓存,write buffer disable

rNCACHBE0 = 0xc0002000; //定义非Cache 区, 从0x2000000到0xbffffff, 中断时进入ROM, 若不允许CACHE 不正常

rEXTINT = 0x0; //所有的外部硬件中断为低电平触发

}

/**************************************************************************** 函数名称: KeyLedTest

功 能: 测试1 * 4键盘,4个按键是接在EXTINT 4,5,6,7上面的,

当我们检测到有按键的时候就用LED 显示相关的按键信息!

参 数: 无

返回 值: 空

****************************************************************************/ #define EXTINT4 0

#define EXTINT5 1

#define EXTINT6 2

#define EXTINT7 3

#define EXTINT4567 21

#define INTTRIG_LOW 0x00

#define INTTRIG_HIGH 0x01

#define INTTRIG_FALLING 0x02

#define INTTRIG_RISING 0x04

#define INTTRIG_BOTHEDGE 0x05

void KeyLedTest (void)

{

U32 dwVal;

//设置IO 口PORT G

rPCONG |= 0xff00;

//设置中断

rINTMOD &= ~MASK_BIT(21);

rINTCON &= ~MASK_BIT(1);

//设置EXTINT4,5,6,7中断模式, 我们这里使用低电平触发

rEXTINT &= 0xffff; //先清除EXTINT4,5,6,7的相应设置bit 位

for (;;)

{

dwVal = rINTPND;

if ((dwVal & MASK_BIT(21)) == 0)

{

continue;

}

//EXTINTPND 寄存器,判断是哪个外部中断触发

dwVal = rEXTINTPND;

if ((dwVal & MASK_BIT(EXTINT4)) != 0)

{

rEXTINTPND |= MASK_BIT(EXTINT4);

//外部中断4 产生了,点亮LED1

sysUtilsLightLed (LED1, TRUE);

}

if ((dwVal & MASK_BIT(EXTINT5)) != 0)

{

rEXTINTPND |= MASK_BIT(EXTINT5);

//外部中断4 产生了,点亮LED2

sysUtilsLightLed (LED2, TRUE);

}

if ((dwVal & MASK_BIT(EXTINT6)) != 0)

{

rEXTINTPND |= MASK_BIT(EXTINT6);

//外部中断4 产生了,点亮LED3

sysUtilsLightLed (LED3, TRUE);

}

if ((dwVal & MASK_BIT(EXTINT7)) != 0)

{

rEXTINTPND |= MASK_BIT(EXTINT7);

//外部中断4 产生了,点亮LED1,2,3

sysUtilsLightLed (LED_ALL, FALSE);

}

//最后清除中断位

//rI_ISPC |= MASK_BIT(21);

rI_ISPC = dwVal;

}

}

4. 编译生成二进制目标文件

5. 通过超级终端下载到S3C44B0实验板上,如图3.2所示。

图3.2 通过超级终端下载程序

6. 分别按下KEY0,KEY1,KEY2,KEY3,观察实验现象。

图3.3 按下KEY0键 图3.4按下KRY1键

图3.5按下KEY2 图3.6按下KEY3

六.实验小结和体会

此次实验让我熟悉了如何通过中断控制LED 灯,掌握ARM 的中断方式和工作原理,学习并编程实现S3C4410的按键控制LED 程序,学习并掌握S3C4410中断控制寄存器的配置方法。实现了按下KEY0,通过中断源ExINT4点亮LED1;按下KEY1,通过中断源ExINT5点亮LED2;按下KEY2,通过中断源ExINT6点亮LED3;按下KEY3,通过中断源ExINT7来熄灭LED1,LED2,LED3。实验中进一步熟悉ADS 的操作环境,提高了自己的动手能力。

实验一 ARM 开发环境

一.实验目的

1. 了解嵌入式系统的开发过程,熟悉嵌入式系统的开发特点。

2. 了解嵌入式系统开发环境的功能与组成,了解开发嵌入式系统使用的几种调试工具,熟悉JTAG 调试技术的原理、工具和连接方法。

3. 了解ADS 、SDT 等集成开发工具的功能与特点,熟悉并掌握它们的使用方法。

二.实验内容

本次实验配置ADS 集成开发环境,新建一个简单的工程文件,并编译这个工程文件。学习ARM 仿真器的使用和开发环境的设置。用超级终端下载已经编译好的文件到S3C44B0开发板上运行并观察结果。

三.实验设备及工具

硬件:ARM 嵌入式开发平台、用于ARM7TDMI 的JTAG 仿真器、PC 机、串口线。

软件:PC 机操作系统win98、Win2000 或WinXP 、ARM SDT 2.51 或ADS1.2 集 成开发环境、仿真器驱动程序、超级终端通讯程序 。

四.实验步骤

1. 新建一个工程

首先运行ADS 的项目管理器CodeWarrior 。双击CodeWarrior 的应用程序图标并运行,打开如图1.1所示的项目管理界面。在图1.1中,执行File 菜单中的“New... ”命令,打开如图1.2所示的新建对象对话框。

在图1.2中,选择ARM Executable Image项,表示新建一个可执行的ELF 格式的映像项目文件。在右边的Project name 栏目中填入新建项目的名称,如本次实验填入LED 。在Location 栏目的右边,单击“Set ”按钮,所打开的图1.3中选择项目文件存放的文件夹,如实验选择D 盘的LEDtest 文件夹。

图1.1 项目管理界面

图1.2 新建对象对话框

图1.3 选择项目文件存放的文件夹

新建一个项目后,在项目所在的文件夹下产生了一个名为LED 的目录,其下目录的led.mcp 就是新产生的项目文件名,该项目文件管理着整个嵌入式工程中的所有文件。

新的项目建立完成后,将出现如图1.4所示的项目管理主窗口。在该窗口中的空白处单击鼠标右键,并在弹出的菜单中执行Create Group命令,然后再弹出的对话框中,输入一个文件夹的名字,如Initial, 这样就在项目中建立了一个文件夹,可以把与本项目相关的初始化文件放在此文件夹中。然后再图1.5所示的窗口中的Initial 文件夹上单击鼠标右键,在弹出的菜单中执行Add Files...命令,将与本项目相关的初始化文件添加到Initial 文件夹中。再在空白处单击鼠标右键,在弹出的菜单中执行Add Files...命令,将本项目的主函数代码文件main.c 添加进项目。添加文件完成后的窗口如图1.6所示。

图1.6中的项目Led.mcp 中,在Initial 文件夹下是一些44B0的初始化文件,其中44binit.s 是一个ARM7类型的汇编语言源代码文件,在这里程序对外围进行初始化,定义了44B0芯片的一部分寄存器地址、44B0的工作模式、内存配置、初始化各种异常向量(包括了IRQ 和FIQ 中断向量)和堆栈以及一些C 语言的变量,并提供系统上电、复位及异常处理的入口点。44B0芯片可外接8个Bank 的存储器(ROM 和RAM ),Memcfg.s

源代码文件对外部存储空间进行配置。

OPTION.S 汇编语言源代码文件对定义了一些宏,包括RAM 的起始地址,中断入口表地址、RAM 类型、系统主频、PLL 控制字等。44BLIB_A.S汇编语言源代码文件中定义了一个ChangeMemCon 函数(虽然没有使用)。44blib.c 是一个C 语言源代码文件,里面定义了其他各个文件所要调用的函数,如延时、I/O初始化、串口初始化、输入输出、PLL 设置、波特率设置等的函数,该文件由用户自行编写。Bspinit.c 是用户自己编写的一个C 语言文件,里面用Bsp_Init函数封装了项目所有初始化需要调用的函数,这样在Main 函数中只需要调用Bsp_Init函数即进行了所有的初始化。一些头文件,如44B.H 文件中定义了44B0芯片的寄存器地址宏定义,OPTION.h 文件中定义了C 程序使用的一些反映系统工作方式的基本宏定义,Def.h 文件中定义了一些数据类型的缩写。在进行44B0的项目的时候,最重要的是包含44binit.S 与44blib_a.S这两个文件,如果需要串口输出等辅助功能,就包含进44blib.c 文件,然后再加入自己的文件。44binit.S 、44blib_a.S这些启动文件都由三星公司提供,建议用户不要进行修改。

另外,在Initial 文件夹下存在的一些头文件如44b.h 、44blib.h 、def.h 和option.h 等,对基于S3C44B0微处理器的嵌入式系统而言,这些头文件都基本是一样的,用户可以直接从别的项目拷贝过来使用。

图1.4项目管理主窗口

图1.5 将相关文件添加进项目

图1.6添加文件完成后的窗口

双击main.c 文件,可打开查看源代码,如图1.7所示。

图1.7 查看main.c 源代码

在图1.7中,首先包含了3个头文件,这3个头文件在前面的章节已经进行了介绍。在Main ()函数中,首先调用的是Bsp_Init()函数,Bsp_Init()函数封装了项目所有初始化需要调用的函数,包括S3C44B0芯片的各个端口的初始化和PLL 锁相环的初始化。我们知道,S3C44B0芯片要正常工作,首先需要对其时钟进行初始化。S3C44B0X 有71个多功能输入\输出管脚,构成了7个I/O接口,包括两个9位的输入/输出接口(E 和F )、两个8位的输入/输出接口(D 和G )、一个16位的输入/输出接口(C )、一个10位的输出接口(A )和一个11位的输出接口(B )。由于每个I/O接口管脚是多路复用的,比如对E 口而言,它的第1位PE1有3个功能,一个功能是输入I/O,一个功能是输出I/O,一个功能是串行口0的TxD 功能引脚。所以在使用S3C44B0芯片的端口前,首先需要确定每个管脚的功能。Bsp_Init()函数就起这个作用。在我们的项目程序中,需要用E 端口去输出高、低电平控制LED 灯的闪烁,因此需要将E 端口初始化为I/O输出功能。

2. 工程设置

在图1.7中,单击Edit 菜单项,在下拉菜单中执行“DebugRel Settings... ”命令,此时会弹出如图1.8所示的“DebugRel Settings”对话框。在图1.8的“DebugRel Settings ”对话框左侧用鼠标单击“Target Settings ”项后,可在右侧的“Target Settings ”栏中的“Linker ”子项中选择“ARM linker ”, 然后再“Post-linker ”子项中选择“ARM fromELF”,

这就使得工程在链接后可以直

接调用“From ELF”产生的以.bin 结尾的可执行的二进制代码文件。

图1.8 设置“Target Settings”项

在图1.8的“DebugRel Settings”对话框左侧用鼠标单击“ARM Linker”项目,然后在右侧的“ARM Linker ”栏中选择“Output ”页,在“Linktype ”项中选择“Simple ”, 在“Simple image ”项中的“Rose Base ”子项中填入“0xc008000”, 在“RW Base”子项中填入“0xc5f800”, 其他项保持默认值。如图1.9所示。

图1.9设置“ARM Linker”项的“Output ”页

在图1.9中的“DebugRel Settings”对话框左侧用鼠标单击“ARM Linker”项目,然后在右侧的“ARM Linker ”栏中选择“Layout ”页,在“Place at the beginning of the image”栏中的“Object/symbol”项中填入“44binit.o ”. 在“Section ”项中填入“Init ”, 表示当程序开始执行时,从“44binit ”文件的“Init ”段开始执行。如图1.10所示。

图1.10 设置“ARM Linker”项的“Layout ”页

当系统上电开始运行或者复位时,程序将从44binit.s 这个文件的Init 段开始运行。如图1.11所示。

图1.11 44binit.s 汇编程序语言文件

由于在图1.8的“Target Setttings”项中的“Post-linker ” 子项中选择了“ARM fromELF ”, 表示工程在链接后可以直接调用“fromELF ”产生以.bin 结尾的可执行的二进制代码文件,因此需要对图1.10中的“ARM fromELF”项进行设置。在图1.10“DebugRel Settings ”对话框左侧用鼠标单击“ARM fromELF”项目,然后在右侧的“Output format ”栏中选择“Plain binary ”, 在“Output file name ”栏中填入产生的可执行二进制代码文件的存放目录,及文件名。如图1.12所示。

图1.12 设置“ARM fromELF”项

至此,所有与本项目相关的设置就完成了。

3. 工程编译

回到如图1.7所示的窗口,在该窗口中执行“Project ”菜单下的“Make ”子菜单命令。Make 的行为包括以下过程:

编译和汇编源程序文件,产生与源文件相对应的以.o 为扩展名的目标对象文件;

连接对象文件和库,产生可执行映像文件Led.asf, 该文件可用于纯软件的调试或用JTAG 接口对目标板进行硬件调试;

产生可以直接写到Flash 的二进制可执行文件Led.bin 。

图1.13 执行Project 菜单下的Make 子菜单命令

Make 完成之后,将弹出错误和警告“Errors&Warnings”对话框来报告出错和警告情况。如果存在错误,在图1.14中,用鼠标单击错误信息提示,这时在“Errors&Warnings”对话框下面将直接定位到出错的位置;如果用鼠标双击错误信息提示,则窗口将直接切换到源代码文件中出错的地方,同时鼠标在此闪烁,用户可进行错误查找和修改,如图1.15所示。

图1.14 错误和警告的具体信息

图1.15错误查找和修改

回到图1.7,查看Main( )函数源代码,在Bsp_Init( )函数后面加上一个分号,重新编译、链接一次,可以看到,在D :\LEDtest 文件夹下产生了一个文件名为Led.bin 的二进制文件,该文件可以直接写如Flash 存储器中运行。同时在D :\LEDtest\LED\LED_Data\DebugRel文件夹下产生了一个文件名为LED.axf 的文件,该文件可以用于目标系统的硬件和软件调试。

4. 工程调试

通过串口打印信息调试

在进行带有目标板的项目调试时,建议用户购买一套开发套件,在购买的嵌入式开发套件中,一般都带有与开发板对应的Boot Loader,Boot Loader中提供了启动、引导、下载、烧写、串口通信、网络通信、设置日期、时间、设置工作频率等多种功能。Boot Loader启动后随即进入shell 模式。用户要启动任何功能都必须输入特定的命令行。该shell 模式类似DOS 操作环境,用户可以通过各种命令与目标板进行交互。ARM-44B0开发板的BootLoader 提供的用户命令如下:

用户命令 功能说明

help 显示Boot Loader命令列表

date 显示、设置开发板时钟的当前日期 chguart 选择串口(UART0/UART1)

setbaud 设置串口通讯波特率

load 通过Kermit 协议从串口下载程序 run 运行下载到目标板上程序

defset 默认设置系统参数

首先利用串口连接线将目标板的串口与PC 机上的COM1口连接起来,使用Windows 操作系统自带的串口通信终端与目标板进行交互。打开PC 机上的超级终端的步骤如下:在计算机上用鼠标点击[开始][程序

]

[附件] [通讯[超级终端]

图1.16 打开PC 上的超级终端

图1.17拨号连接对话框

图1.18“连接描述”对话框 图1.19“连接到”对话框

在图1.19中单击“确定”按钮,此时会弹出如1.20所示的“COM1属性”设置对话框,在每秒位数栏选择“115200”,在数据位栏选择“8”,在奇偶校验栏选择“无”,在停止位选择“1”,在数据流控制栏选择“无”,或者单击“还原为默认值”按钮。如图1.20所示。

图1.20 “COM1”设置对话框

在图1.20中单击“确定”按钮,此时会弹出如图1.21所示的超级终端窗口,现在按目标板上的复位按钮,如果串口连接且设置正确,此时会出现如图1.21中的提示信息,然后按照目标板Bootloader 所提供的命令进行交互。

图1.21 超级终端窗口

Main( )函数首先对芯片和目标板进行初始化,然后加入串口提示信息打印函数,例如以下代码:

void Main(void)

{

int i;

rSYSCFG=CACHECFG;

Port_Init();

Isr_Init();

Uart_Init(0,115200);

Uart_Select(0);

Delay(0); //calibrate Delay()

Uart_Printf("\n come here once ");

„„ ;其他应用程序代码

Uart_Printf("\n come here second time ");

„„ ;其他应用程序代码

Uart_Printf("\n come here third time ");

„„ ;其他应用程序代码

Uart_Printf("\n come here fourth time");

„„ ;其他应用程序代码

while (1);

}

在各个串口输出信息语句Uart_Printf之间,插入用户代码,通过串口输出的信息可以看出应用程序的运行情况和位置。

将项目工程按照以上进行编译后,按照如下的步骤将产生的以.bin 结尾的目标文件通过串口传输到目标板:首先在图超级终端窗口中的,单击[传送]菜单项目,执行[发送文件(S )„]命令,如图1.22所示。

图1.22 执行“发送文件(S )... ”命令

图1.23 “发送文件”对话框

此时会弹出如图1.23所示的“发送文件”对话框,在文件名栏中选择需要传送的目标代码文件,此处是位于C 盘的hello.bin 文件。在协议栏中选择Kermit, 然后单击“发送”按钮。

图1.24 超级终端中打印的调试信息

五.实验小结和体会

通过这次实验,我对ARM 的集成开发环境有了更深入的了解。熟悉了嵌入式系统的开发过程和开发特点。掌握了ADS1.2的使用方法,学会了使用超级终端将已编译好的文件下载到实验板上,并且了解了开发嵌入式系统使用的几种调试工具,并为以后的嵌入式程序开发打下基础。

实验二 串口通信实验

一、实验目的

1. 掌握ARM 的串行口工作原理。

2. 学习编程实现ARM 的UART 通讯 。

3. 掌握CPU 利用串口通讯的方法。

二.实验内容

学习串行通讯原理,了解串行通讯控制器,阅读ARM 芯片文档,掌握ARM 的 UART相关寄存器的功能,熟悉ARM 系统硬件的UART 相关接口。编程实现ARM 和计算机实现串行通讯。

ARM 监视串行口,将接收到的字符再发送给串口(计算机与开发板是通超级终端通讯的),即按PC 键盘通过超级终端发送数据,开发板将接收到的数据再返送给PC ,在超级终端上显示。

三.实验设备及工具

硬件:ARM 嵌入式开发板、用于ARM7TDMI 的JTAG 仿真器、PC 、串口线。

软件:PC 机操作系统win98、Win2000 或WinXP 、ARM SDT 2.51 或ADS1.2 集 成开发环境、仿真器驱动程序、超级终端通讯程序。

四.实验原理及说明

4.1异步串行I /O

异步串行方式是将传输数据的每个字符一位接一位(例如先低位、后高位) 地传送。 数据的各不同位可以分时使用同一传输通道, 因此串行I /O 可以减少信号连线,最少用一对线即可进行。效率较低。首先要分割成位,再按位组成字符。为了恢复发送的信息,双方必须协调工作。

图2.1 串行通信字符格式

图2.1给出异步串行通信中一个字符的传送格式。开始前,线路处于空闲状态, 送出连续“1”。传送开始时首先发一个“0”作为起始位,然后出现在通信线上的是字符的二进制编码数据。每个字符的数据位长可以约定为5 位、6 位、7 位或8 位,一般采用ASCII 编码。

4.2 串行接口的物理层标准

图2.2 EIA RS-232C 标准

图2.2 RS-232C接口通信的连接

4.3 S3C44B0的UART 单元

两个独立的异步串行I/O口,每个通讯口均可工作在中断模式或DMA 模式,也即UART 能产生内部中断请求或DMA 请求在CPU 和串行I/O口之间传送数据。

S3C4510B 的UART 单元特性包括:

1) 波特率可编程

2) 支持红外发送与接收

3) 1~2个停止位

4) 5、6、7或8个数据位 5) 奇偶校验

和实验有关的寄存器:

1.UART 线性控制寄存器ULCONn

2.UART 控制寄存器UCONn

3发送寄存器UTXH 和接收寄存器URXH 4。

4. 波特率分频寄存器UBRDIV

图2.3 ULCON寄存器

图2.4 ULCON功能定义

图2.5 UCON功能定义

使用UART0通信需要两个引脚,分别为:

连接方式如下:

S3C44B0的I/O电压为3.3V (可承受5V ),连接时须注意电平的匹配。与PC 机相连时,由于PC 机串口是RS232电平,所以连接时需要使用RS232转换器。

五.实验步骤

1.新建工程文件。

2.定义与UART 有关的各个寄存器地址和一些特殊的位命令。 3.编写串口驱动函数:

4.在主函数中实现将从串口0 接收到的数据发送到串口0(Main.c ): 文件如下:

Main 函数如下:

#include "option.h" #include "def.h" #include "44b.h" #include "44blib.h"

void Main(void) {

U8 which_key;

rSYSCFG=CACHECFG; // Using 8KB Cache//

Port_Init();

Led_Display(0x0);

rPCONG=0x00ff; //EINT7~0 rPUPG=0x0; //pull up enable Beep(0);

while(1) {

while((rPDATG & 0xf0)==0xf0); which_key=rPDATG&0xf0; switch(which_key) {

case 0xe0:

Led_Display(1); Beep(1); break; case 0xd0: Led_Display(2); Beep(0); break; case 0xb0: Led_Display(3); break; case 0x70: Led_Display(0); break; default : break; }

} }

5. 编译生成二进制目标文件

6. 通过超级终端下载到S3C44B0实验板上,如图2.6所示。

图2.6 通过超级终端下载程序

7. 按程序的要求在PC 键盘上通过超级终端发送数据,开发板将接收到的数据再返送给PC ,在超级终端上显示。

图2.7 实验结果在超级终端上的显示

六.实验小结和体会

此次实验让我熟悉了如何控制串行口通讯,掌握ARM 的串行口工作原理,学习并编程实现S3C4410的UART 串口通讯,学习并掌握S3C4410寄存器的配置方法。实现查询方式串口的收发功能,实现实验装置通PC 平台的串口通信,接受PC 平台发送出的字符,并将该字符重新返回给PC 平台。实验中进一步熟悉ADS 的操作环境,提高了自己阅读ARM 芯片文档的能力,获得了不少编写嵌入式程序的经验。

实验三 综合实验—按键控制LED

一.实验目的

1. 通过实验了解ARM 的中断方式和原理。 2. 通过实验掌握ARM 的编程方法。

二.实验内容

掌握ARM 中断工作原理,了解S3C44B0X 的中断寄存器,掌握常用的中断的编程方法。

编写中断处理程序实现:

电路上面,4 个 1×4 键盘分别接在外部中断 4,5,6,7 上。

三.实验设备及工具

硬件:嵌入式实验平台一套、仿真器一个、PC 机一台。

软件:Windows 98/2000/NT/XP 操作系统、仿真器驱动程序、ADS 开发软件一套。

四.实验原理及说明

S3C44B0X 的中断控制器可以接受来自30 个中断源的中断请求。这些中断

源来自DMA,UART,SIO 等芯片内部外围或外部引脚。在这些中断源中,有4 个外部中断(EINT4/5/6/7)是逻辑“或“的关系。中断控制器的任务是在片内外围和外部中断源组成的多重中断发生时,选择其中一个中断,通过FIQ 或IRQ 向ARM7TMDI 内核发出中断请求。实际最初的ARM7TMDI 内核只有FIQ (快速中断请求)和IRQ(通用中断请求)2 种中断,其他中断都是各个芯片厂家在设计芯片的时候定义的。对这些中断根据其优先级高低来进行处理。例如,如果定义

所有的中断为IRQ 中断(通过中断模式设置),并且同时有10个中断发出请求,那么可以通过读中断优先级寄存器来确定哪一个中断将被优先执行。一般的中断模式在进入所需的服务程序之前,需要很长的中断反应时间。为了解决这个问题,S3C440X 提供了一种新的中断模式。叫做中断向量模式。它具有CISC 结构为控制器的特征,能够降低中断反应时间。也就是说,S3C44B0X 的中断控制器硬件本身直接提供了对向量中断服务的支持。当众多中断源请求中断时,硬件优先级逻辑会判断哪一个中断将被执行;同时,硬件逻辑自动执行0x18(或0x1c) 地址到各个中断源向量地址的跳转指令;然后再由中断源向量进入相应的中断处理程序。与原来软件实现的方法相比,这种方法可以显著的减少中断反应时间。 4.1

中断控制器的操作

1) 程序状态寄存器的F 位到1 位

如果CPSR 程序状态寄存器的F 位被置位1,那么CPU 将不接受来自中断控制器的FIQ ;如果CPSR 程序状态控制器的I 位被置为1,那么CPUJ 将不接受来自中断控制器的IRQ 。因此,为了使能FIQ 和IRQ ,必须先将CPSR 程序状态寄存器的F 位和I 位清0,并且中断屏蔽寄存器的INTMSK 中相应的位也要清0。

2)中断模式(INTMOD )

ARM7TMDI 提供了2 种中断模式,FIQ 和IRQ 模式。所有中断源在中断请求时都要确定使用了哪一种中断模式。

3)中断挂起寄存器(INTPND )

用于指示对应的中断是否被激活。如果挂起位被置位1,那么无论标志I 和标志F 是否被清0,都会执行相应的中断服务程序。中断挂起寄存器为只读寄存器,所以在中断服务程序中必须加入I_ISPC 和F_ISPC 写1 的操作来清除挂起条件。

4) 中断屏蔽寄存器(INTMSK)

当INTMSK 寄存器的屏蔽位为1 时,对应的中断被禁止;当INTMSK 寄存器的屏蔽位为0 时,对应的中断正常执。如果一个中断的屏蔽位为1,那么在该中断发出请求的时候挂起位还是会被置位1。如果中断屏蔽寄存器的GLOBAL 位被设置为1,那么中断挂起位在中断请求时还会被设置,但所有的中断请求都不会被受理 。

4.2中断源

在30 个中断源中,有26 个中断源单独提供中断控制器,4 个外部中断(ENT4/5/6/7)是逻辑“或“的关系,他们共享同一个中断控制器。另外2 个UART 错误中断(UERROR0/1)也是共同一个中断控制器。

4.3中断控制专用寄存器

1) 中断控制寄存器(见表5-1 和5-2) 表4-1 中断控制寄存器

2) 中断挂起寄存器

中断挂起寄存器INTPND 共有26 位,每一位对应一个中断源,当中断请求产生时,相应的位被置为1。该寄存器为只读寄存器,所以在中断服务程序中必须加入I-ISPC 和F-ISPC 写1 的操作来清除挂起条件。如果有几个中断源同时发出中断请求,那么不管他们是否被屏蔽,他们相应的挂起位都会被置1。只是优先级寄存器会根据其优先级该地来响应当前优先级最高的中断。

表4-2 中断挂起寄存器

3)中断模式寄存器

中断模式寄存器INTMOD 共有26 位,每一位对应一个中断源。当中断源的模式位设置为1,对应的中断会由ARM7TDMI 的内核以FIQ 模式处理。相反地,当模式位设置为0 时,中断会以IRQ 模式处理。

4) 中断屏蔽寄存器

在中断屏蔽寄存器INTMSK 中,除了全屏蔽位global mask 外,其余的26 位都分别对应一个中断源。当屏蔽位为1 时,对应的中断源被屏蔽;当屏蔽位为0 时,该中断可以正常使用。如果全屏蔽位global mask 被设置为1,则所有的中断都不执行。如果使用向量中断模式,在中断服务程序中改变了中断屏蔽寄存器INTMSK 的值,那么并不能屏蔽相应的中断过程,因为该中断在中断屏蔽寄存器之前已经被中断挂起寄存器INTPND 锁定了。要解决这个问题,就必须在改变中断寄存器后,再清除相应的挂起位INTPND 。

表4-3中断屏蔽寄存器

5) RQ 向量模式相关寄存器

表4-4RQ 向量模式相关寄存器

S3C44B0X 中的优先级产生模块包含5 个单元,1 个主单元和4 个从单元。每一优先级产生单元管理6 个中断源。主优先级产生单元管理4 个从单元和2 个中断源。每个从单元有4 个可编程优先级中断源(sGn )和2 个固定优先级中断源(kn ). 这4 个中断源的优先级是由I_PSLV 寄存器决定的。另外2 个固定优先级中断源在6 个中断源的优先级最低。主单元可以通过I_PMST 寄存器来决定4 个从单元和2 个中断源的优先级。这2 个中断源INT_RTC 核INT_ADC 在26 个中断源中的优先级最低。如果几个中断源同时发生中断请求,那么I_ISPR 寄存器可以显示当前具有最高优先级的中断源。 6) IRQ/FIQ 中断源挂起清0寄存器

通过对IRQ/FIQ 中断挂起清0 寄存器I_ISPC/F_ISPC 相应的位写1 来清除中断挂起位INTPND 。

表4-5 IRQ/FIQ 中断源挂起清0寄存器

五.实验步骤

1.新建工程文件。

2.将“按键控制LED 实验”所需要的头文件添加到工程中。 文件如下:

图3.1工程包含的文件

3. 编写主函数,实现实验要求的功能。 Main( )函数如下:

#include "..\inc\uTypes.h" #include "..\inc\44b0x.h" #include "..\inc\console.h" #include "..\inc\sysUtils.h"

//申明函数

void IoConfig (void); void KeyLedTest (void);

//我们用这个片编存储我们的IRQ ISR入口地址 U32 pIrqStart = 0; U32 pIrqFinish = 0; U32 pIrqHandler = 0;

U32 g_pTopOfROM = 0; U32 g_pBaseOfROM = 0;

U32 g_pBaseOfBSS = 0;

U32 g_pBaseOfZero = 0;

U32 g_pEndOfBSS = 0;

extern U32 GetBaseOfROM (void);

extern U32 GetEndOfROM (void);

extern U32 GetBaseOfBSS (void);

extern U32 GetBaseOfZero (void);

extern U32 GetEndOfBSS (void);

int main(void)

{

//int i;

sysUtilsSetPllValue (24, 6, 1);

IoConfig ();

console_init (115200);

printf ("\n\nITSN - 44B0 board Test programe version 1.0.\n\n");

//熄灭所有的LED 灯

sysUtilsLightLed (LED_ALL, FALSE);

g_pTopOfROM = GetEndOfROM ();

g_pBaseOfROM = GetBaseOfROM ();

g_pBaseOfBSS = GetBaseOfBSS ();

g_pBaseOfZero = GetBaseOfZero ();

g_pEndOfBSS = GetEndOfBSS ();

printf ("g_pTopOfROM = 0x%08x.\n", g_pTopOfROM);

printf ("g_pBaseOfROM = 0x%08x.\n", g_pBaseOfROM);

printf ("g_pBaseOfBSS = 0x%08x.\n", g_pBaseOfBSS);

printf ("g_pBaseOfZero = 0x%08x.\n", g_pBaseOfZero);

printf ("g_pEndOfBSS = 0x%08x.\n", g_pEndOfBSS);

printf ("&g_pTopOfROM = 0x%08x.\n", &g_pTopOfROM);

printf ("&g_pBaseOfROM = 0x%08x.\n", &g_pBaseOfROM);

printf ("&g_pBaseOfBSS = 0x%08x.\n", &g_pBaseOfBSS);

//KeyLedTest程序是一个死循环

KeyLedTest ();

return 0;

}

/********************************************************************函数名称: IoConfig

功 能: 初始化IO 口

参 数: 无

返回 值: 无

********************************************************************/ void IoConfig (void)

void IoConfig (void)

{

// PORT A GROUP

/* BIT 9 8 7 6 5 4 3 2 1 0 */

/* A24 A23 A22 A21 A20 A19 A18 A17 A16 A0 */

/* 0 1 1 1 1 1 1 1 1 1 */

rPCONA = 0x1ff;

// PORT B GROUP

/* BIT 10 9 8 7 6 5 4 3

1 0 */

/* /CS5 /CS4 /CS3 /CS2 /CS1 nWBE3 nWBE2 /SRAS SCLK SCKE */

/* EXT NIC 8019 IDE D12 NC NC Sdram Sdram Sdram */

/* 1, 1, 1, 1, 1, 0, 0, 1, 1, 1 */

rPDATB = 0x04f;

rPCONB = 0x3cf;

//PORT C GROUP

//BUSWIDTH=16 */ /* PC15 14 13 12 11 10 9 8 */ /* o o RXD1 TXD1 o o o o */ /* NC NC Uart1 Uart1 NC NC NC NC */ /* 01 01 11 11 01 01 01 01 */

/* PC7 6 5 4 3 2 1 0 */ /* o o o o o o o o */ /* NC NC NC NC LED LED LED LED */ /* 01 01 01 01 01 01 01 01 */ rPDATC = 0x0000; //All IO is low

rPCONC = 0x5f555555;

rPUPC = 0x3000; //PULL UP RESISTOR should be enabled to I/O

//PORT D GROUP

/* PORT D GROUP(I/O OR LCD)

/* BIT7 6 5 4 3 2 1 0 */ 2 /SCASSdram 1, */

/* VF VM VLINE VCLK VD3 VD2 VD1 VD0 */ /* 01 01 01 01 01 01 01 01 */ rPDATD= 0x55;

rPCOND= 0xaaaa;

rPUPD = 0x00;

//These pins must be set only after CPU's internal LCD controller is enable

/////////////////////////////////////////////////////

//PORT E GROUP

/* Bit 8 7 6 5 4 3 2 1 0 */

/* ENDLAN o o TOU2 o o RXD0 TXD0 FOUT */

/* 00 01 01 10 01 01 10 10 11 */

rPDATE = 0x157; //Beep = 10

rPCONE = 0x596b;

rPUPE = 0xff;

//PORT F GROUP

/* Bit8 7 6 5 4 3 2 1 0 */

/* IISCLK IISDI IISDO IISLRCK Input Input Input IICSDA IICSCL */

/* 100 100 100 100 00 00 00 10 10 */

rPDATF = 0x0;

rPCONF = 0x24900a;

rPUPF = 0x1d3;

//PORT G GROUP

/* BIT7 6 5 4 3 2 1 0 */ /* EINT7 EINT6 EINT5 EINT4 EINT3 EINT2 EINT1 EINT0 */ /* KEY3 KEY2 KEY1 KEY0 NIC EXT IDE USB */ /* 11 11 11 11 11 11 11 11 */ rPDATG = 0xff;

rPCONG = 0x0000;

rPUPG = 0x00; //should be enabled

rSPUCR= 0x4;//0x7; //D15-D0 pull-up disable

//rSPUCR= 0x6; //D15-D0 pull-up enable

rSYSCFG = 0x0e; //使用8K 字节的指令缓存,write buffer disable

rNCACHBE0 = 0xc0002000; //定义非Cache 区, 从0x2000000到0xbffffff, 中断时进入ROM, 若不允许CACHE 不正常

rEXTINT = 0x0; //所有的外部硬件中断为低电平触发

}

/**************************************************************************** 函数名称: KeyLedTest

功 能: 测试1 * 4键盘,4个按键是接在EXTINT 4,5,6,7上面的,

当我们检测到有按键的时候就用LED 显示相关的按键信息!

参 数: 无

返回 值: 空

****************************************************************************/ #define EXTINT4 0

#define EXTINT5 1

#define EXTINT6 2

#define EXTINT7 3

#define EXTINT4567 21

#define INTTRIG_LOW 0x00

#define INTTRIG_HIGH 0x01

#define INTTRIG_FALLING 0x02

#define INTTRIG_RISING 0x04

#define INTTRIG_BOTHEDGE 0x05

void KeyLedTest (void)

{

U32 dwVal;

//设置IO 口PORT G

rPCONG |= 0xff00;

//设置中断

rINTMOD &= ~MASK_BIT(21);

rINTCON &= ~MASK_BIT(1);

//设置EXTINT4,5,6,7中断模式, 我们这里使用低电平触发

rEXTINT &= 0xffff; //先清除EXTINT4,5,6,7的相应设置bit 位

for (;;)

{

dwVal = rINTPND;

if ((dwVal & MASK_BIT(21)) == 0)

{

continue;

}

//EXTINTPND 寄存器,判断是哪个外部中断触发

dwVal = rEXTINTPND;

if ((dwVal & MASK_BIT(EXTINT4)) != 0)

{

rEXTINTPND |= MASK_BIT(EXTINT4);

//外部中断4 产生了,点亮LED1

sysUtilsLightLed (LED1, TRUE);

}

if ((dwVal & MASK_BIT(EXTINT5)) != 0)

{

rEXTINTPND |= MASK_BIT(EXTINT5);

//外部中断4 产生了,点亮LED2

sysUtilsLightLed (LED2, TRUE);

}

if ((dwVal & MASK_BIT(EXTINT6)) != 0)

{

rEXTINTPND |= MASK_BIT(EXTINT6);

//外部中断4 产生了,点亮LED3

sysUtilsLightLed (LED3, TRUE);

}

if ((dwVal & MASK_BIT(EXTINT7)) != 0)

{

rEXTINTPND |= MASK_BIT(EXTINT7);

//外部中断4 产生了,点亮LED1,2,3

sysUtilsLightLed (LED_ALL, FALSE);

}

//最后清除中断位

//rI_ISPC |= MASK_BIT(21);

rI_ISPC = dwVal;

}

}

4. 编译生成二进制目标文件

5. 通过超级终端下载到S3C44B0实验板上,如图3.2所示。

图3.2 通过超级终端下载程序

6. 分别按下KEY0,KEY1,KEY2,KEY3,观察实验现象。

图3.3 按下KEY0键 图3.4按下KRY1键

图3.5按下KEY2 图3.6按下KEY3

六.实验小结和体会

此次实验让我熟悉了如何通过中断控制LED 灯,掌握ARM 的中断方式和工作原理,学习并编程实现S3C4410的按键控制LED 程序,学习并掌握S3C4410中断控制寄存器的配置方法。实现了按下KEY0,通过中断源ExINT4点亮LED1;按下KEY1,通过中断源ExINT5点亮LED2;按下KEY2,通过中断源ExINT6点亮LED3;按下KEY3,通过中断源ExINT7来熄灭LED1,LED2,LED3。实验中进一步熟悉ADS 的操作环境,提高了自己的动手能力。


相关内容

  • 嵌入式实验报告一
  • 嵌入式实验报告一 实验时间 2015.5.26 报告人 一.实验目的: 1.嵌入式仿真开发环境的建立: 2.通过上机实验,使学生验证.巩固和充实所学理论知识,加深对相关内容的理解,了解嵌入式操作系统的指令和目录结构. 二.实验要求: 1.安装Cygwin; 2.学习常见的Linux命令. (1)文件 ...

  • 软件系网络工程实验室建设规划
  • 软 件 工 程 系 网络工程本科专业实验室建设规划 二○一一年五月 关于软件工程系网络工程本科专业 新建.扩建实验室.实习基地的规划报告 教务处.发展规划处: 根据学校升本工作需要,结合我系实际情况,在对现有校内实验室.实习实训基地等实践条件摸底的基础上,经过仔细讨论和慎重考虑,现提出关于网络工程本 ...

  • 认知实习报告
  • 认识实习报告 根据合肥学院人才培养方案中的第五学期认知实习教学大纲的要求,我于2013年6月17日至8月10日在合肥学院计算机科学与技术系实践14天. 一. 实习单位简介 1.合肥学院计算机科学与技术系 合肥学院计算机科学与技术系创建于1993年,是原合肥联合大学最早用世界银行贷款初始建设起来的系部 ...

  • 电子信息专业认识实习报告
  • 实 习 报 告 实习名称 专 业 认 识 实 习 专业班级 电子1142 姓 名 学 号 成 绩 评 定 电气与信息工程学院 二0一二年十月 实习纪律要求和成绩考核办法 实习纪律要求和成绩考核办法 1.实习过程必须听从教师和现场工作人员指导,严格遵守安全操作规程.不准违规操作,未经现场工作人员允许不 ...

  • 主办方北京林业大学信息学院
  • 主办方:北京林业大学信息学院 承办方(排名按笔画顺序先后): 北京林业大学生物科学与技术学院 北京林业大学园林学院 北京林业大学经济管理学院 北京林业大学理学院 2011年3月 北京林业大学第八届"创e杯"文件汇编 北京林业大学网络文明规范 要善于网上学习 不浏览不良信息 要诚实 ...

  • 多媒体教学设备采购
  • 多媒体教学设备采购(龙圩片) 序号 设备名称 数量 参考品牌 型号规格.技术参数.性能配置 单价 合计 1 交互智能平板 48 希沃.安宇.京东方 一.整体设计要求 1.内置一体化设计,采用铝合金面框,弧形转角采用无尖锐边缘连接,整机物理按键前置,具备前置USB接口. 2.★整机电视开关.电脑开关和 ...

  • 硕士中期报告模板
  • 硕士论文中期报告(田野) 基于vxworks的卫星半物理仿真中的通信 一.研究内容概要:借助vxworks嵌入式操作系统平台,实现卫星半物理仿真中的通信问题.半物理仿真各个阶段涉及嵌入式星载计算机之间的通信.星载计算机和各个外部系统之间的通信.系统中执行和测量部件的控制和信息反馈等,是从系统级.分系 ...

  • 浙工大 嵌入式实验报告
  • 金艳霞 通信2班 [1**********]0 实验五 Linux 交叉编译平台 一. 实验目的 1. 掌握一些基本的linux 读写操作 2. 利用vcc 编译c 程序 3. 通过nfs 挂载到实验箱中,利用交叉编译执行文件 二.实验设备 1. Arm9试验箱 2. Pc 机 3. Linux 系 ...

  • 论文相似性检测报告
  • 论文相似性检测报告 报告编号:e17a2860-c282-4a94-b597-a33901150e79题 名:e17a2860-c282-4a94-b597-a33901150e79报告编号: 作 者:38,411原文字数: 论文相似性检测报告(详细版) 论文相似性检测报告(详细版) 原文字数:20 ...