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

📄 main.c

📁 ucos II操作系统的源代码。程序完整
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************Copyright (c)**************************************************
**                               苏州江海通讯发展实业有限公司
**                                        设计三室 
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: main.c
**创   建   人: 黄凯
**最后修改日期: 2006年11月16日
**描        述: 27号机控制软件
**操作系统版本:uc/os-II v2.52 
**             
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 黄凯
** 版  本: v1.0
** 日 期: 2006年11月10日
** 描 述: 原始版本
**
**------------------------------------------------------------------------------------------------------
** 修改人: 黄凯
** 版  本: v1.1
** 日 期: 2006年11月14日
** 描 述: 按照标准c格式修改书写格式
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 黄凯
** 日 期: 2006年11月17日
** 描 述: 
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/

#include "config.h"
#include "stdlib.h"

#define  FreSaveAddr            3
#define  PowSaveAddr            5
#define  FreConvAddr            20
#define  TASK_STK_SIZE          64

#define  test_on()      { IO1SET = 1<<24; }
#define  test_off()     { IO1CLR = 1<<24; }

typedef struct _flags {
		unsigned  warn		   	: 1;		//告警标志(0: 正常; 1: 告警)							
		unsigned  key			: 1;		//键盘状态(0: 按下; 1: 释放)						
		unsigned  test			: 1;		//环测标志(0: 拆环; 1: 环测)
		unsigned  fre			: 1;		//频率改变(0: 未变; 1: 改变)					
		unsigned  pow			: 1;		//功率改变(0: 未变; 1: 改变)			
		unsigned  test_change	: 1;		//环测事件(0: 无  ; 1: 有)	
		unsigned  state	        : 1;		//设备状态(0: 定频; 1: 跳频) 
		unsigned  commok        : 1;        //通信标志(0: 失败; 1: 成功) 
		unsigned  change        : 1;		//状态改变(0: 未变; 1: 改变) 	
	} BITS;
BITS  flgs;

struct fre0 {
			INT8U h;
			INT8U l;
			} fre ;
struct back0 {
			INT8U ffre; 
			INT8U ppow;
			} back ;

INT8U fre_char[41]=  {		//频率控制字
					  0X00,0X01,0X02,0X03,0X04,0X05,0X06,0X07,
    				  0X08,0X09,0X0A,0X0B,0X0C,0X0D,0X0E,0X0F,
    				  0X10,0X11,0X12,0X13,0X14,0X15,0X16,0X17,
    				  0X18,0X19,0X1A,0X1B,0X1C,0X1D,0X1E,0X1F,
    				  0X20,0X21,0X22,0X23,0X24,0X25,0X26,0X27,
    				  0X28,
    				  };


INT8U warn_info;	//保存告警信息	
INT8U fre_value;	//保存频率信息
INT8U pow_value;	//保存功率信息
INT8U test_value;	//保存环测信息
INT8U fre_char2[64];//保存跳频表
INT32U fre_cnt;		//保存跳频计数

OS_STK   SendDataStk[TASK_STK_SIZE];
OS_STK   ReceDataStk[2*TASK_STK_SIZE];
OS_STK   InfoGatherStk[TASK_STK_SIZE];
OS_STK   FreConversionStk[TASK_STK_SIZE];
OS_STK   Each10sCommStk[TASK_STK_SIZE];

OS_EVENT *SendMbox;
OS_EVENT *ReceMbox;
OS_EVENT *FreSem;

void  SendData(void *pdata);
void  ReceData(void *pdata);
void  FreConversion(void *pdata);
void  InfoGather(void *pdata);
void  Each10sComm(void *pdata);


void CtrlOut(INT8U ctrl_no);
void LedRefresh(INT8U fresh_no);
void LpcInitialize(void);
void KeyDecode(INT8U key_value);
void FrePowChange(void);
void Eint3Exception(void);
void FreConverInfo(void);
void WarnInfo(void);
void KeyInfo(void);
void ReceDataDecode(INT8U *pp);
void I2cE2rom(INT8U SaveAddr, INT8U const *SaveData, INT8U SaveNo);
/*********************************************************************************************************
** 函数名称: SendData
** 功能描述: 发送数据
** 输 入: pdata 任务附加参数(指针)
** 输 出: 无
** 全局变量: flag.commok
** 调用模块: OSMboxPend
**
** 作 者: 黄凯
** 日 期: 2006年11月10日
**-------------------------------------------------------------------------------------------------------
** 修改人: 黄凯
** 日 期: 2006年12月06日
** 备  注:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void  SendData(void *pdata){
	INT8U i; 
	INT8U err;
	INT8U cnt;   
	INT8U *psd;
	INT8U Sbuf[6];
   
    pdata = pdata;                       
                                     
    while (1){
        psd = (INT8U *)OSMboxPend(SendMbox, 0, &err);         /* 接收数据 */
        cnt = *psd + 4;
        memcpy(Sbuf, psd, cnt);

        UART1Putch(0xb1);
        for (i=0; i<cnt; i++) UART1Putch(Sbuf[i]);
        
        flgs.commok = 0;
        while (!flgs.commok){
        	UART0Putch(0x06);
        	if (UART0Getch(5) == 0x00){
        		UART1Putch(0xb2);
        		psd = Sbuf;
        		for (i=0; i<cnt; i++){
        			UART1Putch(*psd);
				   	UART0Putch(*psd++);
				}
        		if (UART0Getch(5) == 0x0f){
					flgs.commok = 1;
				} 
				else
				{
					flgs.commok = 0;
					OSTimeDly(20);						
				}				
        	}
        	else 
        	{
        		OSTimeDly(20);
        	} 
        }
     psd = (INT8U *)0; 
     U0IER = U0IER | 0x01;  
    }
}
/*********************************************************************************************************
** 函数名称: ReceData
** 功能描述: 从UART0接收数据
** 输 入: pdata        任务附加参数(指针)
** 输 出: 无
** 全局变量: 无
** 调用模块: GetCRC16
**
** 作 者: 黄凯
** 日 期: 2006年11月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void ReceData(void *pdata){
    INT8U *cp;
	INT8U i;	
    INT8U Buf[64];
    
    pdata = pdata;             /* 避免编译警告 */
	
    while (1){
    	while (UART0Getch(0x00) != 0x06);
    	UART0Putch(0x00);
    	cp = Buf;
		*cp++ = UART0Getch(5);	//receive length
		UART1Putch(Buf[0]);
		for (i=0; i<(Buf[0]+3); i++){
			 *cp++ = UART0Getch(5);	
			 UART1Putch(Buf[1+i]);
		}
	
		if (GetCRC16(Buf,(INT16U)(Buf[0]+4)) == 0){ 
			UART0Putch(0x0f);
			UART1Putch(0x0f);
			ReceDataDecode(Buf);					
		} else {
		    UART0Putch(0xff);	//communcate fail	
		    UART1Putch(0xff);	
    	}
	}
}
	
/*********************************************************************************************************
** 函数名称: FreConversion
** 功能描述: 跳频服务程序
** 输 入: pdata        任务附加参数(指针)
** 输 出: 无
** 全局变量: 无
** 调用模块: OSMboxCreate,OSSemCreate
**
** 作 者: 黄凯
** 日 期: 2006年11月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void  FreConversion(void *pdata){
    INT8U *cp;
    INT8U err;
	
    pdata = pdata;  
	
	LpcInitialize();
	
    while(1){
        OSSemPend(FreSem, 0, &err);         /* 等待跳频开始 */
        //************
        cp = fre_char2;
        fre_value = *(cp + (fre_cnt % fre_char[0] + 1));
        if (fre_cnt == 0xffffffff){
			  fre_cnt = 0;
	  	} else {
			 fre_cnt++;
		}
        ////CtrlOut(0x03);  
        /***************/                                       
    }
}

/*********************************************************************************************************
** 函数名称: Each10sComm
** 功能描述: 每隔10s发送一次,来表征设备正在工作
** 输 入: pdata        任务附加参数(指针)
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 黄凯
** 日 期: 2006年11月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void Each10sComm(void *pdata){	
	pdata = pdata ;
	while (1){
		OSTimeDly(10*OS_TICKS_PER_SEC);
		UART0Putch(0x18);
	}
}
/*********************************************************************************************************
** 函数名称: ReceDataDecode
** 功能描述: 处理接收到的数据
** 输 入: pp: 接收数据的指针       
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 黄凯
** 日 期: 2006年11月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/    		
void ReceDataDecode(INT8U *pp){	
			if (*(pp+1) == 0x0a){	//跳频			
				*(pp + 1) = *pp;
				memcpy(fre_char2, (pp + 1), (*pp+1));	//更新跳频表	
				I2cE2rom(FreSaveAddr, (pp + 1), *pp);				
			} else if (*(pp+1) == 0x0c){
				if (*(pp+2) == 0xf1){	//test
					flgs.test = 1;
					pow_value = 1;
					test_on();
				}	
				if (*(pp+2) == 0xf2){	//work
					flgs.test = 0;
					pow_value = back.ppow;
					test_off();
				}	
				LedRefresh(0x0f);
				//CtrlOut(0x0f);				
			}
}

/*********************************************************************************************************
** 函数名称: I2cE2rom
** 功能描述: E2rom烧写
** 输 入: SaveAddr:数据保存地址; 
**		   SaveData:指向被保存数据的指针; 
**         SaveNo  :需保存数据的个数      
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 黄凯
** 日 期: 2006年11月10日
**-------------------------------------------------------------------------------------------------------
** 修改人: 黄凯
** 日 期: 2006年11月16日
** 备  注:改正CAT1025烧写时地址错误
**-------------------------------------------------------------------------------------------------------
** 
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/    		
void I2cE2rom(INT8U SaveAddr, INT8U const *SaveData, INT8U SaveNo){
	INT8U i;
	INT8U x;
	INT8U y;
	INT8U *ptr;
	INT8U I2ctemp[17];
	 
	x = SaveNo / 16;
	y = SaveNo % 16;
	ptr = I2ctemp;

	for (i=0; i<x; i++){		
		*ptr = SaveAddr + 16*i;
		memcpy((ptr + 1), (SaveData + 16*i + 1), 17);
		I2cWrite(CAT1025, I2ctemp, 17);	//write eerom
		OSTimeDly(OS_TICKS_PER_SEC / 100 + 1);
	}	
	if (y != 0){
		*ptr = SaveAddr + 16*x;
		memcpy((ptr + 1), (SaveData + 16*x +1), y);
		I2cWrite(CAT1025, I2ctemp, (y + 1));
		OSTimeDly(OS_TICKS_PER_SEC / 100 + 1);
	}	
}		
	
/*********************************************************************************************************
** 函数名称: LpcInitialize
** 功能描述: 芯片初始化
** 输 入: 无        
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 黄凯
** 日 期: 2006年11月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/    		
void LpcInitialize(void){
	INT8U cp = 0;
		
	FreSem = OSSemCreate(NULL); 
    SendMbox = OSMboxCreate(NULL); 
	ReceMbox = OSMboxCreate(NULL); 
	                        
    if (SendMbox == NULL){
	     while (1);
	}
	//**********************
	if (FreSem ==  NULL) {
		while (1);
	}
	if (ReceMbox == NULL) {
	    while (1);
	}
	/*******************/
	TargetInit(); 
	
	PINSEL1 = (PINSEL1 & 0xcfffffff) | (1<<29);//P0.30 is used as EINT3 
	EXTMODE = 0X08;
	EXTPOLAR = 0X08;
	
	//IO0DIR  = 0X3d233F00;
	IO0DIR  = 0X3d230000;
	IO1DIR  = 0X0F << 16;
    IO1DIR  |=  0X03 << 24;//p1.16:19,P1.24:25 output
    
    cp = FreSaveAddr;
    I2cRead(CAT1025, &fre_value, &cp, 1, 1);
    cp = PowSaveAddr;
    I2cRead(CAT1025, &pow_value, &cp, 1, 1);
    if ((fre_value > 0x29) || (fre_value == 0x00))
    {
    	fre_value = 0x01;
    }
    if (pow_value > 0x04)
    {
    	pow_value = 0x01;
    }   
    back.ffre = fre_value;
	back.ppow = pow_value;
    ////CtrlOut(0x03);
	LedRefresh(0x03);
    //CtrlOut(0x0f);
	LedRefresh(0x0f);
    cp = FreConvAddr;
    I2cRead(CAT1025, fre_char2, &cp, 1, 1);	//length
    cp = FreConvAddr +1;
    I2cRead(CAT1025, &fre_char2[1], &cp, 1, fre_char2[0]);
	
}

/*********************************************************************************************************
** 函数名称: FreConverInfo
** 功能描述: 定频,跳频判断
** 输 入: 无        
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 黄凯
** 日 期: 2006年11月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/    		
void FreConverInfo(void){
	if((IO0PIN & 0X00400000) == 0X00400000) {
		flgs.state = 1;
		warn_info |= 0x80;
		

⌨️ 快捷键说明

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