ARM嵌入式系统与应用实验报告
信息科学与技术系
专业班级 ____电信0803班__________
学 号 ____________
姓 名 ___ ___________
实验老师 ___ __________
总 成 绩 _________________________
2011—2012学年(1)
实验一 通用 IO 口试验
一、实验目的
熟悉ARM 芯片I/O口编程配置方法;
掌握ARM芯片I/O口控制LED显示的方法。
二、实验设备
硬件:嵌入式实验平台一套、仿真器一个、PC 机一台。
软件:Windows 98/2000/NT/XP 操作系统、仿真器驱动程序、ADS 开发软件一套。
三、实验
内容
财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容
控制嵌入式实验箱上的LED轮流点亮。
四、实验原理
S3CRRB0X 芯片上共有71 个多功能I/O 引脚,他们分别为7 组I/O 端口:2 个9 位I/O 端口 (端口E 和F)
2 个8 位I/O 端口 (端口D 和G)
1 个16 位I/O 端口 (端口C)
1 个10 位I/O 端口 (端口A )
1 个11 位I/O 端口 (端口B )
每组端口都可以通过软件配置寄存器来满足不同系统合设计的需要。在运行主程序之前,必须先对每一个用到的引脚的功能进行设置。如果某些引脚的附庸功能没有使用,那么可以先将该引脚设置为I/O口。
S3C44B0X芯片与端口相关的寄存器
(1)端口控制寄存器 (PCONA~G):在S3C44B0X 芯片中,大部分引脚是使用多路复用的,所以要确定每个引脚的功能。PCONn(端口控制寄存器)能够定义引脚功能。如果 PG0~PG7作为掉电模式下的唤醒信号,那么这些端口必须配置成中断模式。
(2)端口数据寄存器 (PDATA~G):如果端口定义为输出口,那么输出数据可以写入 PDATn中相应的位;如果端口定义为输入口,那么输入数据可以从PDATn 相应的位中读 入。
(3)端口上拉寄存器 (PUPC~G):通过配置端口上拉寄存器,可以使该组端口
与上拉 电阻连接或断开。当寄存器中相应位配置为0 时,该引脚接上拉寄存器;当寄存器中相应位 配置为1 时,该引脚不接上拉电阻。
(4)外部中断寄存器 (EXTINT ):通过不同的信号方式可以使8 个外部中断被请求。 EXTINT 寄存器可以根据外部中断的需求,将中断触发信号配置为低电平触发,高电平触发,下降沿触发,上升沿触发和边沿触发几种方式。 五、实验操作步骤
1(启动ADS1.2,使用ARM Execuatable Image 工程模板新建一个工程;
2(添加两个组INC 和SRC;
3(将INC 文件夹下所有文件添加到组INC 中;
4(将SRC 文件夹下所有文件添加到组SRC 中;
5(建立源文件test5.C,编写实验程序,添加到工程中;
6(编译链接选项的设置同前面实验;
7(编译链接工程,点击Debug 按钮,启动AXD进行调试;
8(连续点击step in按钮,单步运行程序,主板上的三个LED灯循环点亮。
9(理解并掌握本实验原理及程序,完成练习
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
六、实验参考程序
#include "option.h"
#include "def.h"
#include "44b.h"
#include "44blib.h"
void Isr_Init(void);
void HaltUndef(void);
void HaltSwi(void);
void HaltPabort(void);
void HaltDabort(void);
void Main(void)
{
rSYSCFG=SYSCFG_8KB;
#if (PLLON 1)
ChangePllValue(PLL_M,PLL_P,PLL_S);
#endif
Isr_Init(); 中断初始化
Port_Init(); 端口初始化
Uart_Init(0,115200); 波特率为115200
Uart_Select(0); 选择串口0
Delay(0); //calibrate Delay() 延时
Led_Display(7); 0111三个灯全亮
Delay(1000); //calibrate Delay()
Led_Display(0); 三个灯全灭
Delay(5000); //calibrate Delay()
Led_Display(7);
Uart_Printf("\n start \n"); 在终端打印start
while(1)
{
Delay(5000); //calibrate Delay()
Led_Display(1); 点亮第一个灯,其他灭
Delay(5000); //calibrate Delay()
Led_Display(2); 点亮第二个灯,其他灭
Delay(5000); //calibrate Delay()
Led_Display(4); 点亮第三个灯,其他灭
}
}
void Isr_Init(void)
{
U32 i;
pISR_UNDEF=(unsigned)HaltUndef;
pISR_SWI =(unsigned)HaltSwi;
pISR_PABORT=(unsigned)HaltPabort;
pISR_DABORT=(unsigned)HaltDabort;
for(i=_RAM_STARTADDRESS;i<(_RAM_STARTADDRESS+0x20);i+=4)
{
*((volatile unsigned *)i)=0xEA000000+0x1FFE;
}
rINTCON=0x5; // Non-vectored,IRQ enable,FIQ disable
rINTMOD=0x0; // All=IRQ mode
rINTMSK|=BIT_GLOBAL|BIT_EINT3; // All interrupt is masked.
} void HaltUndef(void)
{
Uart_Printf("Undefined instruction exception!!!\n");
while(1);
}
void HaltSwi(void)
{
Uart_Printf("SWI exception!!!\n");
while(1);
}
void HaltPabort(void)
{
Uart_Printf("Pabort exception!!!\n");
while(1);
}
void HaltDabort(void)
{
Uart_Printf("Dabort exception!!!\n");
while(1);
}
七、思考题
1、在原程序的基础上改变led灯的闪烁方式。
将其中部分程序改为以下程序,使其变为每次两个灯一起亮
Uart_Printf("\n start \n");
while(1)
{ Delay(5000); //calibrate Delay()
Led_Display(5); ;灯r5、r7 亮
Delay(5000); //calibrate Delay()
Led_Display(3); ;灯r5、r6 亮
Delay(5000); //calibrate Delay()
Led_Display(6); ;灯r6、r7 亮
}
2 、用汇编语言实现led灯的闪烁。
ORG 0000H
MOV P2,#0FFH ;全灭
LOOP:
MOV P2,#00H ;全亮
ACALL DELAY ;延时300ms
MOV P2,#0FFH ;全灭
ACALL DELAY ;延时300ms,ACALL 绝对寻址的跳转指令
AJMP LOOP ;AJMP 绝对转移指令 DELAY: MOV R5,#3 ;延时300ms 1+(1*3)+(1*200*3)+
(2*248*200*3)+(2*200*3)+(2*3)+2 =299412us=300ms DEL1: MOV R6,#200 ;12M晶振
DEL2: MOV R7,#230
DEL3: DJNZ R7,DEL3 ;DJNZ 循环控制指令
DJNZ R6,DEL2
DJNZ R5,DEL1
RET
END ;结束
实验二 串口试验
一、实验目的
1. 掌握ARM的串行口工作原理
2. 学习编程实现ARM的UART 通讯
3. 掌握CPU利用串口通讯的方法
二、实验设备
硬件:ARM嵌入式开发板、用于ARM7TDMI的JTAG仿真器、PC、串口线。
软件:PC机操作系统win98、Win2000或WinXP、ARM SDT 2.51或ADS1.2
集成开发环境、仿真器驱动程序、超级终端通讯程序。 三、预备知识
1. 用ARM ADS1.2集成开发环境,编写和调试程序的基本过程
2. ARM应用程序的框架结构
3. 了解串行总线
四、实验内容
学习串行通讯原理,了解串行通讯控制器,阅读ARM芯片文档,掌握ARM
的UART相关寄存器的功能,熟悉ARM系统硬件的UART相关接口。编程实现ARM和计算机实现串行通讯。
ARM监视串行口,将接收到的字符再发送给串口(计算机与开发板是通过超级终端通讯的),即按PC键盘通过超级终端发送数据,开发板将接收到的数据再返送给PC,在超级终端上显示。
五、 实验原理
串行通讯是微计算机之间 种常见的近距离通讯手段,因使用方便、编程简
单而广泛使用,几乎所有的微控制器、PC都提供串行通讯接口。
1. 异步串行I/0
异步串行方式是将传输数据的每个字符 位接 位(例如先低位、后高位)地传送。数据的各不同位可以分时使用同传输通道,因此串行I/0
可以减少信号连线,最少用对线即可进行。接收方对于同 根线上 连串的数字信号,首先要分割成位,再按位组成字符。为了恢复发送的信息,双方必须协调工作。在微型计算机中大量使用异步串行I/0方式,双方使用各自的时钟信号,而且允许时钟频率有定误差,因此实现较容易。但是由于每个字符都要独立确定起始和结束(即每个字符都 要重新同步),字符和字符间还可能有长度不定的空闲时间,因此效率较低。
图4.1 串行通信字符格式
图4.1给出异步串行通信中 个字符的传送格式。开始前,线路处于空闲状态,送出连续1”。传送开始时首先发 个 ,”作为起始位,然后出现在通信线上的是字符的二进制编码数据。每个字符的数据位长可以约定为5 位、6 位、7位或8位,一般采用ASCII编码。
后面是奇偶校验位,根据约定,用奇偶校验位将所传字符中为1”的位数凑成奇数个或偶数个。也可以约定不要奇偶校验,这样就取消奇偶校验位。最后是
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
示停 止位的1”信号,这个停止位可以约定持续1 位、1.5 位或2
位的时间宽度。至此 个字符传送完毕,线路又进入空闲,持续为1”。经过 段随机的时间后,下个字符开始传送才又发出起始位每 个数据位的宽度等于传送波特率的倒数。微机异步 串行通信中,常用的波特率为2400,4800,9600,19200bps 等。
接收方按约定的格式接收数据,并进行检查,可以查出以下三种错误:
1)奇偶错:在约定奇偶检查的情况下,接收到的字符奇偶状态和约定不符。
2)帧格式错: 个字符从起始位到停止位的总位数不对。
3)溢出错:若先接收的字符尚未被微机读取,后面的字符又传送过来,则产生
溢出错。每 种错误都会给出相应的出错信息,提示用户处理。
2. ARM自带的串行口寄存器
S3C4510B的UART单元提供两个独立的异步串行I/O口(Asynchronous Serial I/O,SIO),每个通讯口均可工作在中断模式或DMA模式,也即UART能产生内部中断请求或DMA请求在CPU和串行I/O口之间传送数据。 S3C4510B的UART单元特性包括:
1)波特率可编程
2)支持红外发送与接收
3) 1,2个停止位
4) 5、6、7或8个数据位
5)奇偶校验
每一个异步串行通讯口都具有独立的波特率发生器、发送器、接收器和控制单元波特率发生器可由片内系统时钟MCLK驱动,或由外部时钟UCLK(Pin64)驱动;发送器和接收器都有独立的数据缓冲寄存器和数据移位器。
待发送的数据首先传送到发送缓冲寄存器,然后拷贝到发送移位器并通过发送数数据引脚 UATXDn发送出去。接收数据首先从接收数据引脚UARXDn移入移位器,当接收到一个字节时就拷贝到接收缓冲寄存器。
SIO的控制单元通过软件控制工作模式的选择、状态和中断产生。
当使用UART的发送中断功能时,应在初始化UART之前先写一个字节数据到 UART的发送缓冲寄存器,这样,当发送缓冲寄存器空时就可以产生UART的发送
中断。
图4.2 串行口功能模块
表4.1为UART特殊功能寄存器描述
UART行控制寄存器(UART Line Control Registers,ULCON0、ULCON1):下面简要介绍UART操作。关于数据发送、数据接收、中断产生、波特率产生、回环模式和自动流控制的详细介绍,请参考数据手册及其他相关资料。
发送数据帧是可编程的。1个数据帧包含1个起始位、5-8个数据位、1个可选的奇偶校验位和1~2个停止位。停止位通过行控制寄存器ULCONn配置。
与发送帧类似,接收帧也是可编程的。接收帧由1个起始位、5-8个数据位、 1个可选的奇偶校验位和1~2个行控制寄存器ULCONn中的停止位组成。接收器
还可以检测过速错误、奇偶校验错误、帧错误和传输中断。每一个错误均可以设置一个错误标志。
à 过速错误指已接收到的数据在读取之前被新接收的数据覆盖。 à 奇偶校验错误指接收器检测到的校验和与设置的不相符。 à 帧错误指没有接收到有效的停止位。
à 传输中断指接收数据RxDn保持逻辑0超过1帧的传输时间。
在FIFO模式下,如果RxFIFO非空,而在3个字的传输内没有接收到数据,那么产生超时。
与UART有关的寄存器主要有以下几个:
(1)UART行控制寄存器ULCONn。该寄存器的位6决定是否使用红外模式,位 5~位3决定校验方式,位2决定停止位长度,位1和位0决定每帧的数据位数。 (2)UART控制寄存器UCONn。该寄存器决定UART的各种模式。UART FIFO 控制寄存器UFCONn和UART MODEM控制寄存器,分别用来决定UART FIFO和 MODEM的模式。其中UFCONn的第0位决定是否启用FIFO,UMCONn的第0位是请 求发送位。另外,读/写状态寄存器UTRSTAT以及错误状态寄存器UERSTAT,可以反映芯片目前的读,写状态以及错误类型。FIFO状态寄存器UFSTAT和MODEM状态寄存器UMCONn,通过前者可以读出目前FIFO是否已满足其中的字节数;通过后者可以读出目前MODEM的CTS状态。
(3)发送寄存器UnRegisteredUTXH和接收寄存器URXH。这,个寄存器存放发送和接收的数据,当然只有,个字节,位数据。需要注意的是,在发生溢出错误时,接收的数据必须被读出来;否则会引发下次溢出错误。 (4)波特率分频寄存器UBRDIV
UART的波特率发生器的输入时钟可以为系统时钟,也可以从外部引入时钟信号。 若选用系统时钟为波特率发生器的输入时钟,当系统时钟为50MHz时,则最大的波特率时钟输出为MCLK2/16(= 1.5625MHz),其中MCLK2为系统时钟MCLK除以2。
UCLK引脚为UART0、UART1的外部时钟输入引脚。UART波特率发生器的输入 时钟MCLK2或UCLK,由寄存器UCCON[6]选择。 图4.2、图4.3为UART波特率发生器的结构图和典型的波特率。
六( 实验步骤
1(新建工程文件。
2(定义与UART有关的各个寄存器地址和 些特殊的位命令。
3(编写串口驱动函数:
4(在主函数中实现将从串口0 接收到的数据发送到串口0
实验参考程序:
(Main.c):
#include "option.h"
#include "def.h"
#include "44b.h"
#include "44blib.h"
void Isr_Init(void);
void HaltUndef(void);
void HaltSwi(void);
void HaltPabort(void);
void HaltDabort(void);
void Main(void)
{ U8 aa; 定义一个变量
rSYSCFG=SYSCFG_8KB;
#if (PLLON==1)
ChangePllValue(PLL_M,PLL_P,PLL_S);
#endif
Isr_Init(); 中断初始化
Port_Init(); 端口初始化
Uart_Init(0,115200); 设置串口波特率115200
Uart_Select(0); 选择串口0
Delay(0); //calibrate Delay()
Led_Display(7); 三个灯全亮
Delay(1000); //calibrate Delay()
Led_Display(0); 三个灯全灭
Delay(5000); //calibrate Delay()
Led_Display(7);
Uart_Printf("\n start \n"); 终端打印start
Uart_Printf("\nHello,FS44B0X!"); 终端打印hello,FS44BOX
Uart_Printf("\nPlease Press 'a'or'b'or'c'");打印Press 'a'or'b'or'c'
while(1)
{ aa= Uart_Getch(); 键盘输入的值赋给变量aa
switch(aa)
{
case 'a': 当输入的值为a时,终端打印You Pressed 'a'
Uart_Printf("\nYou Pressed 'a'");
Led_Display(0x1); 点亮第一盏灯
break;
case 'b': 当输入的值为b时,终端打印You Pressed 'b'
Uart_Printf("\nYou Pressed 'b'");
Led_Display(0x2); 点亮第二盏灯
break;
case 'c': 当输入的值为c时,终端打印You Pressed 'c'
Uart_Printf("\nYou Pressed 'c'");
Led_Display(0x4); 点亮第三盏灯
break;
case 0x1b: 当输入的值不为a,b,c时,灯都不亮
Led_Display(0x0);
break;
default :
break;
}
}
}
void Isr_Init(void)
{ U32 i;
pISR_UNDEF=(unsigned)HaltUndef;
pISR_SWI =(unsigned)HaltSwi;
pISR_PABORT=(unsigned)HaltPabort;
pISR_DABORT=(unsigned)HaltDabort;
for(i=_RAM_STARTADDRESS;i<(_RAM_STARTADDRESS+0x20);i+=4)
{
*((volatile unsigned *)i)=0xEA000000+0x1FFE;
}
//rINTCON=0x1; // Vectored Int. IRQ enable,FIQ disable
rINTCON=0x5; // Non-vectored,IRQ enable,FIQ disable
rINTMOD=0x0; // All=IRQ mode
rINTMSK|=BIT_GLOBAL|BIT_EINT3; // All interrupt is masked.
}
void HaltUndef(void)
{ Uart_Printf("Undefined instruction exception!!!\n");
while(1);
}
void HaltSwi(void)
{ Uart_Printf("SWI exception!!!\n");
while(1);
}
void HaltPabort(void)
{ Uart_Printf("Pabort exception!!!\n");
while(1);
}
void HaltDabort(void)
{ Uart_Printf("Dabort exception!!!\n");
while(1);
}
七、思考题
1、 串行通讯最少需要几根线,分别如何连接,
答:最少2根线,一个接收一个发送,电脑端9针接口,2接收(RXD),3发送
端(TXD),最好再加一个5接地端(GND)
2、 ARM 的串行口有几个,相应的寄存器是什么,
答:3个;线性控制寄存器 ULCONn,控制寄存器 UCONn, FIFO 控制寄存器
UFCONn,控制寄存器UMCONn,状态寄存器UTRSTAT,错误状态寄存器UERSTAT,
FIFO状态寄存器UFSTAT,发送寄存器UTXH和接收寄存器URXH,波特率因
子寄存器UBRDIV。
实验三 查询和中断方式键盘试验 一、实验目的
通过实验了解ARM的查询和中断的方式及原理。
通过实验掌握ARM的编程方法。
二、实验设备
硬件:嵌入式实验平台 套、仿真器 个、PC 机 台。
软件:Windows 98/2000/NT/XP 操作系统、仿真器驱动程序、ADS 开发
软件一套。
三、实验内容
掌握ARM中断工作原理,了解S3C44B0X的中断寄存器,掌握常用的中断
的编程方法。
编写中断处理程序实现:
1.使用按钮K2触发EINT5,LED2亮
2.使用按钮K3触发EINT6,LED3 亮
3.使用按钮K4触发EINT7,LED4 亮
四、实验原理
S3C44B0X 的中断控制器可以接受来自30 个中断源的中断请求。这些中断源来自DMA,UART,SIO 等芯片内部外围或外部引脚。在这些中断源中,有4 个外部中断(EINT4/5/6/7)是逻辑“或“的关系。
中断控制器的任务是在片内外围和外部中断源组成的多重中断发生时,选择其中一个中断,通过FIQ 或IRQ 向ARM7TMDI 内核发出中断请求。实际最初的ARM7TMDI 内核只有FIQ(快速中断请求)和IRQ(通用中断请求)2 种中断,其他中断都是各个芯片厂家在设计芯片的时候定义的。对这些中断根据其优先级高低来进行处理。例如,如果定义所有的中断为IRQ 中断(通过中断模式设置),并且同时有10个中断发出请求,那么可以通过读中断优先级寄存器来确定哪一个中断将被优先执行。
一般的中断模式在进入所需的服务程序之前,需要很长的中断反应时间。为了解决这个问题,S3C440X 提供了一种新的中断模式。叫做中断向量模式。它具有CISC 结构为控制器的特征,能够降低中断反应时间。也就是说,S3C44B0X 的中断控制器硬件本身直接提供了对向量中断服务的支持。
当众多中断源请求中断时,硬件优先级逻辑会判断哪一个中断将被执行;同时,硬件逻辑自动执行0x18(或0x1c)地址到各个中断源向量地址的跳转指令;然后再由中断源向量进入相应的中断处理程序。与原来软件实现的方法相比,这种方法可以显著的减少中断反应时间。
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,那么中断挂起位在中断请求时还会被设置,但所有的中断请求都不会被受理
2(中断源
在30 个中断源中,有26 个中断源单独提供中断控制器,4 个外部中断(ENT4/5/6/7)是逻辑“或“的关系,他们共享同一个中断控制器。另外2 个UART 错误中断(UERROR0/1)也是共同一个中断控制器
4 .中断控制专用寄存器
1) 中断控制寄存器(见表5-1 和5-2)
表5-1 中断控制寄存器
2)中断挂起寄存器
中断挂起寄存器INTPND共有26 位,每 位对应 个中断源,当中断请求产生时,相 应的位被置为1。该寄存器为只读寄存器,所以在中断服务程序中必须加入I-ISPC和F-ISPC写1 的操作来清除挂起条件。
如果有几个中断源同时发出中断请求,那么不管他们 否被屏蔽,他们相应的挂起位都会被置1。只 优先级寄存器会根据其优先级的设置来响应当前优先级最高的中断。
3)中断模式寄存器
中断模式寄存器INTMOD 共有26 位,每 位对应一个中断源。当中断源的模式位设置 为1,对应的中断会由ARM7TDMI的内核以FIQ 模式处理。相反地,当模式位设置为0时, 中断会以IRQ 模式处理。
4) 中断屏蔽寄存器
在中断屏蔽寄存器INTMSK中,除了全屏蔽位global mask外,其余的26 位都分别对应一个中断源。当屏蔽位为1 时,对应的中断源被屏蔽;当屏蔽位为0时,该中断可以正常使用。如果全屏蔽位global mask被设置为1,则所有的中断都不执行。
5)RQ向量模式相关寄存器
S3C44B0X中的优先级产生模块包含5个单元,1个主单元和4个从单元。每 优先级产生单元管理6个中断源。主优先级产生单元管理4个从单元和2个中断源。每个从单元有优先级中断源(sGn)和2个固定优先级中断源(kn ).这4个中断源的优先级 由I_PSLV 寄存器决定的。另外2个固定优先级中断源在6个中断源的优先级最低。
6)IRQ/FIQ中断源挂起清0寄存器
通过对IRQ/FIQ中断挂起清0寄存器I_ISPC/F_ISPC相应的位写1 来清除中断挂起INTPND。
五、实验参考程序
#include "option.h"
#include "def.h"
#include "44b.h"
#include "44blib.h"
void Isr_Init(void);
void HaltUndef(void);
void HaltSwi(void);
void HaltPabort(void);
void HaltDabort(void);
void Main(void)
{
U8 which_key; 定义变量
rSYSCFG=SYSCFG_8KB;
#if (PLLON==1)
ChangePllValue(PLL_M,PLL_P,PLL_S);
#endif
Isr_Init(); 中断初始化
Port_Init(); 端口初始化
Uart_Init(0,115200); 设置波特率为115200
Uart_Select(0); 选择串口0
rPCONG=0x00ff;//EINT7~0
rPUPG=0x0; //pull up enable
Delay(0); //calibrate Delay()
Led_Display(7);
Delay(1000); //calibrate Delay()
Led_Display(0);
Delay(5000); //calibrate Delay()
Led_Display(7);
Uart_Printf("\n start \n");
while(1)
{
while((rPDATG & 0xf0)==0xf0);
which_key=rPDATG&0xf0; 当按下一个键时,rPDATG会产生一个对应的值,与0xf0
switch(which_key) 相与后赋给which_key通过switch语句来实现查询功能
{
case 0xe0: 当按下第一个键时,点亮最上面的灯
Led_Display(0x1);
break;
case 0xd0: 当按下第二个键时,点亮第二个灯
Led_Display(0x2);
break;
case 0xb0: 当按下第三个键时,点亮第三个灯
Led_Display(0x4);
break;
case 0x70: 当按下第四个键时,点亮三个灯
Led_Display(0x7);
break;
default :
break;
}
}
}
void Isr_Init(void)
{
U32 i;
pISR_UNDEF=(unsigned)HaltUndef;
pISR_SWI =(unsigned)HaltSwi;
pISR_PABORT=(unsigned)HaltPabort;
pISR_DABORT=(unsigned)HaltDabort;
for(i=_RAM_STARTADDRESS;i<(_RAM_STARTADDRESS+0x20);i+=4)
{
*((volatile unsigned *)i)=0xEA000000+0x1FFE;
}
rINTCON=0x5; // Non-vectored,IRQ enable,FIQ disable
rINTMOD=0x0; // All=IRQ mode
rINTMSK|=BIT_GLOBAL|BIT_EINT3; // All interrupt is masked.
}
void HaltUndef(void)
{
Uart_Printf("Undefined instruction exception!!!\n");
while(1);
}
void HaltSwi(void)
{
Uart_Printf("SWI exception!!!\n");
while(1);
}
void HaltPabort(void)
{
Uart_Printf("Pabort exception!!!\n");
while(1);
}
void HaltDabort(void)
{
Uart_Printf("Dabort exception!!!\n");
while(1);
}
实验四 看门狗
一、实验目的
通过实验熟悉S3C44B0X系列ARM7控制器的看门狗的基本工作原理及应用 二、实验设备
硬件:嵌入式实验平台一套、仿真器一个、PC机一台
软件:WINDOWS2000/XP操作系统、仿真器驱动程序、ADS开发软件一套 三、实验内容
使用看门狗实现定时功能和系统重启功能。
四、实验原理
1.看门狗及工作原理
当嵌入式系统运行时受到外部干扰或者系统错误,程序有时会出现“跑飞”,导致整个系统瘫痪。在对系统稳定性要求较高的场合,为了防止这一现象的发生,需要一种叫“看门狗”(WATCHDOG)的电路。
看门狗的作用就是当系统“跑飞”而进入死循环时,恢复系统的运行。看门狗是一种电路,具有监视并恢复程序正常运行的功能,是一个定时器电路。 基本原理:
设一系统程序完整运行一周期的时间是Tp,看门狗的定时周期为Ti,要求Ti>Tp。在程序运行一周期后,修改定时器的计数值,只要程序正常运行,定时器就不会溢出。
若由于干扰等原因使系统不能在Tp时刻修改定时器的计数值,定时器将在Ti时刻溢出,引发系统复位,使系统得以重新运行,从而起到监控作用。 2.S3C44B0X的看门狗
1) S3C44B0X看门狗的功能
S3C44B0X的看门狗定时器有两个功能:
(1)定时器功能:可以作为常
规定
关于下班后关闭电源的规定党章中关于入党时间的规定公务员考核规定下载规定办法文件下载宁波关于闷顶的规定
时器使用,它是一个十六位的定时器,并且可以产生中断,中断名为INT_WDT。
(2)复位功能:作为看门狗定时器使用,当时钟计数减为0(超时)时,它将产生一个128个时钟周期的复位信号。
2) S3C44B0X看门狗结构与工作原理
S3C44B0X ARM7的看门狗主要由五部分构成:时钟、看门狗计时器、看门狗数据寄存器、复位信号发生器、控制逻辑等。
图6-1 看门狗定时器的功能框图
S3C44B0X看门狗定时利用MCLK作为时钟源,经过8位的预分频和4选1的2位分割之后得到所需频率。预分频值和频率分割值在看门狗定时器控制寄存器WTCON中配置。
3) S3C44B0X看门狗定时时间
, 预分频器为8位,其值为:0---255
, 再分频器可选择值为:16、32、64、128
, 输入到计数器的时钟周期为:
T_wtd=1/[PCLK/(Prescaler+1)/Division_factor]
, 看门狗的定时周期为:
T=WTDAT×T_wtd
注意:
一旦看门狗的定时器启动工作,其数据寄存器(WTDAT)中的值将不会自动读到时间寄存器中间去(WTCNT)。
由于这个原因,程序员必须在看门狗计时器启动之前,应该将一个初始值写入到看门狗的时间计数器(WTCNT)中间去。即先对时间计数器系初值,再启动看门狗工作。
3. 看门狗专用寄存器
共3个,其基地址为0x1D30000。
寄存器 描 述 初值 偏移地址
WTCON 看门狗控制寄存器 0x8021 0
WTDAT 看门狗数据寄存器 0x8000 4
WTCNT 看门狗计数寄存器 0x8000 8 1)看门狗控制寄存器(WTCON)
Register Off Add R/W Description Reset Value
WTCON 0 R/W 看门狗控制寄存器 0x8021
字段名 位 意 义 初值
Prescaler Value 15:8 预分频值。0---255。 0x80
Reserved 7:6 保留(为0) 00
看门狗控制位。
Watchdog Timer 5 1
0:禁止;1:允许
字段名 位 意 义 初值
再分频值选择。 00:16;
Clock Select 4:3 00
01:32;10:64;11:128
Interrupt 看门狗中断控制。
2 0
Generation 0:禁止; 1:允许。
Reserved 1 保留(为0) 0
Reset 看门狗复位功能控制。
0 1
Enable 0:禁止; 1:允许。 2)看门狗数据寄存器(WTDAT)
Register Off Add R/W Description Reset Value
WTDAT 4 R/W 看门狗数据寄存器 0x8000
说明
关于失联党员情况说明岗位说明总经理岗位说明书会计岗位说明书行政主管岗位说明书
:
(1)该数据寄存器为对看门狗计数器重装计数值。初始值为0x8000。
(2)在初始化看门狗操作中,WTDATA 的值不会自动加载到定时计数器中。
(3)在计数溢出后,WTDAT的值将被装载到WTCNT 寄存器中。 3)看门狗计数寄存器(WTCNT)
Register Off Add R/W Description Reset Value
WTCNT 8 R/W 看门狗计数寄存器 0x8000
字段名 位 意 义 初值
Count Value 15:0 看门狗的当前计数值 0x8000
说明:在计数中只能读,不能写(写不起作用)。 五、实验操作步骤
1、新建工程文件
2、定义相关各寄存器地址和一些特殊的位地址,编写实验程序,然后添加到工
程中去。
3、选择project->Debug,启动AXD进行JTAG仿真调试。 4、理解并掌握本实验原理及程序,完成思考题。 #include "option.h"
#include "def.h"
#include "44b.h"
#include "44blib.h"
void Isr_Init(void);
void HaltUndef(void);
void HaltSwi(void);
void HaltPabort(void); void HaltDabort(void);
void __irq Wdt_Int(void); volatile int isWdtInt;
void Main(void)
{
unsigned char *src, *dst;
int i;
unsigned int memSum;
rSYSCFG=SYSCFG_8KB; #if (PLLON==1)
ChangePllValue(PLL_M,PLL_P,PLL_S); #endif
Isr_Init(); 中断初始化
Port_Init(); 端口初始化
Uart_Init(0,115200); 设置波特率为115200
Uart_Select(0); 选择串口0
Delay(0); //calibrate Delay()
Led_Display(7);
Delay(1000); //calibrate Delay()
Led_Display(0);
Delay(5000); //calibrate Delay()
Led_Display(7);
rINTMSK=~(BIT_GLOBAL|BIT_WDT);
pISR_WDT=(unsigned)Wdt_Int;
isWdtInt=0;
rWTCON=((MCLK/1000000-1)<<8)|(3<<3)|(1<<2); //interrupt enable
rWTDAT=8448/4;
rWTCNT=8448/4; 当改变这个寄存器的值时,终端显示1-10之间的时间间隔会改变
rWTCON=rWTCON|(1<<5); //interrupt
while(isWdtInt!=10); 改变10数据,终端显示的数字会改变
rWTCON=((MCLK/1000000-1)<<8)|(3<<3)|(1); // reset enable
Uart_Printf("\nI will restart after 2 sec!!!\n");
rWTCNT=8448*2; ;设置重启时间为2S
rWTCON=rWTCON|(1<<5); // interrupt
while(1);
rINTMSK|=BIT_GLOBAL;
}
void __irq Wdt_Int(void)
{
rI_ISPC=BIT_WDT;
Uart_Printf("%d ",++isWdtInt); }
/******************************************************************/
void Isr_Init(void)
{ U32 i;
pISR_UNDEF=(unsigned)HaltUndef;
pISR_SWI =(unsigned)HaltSwi;
pISR_PABORT=(unsigned)HaltPabort;
pISR_DABORT=(unsigned)HaltDabort;
for(i=_RAM_STARTADDRESS;i<(_RAM_STARTADDRESS+0x20);i+=4)
{
*((volatile unsigned *)i)=0xEA000000+0x1FFE;
}
rINTCON=0x5; // Non-vectored,IRQ enable,FIQ disable
rINTMOD=0x0; // All=IRQ mode
rINTMSK|=BIT_GLOBAL|BIT_EINT3; // All interrupt is masked.
}
void HaltUndef(void)
{
Uart_Printf("Undefined instruction exception!!!\n");
while(1);
}
void HaltSwi(void)
{
Uart_Printf("SWI exception!!!\n");
while(1);
}
void HaltPabort(void)
{
Uart_Printf("Pabort exception!!!\n");
while(1);
}
void HaltDabort(void)
{
Uart_Printf("Dabort exception!!!\n");
while(1);
}
现象:先显示1、2、3、4、5、6、7、8、9、10,过2秒后重启 六、思考题
1、在看门狗定时器中断服务子程序中实现对LED灯的控制: 可在如下一段程序后加一段控制点灯的程序
void __irq Wdt_Int(void)
{
rI_ISPC=BIT_WDT;
Uart_Printf("%d ",++isWdtInt); }
Switch(isWdtInt)
{ case 0x1:
LED_DISPLAY(0x1);
case 0x2:
LED_DISPLAY(0x2);
case 0x3:
LED_DISPLAY(0x4); case 0x4:
LED_DISPLAY(0x1); case 0x5:
LED_DISPLAY(0x2); case 0x6:
LED_DISPLAY(0x4); case 0x7:
LED_DISPLAY(0x1); case 0x8:
LED_DISPLAY(0x2); case 0x9:
LED_DISPLAY(0x4); case 0xA:
LED_DISPLAY(0x0); Default:
Break;
}
亮灯说明:当显示1到9的时候,灯按顺序123的循环点亮,显示10的时候,灯全
部熄灭。
总结