QuakeGod
2024-11-25 9aed5d7e7b3c7bf09da712e9c272ece401a7acc9
Radio_LLCC68/Src/main.c
@@ -70,22 +70,45 @@
/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
#define RX2BUFSIZE 64
#define TX2BUFSIZE 64
unsigned char Uart1RxBuf[128];
unsigned char Uart1TxBuf[260];
unsigned char Uart2RxBuf[RX2BUFSIZE];
unsigned char Uart2TxBuf[TX2BUFSIZE];
unsigned char Uart1RxBuf1[Uart1RxBufSize];
unsigned char Uart1TxBuf1[260];
unsigned char Uart2RxBuf1[RX2BUFSIZE];
unsigned char Uart2TxBuf1[TX2BUFSIZE];
unsigned short Uart1RxBuf1DataLen = 0;
unsigned short Uart2RxBuf1DataLen = 0;
unsigned char SlowFlicker=0;
unsigned char FastFlicker=0;
unsigned int Uart1IdelTimer = 0;
stBinProg1 * pProgs = (stBinProg1 *)STORE_PRG_BASE;
unsigned char Uart1Mode = 1;         //Uart1工作模式, 0 : 普通, 1 : 透传模式
unsigned int Uart1Baud = DefaultUart1Baud;
unsigned int Uart2Baud = DefaultUart2Baud;
//unsigned char Uart1RecvBuf1[Uart1RecvBufSize];
//unsigned short Uart1RecvBuf1DataLen=0;
//unsigned char Uart2RecvBuf1[128];
//unsigned short Uart2RecvBuf1DataLen=0;
volatile char Uart1BaudGot=0;
volatile char Uart1BaudFirstGot=0;
volatile char Uart1DmaInts=0;
#if (ENABLE_PLC)
stBinProg1 * pProgs = (stBinProg1 *)STORE_PRG_BASE;
#endif
uint32_t us1,us2,us3,us4,us5,us6;
stKBusDef KBus1;                     //
extern    stDeviceInfo MyDeviceInfo;
/* USER CODE END PV */
@@ -118,7 +141,7 @@
static int Count=0;
   CurTickuS += 100;   
   nCurTick++;
   nSlaveTick++;
   KBus1.nSlaveTick++;
   Count++;
   if (Count>=10000) 
   {
@@ -132,6 +155,107 @@
   return;
}
void PendSvCallBack()
{
#if (BOARD_TYPE == 14)
///*
      if (bSPI1RecvDone)
      {
         bSPI1RecvDone=0;
         FPxParsePkt(SPI1RecvBuf,nSPI1RecvLenInBuf);
      }
//*/
#endif
   if (Uart2Stat.bPacketRecved)
   {
      KBusParsePacket(&KBus1, (pKBPacket)Uart2RxBuf1, Uart2RxBuf1DataLen);
      Uart2RxBuf1DataLen=0;
      Uart2Stat.bPacketRecved=0;
      Uart2RecvDMA(Uart2RxBuf1,sizeof(Uart2RxBuf1));
      KMem.WDT[2]++;
   }
      if (Uart1RxBuf1DataLen >0 && Uart1Stat.bPacketRecved)
      {
         int res1 = -1;
         if (Uart1RxBuf1DataLen == 3 && Uart1RxBuf1[0]=='+' && Uart1RxBuf1[0]=='+' && Uart1RxBuf1[0]=='+')
         {
            Uart1Mode = 0;      // 切换到命令模式
         }else if (Uart1RxBuf1DataLen == 3 && Uart1RxBuf1[0]=='-' && Uart1RxBuf1[0]=='-' && Uart1RxBuf1[0]=='-')
         {
            Uart1Mode = 1;      // 切换到透传模式
         }else   if (Uart1Mode == 0) {
            res1 = ModBusSlaveParsePkg(1, Uart1RxBuf1, Uart1RxBuf1DataLen);
            if (res1 !=0)
            {
               KLParsePacket(1, Uart1RxBuf1, Uart1RxBuf1DataLen);
            }
         }else if (Uart1Mode == 1) {
            // 透传模式
            if (KwRunStat.sizetosend == 0) {
               memcpy(   KwRunStat.ttTxBuf1,Uart1RxBuf1, Uart1RxBuf1DataLen);
               KwRunStat.sentsize = 0;
               KwRunStat.sizesending = 0;
               KwRunStat.sizetosend = Uart1RxBuf1DataLen;
            }else {
               return;
            }
            //SendPacket(1, Uart1RecvBuf1, Uart1RecvBuf1DataLen);
         }
         Uart1RxBuf1DataLen=0;
         Uart1Stat.bPacketRecved=0;
         Uart1IdelTimer = 0;
      }
}
/*
KBus通讯回调函数,当通讯状态改变或数据更新时被调用。
或者系统请求时。
*/
void * KBusEvCallBackFunc(void*  pParam, int nEvent, void *pBuf, int nLen1)
{
   switch (nEvent){
      case KBusEvNone:
         break;
      case KBusEvCreate:
         break;
      case KBusEvConnected:
         break;
      case KBusEvDisConnected:
         break;
      case KBusEvClosed:
         break;
      case KBusEvStateChange:
         break;
      case KBusEvTimeSync:
         break;
      case KBusEvDataUpdate:
         KMem.WLX[0] = KBusMem.WLX[0];
         KMem.WLY[0] = KBusMem.WLY[0];
         if (KBus1.bMaster) {
            KMem.WY[0]=KBusMem.WLX[0];         //KPLC with KBus Master
            KBusMem.WLY[0]=KMem.WX[0];
         } else if (KBus1.bSlave) {
            KMem.WYB[0]=KBusMem.WLYB[0];         //WireLess with KBus Slave
            KBusMem.WLXB[0]=KMem.WXB[0];
         }
         break;
      case KBusEvCmdResponse:
         break;
      default:
         break;
   }
   return 0;
}
/* USER CODE END 0 */
/**
@@ -144,8 +268,8 @@
  /* USER CODE BEGIN 1 */
   KMRunStat.bLEDFlick = 1;
   
   InitUartstat(&Uart1Stat,Uart1RxBuf,sizeof(Uart1RxBuf),Uart1TxBuf,sizeof(Uart1TxBuf));
   InitUartstat(&Uart2Stat,Uart2RxBuf,sizeof(Uart2RxBuf),Uart2TxBuf,sizeof(Uart2TxBuf));
   InitUartstat(&Uart1Stat,Uart1RxBuf1,sizeof(Uart1RxBuf1),Uart1TxBuf1,sizeof(Uart1TxBuf1));
//   InitUartstat(&Uart2Stat,Uart2RxBuf1,sizeof(Uart2RxBuf1),Uart2TxBuf1,sizeof(Uart2TxBuf1));
  /* USER CODE END 1 */
  /* MCU Configuration----------------------------------------------------------*/
@@ -155,36 +279,6 @@
  /* USER CODE BEGIN Init */
   for (int i=0;i<9;i++)
   {
//      memset(KBusChnStats[i],0,0);
      KBusChnStats[i].SendPackets=0;
      KBusChnStats[i].RecvPackets=0;
      KBusChnStats[i].LostPackets=0;
      KBusChnStats[i].CtnLstPkts=0;
      KBusChnStats[i].MaxCtnLstPkts=0;
      KBusChnStats[i].NotPkgErr=0;
      KBusChnStats[i].PkgLenErr=0;
      KBusChnStats[i].TimeOutErr=0;
      KBusChnStats[i].BCCErr=0;
      KBusChnStats[i].Delay=0;
      KBusChnStats[i].MaxDelay=0;
   }
      KMem.LastScanTime=0;
      KMem.ScanTimeuS=0;
      KMem.MinScanTimeuS=99999;
      KMem.MaxScanTimeuS=0;
//      KMem.SDD[14]=(unsigned int)&KMStoreSysCfg;
//      KMem.SDD[15]=(unsigned int)&KMStoreSysCfg1;
      KMem.SDD[12]=((uint32_t *)UID_BASE)[0];
//      KMem.SDD[13]=((uint32_t *)UID_BASE)[1];
//      KMem.SDD[14]=((uint32_t *)UID_BASE)[2];
      KMem.SDD[13]=PendSvCount;
      KMem.SDD[14]=RCC->CSR;
//      KMem.SDD[15]=*(uint32_t *)FLASHSIZE_BASE;
//      KMem.SDD[16]=(unsigned int)&KMSysCfg;
   
  /* USER CODE END Init */
@@ -207,6 +301,16 @@
   
   KMRunStat.bLEDFlick = 1;
   
   KLinkInit(1);     //注册KLink端口
//   stPortDef PortReg1 = {.nPortHardType = 3,.nPortUseType = 2};
//   KMRegisterPort(0,&PortReg1);
   unsigned char bKBusMaster, bKBusSlave, bKBusRepeater;
   int nKBusStationID;
   int nKBusChilds;
   KMem.CurJumperSW=ReadJumperSW();
   KMem.EffJumperSW=KMem.CurJumperSW;
   
@@ -221,7 +325,7 @@
   FP0_Init();
#elif (BOARD_TYPE == 15 || BOARD_TYPE == 16)
   nStationID=1 ;//KMem.EffJumperSW&0x0f;
   nKBusStationID=KMem.EffJumperSW&0x0f;
//   if (KMem.EffJumperSW == 0x1f) {bKBusRepeater=1;bKBusMaster=1;bKBusSlave=0;}
//  else if ((KMem.EffJumperSW&0x10)!=0) {bKBusMaster=1;bKBusSlave=0;}
//   else
@@ -232,10 +336,23 @@
  else if ((KMem.EffJumperSW&0x10)!=0) {bKBusMaster=1;bKBusSlave=0;}
   else{bKBusMaster=0;bKBusSlave=1;}
#endif
   nChilds=nStationID;
   nCurPollId=1;
   nKBusChilds=nKBusStationID;
      if (bKBusMaster) {
      KBusInitMaster(&KBus1, (KBusSendPktFuncDef)PutStr2, nKBusChilds);
   }   else if (bKBusSlave) {
      KBusInitSlave(&KBus1, (KBusSendPktFuncDef)PutStr2, nKBusStationID,&MyDeviceInfo);
   }
   KBusSetEvCallBackFunc(&KBus1, &KBusEvCallBackFunc);
   UNUSED(bKBusRepeater);
   // 注册KBus端口
/*
   stPortDef PortReg2 = {.nPortHardType = 4,.nPortUseType = 3};
   KMRegisterPort(1,&PortReg2);
*/
   //if (KMem.EffJumperSW == 0x00)
      Uart1Baud = DefaultUart1Baud;
   Uart1Baud = DefaultUart1Baud;
  MX_USART1_UART_Init();
  MX_USART2_UART_Init();
@@ -261,9 +378,10 @@
   LL_USART_EnableIT_TC(USART1);
//   LL_USART_EnableIT_RXNE(USART2);
   Uart2RecvDMA(Uart2RecvBuf1,sizeof(Uart2RecvBuf1));
   Uart2RecvDMA(Uart2RxBuf1,sizeof(Uart2RxBuf1));
   LL_USART_EnableIT_IDLE(USART2);
   LL_USART_EnableIT_TC(USART2);
#if (BOARD_TYPE == 13)
   int res;
   res = w5500_init();
@@ -314,18 +432,27 @@
   KMRunStat.WorkMode2=0;
      
   KMRunStat.WorkMode = storedKMSysCfg.theKMSysCfg.workmode;
#if (ENABLE_PLC)
   if (KMRunStat.WorkMode == 1){
      InitPLC();
      KMRunStat.WorkMode2 = KMem.CurJumperSW&0x20 ;
      if (KMRunStat.WorkMode2) {
         StartPLC(); }
   }
   KMem.WX[7]=0x5a;
#endif
#if (BOARD_TYPE == 15 || BOARD_TYPE == 16)
   LoadKwConfig();
//   KWireLessInit(&KWInitStruct);
   KWireLessInit(KMem.EffJumperSW&0x20,KMem.EffJumperSW&0x0f);
   KWireLessStart();
#endif
   stPortDef PortReg3 = {.nPortHardType = 7,.nPortUseType = 6};
   KMRegisterPort(2,&PortReg3);
   
  while (1)
  {
@@ -341,13 +468,14 @@
      
      int thisJumperSW=ReadJumperSW();
      
#if (ENABLE_PLC)
      if (KMRunStat.WorkMode&1){
         if (thisJumperSW&0x20 && !(KMem.CurJumperSW&0x20))  // Run 开关 正 跳变。
         {StartPLC();}
         if (!(thisJumperSW&0x20) && (KMem.CurJumperSW&0x20))  // Run 开关 负 跳变。
         {StopPLC();}
      }
#endif
      KMem.CurJumperSW=thisJumperSW;
      KMem.haltick=haltick;
//      KMem.TotalRunTime=TotalRunTime;
@@ -356,6 +484,7 @@
//      *((unsigned int *)&(PLCMem.SDT[2]))=nChilds;
//      KMem.SDD[13]=PendSvCount;
//      KMem.SDD[14]=RCC->CSR;      
      
      int a;
      a      = LL_GPIO_ReadInputPort(GPIOA);
@@ -413,7 +542,7 @@
#endif
//      pProgs = (stBinProg1 *) STORE_PRG_BASE;
#if (ENABLE_PLC)
      if (   KMRunStat.WorkMode==1 ) //&& bKBusMaster)
      {
         if (KMRunStat.nBinProgBank == 0){
@@ -426,7 +555,7 @@
         
         ProcessPLCBinProg(pProgs, nSizeProg1);
      }
#endif // ENABLE_PLC
      KMem.ScanTimeuS=us2-KMem.LastScanTime;
      KMem.LastScanTime = us2;
      if (KMem.ScanTimeuS < KMem.MinScanTimeuS) {KMem.MinScanTimeuS = KMem.ScanTimeuS;}
@@ -445,15 +574,9 @@
//         BufferOut[1]=KMem.WX[0]&0xff;
//         BufferOut[2]=(KMem.WX[0]>>8)&0xff;
#endif
         if (nChilds>0) {      KBusMasterFunc(2); }
#if (BOARD_TYPE == 14)
//         KMem.WX[0]=BufferIn[1]+(BufferIn[2]<<8);
#else
//         KMem.WY[0]=BufferIn[1]+(BufferIn[2]<<8);
#endif
      }
         KBusLoopProcess(&KBus1);
         if (haltick&0x00002000) SlowFlicker=1;
         else SlowFlicker=0;
         if (haltick&0x00000800) FastFlicker=1;
@@ -467,20 +590,18 @@
      //   if (! KMem.RunStat) {BufferIn[0]=0;}
      //   KMem.WY[0]=BufferIn[0];
#else
         KBusSlaveFunc(2);
         KBusSlaveFunc(&KBus1);
         if (! KMem.RunStat) {BufferIn[0]=0;}
         KMem.WY[0]=BufferIn[0];
#endif
         if (nSlaveTick&0x00002000) SlowFlicker=1;
         if (KBus1.nSlaveTick&0x00002000) SlowFlicker=1;
         else SlowFlicker=0;
         if (nSlaveTick&0x00000800) FastFlicker=1;
         if (KBus1.nSlaveTick&0x00000800) FastFlicker=1;
         else FastFlicker=0;         
      }
//      KMem.WY[0]=nCount2>>5;
      if (KMem.RunStat) {KMem.RunStat--;}
      if (KMem.ErrStat) {KMem.ErrStat--;}
      
      if (KMRunStat.bLEDFlick)
      {
@@ -492,14 +613,20 @@
      }
      else
      {
         KMem.ErrStat = KwRunStat.ErrStat;
         if ((KMem.EffJumperSW&0x10)==0x10)       KMem.ErrStat += KBus1.ErrStat;
#if (ENABLE_PLC)
         if (KMRunStat.WorkMode==1 ) {
            if (PLCMem.bPLCRunning){SetRunLed(SlowFlicker);}
               else {SetRunLed(0);}
         }
         else {
         else
#endif // ENABLE_PLC
         {
               if (!KMem.RunStat) SetRunLed(SlowFlicker);
               else SetRunLed(FastFlicker);
         }
         if (!KMem.ErrStat) 
         {
            SetErrLed(0);
@@ -521,11 +648,12 @@
      us4=GetuS();
//      EffJumperSW = GetInput(20)&0xff;
#if (BOARD_TYPE == 15 || BOARD_TYPE == 16)      
      
      if ((KMem.EffJumperSW&0x10)==0x10) {
         KMem.WFY[1]=KMem.WLY[0];
         KMem.WLX[0]=KMem.WFX[1];
         KMem.WFY[1]=KBusMem.WLYB[1];
         KBusMem.WLXB[1]=KMem.WFX[1];
      }else
      {
         KMem.WFY[1]=KMem.WX[0];
@@ -561,26 +689,15 @@
//      memcpy(&KMem.SDT[64+nSize/2],&KBusChnStats[2],nSize);
//      for (int i=0;i<128;i++)   {      SDT[i]=i;   }
//      SDT[48]=55;
      if (Uart1RecvBuf1DataLen >0 && Uart1Stat.bPacketRecved)
      {
         int res1 = -1;
         res1 = ModBusSlaveParsePkg(1, Uart1RecvBuf1, Uart1RecvBuf1DataLen);
         if (res1 !=0)
         {
            KLParsePacket(1, Uart1RecvBuf1, Uart1RecvBuf1DataLen);
         }
         Uart1RecvBuf1DataLen=0;
         Uart1Stat.bPacketRecved=0;
         Uart1IdelTimer = 0;
      }else {
         if (Uart1IdelTimer>600000) {
#if (USART1_AUTO_BAUDRATE == 1)
         if (Uart1IdelTimer>300000) { // 超过60秒没有数据传输,重新进入自适应波特率状态
            LL_USART_EnableAutoBaudRate(USART1);
            LL_USART_SetAutoBaudRateMode(USART1, LL_USART_AUTOBAUD_DETECT_ON_FALLINGEDGE);
         }else {
               Uart1IdelTimer++;
         }
      }
 if (bKBusSlave)   HAL_Delay(0);
#endif
// if (bKBusSlave)   HAL_Delay(0);
/*
      if (!IsEmpty(&Uart1Stat.QRx))
      {