/****************************************Copyright (c)**************************************************
** Graduate of Xidian Unversity
** WANG TINGGUANG
**--------------File Info-------------------------------------------------------------------------------
** File name: main.c
** Last modified Date: 2008-06-19
** Last Version: 1.0
** Descriptions: 基于GPSOne的CDMA车辆报警器主程序,通过UART0控制DTGS-800模块,实现车辆报警、定位等功能
**
********************************************************************************************************/
#include "config.h"
#include "include.h"
#include "I2CINT.h"
/*
*********************************************************************************************************
** 函数名称 :main()
** 函数功能 :系统主程序
** 调试说明 :
*********************************************************************************************************
*/
int main (void)
{
Init_VAR(); //初始化变量
Init_IO(); //引脚初始化
Init_UART0(UART_BPS, set); //串口0初始化
CDMA_RST(); //CDMA模块复位
Init_SFReg(); //初始化定时器、中断相关的寄存器
Init_I2c(100000); //初始化I2C
Init_Device(); //设备初始化
Init_CCS() ; //初始化中心号码
Init_OWNERTEL(); //初始化车主号码
Init_HELPTEL(); //初始化求救号码
Init_SIMNO(); //初始化报警器号码
Init_PassWord(); //初始化旁路及其密码
Init_Other(); //初始化其他标志,如布防标志
Init_WATCHDOG(); //初始化看门狗
while(1)
{
//Task1:
if (RCVGSM_ID==1)
{
Proc_GSMCMD(); //处理收到的DTGS-800数据
RCVGSM_ID=0;
}
//Task2:
if ((STARTDLY_ID==0)&&(SNDLY_ID==0) && (ACKWT_ID==0)&&(OVTM_ID==0))
{
Task_ATCMD(); //发送AT指令及短信
}
//Task3
if (SCAN_ID==1)
{
SCAN_ID=0;
SCAN_IN(); //输入扫描 //test++
}
//Task4
if (WTDOG_ID==1)
{
IRQDisable(); //关中断
WDFEED = 0xAA; //第一次喂狗启动WDT
WDFEED = 0x55; //喂狗序列
IRQEnable(); //开中断
WTDOG_ID=0;
}
}
return 0;
}
/*
*********************************************************************************************************
** 函数名称 :Init_VAR()()
** 函数功能 :变量初始化
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************
*/
void Init_VAR(void)
{
uchar i;
for (i=1;i<=99;i++) SendBuf[i]=0;
set.datab =8; //数据位
set.stopb =1; //停止位
set.parity =0; //校验位
PassBy_ID =0; //密码不旁路
GUARD_ID =0; //布防标志
WTDOG_ID =0; //看门狗标志
SCAN_ID =0; //按键扫描任务标志
RCVGSM_ID =0; //处理接收数据任务
STARTDLY_ID=1; //开机延时标志
SNDLY_ID =0; //发送间隔标志
ACKWT_ID =0; //等待应答标志
OVTM_ID =0; //接收GPS定时标志
GPSER2_ID =1; //GPS数据接收失败标志
HCMD_ID4 =0; //发送AT+GPSSTRT标志
GPSER_CNT =0; //GPSONE重新定位次数
T2MIN_CNT =0; //定时器2分计数变量
ACKWTCNT =0; //自动应答计时变量
SNEWSM_ID =0; //发送短信标志,GPS定位数据
INPUT1 =0; //按键扫描计数
INPUT2 =0;
INPUT1_ID =1; //按键按下时间标志
INPUT2_ID =1;
SOS1_ID =1; //匪警标志
SOSSM_ID =0; //报警触发标志,发送报警短信
BFDLY_ID =0; //启动布防标志
BEG_SHAKE =0; //
SHAKEINTER_ID=0; //布防报警短信周期标志
ShakeTime =0;
FIRSTShake_ID=0;
RSMCHR =0; // 接收GSM 1字节寄存器
OVTMCNT =0; //接收定时器初值
RSSMS_ID =0; //直接接收数据标志
RSMLEN =0; //接收数据长度
RcvPointer =0; //接收指针归零
SSMLEN =0; //发送数据长度
SBUF =0; //发送缓冲
SendPointer =0; //发送数据指针
HDM1_ID =0; //头1
HDM2_ID =0; //头2
HDM3_ID =0; //头3
RSMCASE =0; //接收GSM命令类型
HCMD_ID7 =0;
HCMD_ID8 =0;
HCMD_ID9 =0;
HCMD_ID1 =0; //挂机标志
HCMD_ID2 =0; //手机回复设置短信标志
READSM_ID =0; //接收到AT_READY标志
SM_TYPE =1; //发送短信类型变量
RESNDSM_ID =0; //重发短信标志
BFBJSM_ID =0; //非法移动车辆标志
SSMCMD =0; //命令类型变量
SOS2_ID =0;
OK_CNT =1;
}
/*
*********************************************************************************************************
** 函数名称 :Init_IO()
** 函数功能 :ARM引脚配置及其初始化
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************
*/
void Init_IO(void)
{
PINSEL0 = 0x00000000; //引脚先配置为GPIO
PINSEL1 = 0x00000000;
PINSEL0 = PINSEL0 | 0x05; //设置I/O连接到UART0
PINSEL0 = PINSEL0 | 0x50; //设置I/O连接到I2C 0
PINSEL1 = 0x00000001; //配置p0.16 TI_CC_GDO0_PIN 为外部中断引脚
IO0DIR = 0x00000000; //引脚先配置为输入
IO1DIR = 0x00000000;
IO1DIR=IO1DIR|pinRLED |pinGLED; //连LED的引脚配置为输出引脚
IO1DIR=IO1DIR|pinGsm_Rst; //连接模块复位引脚为输出
IO0DIR=IO0DIR|pinBEEP; //连接蜂鸣器的引脚配置输出
EXTMODE=0x01; //EINT0使用边沿激活
EXTPOLAR=0x00; //下降沿或低电平有效
}
/*
*********************************************************************************************************
** 函数名称 :Init_UART0()
** 函数功能 :串口初始化,设置工作模式和波特率。
** 入口参数 :baud 波特率
** set 模式设置(UARTMODE数据结构)
** 出口参数 :1-初始化成功, 0-初始化失败
*********************************************************************************************************
*/
uint8 Init_UART0(uint32 baud, UARTMODE set)
{
uint32 bak;
/* 参数过滤 */
if ((baud ==0 ) || (baud > 115200)) return (0);
if ((set.datab <5) || (set.datab > 8)) return (0);
if ((set.stopb == 0) || (set.stopb > 2)) return (0);
if (set.parity > 4) return (0);
/* 设置串口波特率 */
U0LCR = 0x80; // DLAB = 1 使能除数所存访问
bak = (Fpclk >> 4) / baud; //外设时钟左移四位相当于除以16 相当于(Fpclk/16)/16
U0DLM = bak >> 8; //除数高位取16位分频值的高8位 相当于 bak/256
U0DLL = bak & 0xFF; //除数低位取16位分频值的低8位 相当于 bak%256
/* 设置串口模式 */
bak = set.datab - 5; // 设置字长
if (set.stopb == 2) bak |= 0x04; // 判断是否为2位停止位
if (set.parit