📄 main.c
字号:
/****************************************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 + -