⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 周立功 《μCOS-II微小内核分析与程序设计-基于LPC2300》配套例程源码
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               Guangzou ZLG-MCU Development Co.,LTD.
**                                      graduate school
**                                 http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name:			main.c
** Last modified Date:  2004-09-16
** Last Version:		1.0
** Descriptions:		The main() function example template
**
**------------------------------------------------------------------------------------------------------
** Created by:			Chenmingji
** Created date:		2004-09-16
** Version:				1.0
** Descriptions:		The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:         lixiaocheng
** Modified date:       2007-10-16
** Version:             1.0
** Descriptions:        一个关于UCOSII操作II2C的实验例程
**
********************************************************************************************************/
#include "main.h"
#include "i2c.h"
#include "7290.h"


#define TASKI2CTEST_ID                  15      		                /*  任务的ID                   */
#define TASKI2CTEST_PRIO                TASKI2CTEST_ID		            /*  任务的优先级               */
#define TASKI2CTEST_STACK_SIZE          512     		                /*  定义用户堆栈长度           */   

#define TASK0_ID                        16      		                /*  任务的ID                   */
#define TASK0_PRIO                      TASK0_ID		                /*  任务的优先级               */
#define TASK0_STACK_SIZE                256     		                /*  定义用户堆栈长度           */    

#define TASK_TEST_RESULT_ID             17      		                /*  任务的ID                   */
#define TASK_TEST_RESULT_PRIO           TASK_TEST_RESULT_ID		        /*  任务的优先级               */
#define TASK_TEST_RESULT_STACK_SIZE     512     		                /*  定义用户堆栈长度           */    
   
OS_STK  TASKI2CTEST_STACK[TASKI2CTEST_STACK_SIZE];
OS_STK  TASK0_STACK[TASK0_STACK_SIZE];
OS_STK  TASK_TEST_RESULT_STACK[TASK_TEST_RESULT_STACK_SIZE];

void taskI2cTest( void *pdata);
void TASK0(void *pdata);
void taskTestResult(void *pdata);
/*********************************************************************************************************
  定义FRAM存储器的地址
*********************************************************************************************************/
#define FRAM_ADDR           0xA0
#define ZLG7290_ADDR        0x70

/*********************************************************************************************************
  定义一个各个任务之间通讯的邮箱
*********************************************************************************************************/
OS_EVENT    *GposeI2cStatMbox;
OS_EVENT    *Gpose7290IntSem;

/*********************************************************************************************************
** Function name : main
** Descriptions  : 主函数
** Input         : 无 
** Output        : 无 
** Created Date  : 2006-04-11
*********************************************************************************************************/
int main (void)
{
    OSInit(); 
    OSTaskCreateExt(TASK0,
                    (void *)0,
                    &TASK0_STACK[TASK0_STACK_SIZE-1],
                    TASK0_PRIO,
                    TASK0_ID,
                    &TASK0_STACK[0],
                    TASK0_STACK_SIZE,
                    (void *)0,
                    OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); 
                              
    OSStart();                                       
}
		
/*********************************************************************************************************
** Function name: TASK0
** Descriptions:  无
** Input:         无
** Output:        无 
*********************************************************************************************************/
void TASK0	(void *pdata)
{
	pdata = pdata;
#if OS_CRITICAL_METHOD == 3				// Allocate storage for CPU status register
    OS_CPU_SR  cpu_sr;
#endif	
    TargetInit(); 
        
	GposeI2cStatMbox = OSMboxCreate((void*)NULL);                       /*  创建一个邮箱                 */
	Gpose7290IntSem  = OSSemCreate(0);                                  /*  创建一个信号量               */
	
	if (!GposeI2cStatMbox) {
	    OSTaskSuspend(OS_PRIO_SELF);
	}
	if (!Gpose7290IntSem) {
	    OSTaskSuspend(OS_PRIO_SELF);
	}
	
    BUZZER_Set();                                                       /*  启动鸣叫两声                 */
	OSTimeDly(OS_TICKS_PER_SEC/10);
	BUZZER_Clr();
	OSTimeDly(OS_TICKS_PER_SEC/10);
	
	BUZZER_Set();
	OSTimeDly(OS_TICKS_PER_SEC/10);
	BUZZER_Clr();
	OSTimeDly(OS_TICKS_PER_SEC/5);
	OSTimeDly(1*OS_TICKS_PER_SEC);                                      /*  延时1秒好区别后面蜂鸣器      */
	
	OSTaskCreateExt(taskTestResult,
                    (void *)0,
                    &TASK_TEST_RESULT_STACK[TASK_TEST_RESULT_STACK_SIZE-1],
                    TASK_TEST_RESULT_PRIO,
                    TASK_TEST_RESULT_ID,
                    &TASK_TEST_RESULT_STACK[0],
                    TASK_TEST_RESULT_STACK_SIZE,
                    (void *)0,
                    OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);  

    OSTaskCreateExt(taskI2cTest,
                    (void *)0,
                    &TASKI2CTEST_STACK[TASKI2CTEST_STACK_SIZE-1],
                    TASKI2CTEST_PRIO,
                    TASKI2CTEST_ID,
                    &TASKI2CTEST_STACK[0],
                    TASKI2CTEST_STACK_SIZE,
                    (void *)0,
                    OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);  
   	while (1)
	{	
		OSTimeDly(OS_TICKS_PER_SEC);
	}
}

/*********************************************************************************************************
** Function name: beepCpl
** Descriptions:  让蜂鸣器鸣叫指定次数
** Input:         uiParmCout  指定鸣叫的次数
** Output:        无 
*********************************************************************************************************/
void beepCpl ( uint32 uiParmCout )
{
    uint32 i;
    
    for (i = 0; i < uiParmCout; i++ ) {
		 BUZZER_Set();
	  	 OSTimeDly(OS_TICKS_PER_SEC / 2);
		 BUZZER_Clr();		
		 OSTimeDly(OS_TICKS_PER_SEC / 2);
    }
}

/*********************************************************************************************************
** Function name: testResult
** Descriptions:  无
** Input:         无
** Output:        无 
*********************************************************************************************************/
void taskTestResult	(void *pdata)
{
    uint8   ucerr;
    uint8  *ucResult;
    
	pdata = pdata;	
	while(1) {
	    ucResult = OSMboxPend(GposeI2cStatMbox, 0, &ucerr);             /*  等待消息邮箱               */
	    if (ucerr == OS_NO_ERR) {                                       
	        switch(*ucResult) {                                         /*  检查邮箱传送过来的结果     */
	        
	        case 1:                                                     /*  结果是I2C读写结果正确      */
	            beepCpl(1);
	        break;
	        
	        case 3:                                                     /*  结果是I2C读写结果错误      */
	            beepCpl(3);
	        break;
	        
	        default:                                                    /*  其他未知情况               */
	            beepCpl(4);                                             /*  蜂鸣四下                   */
	        break;
	        }
	    }		
	}	    
}

/*********************************************************************************************************
** Function name: GpioIntISR
** Descriptions:  Gpio中断服务程序
** Input:         无
** Output:        无 
*********************************************************************************************************/
void GpioIntISR (void)
{
    IO0IntClr = 1<<25;                                                  /*  清除中断源                  */
    OSSemPost(Gpose7290IntSem);                                         /*  发送信号量                  */
    VICVectAddr = 0;                                                    /*  清除VIC                     */
}

/*********************************************************************************************************
** Function name: TASKI2CTEST
** Descriptions:  无
** Input:         无
** Output:        无 
*********************************************************************************************************/
void taskI2cTest (void *pdata)
{
    uint8   ucReadFramBuf[40];
    uint8   ucI2cStat;
    uint8   ucerr;                                                      /*  操作系统错误返回变量        */
    uint8   ucKey;
    
	pdata = pdata;
	
	PINSEL1 |= (1 << 22) | (1 << 24);                                   /*  设置I2C管脚功能             */
    PINSEL1 &= ~(3<<18);                                                /*  设置外部中断管脚连接        */
    IO0IntEnF |= 1<<25;                                                 /*  设置P0.25为GPIO中断响应     */	
	
	SetVICIRQ(9, 2, (int)i2c0IRQ);                                      /*  I2C中断设置                 */
	SetVICIRQ(17,3,(int)GpioIntISR);                                    /*  GPIO中断设置                */	
	
	i2cInit(0, "Speed=100000", NULL);                                   /*  初始化I2C0                  */
	
    i2cWrite(0,                                                         /*  I2C0                        */
             FRAM_ADDR,                                                 /*  器件地址                    */
             (uint8*)"this is lpc2378 test program!!",                  /*  要写入数据的缓冲区          */
             0,                                                         /*  器件子地址                  */
             1,                                                         /*  器件子地址类型为单字节型    */
             sizeof("this is lpc2378 test program!!"));                 /*  写入的数量                  */
             
     i2cRead( 0,                                                        /*  I2C0                        */
              FRAM_ADDR,                                                /*  器件地址                    */
              ucReadFramBuf,                                            /*  接收数据的缓冲区            */
              0,                                                        /*  器件子地址                  */
              1,                                                        /*  器件子地址类型为单字节型    */
              sizeof("this is lpc2378 test program!!"));                /*  读取数据的长度              */
              
    while (i2cGetFlag(0) == I2C_BUSY);                                  /*  等待I2C总线操作结束         */
              
    if (strcmp((char*)ucReadFramBuf, (char *)"this is lpc2378 test program!!") == 0) {
        ucI2cStat = 1;
    } else {
        ucI2cStat = 3;
    }
    
    OSMboxPost(GposeI2cStatMbox, &ucI2cStat);                           /*  发送I2C状态信号量          */
    
    zlg7290LEDTest();
	while(1) {
	    OSSemPend(Gpose7290IntSem, 0, &ucerr);                          /*  等待7290是否有键按下       */
	    if (ucerr != OS_NO_ERR) {
	        continue;
	    }
	    ucKey = zlg7290GetKey();                                               /*  获取键值                   */
	    if (ucKey > 8) {                                                /*  键值判断                   */
	        ucKey = 8;
	    }
	    if (ucKey == 0) {
	        continue;
	    }
	    zlg7290FlashContrl((ucKey - 1), 1);                                    /*  根据不同的键值闪烁不同的LED*/
	}
}


/*********************************************************************************************************
**                            End Of File
*********************************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -