嵌入式软件开发技术实验报告-定时器

  • 实验目的

(1)掌握嵌入式系统软件设计方法,培养分析问题、解决问题、应用知识的能力和创新精神,全面提高综合素质。

(2)熟悉嵌入式Linux开发环境,学会基于UP-CUP6410-II型平台的Linux开发环境的配置和使用,利用arm-linux-gcc交叉编译程序,使用基于NFS的挂载方式进行GPIO实验,了解嵌入式开发的基本过程;

(3)了解嵌入式Linux裁剪、移植及驱动的编写。

  • 实验内容

(1)基础实验——熟悉嵌入式Linux开发环境,嵌入式数据库应用实验。

(2)图形界面应用程序设计——安装与建立QT桌面运行环境,使用Qt Designer。

(3)内核与根文件系统实验(选做)——Linux内核裁剪、编译、移植,根文件系统建立。

(4)嵌入式Linux驱动实验——LED驱动及控制实验。

  • 实验原理及实验内容

1.实验原理

S3C2440提供具备定时器功能的部件如下,都可以精确的每隔一段时间产生中断:

(1)Timer0—Timer4共5个定时器, Timer0—Timer3可以通过TOUT0—TOUT3引脚输出PWM波,Timer4没有输出引脚。对于每个定时器,每次开始计数时,硬件将TCNTBn 数值加载到TCNTn ,将TCMPBn 数值加载到TCMPn;之后每个计数时钟周期TCNTn自减。

(2)其数值减到等于TCMPn时,TOUTn引脚上的电平发生反转,减至0触发INT_TIMERn内部中断。  RTC实时时钟部件具备毫秒级时间片计时器,产生时间片中断INT_TICK,可以编程设置时间片,每次中断时间最大为小于等于1秒。

(3)看门狗部件可以作为1个常规定时器,计数减到为0则触发INT_WDT内部中断(INT_WDT_AC97的子中断)并自动加载计数。  另外,LED灯连接的引脚为GPB5(nLED1)、GPB6(nLED2)、GPB7(nLED3)、GPB8(nLED4),当引脚输出低电平时,相应LED发光;输出低电平时,相应LED灭。

2.实验内容

S3C2440具有5个16为定时器,每个定时器可以按照中断模式或DMA模式工作。定时器0、1、2、3具有PWM功能。定时器是一个内部定时器,不具有对外输出口线。定时器0还具有死区发生器,通常用于大电流设备。

在单次触下发模式下,定时器完成一次倒计时并产生中断请求后,定时器便停止了。如果要启动下一次计时,需要重新向TCNBn中写入计时值,并重新启动定时器开始工作。

 

void Test_TimerInt(void)

{variable0 = 0;variable1 = 0;variable2 = 0;variable3 = 0;variable4 = 0;

/* Timer0,1,2,3,4 Interrupt service is available */

    rINTMSK = ~(BIT_TIMER4 | BIT_TIMER3 | BIT_TIMER2 | BIT_TIMER1 | BIT_TIMER0);

// Uart_Printf("rINTMSK (After)  = 0x%8x   <= Timer4,3,2,1 Bit[14:10]\n",rINTMSK);

    /* Timer0,1,2,3,4 Interrupt Service Routine Entry Point Determine */

    pISR_TIMER0 = (int)Timer0Done;

    pISR_TIMER1 = (int)Timer1Done;

    pISR_TIMER2 = (int)Timer2Done;

    pISR_TIMER3 = (int)Timer3Done;

    pISR_TIMER4 = (int)Timer4Done;

    Uart_Printf("\n[Timer 0,1,2,3,4 Interrupt Test]\n\n");

    rTCFG0 = rTCFG0 & ~(0xffffff) | 0xff | 0xff<<8; //Dead zone=0,Prescaler1=255(0x0f),Prescaler0=255(0x0f)

    rTCFG1  =rTCFG1 & ~(0xffffff) | 0x001233; //All interrupt,Mux4=1/2,Mux3=1/4,Mux2=1/8,Mux1=1/16,Mux0=1/16

    rTCNTB0 = 30000;         

    rTCNTB1 = 30000;           

    rTCNTB2 = 30000;           

    rTCNTB3 = 30000;        

    rTCNTB4 = 30000;         

    rTCMPB0 = 15000;

    rTCMPB1 = 15000;

    rTCMPB2 = 15000;

    rTCMPB3 = 15000;

    rTCON  = rTCON & ~(0xffffff) | 0x1<<1 | 0x1<<9 | 0x1<<13 | 0x1<<17 | 0x1<<21 ; //Manual update

    rTCON  = rTCON & ~(0xffffff) | 0x1  ; //Timer 0 Start, Auto-reload

    rTCON  = rTCON | 0x1<<8 ; //Timer 1 Start, Auto-reload

    rTCON  = rTCON | 0x1<<12 ; //Timer 2 Start, Auto-reload

    rTCON  = rTCON | 0x1<<16; //Timer 3 Start, Auto-reload

    rTCON  = rTCON | 0x1<<20; //Timer 4 Start, Auto-reload   

    while(1)

{

 if(old_v3!=variable3)

     {//重新启动定时器3   

     rTCON= rTCON&0xf6ffff;

     rTCON  = rTCON | 0x1<<16 ;

     old_v3=variable3;           

     }

       if(old_v2!=variable2)

     {   //重新启动定时器2

     rTCON= rTCON&0xff6fff;

     rTCON  = rTCON | 0x1<<12 ;

     old_v2=variable2;           

     }

     if(old_v1!=variable1)

     {//重新启动定时器1

        rTCON= rTCON&0xfff6ff;

     rTCON  = rTCON | 0x1<<8 ;

     old_v1=variable1;

      }

     if(old_v0!=variable0)

     {//重新启动定时器0   

     rTCON= rTCON&0xfffff6;

     rTCON  = rTCON | 0x1<<0 ;

     old_v0=variable0;           

     }

     if(old_v4!=variable4)

     {//重新启动定时器4

        rTCON= rTCON&0x6fffff;

     rTCON  = rTCON | 0x1<<20 ;

     old_v4=variable4;           

     }

     if(variable4 == 8)

     break;

    }

    //Delay(1); //To compensate timer error(<1 tick period)

    rTCON = 0x0; //Stop Timers

    if(variable4==8 && variable3==4 && variable2==2 && variable1==1 && variable0==1)

{Uart_Printf("Timer 0,1,2,3,4 Auto-reload Interrupt Test => OK!\n");}        

    else

    {Uart_Printf("Timer 0,1,2,3,4 Auto-reload Interrupt Test => Fail............\n");}    

    Uart_Printf("Timer0: %d (=1)\nTimer1: %d (=1)\nTimer2: %d (=2)\nTimer3: %d (=4)\nTimer4: %d (=8)\n",

        variable0,variable1,variable2,variable3,variable4);        

/* Timer0,1,2,3,4 Interrupt Service is masked */

    rINTMSK |= (BIT_TIMER4 | BIT_TIMER3 | BIT_TIMER2 | BIT_TIMER1 | BIT_TIMER0);

Uart_Printf("Press any key\n");      

while(!Uart_Getch());       //Key board press check      

}

定义变量old_v0——old_v4,在Timer.c文件中变量variable0,variable1,variable2,variable3,variable4定义之处添加,如下:

Static volatile int dmaDone,variable0,variable1,variable2,variable3,variable4,old_v4,old_v3,old_v2,old_v1,old_v0;

初始化变量old_v0——old_v4,在void Test_TimerInt(void)函数中,如下:

    variable0 = 0;variable1 = 0;variable2 = 0;variable3 = 0;variable4 = 0; old_v3=0;old_v4=0;old_v2=0;old_v1=0;old_v0=0;

 

 

  • 实验结果展示

在程序没有改动之前,编译程序,下载到实验箱运行,结果如下:

Timer0:1

Timer1:1

Timer2:2

Timer3:4

Timer4:8

编译程序,下载到实验箱运行。运行结果为:

Timer0:1

Timer1:1

Timer2:2

Timer3:4

Timer4:8

 

 

  • 创新点及存在问题

在实验过程中,由于考虑问题不够全面,在修改程序使定时器工作于单次触发模式并完成本实验相同的功能。我们只考虑了定时器控制寄存器中Timer0、Timer1、Timer2、Timer3、Timer4的自动装载位是否启动。其中第3位、第11位、15位、19位、22位置0,使其工作于单次触发模式下。所以我们只把

rTCON  = rTCON & ~(0xffffff) | 0x1;// | 0x1<<3 ; //Timer 0 Start,

rTCON  = rTCON | 0x1<<8 ;//| 0x1<<11 ; //Timer 1 Start,

rTCON  = rTCON | 0x1<<12;// | 0x1<<15 ; //Timer 2 Start, Auto-reload

rTCON  = rTCON | 0x1<<16 ;//| 0x1<<19 ; //Timer 3 Start, Auto-reload

rTCON  = rTCON | 0x1<<20;// | 0x1<<22 ; //Timer 4 Start, Auto-reload   

结果在运行结果后,并没有出现预想的结果。重新改正了程序,并得到了相同的结果。因为还需要在单次触发模式下重新启动定时器。

 定时长度=计时常数/(pclk/(预分频值+1))/分割器值)可以计算出T0:T1:T2:T3:T4=8:8:4:2:1,而中断次数反比于定时长度(相同时间内)Tn0:Tn1:Tn2:Tn3:Tn4=1:1:2:4:8.从而得到了即Timer0——Timer4的中断次数分别是1、1、2、4、8。

  • 实验总结

定时器控制寄存器(TCON)可进行定时器自动重载、手动更新、启动/停止、输入、输入反转及死区使能的设置功能。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
包含代码和文档 实验一 实验内容 编写程序,演示多进程并发执行和进程软中断、管道通信。 父进程使用系统调用pipe( )建立一个管道,然后使用系统调用fork()创建两个子进程,子进程1和子进程2; 子进程1每隔1秒通过管道向子进程2发送数据: I send you x times. (x初值为1,每次发送后做加一操作) 子进程2从管道读出信息,并显示在屏幕上。 父进程用系统调用signal()捕捉来自键盘的中断信号(即按Ctrl+C键);当捕捉到中断信号后,父进程用系统调用Kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止: Child Process l is Killed by Parent! Child Process 2 is Killed by Parent! 父进程等待两个子进程终止后,释放管道并输出如下的信息后终止 Parent Process is Killed! 实验二 实验内容 过Linux多线程与信号灯机制,设计并实现计算机线程与I/O线程共享缓冲区的同步与通信。 程序要求:两个线程,共享公共变量a 线程1负责计算(1到100的累加,每次加一个数) 线程2负责打印(输出累加的中间结果) 实验三 实验内容 利用多个共享内存(有限空间)构成的环形缓冲,将源文件复制到目标文件,实现两个进程的誊抄。 实验四 实验内容 1、(1)Blink程序的编译和下载 (2)给Blink程序加入printf,在每次定时器事件触发点亮LED的同时通过串口显示信息 (3)修改BLink程序,只使用一个Timer,三个LED灯作为3位的二进制数表示(亮灯为1,不亮为0),按照0-7的顺序循环显示,同时将数值显示在终端上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值