📄 复件 main.c
字号:
/****************************************Copyright (c)**************************************************
** 苏州江海通讯发展实业有限公司
** 设计三室
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件名: main.c
**创 建人: 黄凯
** 版 本: v2.0
**最后修改日期: 2007年01月4日
**描 述: 29号机控制软件
**操作系统版本:uc/os-II v2.52
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 黄凯
** 版 本: v1.0
** 日 期: 2006年11月10日
** 描 述: 原始版本
**
**------------------------------------------------------------------------------------------------------
** 修改人: 黄凯
** 版 本: v1.1
** 日 期: 2006年11月14日
** 描 述: 按照标准c格式修改书写格式
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 黄凯
** 日 期: 2006年12月10日
** 描 述: 按照新的跳频方案改写程序
**
**---------------------------------------------------------------------------------------------
*************************************************************************************************/
#include "config.h"
#include "stdlib.h"
extern INT8U fre_char3[100][3841];
#define EachGroupLen 3841
#define MaxGroupNo 99
#define MinGroupNo 0
#define MaxFreValue 41
#define MinFreValue 1
#define BegSector 9
#define EndSector 21 //384k
#define SectorAddr 0x00010000
#define WriteDataLen 512*8 //每次IAP数据长度
#define Len 512*16+8 //每次接收数据长度
#define TotalLen 3841*10 //数据总长
#define ShakeHander 0x28 //握手信号
#define FreSaveAddr 3
#define PowSaveAddr 4
#define FreConvAddr 5
#define FreTabUpdataLen 96
#define Uart1ReceStkLen 96
#define InfoGatherStkLen 96
#define Each3sCommStkLen 96
OS_STK FreTabUpdataStk[FreTabUpdataLen];
OS_STK Uart1ReceStk[Uart1ReceStkLen];
OS_STK InfoGatherStk[InfoGatherStkLen];
OS_STK Each3sCommStk[Each3sCommStkLen];
OS_EVENT *ReceMbox;
#define test_on() { IO1SET = 1<<24; }
#define test_off() { IO1CLR = 1<<24; }
#define sel_led_on() { IO0CLR = 1<<18; }
#define sel_led_off() { IO0SET = 1<<18; }
#define sn74_oe_on() { IO0CLR = 1<<19; }
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 freconvon : 1; //设备状态(0: 定频中; 1: 跳频中)
unsigned freconvkey : 1; //跳频按键状态(0: 释放; 1: 按下)
unsigned freconvswitch : 1; //跳频开关(0: 断开; 1: 闭合)
unsigned firstiap : 1; //IAP状态(0:未开始;1:已开始)
} BITS;
BITS flgs;
struct back0 {
INT8U ffre;
INT8U ppow;
} back ;
/*****
INT8U const 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_group; //保存跳频图谱组号
INT8U fre_char2[EachGroupLen];//保存跳频表
INT32U fre_cnt; //保存跳频计数
INT32U rece_data[(Len+1)/4];
void FreTblUpdata(void *pdata);
void Uart1Rece(void *pdata);
void InfoGather(void *pdata);
void Each3sComm(void *pdata);
void CtrlOut(INT8U ctrl_data, INT8U ctrl_no);
void LedRefresh(INT8U dat,INT8U fresh_no);
void LpcInitialize(void);
void KeyDecode(INT8U key_value);
void FrePowChange(void);
void Eint2Exception(void);
void Eint3Exception(void);
void FreConverInfo(void);
void WarnInfo(void);
void KeyInfo(void);
INT8U Uart1Send(void);
void I2cE2rom(INT8U SaveAddr, INT8U const *SaveData, INT8U SaveNo);
/*****************************************************************************************
** 函数名称: FreTabUpdate
** 功能描述: 更新跳频表 注意:每次更新数据长度不能超过384k
** 输 入: pdata 任务附加参数(指针)
** 输 出: 无
** 全局变量: 无
** 调用模块:
**
** 作 者: 黄凯
** 日 期: 2006年12月30日
**------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-----------------------------------------------------------------------------------------------
*********************************************************************************/
void FreTabUpdate(void *pdata){
INT8U *cp;
INT8U i;
INT8U temp[3];
INT16U rxlen; //每次串口接收长度
INT16U rxlen1; //每组发送数据长度(包括起始符、终止符、长度及crc值)
INT32U rxedlen; //总的接收长度(不包括起始符、终止符、长度及crc值)
INT32U x;
INT32U iapcnt2;
INT32U iapcnt3;
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
pdata = pdata;
LpcInitialize();
while (1) {
x = 0;
rxlen = 0;
rxedlen = 0;
iapcnt2 = 0;
iapcnt3 = 0;
flgs.firstiap = 0;
cp = (INT8U *)rece_data;
/******debug********
//do
//{
rece_data[0] = 0;
UART_read(0, cp, 1, 0);
//} while (*cp != 0);
fre_group = *cp;
OS_ENTER_CRITICAL();
memcpy(fre_char2, fre_char3[fre_group], EachGroupLen);
OS_EXIT_CRITICAL();
cp = fre_char2;
UART_write(0, cp, EachGroupLen, 12000);
***/
do
{
rece_data[0] = 0;
UART_read(0, cp, 1, 0);
} while (*cp != ShakeHander);
do
{
err:
rxlen = UART_read(0, cp, 4, 20); //接收每组数据的长度
if (rxlen != 4)
{
rxlen = 0;
goto err;
}
rxlen1 = *(cp+2)<<8 + *(cp+3) + 8;
x = rxlen;
do
{
rxlen = UART_read(0, cp+x, Len-x, 20);
x += rxlen;
} while (x<rxlen1);
if ((rxlen=GetCRC16(cp+2, rxlen1-4))!=0) //出错处理
{
rxlen = 0;
temp[0] = 0x1f; //重发本组数据
UART_write(0, temp, 1, 4);
goto err;
}
rxedlen = rxedlen + x - 8;
UART_write(0, cp, Len, 4800);
iapcnt2 = (rxlen1-8) / WriteDataLen; //计算每组数据所需IAP的次数
if (((rxlen1-8) & 0x0fff) != 0)
{
iapcnt2 ++;
}
OS_ENTER_CRITICAL();
temp[0]=MAMCR;
temp[1]=MAMTIM;
temp[2]=(INT8U)PLLSTAT;
MAMCR=0;
PLLCON=0;
PLLFEED = 0XAA;
PLLFEED = 0X55;
ReadParID();
BootCodeID();
if (flgs.firstiap)
{
flgs.firstiap = 1;
SelSector(BegSector,EndSector);
EraseSector(BegSector,EndSector);
BlankCHK(BegSector,EndSector);
}
for (i=iapcnt2; i>0; i--)
{
SelSector(BegSector,EndSector);
RamToFlash(SectorAddr+WriteDataLen*iapcnt3,(INT32U)rece_data+4+WriteDataLen*iapcnt3,WriteDataLen);
iapcnt3++;
}
BlankCHK(BegSector,EndSector);
MAMCR = temp[0];
MAMTIM = temp[1];
PLLCON = 1;
PLLCFG = temp[2];
PLLFEED = 0xaa;
PLLFEED = 0x55;
while((PLLSTAT & (1 << 10)) == 0);
PLLCON = 3;
PLLFEED = 0xaa;
PLLFEED = 0x55;
OS_EXIT_CRITICAL();
temp[0] = 0x0f; //可以接收下一组数据
UART_write(0, temp, 1, 4);
} while(TotalLen > rxedlen);
cp=(INT8U *)SectorAddr;
UART_write(1, cp, Len, 12000);
}
}
/*****************************************************************************************
** 函数名称: Uart1Rece
** 功能描述: 从UART1接收数据
** 输 入: pdata 任务附加参数(指针)
** 输 出: 无
** 全局变量: 无
** 调用模块:
**
** 作 者: 黄凯
** 日 期: 2006年11月10日
**----------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**--------------------------------------------------------------------------------------
*********************************************************************************/
void Uart1Rece(void *pdata){
INT8U Uart1Buf[4];
pdata = pdata;
while (1){
UART_read(1, Uart1Buf, 1, 0);
#ifdef __DEBUG
UART_write(0, Uart1Buf, 1, 3);
#endif
switch (Uart1Buf[0])
{
case 0xf1 :
{
flgs.test = 1;
pow_value = 1;
test_on();
LedRefresh(pow_value,0x0f);
break;
}
case 0xf2 :
{
flgs.test = 0;
pow_value = back.ppow;
test_off();
LedRefresh(pow_value,0x0f);
break;
}
default: break;
}
}
}
/*********************************************************************************************************
** 函数名称: Each3sComm
** 功能描述: 每隔3s发送一次,
** 输 入: pdata 任务附加参数(指针)
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 黄凯
** 日 期: 2006年11月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void Each3sComm(void *pdata){
pdata = pdata ;
while (1)
{
OSTimeDly(3*OS_TICKS_PER_SEC);
Uart1Send();
}
}
/*********************************************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -