API.c 3.98 KB
Newer Older
崔立宝's avatar
崔立宝 committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
/************************************************ ******************************
文 件 名:API.c
功能描述:API控制函数库文件
作    者:张暄
版    本:V1.0
日    期:2016.11.3
******************************************************************************/

#include "API.h"
#include "Stepper_Motor.h"
#include "Common.h"
#include "Buzzer.h"
 
extern void DoCAN_Timer_Update(uint16_t Interval);
extern void CoCAN_Init_Mode_Tx_ISR(void);
extern void Drive_Info_Speed_Plus_Conversion_ISR(void);
//extern void Drive_Info_Fuel_Plus_Conversion_ISR (void);

APImsTimerStruct     APImsTimer;
volatile  uint16_t   APIRollingCounter;
uint8_t   Time10ms;
uint8_t   Time2ms;
uint8_t   APIBGNMEnable;
uint8_t   PriorityLock;  //增加优先级锁是为了保证先执行网络管理部分 再执行应用报文外发部分

/******************************************************************************
函数名:API_Start
功  能:启动API
        API每隔API_INT_CYCLE周期会发生一次中断,系统以该中断为时基调度任务
        API_INT_CYCLE需要预先在API.h中定义
参  数:无
返回值:无
******************************************************************************/
void API_Start(void)
{
  VREGAPICL_APICLK  = 1;            //Bus Clock 做为API的时钟源

#pragma MESSAGE DISABLE C2705
  VREGAPIR = (uint16_t)((BUSCLK / 1000000 ) * API_INT_CYCLE / 2);   //设置API中断周期

  VREGAPICL_APIE    = 1;           //开API中断
  VREGAPICL_APIFE   = 1;			     //使能API,并开始计时

  APImsTimer.Cnt    = 0;
  APImsTimer.Flag   = 0;
  APIRollingCounter = 0;
}

/******************************************************************************
函数名:API_Stop
功  能:关闭API
参  数:无
返回值:无
******************************************************************************/
void API_Stop ( void )
{
  VREGAPICL_APIE = 0;           //禁用API
  VREGAPICL_APIFE = 0;			    //禁止API中断功能
}

/******************************************************************************
函数名:API_1ms_Timer_Update
功  能:获取毫秒定时更新标志
        用于指示一次1ms计时完成
参  数:无
返回值:1 - 1ms计时完成
        0 - 1ms计时未完成
******************************************************************************/
uint8_t API_1ms_Timer_Update ( void )
{
  if( APImsTimer.Flag )
  {
    APImsTimer.Flag = 0;
    return 1;
  }
  else
   return 0;
}

/******************************************************************************
中断函数
******************************************************************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED   	//置中断函数放在FLASH的非分页区

void interrupt NONUSE1_ISR(void)
{
}

void interrupt NONUSE2_ISR(void)
{
}

void interrupt NONUSE3_ISR(void)
{
}

void interrupt NONUSE5_ISR(void)
{
}
/******************************************************************************
函数名:interrupt API_ISR
功  能:API中断服务函数
参  数:无
返回值:无
******************************************************************************/
uint8_t iTIME1MS ;
uint8_t T1MS_SYB_FF;
static uint8_t tempCnt = 0;
void interrupt API_ISR ( void )
{
  VREGAPICL_APIF = 1;		            //通过写1清0中断标志
  Buzzer_Play_ISR();                //蜂鸣器
  APImsTimer.Cnt++;
  
    tempCnt++;
  if(tempCnt >= 20) 
  {
    tempCnt = 0;
    MSCAN0_L_Data_Service();  
  }
  
  if ( APImsTimer.Cnt >= API_MS_CNT_TOP )
  {
    APImsTimer.Cnt  = 0;
    APImsTimer.Flag = 1;

  }
  if ( APIBGNMEnable )
  {
    Time10ms++;
    if ( Time10ms >= 200 )
    {
      Time10ms = 0;
      PriorityLock = 1;
    }
  }
  else
  {
    PriorityLock = 0;
    Time10ms = 0;
  }
  APIRollingCounter++;

  DoCAN_Timer_Update(API_INT_CYCLE);
  if(PriorityLock == 1)
    CoCAN_Init_Mode_Tx_ISR();
  Stepper_Motor_Rotating_ISR();
  
  /*********************表针调试***************/
  //0.128MS列程
  if(SCI0SR1_RDRF)     	     	//串口接受缓存区中有数据
  {
    RX_BUF[RSB_P] = SCI0DRL;	//读SCI1DRL将自动清SCI1SR1_RDRF
    if(RSB_P != cnRSBufLen - 1)
      RSB_P++;
  }
  /***************1MS************************/
  //0.128MS列程
  iTIME1MS++;

  if ( iTIME1MS == 8 )		// 1.024MS
  {
    iTIME1MS = 0;
    T1MS_SYB_FF = 1;
  }
}
#pragma CODE_SEG DEFAULT