实验6 S3C2440定时器应用编程
班级 B12511 姓名 刘贺 学号 20124051136 日期 11 25 成绩评定
1.实验目的
(1)掌握定时器部件的功能,能够通过查找DataSheet进行解决问题; (2)掌握定时器相关寄存器的功能和设置,中断程序的编写与调试。
2.实验环境
普通PC机,Windows系统下安装ADS1.2集成开发环境,ARM实验设备,串口线,USB线,网线。
3.实验原理
S3C2440提供具备定时器功能的部件如下,都可以精确的每隔一段时间产生中断:
(1)Timer0—Timer4共5个定时器, Timer0—Timer3可以通过TOUT0—TOUT3引脚输出PWM波,Timer4没有输出引脚。对于每个定时器,每次开始计数时,硬件将TCNTBn 数值加载到TCNTn ,将TCMPBn 数值加载到TCMPn;之后每个计数时钟周期TCNTn自减1,其数值减到等于TCMPn时,TOUTn引脚上的电平发生反转,减至0触发INT_TIMERn内部中断。
(2)RTC实时时钟部件具备毫秒级时间片计时器,产生时间片中断INT_TICK,可以编程设置时间片,每次中断时间最大为小于等于1秒。 (3)看门狗部件可以作为1个常规定时器,计数减到为0则触发INT_WDT内部中断(INT_WDT_AC97的子中断)并自动加载计数。
另外,LED灯连接的引脚为GPB5(nLED1)、GPB6(nLED2)、GPB7(nLED3)、GPB8(nLED4),当引脚输出低电平时,相应LED发光;输出低电平时,相应LED灭。
1
嵌入式系统基础 实验报告
4.实验步骤与内容
选择使用Timer0、RTC、看门狗其中一个部件,适当设置分频参数产生精确的每1S产生一次中断,控制4个Led灯实现跑马灯效果,LED1亮持续1S灭, LED2亮持续1S灭, LED3亮持续1S灭, LED4亮持续1S灭,循环此过程。 实现程序的C语言部分写在main.c文件中,如下: main.c文件 #include\"2440addr.h\" #include \"def.h\" void __irq timer0_isr(void); #define Led1_On() {rGPBDAT &= ~(1<<5);} #define Led1_Off() {rGPBDAT |= (1<<5);} #define Led2_On() {rGPBDAT &= ~(1<<6);} #define Led2_Off() {rGPBDAT |= (1<<6);} #define Led3_On() {rGPBDAT &= ~(1<<7);} #define Led3_Off() {rGPBDAT |= (1<<7);} #define Led4_On() {rGPBDAT &= ~(1<<8);} #define Led4_Off() {rGPBDAT |= (1<<8);} (1<<7)| (1<<8);}//LED灯相关引脚初始化 void led_init() { rGPBCON &=~((3<<10)|(3<<12)|(3<<14)|(3<<16)); rGPBCON |=((1<<10)|(1<<12)|(1<<14)|(1<<16)); rGPBUP &=~((1<<5)|(1<<6)|(1<<7)|(1<<8)); rGPBDAT |=(1<<5)|(1<<6)|(1<<7)|(1<<8);//初始熄灭 } void timer0_init() { //清除中断相关寄存器 }
rSRCPND |= (1<<10); rINTPND |= (1<<10);//选择中断屏蔽 rINTMSK &= ~(1<<10); pISR_TIMER0 = (unsigned int)timer0_isr;// 中断入口 rTCFG0 &= ~(0xFF); rTCFG0 |= (49<<0); rTCFG1 &= ~(0xF);//rTCFG1 void __irq timer0_isr(void) { static unsigned int count=0; count++; count=count%4; if(count==1) { } if(count==2) { } if(count==3) { } if(count==0) { } rSRCPND |= (1<<10); LEDALL_Off(); Led4_On(); LEDALL_Off(); Led3_On(); LEDALL_Off(); Led2_On(); LEDALL_Off(); Led1_On(); #define LEDALL_Off() {{rGPBDAT |= (1<<5)| (1<<6)| //等价于ClearPending(BIT_TIMER0);清SRCPND,INTPND的定时器0中断标志位 rINTPND |= (1<<10); &= } void Main(void) { led_init(); timer0_init(); while(1) {;} } 2
~( (15<<20)|(15<<0) ); rTCFG1 |= (3<<0); rTCNTB0 =62500;//加载计数 rTCON |= (1<<1); rTCON &= ~(1<<1); rTCON |= ((1<<3)|(1<<2)|(1<<0)); //开始定时器Timer0,自动加载模式 嵌入式系统基础 实验报告
5.实验总结
本次试验是在之前实验的基础上完成的,更加强化了我对中断以及LED小灯实验的理解,实验中出现的一些小问题都相应的解决,希望下次自己继续努力。
3
因篇幅问题不能全部显示,请点此查看更多更全内容