QuakeGod
2024-08-06 7d8ba5df7d883c86c24aa38449c4a6dd126e920f
提交 | 用户 | age
483170 1
Q 2 /**
3   ******************************************************************************
4   * @file           : main.c
5   * @brief          : Main program body
6   ******************************************************************************
7   ** This notice applies to any and all portions of this file
8   * that are not between comment pairs USER CODE BEGIN and
9   * USER CODE END. Other portions of this file, whether 
10   * inserted by the user or by software development tools
11   * are owned by their respective copyright owners.
12   *
13   * COPYRIGHT(c) 2018 STMicroelectronics
14   *
15   * Redistribution and use in source and binary forms, with or without modification,
16   * are permitted provided that the following conditions are met:
17   *   1. Redistributions of source code must retain the above copyright notice,
18   *      this list of conditions and the following disclaimer.
19   *   2. Redistributions in binary form must reproduce the above copyright notice,
20   *      this list of conditions and the following disclaimer in the documentation
21   *      and/or other materials provided with the distribution.
22   *   3. Neither the name of STMicroelectronics nor the names of its contributors
23   *      may be used to endorse or promote products derived from this software
24   *      without specific prior written permission.
25   *
26   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
27   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
29   * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
30   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
32   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
33   * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
34   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36   *
37   ******************************************************************************
38   */
39 /* Includes ------------------------------------------------------------------*/
40 #include "main.h"
41 #include "stm32f0xx_hal.h"
42
43 /* USER CODE BEGIN Includes */
44 #include "Globaldef.h"
45 #include "debug.h"
46 #include "Functions.h"
47 #include "KMachine.h"
48 #include "PLCfunctions.h"
49 //#include "KBus.h"
50 #include "KLink.h"
51 #include "string.h"
52 #include "BSP.h"
53 #include "ModbusRTU.h"
54 #if (BOARD_TYPE == 13)
55 #include "w5500_port.h"
56 #include "../src/Ethernet/socket.h"
57 #include "../src/Ethernet/loopback.h"
58 #elif (BOARD_TYPE == 14)
59 #include "FP0.h"
60 #elif (BOARD_TYPE == 15 || BOARD_TYPE == 16)
61 #include "KWireless.h"
62 //#include "user.h"
63 //#include "../src/radio/inc/sx126x-board.h"
64 #endif
65
66 /* USER CODE END Includes */
67
68 /* Private variables ---------------------------------------------------------*/
69
70 /* USER CODE BEGIN PV */
71 /* Private variables ---------------------------------------------------------*/
72
73 #define RX2BUFSIZE 64
74 #define TX2BUFSIZE 64
75
76 unsigned char Uart1RxBuf[128];
77 unsigned char Uart1TxBuf[260];
78
79 unsigned char Uart2RxBuf[RX2BUFSIZE];
80 unsigned char Uart2TxBuf[TX2BUFSIZE];
81
82 unsigned char SlowFlicker=0;
83 unsigned char FastFlicker=0;
84
85 unsigned int Uart1IdelTimer = 0;
842bb6 86 #if (ENABLE_PLC)
483170 87 stBinProg1 * pProgs = (stBinProg1 *)STORE_PRG_BASE;
842bb6 88 #endif
483170 89 uint32_t us1,us2,us3,us4,us5,us6;
842bb6 90
Q 91 stKBusDef KBus1;                            // 
92
93 extern     stDeviceInfo MyDeviceInfo;
483170 94
Q 95 /* USER CODE END PV */
96
97 /* Private function prototypes -----------------------------------------------*/
98
99
100 /* USER CODE BEGIN PFP */
101 /* Private function prototypes -----------------------------------------------*/
102
103 const unsigned char LEDSEGTAB[]={
104 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,    //0-F
105 0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1,  //0.-F.
106 0x00,0x40,            //  ,-,_,~,o,n,N,<,>,J,r,
107 };
108
109 /* USER CODE END PFP */
110
111 /* USER CODE BEGIN 0 */
112
113 int HexToInt(char ch)
114 {
115     if (ch>='0' && ch <='9') return ch-'0';
116     if (ch>='A' && ch <='F') return ch-'A'+10;
117     if (ch>='a' && ch <='f') return ch-'a'+10;
118     return 0;
119 }
120
121 void HAL_SYSTICK_Callback(void)
122 {
123 static int Count=0;
124     CurTickuS += 100;    
125     nCurTick++;
842bb6 126     KBus1.nSlaveTick++;
483170 127     Count++;
Q 128     if (Count>=10000) 
129     {
130         Count=0; 
131         KMem.CurTimeSec++;
132         KMem.ThisRunTime++; KMem.TotalRunTime++;
133         if (KMRunStat.bLEDFlick) KMRunStat.bLEDFlick--;
134         if (KMRunStat.bLEDFlick >120) KMRunStat.bLEDFlick=120;
135     }
136
137     return;
138 }
842bb6 139
Q 140
141 void PendSvCallBack()
142 {
143 #if (BOARD_TYPE == 14)
144 ///*    
145         if (bSPI1RecvDone)
146         {
147             bSPI1RecvDone=0;
148             FPxParsePkt(SPI1RecvBuf,nSPI1RecvLenInBuf);
149         }
150 //*/    
151 #endif        
152     if (Uart2Stat.bPacketRecved)
153     {
154         KBusParsePacket(&KBus1, (pKBPacket)Uart2RecvBuf1, Uart2RecvBuf1DataLen);        
155         Uart2RecvBuf1DataLen=0;
156         Uart2Stat.bPacketRecved=0;
157         Uart2RecvDMA(Uart2RecvBuf1,sizeof(Uart2RecvBuf1));        
158         KMem.WDT[2]++;
159     }
7d8ba5 160         if (Uart1RecvBuf1DataLen >0 && Uart1Stat.bPacketRecved)
Q 161         {
162             int res1 = -1;
163             res1 = ModBusSlaveParsePkg(1, Uart1RecvBuf1, Uart1RecvBuf1DataLen);
164             if (res1 !=0)
165             {
166                 KLParsePacket(1, Uart1RecvBuf1, Uart1RecvBuf1DataLen);
167             }
168             Uart1RecvBuf1DataLen=0;
169             Uart1Stat.bPacketRecved=0;
170             Uart1IdelTimer = 0;
171         }    
842bb6 172 }
Q 173
174 /*
175 KBus通讯回调函数,当通讯状态改变或数据更新时被调用。
176 或者系统请求时。
177 */
178 void * KBusEvCallBackFunc(void*  pParam, int nEvent, void *pBuf, int nLen1)
179 {
180     switch (nEvent){
181         
182         case KBusEvNone:
183             break;
184         case KBusEvCreate:
185             break;
186         case KBusEvConnected:
187             break;
188         case KBusEvDisConnected:
189             break;
190         case KBusEvClosed:
191             break;
192         case KBusEvStateChange:
193             break;
194         case KBusEvTimeSync:
195             break;
196         case KBusEvDataUpdate:
197             KMem.WLX[0] = KBusMem.WLX[0];
198             KMem.WLY[0] = KBusMem.WLY[0];
199         
200             if (KBus1.bMaster) {
201                 KMem.WY[0]=KBusMem.WLX[0];            //KPLC with KBus Master
202                 KBusMem.WLY[0]=KMem.WX[0];
203             } else if (KBus1.bSlave) {
204                 KMem.WYB[0]=KBusMem.WLYB[0];            //WireLess with KBus Slave
205                 KBusMem.WLXB[0]=KMem.WXB[0];
206                 
207             }
208             break;
209         case KBusEvCmdResponse:
210             break;
211         
212         default:
213             break;
214     }
215     return 0;
216 }
217
483170 218
Q 219 /* USER CODE END 0 */
220
221 /**
222   * @brief  The application entry point.
223   *
224   * @retval None
225   */
226 int main(void)
227 {
228   /* USER CODE BEGIN 1 */
229     KMRunStat.bLEDFlick = 1;
230     
231     InitUartstat(&Uart1Stat,Uart1RxBuf,sizeof(Uart1RxBuf),Uart1TxBuf,sizeof(Uart1TxBuf));
232     InitUartstat(&Uart2Stat,Uart2RxBuf,sizeof(Uart2RxBuf),Uart2TxBuf,sizeof(Uart2TxBuf));
233   /* USER CODE END 1 */
234
235   /* MCU Configuration----------------------------------------------------------*/
236
237   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
238   HAL_Init();
239
240   /* USER CODE BEGIN Init */
241
242     
243   /* USER CODE END Init */
244
245   /* Configure the system clock */
246   SystemClock_Config();
247
248   /* USER CODE BEGIN SysInit */
249     TickFreq=10000;        //Tick频率
250     InituS(TickFreq);    
251  // HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/TickFreq);    //重新定义SysTick的频率
252
253   /* USER CODE END SysInit */
254
255   /* Initialize all configured peripherals */
256   MX_GPIO_Init();
257   MX_DMA_Init();
258     
259     KMachineInit();
260     ReadSysCfgFromFlash(&storedKMSysCfg);
261     
262     KMRunStat.bLEDFlick = 1;
263     
842bb6 264     KLinkInit(1);      //注册KLink端口
Q 265
266 //    stPortDef PortReg1 = {.nPortHardType = 3,.nPortUseType = 2};
267 //    KMRegisterPort(0,&PortReg1);
268
269
270     unsigned char bKBusMaster, bKBusSlave, bKBusRepeater;
271     int nKBusStationID;
272     int nKBusChilds;
273     
483170 274     KMem.CurJumperSW=ReadJumperSW();
Q 275     KMem.EffJumperSW=KMem.CurJumperSW;
276     
277 //    Uart2Baud = AlterUart2Baud;
278     
279 #if (BOARD_TYPE == 14)
280     KMem.EffJumperSW|=0x10;
281     nStationID=KMem.EffJumperSW&0x0f;
282   if ((KMem.EffJumperSW&0x10)!=0) {bKBusMaster=1;bKBusSlave=0;}
283     else{bKBusMaster=0;bKBusSlave=1;}
284     nChilds=nStationID;
285     FP0_Init();
286
287 #elif (BOARD_TYPE == 15 || BOARD_TYPE == 16)
842bb6 288     nKBusStationID=KMem.EffJumperSW&0x0f;
483170 289 //    if (KMem.EffJumperSW == 0x1f) {bKBusRepeater=1;bKBusMaster=1;bKBusSlave=0;}
Q 290 //  else if ((KMem.EffJumperSW&0x10)!=0) {bKBusMaster=1;bKBusSlave=0;}
291 //    else
292         {bKBusMaster=0;bKBusSlave=1;}    
293 #else
294     nStationID=KMem.EffJumperSW&0x0f;
295     if (KMem.EffJumperSW == 0x1f) {bKBusRepeater=1;bKBusMaster=1;bKBusSlave=0;}
296   else if ((KMem.EffJumperSW&0x10)!=0) {bKBusMaster=1;bKBusSlave=0;}
297     else{bKBusMaster=0;bKBusSlave=1;}
298 #endif
842bb6 299     nKBusChilds=nKBusStationID;
Q 300
301         if (bKBusMaster) {
302         KBusInitMaster(&KBus1, (KBusSendPktFuncDef)PutStr2, nKBusChilds);        
303     }    else if (bKBusSlave) {
304         KBusInitSlave(&KBus1, (KBusSendPktFuncDef)PutStr2, nKBusStationID,&MyDeviceInfo);    
305     }        
306     KBusSetEvCallBackFunc(&KBus1, &KBusEvCallBackFunc);
307     
308     UNUSED(bKBusRepeater);
309     // 注册KBus端口
310 /*    
311     stPortDef PortReg2 = {.nPortHardType = 4,.nPortUseType = 3};
312     KMRegisterPort(1,&PortReg2);
313 */    
483170 314     //if (KMem.EffJumperSW == 0x00)
842bb6 315     Uart1Baud = DefaultUart1Baud;
483170 316   MX_USART1_UART_Init();
Q 317   MX_USART2_UART_Init();
318
319     MX_SPI1_Init();
320     LL_SPI_EnableIT_RXNE(SPI1);
321
322 #if (BOARD_TYPE == 14)
323 //    MX_SPI2_Init();
324 //  MX_ADC_Init();
325 #else
326     MX_SPI2_Init();
327   MX_ADC_Init();
328 #endif
329
330     MX_IWDG_Init();
331
332     MX_TIM6_Init();
333     LL_TIM_EnableCounter(TIM6);
334     
335   /* USER CODE BEGIN 2 */
336     LL_USART_EnableIT_RXNE(USART1);
337     LL_USART_EnableIT_IDLE(USART1);
338     LL_USART_EnableIT_TC(USART1);
339
340 //    LL_USART_EnableIT_RXNE(USART2);
341     Uart2RecvDMA(Uart2RecvBuf1,sizeof(Uart2RecvBuf1));    
342     LL_USART_EnableIT_IDLE(USART2);
343     LL_USART_EnableIT_TC(USART2);
842bb6 344     
483170 345 #if (BOARD_TYPE == 13)
Q 346     int res;
347     res = w5500_init();
348     KMem.SDD[28]=res;
349     
350 //    res=socket(0,Sn_MR_TCP,5000,0);
351     KMem.SDD[29]=res;    
352     
353 //    res = listen(0);
354 #endif    
355 //    if (bKBusSlave)
356     {
357     //    LL_USART_EnableAutoBaudRate(USART1);
358     //    LL_USART_SetAutoBaudRateMode(USART1, LL_USART_AUTOBAUD_DETECT_ON_FALLINGEDGE);        
359     //    LL_USART_EnableAutoBaudRate(USART2);
360     //    LL_USART_SetAutoBaudRateMode(USART2, LL_USART_AUTOBAUD_DETECT_ON_FALLINGEDGE);        
361     }
362     //LL_USART_EnableIT_TXE(USART1);
363   /* USER CODE END 2 */
364
365     
366   /* Infinite loop */
367   /* USER CODE BEGIN WHILE */
368
369     HAL_Delay(10);                
370     SetRunLed(1);                //Turn On Run Led
371     SetErrLed(0);                //Turn Off Err Led
372
373 #if (BOARD_TYPE == 14)
374 //    PutOutput (0);                    //Clear all Output
375 //    Enable595(1);                        //Enable 595 Output 
376 #else
377     PutOutput (0);                    //Clear all Output
378     Enable595(1);                        //Enable 595 Output 
379 #endif
380
381         if (GetBoardType() == 7 || GetBoardType() ==8 
382             || GetBoardType() == 9 || GetBoardType() ==10 ||GetBoardType() ==13 ||GetBoardType() ==15 || BOARD_TYPE == 16) 
383         {
384             displayInput(0xffff);        //
385             EnableDisIn(1);                //Input Diaplay Enable 595 
386         }
387     SetOutStat(0);            //OK Good, signal
388     ShowInitInfo();
389     KMem.LastScanTime = GetuS();
390
391     KMRunStat.WorkMode=0;
392     KMRunStat.WorkMode2=0;
393         
394     KMRunStat.WorkMode = storedKMSysCfg.theKMSysCfg.workmode;
842bb6 395
Q 396 #if (ENABLE_PLC)        
483170 397     if (KMRunStat.WorkMode == 1){
Q 398         InitPLC();
399         KMRunStat.WorkMode2 = KMem.CurJumperSW&0x20 ;
400         if (KMRunStat.WorkMode2) {
401             StartPLC(); }
402     }
842bb6 403 #endif
Q 404     
483170 405 #if (BOARD_TYPE == 15 || BOARD_TYPE == 16)
842bb6 406     LoadKwConfig();
Q 407 //    KWireLessInit(&KWInitStruct);
408     
483170 409     KWireLessInit(KMem.EffJumperSW&0x20,KMem.EffJumperSW&0x0f);
Q 410     KWireLessStart();
411 #endif
842bb6 412
Q 413
414     stPortDef PortReg3 = {.nPortHardType = 7,.nPortUseType = 6};
415     KMRegisterPort(2,&PortReg3);
483170 416     
Q 417   while (1)
418   {
419         //int MyKeyStat1,MyKeyStat2;
420         //MyKeyStat1=GetInput();
421
422         //*((unsigned int *)&(PLCMem.SDT[10]))=nRunCount;
423     //    KMem.nRunCount=nRunCount;
424         SlowFlicker=0;
425         FastFlicker=1;        
426         us1=GetuS();
427         int haltick=HAL_GetTick();
428         
429         int thisJumperSW=ReadJumperSW();
430         
842bb6 431 #if (ENABLE_PLC)        
483170 432         if (KMRunStat.WorkMode&1){
Q 433             if (thisJumperSW&0x20 && !(KMem.CurJumperSW&0x20))  // Run 开关 正 跳变。
434             {StartPLC();}
435             if (!(thisJumperSW&0x20) && (KMem.CurJumperSW&0x20))  // Run 开关 负 跳变。
436             {StopPLC();}
437         }
842bb6 438 #endif        
483170 439         KMem.CurJumperSW=thisJumperSW;
Q 440         KMem.haltick=haltick;
441 //        KMem.TotalRunTime=TotalRunTime;
442 //        KMem.ThisRunTime=ThisRunTime;        
443         
444 //        *((unsigned int *)&(PLCMem.SDT[2]))=nChilds;
445 //        KMem.SDD[13]=PendSvCount;
446 //        KMem.SDD[14]=RCC->CSR;        
842bb6 447         
483170 448         
Q 449         int a;
450         a        = LL_GPIO_ReadInputPort(GPIOA);
451         KMem.WDT[120]=a;
452         a        = LL_GPIO_ReadInputPort(GPIOB);
453         KMem.WDT[121]=a;
454         a        = LL_GPIO_ReadInputPort(GPIOC);
455         KMem.WDT[122]=a;
456         a        = LL_GPIO_ReadInputPort(GPIOD);
457         KMem.WDT[123]=a;
458         
459 #if (BOARD_TYPE == 14)
460 //        KMem.WX[0]= GetInput();        
461         FP0_Proc();
462 #else
463         KMem.WX[0]= GetInput();        
464 #endif
465         
466         if (GetBoardType() == 7 || GetBoardType() ==8 
467             || GetBoardType() == 9 || GetBoardType() ==10 || GetBoardType() ==15 || GetBoardType() ==16) 
468         {
469             displayInput(KMem.WX[0]);
470         }
471         us2=GetuS();
472         if (PowerDownEvent) {        KMem.WX[0]=0;}
473 ///*
474         if ((KMem.nRunCount &0x1f) == 0x02)
475         {
476             ADCProcess();
477             if (PowerDownEvent)
478             {
479                 KMem.WX[0]=0;
480                 if (!OldPowerDownEvent)
481                 {
482                     OldPowerDownEvent = PowerDownEvent;
483                     OldPowerDownEventTime = nCurTick;
484                     PowerDownProcess();
485                 }
486             }else
487             {
488                 if (OldPowerDownEvent)
489                 {
490                     OldPowerDownEvent=PowerDownEvent;
491                     PowerRecoverProcess();
492                     
493                 }
494             }
495         }
496 //*/
497
498 #if (BOARD_TYPE == 15 || BOARD_TYPE == 16)
499         Radio.IrqProcess( ); // Process Radio IRQ
500         KWL_Process(1);
501         
502 #endif
503
504 //        pProgs = (stBinProg1 *) STORE_PRG_BASE;
842bb6 505 #if (ENABLE_PLC)
483170 506         if (    KMRunStat.WorkMode==1 ) //&& bKBusMaster)
Q 507         {
508             if (KMRunStat.nBinProgBank == 0){
509                 pProgs=(stBinProg1 *)STORE_PRG_BASE;
510             }else {
511                 pProgs=(stBinProg1 *)ALT_PRG_BASE;
512             }
513             nSizeProg1=KMRunStat.nBinProgSize;
514         //    pProgs=(stBinProg1 *)prog1;
515             
516             ProcessPLCBinProg(pProgs, nSizeProg1);
517         }
842bb6 518 #endif // ENABLE_PLC
483170 519         KMem.ScanTimeuS=us2-KMem.LastScanTime;
Q 520         KMem.LastScanTime = us2;
521         if (KMem.ScanTimeuS < KMem.MinScanTimeuS) {KMem.MinScanTimeuS = KMem.ScanTimeuS;}
522         if (KMem.ScanTimeuS > KMem.MaxScanTimeuS) {KMem.MaxScanTimeuS = KMem.ScanTimeuS;}
523
524         //        if (bKBusRepeater)        {    KBusRepeaterFunc();    }
525
526         us3=GetuS();
527
528         if (bKBusMaster)        
529         {
530 #if (BOARD_TYPE == 14)
531             for (int i=0;i<nOutputBytes;i++)
532             {BufferOut[i+1]=KMem.WYB[i];}
533 #else
534 //            BufferOut[1]=KMem.WX[0]&0xff;
535 //            BufferOut[2]=(KMem.WX[0]>>8)&0xff;
536 #endif
537         }
842bb6 538             KBusLoopProcess(&KBus1);
Q 539             
483170 540             if (haltick&0x00002000) SlowFlicker=1;
Q 541             else SlowFlicker=0;
542             if (haltick&0x00000800) FastFlicker=1;
543             else FastFlicker=0;    
544
545         if (bKBusSlave)        
546         {
547 //            BufferOut[0]=KMem.WX[0];
548 #if (BOARD_TYPE == 15 || BOARD_TYPE == 16)
549 //            KBusSlaveFunc(2);    
550         //    if (! KMem.RunStat) {BufferIn[0]=0;}
551         //    KMem.WY[0]=BufferIn[0];
552 #else
842bb6 553             KBusSlaveFunc(&KBus1);    
483170 554             if (! KMem.RunStat) {BufferIn[0]=0;}
Q 555             KMem.WY[0]=BufferIn[0];
556 #endif
842bb6 557             if (KBus1.nSlaveTick&0x00002000) SlowFlicker=1;
483170 558             else SlowFlicker=0;
842bb6 559             if (KBus1.nSlaveTick&0x00000800) FastFlicker=1;
483170 560             else FastFlicker=0;            
Q 561         }
562
563 //        KMem.WY[0]=nCount2>>5;
842bb6 564
483170 565         
Q 566         if (KMRunStat.bLEDFlick)
567         {
568             SetRunLed(FastFlicker);
569             SetErrLed(FastFlicker);
570             SetErr2Led(FastFlicker);
571             SetOutStat(!FastFlicker);
572             //KMRunStat.bLEDFlick-- ;
573         }
574         else
575         {
842bb6 576             KMem.ErrStat = KwRunStat.ErrStat; 
Q 577             if ((KMem.EffJumperSW&0x10)==0x10)         KMem.ErrStat += KBus1.ErrStat;
578 #if (ENABLE_PLC)        
483170 579             if (KMRunStat.WorkMode==1 ) {
Q 580                 if (PLCMem.bPLCRunning){SetRunLed(SlowFlicker);}
581                     else {SetRunLed(0);}
582             }
842bb6 583             else
Q 584 #endif // ENABLE_PLC
585             {
483170 586                     if (!KMem.RunStat) SetRunLed(SlowFlicker);
Q 587                     else SetRunLed(FastFlicker);
588             }
842bb6 589
483170 590             if (!KMem.ErrStat) 
Q 591             {
592                 SetErrLed(0);
593                 SetErr2Led(0);
594                 SetOutStat(1);
595             }
596             else 
597             {
598                 SetErrLed(FastFlicker);
599                 SetErr2Led(FastFlicker);
600                 SetOutStat(0);
601                 
602             }
603         }
604         
605 //        SetRunLed(RunStat);
606 //        SetErrLed(ErrStat);
607         
608         us4=GetuS();
609 //        EffJumperSW = GetInput(20)&0xff;
610
842bb6 611         
483170 612 #if (BOARD_TYPE == 15 || BOARD_TYPE == 16)        
Q 613         
614         if ((KMem.EffJumperSW&0x10)==0x10) {
842bb6 615             KMem.WFY[1]=KBusMem.WLYB[1];
Q 616             KBusMem.WLXB[1]=KMem.WFX[1];
483170 617         }else
Q 618         {
619             KMem.WFY[1]=KMem.WX[0];
620             KMem.WY[0]=KMem.WFX[1];
621         }
622 //    KMem.WY[0]=KMem.WLY[0];
623 #else
624         KMem.WLX[0]=KMem.WX[0];
625         KMem.WY[0]=KMem.WLY[0];
626 #endif
627
628         us5=GetuS();
629         
630 #if (BOARD_TYPE == 14)
631 //        PutOutput (KMem.WY[0]);
632 #else
633         PutOutput (KMem.WY[0]);
634 #endif
635         //PutOutput (KMem.nRunCount>>8);
636         //PutOutput(0x0f70);
637
638 //        if (bKBusMaster) ShowInfo();
639 //        if (bKBusSlave) ShowInfo();
640         us6=GetuS();
641         add1(10,10);
642         for (int i=0;i<64;i++)
643         {
644 //            ProcessTimer(i);
645         }
646         KMem.nRunCount++;
647 //        int nSize=sizeof(stKBusChnStat);
648 //        memcpy(&KMem.SDT[64],&KBusChnStats[1],nSize);
649 //        memcpy(&KMem.SDT[64+nSize/2],&KBusChnStats[2],nSize);
650 //        for (int i=0;i<128;i++)    {        SDT[i]=i;    }
651 //        SDT[48]=55;
7d8ba5 652 #if (USART1_AUTO_BAUDRATE == 1)
842bb6 653             if (Uart1IdelTimer>300000) { // 超过60秒没有数据传输,重新进入自适应波特率状态
483170 654                 LL_USART_EnableAutoBaudRate(USART1);
Q 655                 LL_USART_SetAutoBaudRateMode(USART1, LL_USART_AUTOBAUD_DETECT_ON_FALLINGEDGE);
656             }else {
657                     Uart1IdelTimer++;
658             }
7d8ba5 659 #endif            
842bb6 660 // if (bKBusSlave)    HAL_Delay(0);
483170 661 /*
Q 662         if (!IsEmpty(&Uart1Stat.QRx))
663         {
664             unsigned char k=PopOne(&Uart1Stat.QRx);
665             if (k=='L')
666             {
667                 clearscreen();
668             }
669         }
670 */
671
672 #if (BOARD_TYPE == 14)
673 const unsigned int pins[6]= {        LL_GPIO_PIN_10,LL_GPIO_PIN_11,LL_GPIO_PIN_12,LL_GPIO_PIN_13,LL_GPIO_PIN_14,LL_GPIO_PIN_15};
674         //process 6 output
675         {
676                 // mapping bits.
677             for (int i=0;i<6;i++)
678             {
679                 USHORT bitaddr = storedKMSysCfg.theKMSysCfg.OutMappings[i];
680                 UCHAR type =  (bitaddr&0xf000) >>12;
681                 USHORT byteaddr = (bitaddr&0x0ff0) >>4;
682                 UCHAR bitpos = bitaddr &0x0f;
683                 UCHAR bitvalue = 0 ;
684                 if (byteaddr>0) {
685                     if (type == 0) bitvalue = KMem.WXB[byteaddr-1] & ( 1 << bitpos );
686                     else if (type == 1 ) bitvalue = KMem.WYB[byteaddr-1] & ( 1 << bitpos );
687                 }
688                 if (bitvalue){ LL_GPIO_SetOutputPin(GPIOB,pins[i]);}
689                 else {LL_GPIO_ResetOutputPin(GPIOB,pins[i]);}
690             }
691         }
692 #endif
693
694 /*        
695         {
696         unsigned char pos,seg;
697         unsigned short val;
698         pos=((KMem.nRunCount)&0x3);
699         //val=(KMem.nRunCount)&0xfff;
700         val=KMem.ErrStat;
701         char buf5[20];
702         sprintf(buf5,"%4d",val);
703         val=buf5[3-pos];
704         if (val <'0' || val >'9') {seg=0;}
705         else {seg=LEDSEGTAB[val-'0'];}
706         
707         pos=1<<pos;
708         //pos=1;
709         //seg=2;
710         seg=~seg;
711         //    PutOutputSPI1(pos|(seg<<8));
712     }
713 */
714
715 #if (BOARD_TYPE == 13)    
716      w5500_network_info_show();
717 //     loopback_tcps(0,str1,5000);
718 #endif
719
720      LL_IWDG_ReloadCounter(IWDG);
721         
722   }    //while (1) ;
723   /* USER CODE END WHILE */
724
725   /* USER CODE BEGIN 3 */
726
727   /* USER CODE END 3 */
728
729 }
730
731
732 /* USER CODE BEGIN 4 */
733
734 /* USER CODE END 4 */
735
736 /**
737   * @brief  This function is executed in case of error occurrence.
738   * @param  file: The file name as string.
739   * @param  line: The line in file as a number.
740   * @retval None
741   */
742 void _Error_Handler(char *file, int line)
743 {
744   /* USER CODE BEGIN Error_Handler_Debug */
745   /* User can add his own implementation to report the HAL error return state */
746   while(1)
747   {
748   }
749   /* USER CODE END Error_Handler_Debug */
750 }
751
752 #ifdef  USE_FULL_ASSERT
753 /**
754   * @brief  Reports the name of the source file and the source line number
755   *         where the assert_param error has occurred.
756   * @param  file: pointer to the source file name
757   * @param  line: assert_param error line source number
758   * @retval None
759   */
760 void assert_failed(uint8_t* file, uint32_t line)
761
762   /* USER CODE BEGIN 6 */
763   /* User can add his own implementation to report the file name and line number,
764      tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
765   /* USER CODE END 6 */
766 }
767 #endif /* USE_FULL_ASSERT */
768
769 /**
770   * @}
771   */
772
773 /**
774   * @}
775   */
776
777 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/