Chinaunix首页 | 论坛 | 博客
  • 博客访问: 112998
  • 博文数量: 23
  • 博客积分: 2092
  • 博客等级: 大尉
  • 技术积分: 305
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-10 19:40
文章分类
文章存档

2011年(3)

2010年(17)

2009年(3)

我的朋友

分类: 嵌入式

2009-11-08 17:25:55

Mini2440 UCOSII 添加按键和蜂鸣器任务

硬件环境:mini2440

软件环境:ADS1.2

前些时候在添加了流水灯任务,今天闲来无事又来玩玩。

任务实现,按键1按下蜂鸣器发出响声。

首先添加蜂鸣器任务。

因为在友善提供的UCOS2里面没有添加蜂鸣器和按键驱动(keyscan.c)上去。因此需要自己手动添加上去。

 

通过查看友善提供的2240test源文件可以找到蜂鸣器以及按键驱动。

 

蜂鸣器包括以下3个函数:

 

void Buzzer_Freq_Set( U32 freq )

{

       rGPBCON &= ~3;                   //set GPB0 as tout0, pwm output

       rGPBCON |= 2;

      

       rTCFG0 &= ~0xff;

       rTCFG0 |= 15;                   //prescaler = 15+1

       rTCFG1 &= ~0xf;

       rTCFG1 |= 2;                     //mux = 1/8

       rTCNTB0 = (PCLK>>7)/freq;

       rTCMPB0 = rTCNTB0>>1;     // 50%

       rTCON &= ~0x1f;

       rTCON |= 0xb;                  //disable deadzone, auto-reload, inv-off, update TCNTB0&TCMPB0, start timer 0

       rTCON &= ~2;                 //clear manual update bit

}

 

void Buzzer_Stop( void )

{

       rGPBCON &= ~3;                   //set GPB0 as output

       rGPBCON |= 1;

       rGPBDAT &= ~1;

}

 

//***************************[ BOARDBEEP ]**************************

void Beep(U32 freq, U32 ms)

{

       Buzzer_Freq_Set( freq ) ;

       Delay( ms ) ;

       Buzzer_Stop() ;

}

以上3个函数都是在2440lib.c中。由于原来的UCOS2没有加上,因此copy3个函数到2440lib.c适当的位置。

另外2440lib.c对应的头文件是2440lib.h默认的时候,没有将其包含进来,因此呢我们打开config.h文件将里面的注释删除掉。//#include "2440lib.h" 改为#include "2440lib.h"

 

按键驱动是keyscan.cmini2440testsource文件夹下可以找到。我们将此文件复制到uCos2\S3C2440\source文件夹下。做一下修改就可以了

 

/**************************************************************
4*4 Key Scan
**************************************************************/

//#include "def.h"//一些定义在S3C2440\includes\Def1.h用到的已有了定义

//注释掉
#include "option.h"
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"

/******************************************************************************
 1X6 矩阵键盘
六个输入引脚: EINT8 -----( GPG0  )
    EINT11 -----( GPG3  )
    EINT13-----( GPG5  )
    EINT14-----( GPG6 )
    EINT15-----( GPG7 )
    EINT19-----( GPG11 )
    
    
*********************************************************************
U8 Key_Scan( void )
{
 Delay( 80 ) ;

 if(      (rGPGDAT&(1<< 0)) == 0 ) 
  return 1 ;
 else if( (rGPGDAT&(1<< 3)) == 0 )
  return 2;
 else if( (rGPGDAT&(1<< 5)) == 0 )
  return 3 ;
 else if( (rGPGDAT&(1<< 6)) == 0 )
  return 4 ;
 else if( (rGPGDAT&(1<< 7)) == 0 )
  return 5 ;
 else if( (rGPGDAT&(1<<11)) == 0 )
  return 6 ;
 else
  return 0xff;

}

static void __irq Key_ISR(void)
{
 U8 key;
 U32 r;

 EnterCritical(&r);
 if(rINTPND==BIT_EINT8_23) {
  ClearPending(BIT_EINT8_23);
  if(rEINTPEND&(1<<8)) {
  //Uart_Printf("eint11\n");
   rEINTPEND |= 1<< 8;
  }
  if(rEINTPEND&(1<<11)) {
  //Uart_Printf("eint11\n");
   rEINTPEND |= 1<< 11;
  }
  if(rEINTPEND&(1<<13)) {
  //Uart_Printf("eint11\n");
   rEINTPEND |= 1<< 13;
  }
  if(rEINTPEND&(1<<14)) {
  //Uart_Printf("eint11\n");
   rEINTPEND |= 1<< 14;
  }
  if(rEINTPEND&(1<<15)) {
  //Uart_Printf("eint11\n");
   rEINTPEND |= 1<< 15;
  }
  if(rEINTPEND&(1<<19)) {
  // Uart_Printf("eint19\n");  
   rEINTPEND |= 1<< 19;
  }
 }

//以下是扫描测试注释掉

 /*key=Key_Scan();
 if( key == 0xff )
  Uart_Printf( "Interrupt occur... Key is released!\n") ;
 else
  Uart_Printf( "Interrupt occur... K%d is pressed!\n", key) ;*/

 

 ExitCritical(&r); //关闭中断
}

//以下是按键的测试也注释掉

/*void KeyScan_Test(void){}

 

到此我们就可以添加按键和蜂鸣器任务了。

 

只列出部分代码:

 

#include "config.h"

 

//=======================================

#include "app_cfg.h"

#include "Printf.h"

//=========================================

OS_STK  MainTaskStk[MainTaskStkLengh];

OS_STK      Task0Stk [Task0StkLengh];       // Define the Task0 stack

OS_STK      Task1Stk [Task1StkLengh];       // Define the Task1 stack

OS_STK      Task2Stk [Task2StkLengh];       // Define the Task1 stack

OS_STK      TaskledStk [TaskledStkLengh];       // Define the Taskled stack

OS_STK      TaskBeepStk [TaskBeepStkLengh];       // 蜂鸣器任务

OS_STK      TaskKeyStk [TaskKeyStkLengh];       // 按键任务

*********************************************************************

 

//在主任务中创建按键任务,然后在按键任务中调用蜂鸣器任务。

 

void MainTask(void *pdata) //Main Task create taks0 and task1

{

  

   #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */

   OS_CPU_SR  cpu_sr;

   #endif

   OS_ENTER_CRITICAL();

    

       Timer0Init();//initial timer0 for ucos time tick

       ISRInit();   //initial interrupt prio or enable or disable

       //GUI_Init();

       OS_EXIT_CRITICAL();

   

       OSPrintfInit();//use task to print massage to Uart

   

       OSStatInit();

       OSTaskCreate (Task0,(void *)0, &Task0Stk[Task0StkLengh - 1], Task0Prio);    

       //OSTaskCreate (Task1,(void *)0, &Task1Stk[Task1StkLengh - 1], Task1Prio);  

       OSTaskCreate (Task2,(void *)0, &Task2Stk[Task2StkLengh - 1], Task2Prio);

       OSTaskCreate (Taskled,(void *)0, &TaskledStk[TaskledStkLengh - 1], TaskledPrio);

       OSTaskCreate (TaskKey,(void *)0, &TaskKeyStk[TaskBeepStkLengh - 1], TaskKeyPrio);

               

        while(1)

        {

        

          //  GUI_DispString("hello word");

         OSPrintf("\nEnter Main Task\n");

         OSTimeDly(OS_TICKS_PER_SEC);

              

        }

 

}

 

*********************************************************************

按键任务

void TaskKey       (void *pdata) //task for test

{

 

       //U16 TestCnt=0;

       //U16 Version;

       //Version=OSVersion();     

          

       while (1)

       {

   

       // TestCnt++;

    // OSPrintf("********************************\n");

   //  OSPrintf("Enter TaskKey Cnt=%d\n",TestCnt);      

     OSPrintf("Enter TaskKey\n");

   //  OSPrintf("uC/OS Version:V%4.2f\n",(float)Version*0.01);//ucos version

    // OSPrintf("********************************\n");

    

    

     OSTimeDly(OS_TICKS_PER_SEC/50);

     if(Key_Scan()!=1)

     {

         continue;

     }

     OSTimeDly(OS_TICKS_PER_SEC/50);        //去掉按键抖动

     if(Key_Scan()!=1)                           //确认是按键1

     {

         continue;

     }

    

     OSTaskCreate (TaskBeep,(void *)0, &TaskBeepStk[TaskBeepStkLengh - 1], TaskBeepPrio);

    

     while(Key_Scan()!=0XFF)

     {

    

        OSTimeDly(OS_TICKS_PER_SEC/50);

     }

 

       }

}

 

*********************************************************************

蜂鸣器任务:

 

void TaskBeep     (void *pdata) //task for test

{

      

       //U16 TestCnt=0;

       //U16 Version;

       //U8  i;

 

       //Version=OSVersion();     

   

          

       while (1)

       {

   

       // TestCnt++;

   //  OSPrintf("********************************\n");

   //  OSPrintf("Enter TaskBeep Cnt=%d\n",TestCnt);     

     OSPrintf("Enter TaskBeep\n");

   //  OSPrintf("uC/OS Version:V%4.2f\n",(float)Version*0.01);//ucos version

   //  OSPrintf("********************************\n");

    

        Beep(1000, 100);

              //Beep(1500, 50);

              ///Beep(2000, 50);

              Beep(2500, 50);

              //Beep(3000, 100);

              //Beep(3500, 50);

 

      OSTaskDel(OS_PRIO_SELF);  //任务自身删除

    // OSTimeDly(OS_TICKS_PER_SEC);

 

       }

}

 

到此就完成了任务的添加。下载到板子上运行就可以看到效果了。

 

有个问题是按键按下去后运行的速度明显比没有按下去的速度慢了很多。不知道什么原因,恳请大牛指教。

 

 

阅读(3540) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~