南昌大学实验
报告
软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载
实验七 定时器实验
(一)实验目的
掌握S3C2410A的定时器基本设置及定时器中断应用。
(二)实验要求
1、学习周动光盘的定时器实验程序。
2、编写程序完成下列功能:
1)从0开始计数,每隔半分钟数值加1并用LED显示,例如隔90秒后,LED显示的数值为3.
2)LED显示数值的方式为:例如:用LED显示3时,四个发光二极管的显示情况从左到右依次为:暗、暗、亮、亮。
(三)实验仪器
硬件: PC机 1台 MagicARM2410教学实验开发平台 1台
软件: Windows 98/2000/XP操作系统 ADS 1.2集成开发环境
(四)实验原理
1、 使用S3C2410A的定时器0实现30秒的定时并产生中断,每产生一次中断即控制LED显示一次数据。
2、 S3C2410A具有5个16位定时器,其中有4个可以来控制PWM信号输出,所以称它们为PWM定时器。定时器的时钟源是PCLK,5个定时器共享2个8位预分频器,经过预分频器之后,每个定时器还拥有4个不同分频信号(1/2,1/4,1/8和1/16)输出的时钟分割器,这样就可以使定时器的时钟范围更大。预分频器的设置通过TCFG0寄存器实现,时钟分割器的分频选择(即定时器时钟源选择)设置通过TCFG1寄存器实现;
3、 定时器是减法计数的,当定时器TCNTn的值倒数到0时,TCNTBn寄存器的值会被自动的加载到定时器继续下一次定时操作。当定时器TCNTn的值倒数到0时,如果中断使能,将会产生一次定时器中断请求;
4、 PWM定时器功能框图;
5、
PWM定时器基本操作图;
6、TCFG0和TCFG1寄存器;
7、
TCON寄存器;
(五) 实验步骤:
(1) 启动ADS 1.2,使用ARM Executable Image for DeviceARM2410工程模板建立一个工程TimeOut。
(2) 在工程src组中的main.c中编写实验代码。
(3) 选用DebugRel生成目标,然后编译链接工程。
(4) 将MagicARM2410实验箱上的蜂鸣器控制电路的跳线JP9短接,将启动方式选择跳线JP8短接,然后按RST键复位系统。
(5) 选择【Project】->【Debug】,启动AXD进行JTAG仿真调试。
(6) 在中断服务函数中设置断点,全速运行程序观察是否能产生定时器中断。取消设置断点,全速运行程序,蜂鸣器应每秒响一声。
(六)实验程序
#include "config.h"
// 定义蜂鸣器控制口
#define BEEP (1<<10) /* GPH10口 */
#define BEEP_MASK (~BEEP)
uint8 num = 0;
uint32 led_dat=0;
void DelayNS(uint32 dly)
{ uint32 i;
for(; dly>0; dly--)
for(i=0; i<50000; i++);
}
void LED_DispNum(uint32 dat)
{ dat = dat & 0x0000000F; // 参数过滤
// 控制LED4、LED3显示(d3、d2位)
if(dat & 0x08) rGPHDAT = rGPHDAT | (0x01<<6);
else rGPHDAT = rGPHDAT & (~(0x01<<6));
if(dat & 0x04) rGPHDAT = rGPHDAT | (0x01<<4);
else rGPHDAT = rGPHDAT & (~(0x01<<4));
// 控制LED2、LED1显示(d1、d0位)
rGPEDAT = (rGPEDAT & (~(0x03<<11))) | ((dat&0x03) << 11);
}
void IRQ_Time0(void)
{ num++;
if(num>=6)
{ led_dat++;
LED_DispNum(led_dat);
num = 0;
}
// 清除中断标志
rSRCPND = 1<<10;
rINTPND = rINTPND;
}
int main(void)
{ // 初始化I/O
rGPHCON = (rGPHCON & (~(0x03<<20))) | (0x01<<20); // rGPHCON[21:20] = 01b,设置GPH10为GPIO输出模式
rGPHDAT = rGPHDAT | BEEP; // 防止蜂鸣器响
rGPECON = (rGPECON & (~(0x0F<<22))) | (0x05<<22); // rGPECON[25:22] = 0101b,设置GPE11、GPE12为GPIO输出模式
rGPHCON = (rGPHCON & (~(0x33<<8))) | (0x11<<8); // rGPHCON[13:8] = 01xx01b,设置GPH4、GPH6为GPIO输出模式
// 设置中断服务程序
VICVectAddr[10] = (uint32) IRQ_Time0;
// 设置中断控制器
rPRIORITY = 0x00000000; // 使用默认的固定的优先级
rINTMOD = 0x00000000; // 所有中断均为IRQ中断
rINTMSK = ~(1<<10); // 打开TIMER0中断允许
// 定时器设置
// Fclk=200MHz,时钟分频配置为1:2:4,即Pclk=50MHz。
rTCFG0 = 255; // 预分频器0设置为250,取得200KHz
rTCFG1 = 3; // TIMER0再取1/4分频,取得50KHz
rTCMPB0 = 0x0000; // 设置定时器为0
rTCNTB0 = 61035; // 定时0.5秒
rTCON = (1<<1); // 更新定时器数据
rTCON = (1<<0)|(1<<3); // 启动定时器
LED_DispNum(led_dat);
IRQEnable(); // 使能IRQ中断(CPSR)
while(1);
return(0);
}
(七) 实验现象描述:
(八) 实验心得: