分类: 嵌入式
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 &= ~0x
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没有加上,因此copy这3个函数到2440lib.c适当的位置。
另外2440lib.c对应的头文件是2440lib.h默认的时候,没有将其包含进来,因此呢我们打开config.h文件将里面的注释删除掉。//#include "2440lib.h" 改为#include "2440lib.h"。
按键驱动是keyscan.c在mini2440test的source文件夹下可以找到。我们将此文件复制到uCos2\S3C2440\source文件夹下。做一下修改就可以了
/**************************************************************
4*4 Key Scan
**************************************************************/
//#include "def.h"//一些定义在S
//注释掉
#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%
// 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%
// 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);
}
}
到此就完成了任务的添加。下载到板子上运行就可以看到效果了。
有个问题是按键按下去后运行的速度明显比没有按下去的速度慢了很多。不知道什么原因,恳请大牛指教。