📄 car_sim300.c
字号:
{
u8 bTemp;
u16 wTemp;
wTemp = wAddr;
wTemp >>= 8;
I2CStart();
I2CSendByte(0xa0);
I2CSendByte((u8)wTemp);
I2CSendByte((u8)wAddr);
SomeNOP();
I2CStart();
I2CSendByte(0xa1);
bTemp = I2CReceiveByte();
I2CStop();
return bTemp;
}
void vISP_IAP_ByteProgram(u8 bTemp,u16 wAddr)
{
u16 wTemp;
wTemp = wAddr;
wTemp >>= 8;
I2CStart();
I2CSendByte(0xa0);
I2CSendByte((u8)wTemp);
I2CSendByte((u8)wAddr);
I2CSendByte(bTemp);
I2CStop();
Delay_l0ms();
}
//==============================================================================
u16 wTimer0Ccount(void)
{
u16 wT;
wT = W_TimeCount;
return(wT);
}
void vDelayTime(u16 wCount)
{
u16 wStartCount;
wStartCount = wTimer0Ccount(); /* get the start count */
while ((wTimer0Ccount() - wStartCount) <= wCount) /* wait for count "ticks" */
{
IWDG_ReloadCounter();//喂狗
}
}
/********************************************************************************************
**函数名: vTurnOnGsm
**功能简介: 硬件控制SIM508开机
**参数说明: 无
**调用函数: 无
**全局变量: 无
**函数返回: 无
**最后修改时间:2007-02-09
**********************************************************************************************/
void vTurnOnGsm(void)
{
GPIOB->ODR &= 0xfffffffd;
vDelayTime(250);
GPIOB->ODR |= 0x00000002;
vDelayTime(300);
}
void vRestGPS(void)
{
GPIOB->ODR &= 0xfffffffe;//低电平
vDelayTime(50);
GPIOB->ODR |= 0x00000001;//高电平
vDelayTime(50);
GPIOB->ODR &= 0xfffffffe;//低电平
vDelayTime(300);
vIinitGps();
vIinitGps();
}
/********************************************************************************************
**函数名: vTurnOffGsm
**功能简介: 硬件控制SIM508关机
**参数说明: 无
**调用函数: 无
**全局变量: 无
**函数返回: 无
**最后修改时间:2007-02-09
**********************************************************************************************/
void vTurnOffGsm(void)
{
GPIOB->ODR &= 0xfffffffd;
vDelayTime(70);
GPIOB->ODR |= 0x00000002;
}
/******************************************************************************
**函 数 名 : vMcuTimer0Intr
**功能简介 : 定时器0中断服务函数
**参数说明 : 无
**调用函数 : 无
**被调用函数: 无
**全局变量 : W_TimeCount
**返 回 值 : 无
**函数版本 : V1.00.00
**修改时间 : 2007-01-27
******************************************************************************/
/* SysTick interrupt happens every 10 ms */
void SysTick_Handler (void)
{
W_TimeCount++;
if(GPS_V_F)B_GpsVFTimer++;
if(B_OverBeepStart)B_OverBeepTimer++;
}
/*******************************************************************************
* Function Name : USART1_IRQHandler
* Description : This function handles USART1 global interrupt request.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void USART1_IRQHandler(void)
{
BYTE bTByte2;
WORD wTPsn2;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
/* Read one byte from the receive data register */
bTByte2 = (USART_ReceiveData(USART1));
wTPsn2 = W_InSerial2;
if(++wTPsn2 == MAX_SERIAL_LEN2) wTPsn2 = 0;//修改指针边界
if(wTPsn2 != W_OutSerial2)//队列没有满的情况下
{
B_SerialQueue2[W_InSerial2] = bTByte2;
W_InSerial2 = wTPsn2;
}
/* Clear the USART1 Receive interrupt */
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
}
}
/*******************************************************************************
* Function Name : USART2_IRQHandler
* Description : This function handles USART2 global interrupt request.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void USART2_IRQHandler(void)
{
BYTE bTByte;
WORD wTPsn;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
{
/* Read one byte from the receive data register */
bTByte = (USART_ReceiveData(USART2));
wTPsn = W_InSerial;
if(++wTPsn == MAX_SERIAL_LEN) wTPsn = 0;//修改指针边界
if(wTPsn != W_OutSerial)//队列没有满的情况下
{
B_SerialQueue[W_InSerial] = bTByte;
W_InSerial = wTPsn;
}
/* Clear the USART1 Receive interrupt */
USART_ClearITPendingBit(USART2, USART_IT_RXNE);
}
}
/******************************************************************************
**函 数 名 : vInitSoftTimer
**功能简介 : 软定时器初始化
**参数说明 : 无
**调用函数 : 无
**被调用函数: main
**全局变量 : REC_A_SoftTimers
**返 回 值 : 无
**函数版本 : V1.00.00
**修改时间 : 2007-01-27
******************************************************************************/
void vInitSoftTimer(void)
{
WORD wI;
//初始化A类软定时器
for(wI = 0; wI < MAX_A_SOFT_TIMERS; wI++)
{
REC_A_SoftTimers[wI].bStartFb = 0;
REC_A_SoftTimers[wI].wOverValue = 0;
REC_A_SoftTimers[wI].pfTimerFunction = NULL;
}
}
/******************************************************************************
**函 数 名 : vSoftTimerSum
**功能简介 : 用于查询软定时器计时
**参数说明 : 无
**调用函数 : 无
**被调用函数: main
**全局变量 : W_TimeCount,REC_A_SoftTimers
**返 回 值 : 无
**函数版本 : V1.00.00
**修改时间 : 2007-01-27
******************************************************************************/
void vSoftTimerSum(void)
{
WORD wI;
if(B_GpsVFTimer>2)//gps状态灯指示
{
B_GpsVFTimer = 0;
//LED = 0;
ClrLED();
}
if(B_OverBeepTimer > 10)
{
B_OverBeepTimer = 0;
//驱动封鸣器
if(beep)ClrBeep();
else SetBeep();
}
if(W_TimeCount<MIN_TIME_PERIOD)return;
W_TimeCount = 0; //一秒钟时间到
for(wI = 0; wI < MAX_A_SOFT_TIMERS; wI++)//检测A类定时器
{
if(REC_A_SoftTimers[wI].bStartFb == 1)//只有启动了的定时器才作检测
{
if(REC_A_SoftTimers[wI].wOverValue>0)
{
if(--REC_A_SoftTimers[wI].wOverValue == 0)
{
REC_A_SoftTimers[wI].bStartFb = 0;
REC_A_SoftTimers[wI].pfTimerFunction();//溢出处理
}
}
}
}
if(++B_NoCsqTimer > 120)
{
B_NoCsqTimer = 0;
GPIOB->ODR &= 0xffffefff;//power//低电平
vDelayTime(500);
GPIOB->ODR |= 0x00001000;//power//高电平
vDelayTime(500);
vTurnOnGsm();//开GSM508时序
EN_CommandStatus = NO_COMMAND_WAIT;
DW_SetAtCmdFlag = MAC_SET_AT_CMD;
vStopSoftTimer_A(AT_CMD_WAITING_TIMER); //停止AT命令超时等待定时器
B_AtCmdTimes = 0;
B_AtCommandItem = 0xff;//最后赋值成无意义值
W_InSerial = 0;
W_OutSerial = 0;
}
if(++W_PowerSwitchTimer > 28800)//8个小时
{
W_PowerSwitchTimer = 0;
GPIOB->ODR &= 0xffffefff;//power//低电平
vDelayTime(500);
GPIOB->ODR |= 0x00001000;//power//高电平
vDelayTime(500);
vTurnOnGsm();//开GSM508时序
EN_CommandStatus = NO_COMMAND_WAIT;
DW_SetAtCmdFlag = MAC_SET_AT_CMD;
vStopSoftTimer_A(AT_CMD_WAITING_TIMER); //停止AT命令超时等待定时器
B_AtCmdTimes = 0;
B_AtCommandItem = 0xff;//最后赋值成无意义值
W_InSerial = 0;
W_OutSerial = 0;
}
if(FB_AtdDelayStart)//ATD电话拨打延时准备
{
if(++B_AtdDelayTimer >= 30)//延时到
{
FB_AtdDelayStart = 0;
B_AtdDelayTimer = 0;
vStartAtCommand(MAC_ATD_ITEM);//拨打电话
FB_AtdReg = 1;
}
}
vRelayOut();
vKeyCheck();//按键检测,一秒钟检测一次
if(B_NetStatus == 1)//网络标志值为'1'不许时间太长
{
if(++B_NetValue_1_Cnt > 60)
{
B_NetValue_1_Cnt = 0;
vStartAtCommand(MAC_CIPSHUT_ITEM);//关断IP连接
}
}
else B_NetValue_1_Cnt = 0;
}
/******************************************************************************
**函 数 名 : vStartSoftTimer_A
**功能简介 : 启动一软定时器A
**参数说明 : wIndex--为定时器索引,范围0至MAX_A_SOFT_TIMERS-1,
wDelay--定时时间,pfTimerFun--时间到后执行的函数
**调用函数 : 无
**被调用函数: 暂无
**全局变量 : REC_A_SoftTimers[MAX_A_SOFT_TIMERS]
**函数返回 : 无
**修改时间 : 2007-01-27
******************************************************************************/
void vStartSoftTimer_A(WORD wIndex,WORD wDelay,void(*pfTimerFun)(void))
{
if(wIndex>=MAX_A_SOFT_TIMERS)return;//没有这个定时器
REC_A_SoftTimers[wIndex].wOverValue = wDelay;
REC_A_SoftTimers[wIndex].bStartFb = 1;
REC_A_SoftTimers[wIndex].pfTimerFunction = pfTimerFun;
}
/******************************************************************************
**函 数 名 : vStopSoftTimer_A
**功能简介 : 停止一软定时器A
**参数说明 : wIndex--为定时器索引,范围0至MAX_A_SOFT_TIMERS-1,
**调用函数 : 无
**被调用函数: 暂无
**全局变量 : REC_A_SoftTimers[MAX_A_SOFT_TIMERS]
**函数返回 : 无
**修改时间 : 2006-04-11
******************************************************************************/
void vStopSoftTimer_A(WORD wIndex)
{
if(wIndex>=MAX_A_SOFT_TIMERS)return;//没有这个定时器
REC_A_SoftTimers[wIndex].wOverValue = 0;
REC_A_SoftTimers[wIndex].bStartFb = 0;
REC_A_SoftTimers[wIndex].pfTimerFunction = NULL;
}
/******************************************************************************
**函 数 名 : vMcuSerialIntr
**功能简介 : MCU串口1中断服务函数
**参数说明 : 无
**调用函数 : 无
**被调用函数: 无
**全局变量 : W_InSerial, W_OutSerial
**返 回 值 : 无
**函数版本 : V1.00.00
**修改时间 : 2007-01-27
******************************************************************************/
/*
void vMcuSerialIntr(void) interrupt SERIAL_INT_NUM //4
{
BYTE bTByte;
WORD wTPsn;
if(RI) //接收中断服务函数
{
RI = 0;
bTByte = SBUF;//最好先读一下
wTPsn = W_InSerial;
if(++wTPsn == MAX_SERIAL_LEN) wTPsn = 0;//修改指针边界
if(wTPsn != W_OutSerial)//队列没有满的情况下
{
B_SerialQueue[W_InSerial] = bTByte;
W_InSerial = wTPsn;
}
}
}
*/
/******************************************************************************
**函 数 名 : wReadSerial
**功能简介 : 读MCU串口1缓冲中的一个字节
**参数说明 : 无
**调用函数 : vCloseINTR(),vOpenINT()
**被调用函数: 暂无
**全局变量 : W_InSerial, W_OutSerial
**返 回 值 : WORD类型,为读出一字节内容
**函数版本 : V1.00.00
**修改时间 : 2007-01-27
******************************************************************************/
WORD wReadSerial(void)
{
BYTE bTByte;
//vCloseINTR();//关中断
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -