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

📄 main.c

📁 SmartARM2400系列开发板全套资料
💻 C
字号:
/****************************************Copyright (c)****************************************************
**                         Guangzhou ZHIYUAN electronics Co.,LTD.                               
**                                     
**                               http://www.embedtools.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:
** Modified date:
** Version:
** Descriptions:
**
*********************************************************************************************************/
#include "main.h"

/*********************************************************************************************************
  TASK0 任务ID、优先级、堆栈设置及函数声明                                
*********************************************************************************************************/
#define TASK0_ID            12                                          /* 任务的ID                     */
#define TASK0_PRIO          TASK0_ID                                    /* 任务的优先级                 */
#define TASK0_STACK_SIZE    512                                         /* 定义用户堆栈长度             */
OS_STK  TASK0_STACK[TASK0_STACK_SIZE];                                  /* 定义任务0 堆栈               */
void    task0(void *pdata);                                             /* 声明任务0                    */

/*********************************************************************************************************
  TASK1 任务ID、优先级、堆栈设置及函数声明                                
*********************************************************************************************************/
#define TASKI2CTEST_ID                  6                               /* 任务的ID                     */
#define TASKI2CTEST_PRIO                TASKI2CTEST_ID                  /* 任务的优先级                 */
#define TASKI2CTEST_STACK_SIZE          512                             /* 定义用户堆栈长度             */
OS_STK  TASKI2CTEST_STACK[TASKI2CTEST_STACK_SIZE];                      /* 定义任务1 堆栈               */
void    taskI2cTest(void *pdata);                                       /* 声明任务1                    */
/*********************************************************************************************************
  TASK2 任务ID、优先级、堆栈设置及函数声明                                
*********************************************************************************************************/   
#define TASK_TEST_RESULT_ID             13                              /* 任务的ID                     */
#define TASK_TEST_RESULT_PRIO           TASK_TEST_RESULT_ID             /* 任务的优先级                 */
#define TASK_TEST_RESULT_STACK_SIZE     512                             /* 定义用户堆栈长度             */
OS_STK  TASK_TEST_RESULT_STACK[TASK_TEST_RESULT_STACK_SIZE];            /* 定义任务2 堆栈               */
void    taskTestResult	(void *pdata);                                  /* 声明任务2                    */


/*********************************************************************************************************
  定义FRAM存储器的地址
*********************************************************************************************************/
#define CAT24WC04_ADDR      0xA4
#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;
 
    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 = (uint8 *)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<<15;                                                  /*  清除中断源                  */
    OSSemPost(Gpose7290IntSem);                                         /*  发送信号量                  */
    VICVectAddr = 0;                                                    /*  清除VIC                     */
}

/*********************************************************************************************************
** Function name: TASKI2CTEST
** Descriptions:  无
** Input:         无
** Output:        无 
*********************************************************************************************************/
void taskI2cTest (void *pdata)
{
    uint8   ucReadFramBuf[40];
    uint8   ucI2cStat;
    uint8   ucerr;                                                      /*  操作系统错误返回变量        */
    uint8   ucKey;
    char    str[] = "www.zlgmcu.com";
	pdata = pdata;
	
	PINSEL1 &= ~((3 << 22) | (3 << 24));                                /*  设置I2C管脚功能             */
	PINSEL1 |= (1 << 22) | (1 << 24);                                   /*  设置I2C管脚功能             */
	PINSEL1 |= (3 << 6) | (3 << 8);
	
	PINSEL0 &= 0x3fffffff;
	IO0IntEnF |= 1 << 15;
	
	SetVICIRQ(9, 2, (int)i2c0IRQ);                                      /*  I2C中断设置                 */
	SetVICIRQ(19, 3, (int)i2c1IRQ);    
	SetVICIRQ(17,4, (int)GpioIntISR);                                   /*  GPIO中断设置                */	
	
	i2cInit(0, "Speed=10000", NULL);
	i2cInit(1, "Speed=10000", NULL);                                    /*  初始化I2C0                  */
	OSTimeDly(50);
    i2cWrite(0,                                                         /*  I2C0                        */
             CAT24WC04_ADDR,                                            /*  器件地址                    */
             (uint8*)str,                                               /*  要写入数据的缓冲区          */
             0,                                                         /*  器件子地址                  */
             1,                                                         /*  器件子地址类型为单字节型    */
             sizeof(str));                                              /*  写入的数量                  */
     OSTimeDly(50);
        
     i2cRead( 0,                                                        /*  I2C0                        */
              CAT24WC04_ADDR,                                           /*  器件地址                    */
              ucReadFramBuf,                                            /*  接收数据的缓冲区            */
              0,                                                        /*  器件子地址                  */
              1,                                                        /*  器件子地址类型为单字节型    */
              sizeof(str));                                             /*  读取数据的长度              */
              
    while (i2cGetFlag(0) == I2C_BUSY);                                  /*  等待I2C总线操作结束         */
              
    if (strcmp((char*)ucReadFramBuf, (char *)str) == 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 FILE
*********************************************************************************************************/

⌨️ 快捷键说明

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