QuakeGod
2024-07-27 842bb64195f958b050867c50db66fc0aa413dafb
提交 | 用户 | age
8b51c7 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)
5dd1b7 59 #include "FPx.h"
8b51c7 60 #elif (BOARD_TYPE == 15 || BOARD_TYPE == 16)
Q 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)
8b51c7 87 stBinProg1 * pProgs = (stBinProg1 *)STORE_PRG_BASE;
842bb6 88 #endif 
8b51c7 89 uint32_t us1,us2,us3,us4,us5,us6;
Q 90
5dd1b7 91 stKBusDef KBus1;
Q 92
93 #define RAM_START_ADDR 0x20000000
94 #define VECTOR_SIZE 45 
95 #define  ApplicationAddress  0x08001000  //应用程序首地址定义
96 /*
97 static void RemapIrqVector(void)
98 {
99     memcpy((void*)RAM_START_ADDR, (void *)ApplicationAddress, VECTOR_SIZE * 4);
100     LL_APB1_GRP2_EnableClock(LL_APB1_GRP2_PERIPH_SYSCFG);
101     LL_SYSCFG_SetRemapMemory(LL_SYSCFG_REMAP_SRAM);
102 }*/
103
8b51c7 104 /* USER CODE END PV */
Q 105
106 /* Private function prototypes -----------------------------------------------*/
5dd1b7 107
8b51c7 108
Q 109
110 /* USER CODE BEGIN PFP */
111 /* Private function prototypes -----------------------------------------------*/
112
113 const unsigned char LEDSEGTAB[]={
114 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,    //0-F
115 0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1,  //0.-F.
116 0x00,0x40,            //  ,-,_,~,o,n,N,<,>,J,r,
117 };
118
119 /* USER CODE END PFP */
120
121 /* USER CODE BEGIN 0 */
122
123 int HexToInt(char ch)
124 {
125     if (ch>='0' && ch <='9') return ch-'0';
126     if (ch>='A' && ch <='F') return ch-'A'+10;
127     if (ch>='a' && ch <='f') return ch-'a'+10;
128     return 0;
129 }
130
131 void HAL_SYSTICK_Callback(void)
132 {
133 static int Count=0;
134     CurTickuS += 100;    
135     nCurTick++;
5dd1b7 136     KBus1.nSlaveTick++;
8b51c7 137     Count++;
Q 138     if (Count>=10000) 
139     {
140         Count=0; 
141         KMem.CurTimeSec++;
142         KMem.ThisRunTime++; KMem.TotalRunTime++;
143         if (KMRunStat.bLEDFlick) KMRunStat.bLEDFlick--;
144         if (KMRunStat.bLEDFlick >120) KMRunStat.bLEDFlick=120;
145     }
146
147     return;
148 }
149
5dd1b7 150 void PendSvCallBack()
8b51c7 151 {
5dd1b7 152 #if (BOARD_TYPE == 14)
Q 153 ///*    
154         if (bSPI1RecvDone)
155         {
156             bSPI1RecvDone=0;
157             FPxParsePkt(SPI1RecvBuf,nSPI1RecvLenInBuf);
158         }
159 //*/    
160 #endif        
161     if (Uart2Stat.bPacketRecved)
162     {
163         KBusParsePacket(&KBus1, (pKBPacket)Uart2RecvBuf1, Uart2RecvBuf1DataLen);        
164         Uart2RecvBuf1DataLen=0;
165         Uart2Stat.bPacketRecved=0;
166         Uart2RecvDMA(Uart2RecvBuf1,sizeof(Uart2RecvBuf1));        
167     }
8b51c7 168 }
5dd1b7 169
Q 170 /*
171 FPx通讯回调函数,当通讯状态改变或数据更新时被调用。
172 */
173 void * FPxCallBackFunc(int nEvent, void * pBuf, int nLen1)
174 {
175     switch (nEvent){
176         case evFPxNone:
177             break;
178         case evFPxCreate:
179             break;
180         case evFPxConnected:
181             break;
182         case evFPxDisConnected:
183             break;
184         case evFPxClosed:
185             break;
186         case evFPxStateChange:
187             break;
188         case evFPxTimeSync:
189             break;
190         case evFPxDataUpdate:
191             for (int i=0;i<16;i++){
192                     KBusMem.WLY[i]=FPxMem.WLY[i];
193             }
194             for (int i=0;i<16;i++) {
195                 FPxMem.WLX[i]=KBusMem.WLX[i];
196             }
197 //            KBusMem.WLY[0]=0x0301;
198             break;
199         
200         default:
201             break;
202         
203     }
204     return 0;
205 }
206
207 /*
208 KBus通讯回调函数,当通讯状态改变或数据更新时被调用。
209 或者系统请求时。
210 */
211 void * KBusEvCallBackFunc(void*  pParam, int nEvent, void *pBuf, int nLen1)
212 {
213     switch (nEvent){
214         
215         case KBusEvNone:
216             break;
217         case KBusEvCreate:
218             break;
219         case KBusEvConnected:
220             break;
221         case KBusEvDisConnected:
222             break;
223         case KBusEvClosed:
224             break;
225         case KBusEvStateChange:
226             break;
227         case KBusEvTimeSync:
228             break;
229         case KBusEvDataUpdate:
230             for (int i=0;i<16;i++){
231                     KBusMem.WLY[i]=FPxMem.WLY[i];
232             }
233             for (int i=0;i<16;i++) {
234                 KMem.WLX[i]=KBusMem.WLX[i];
235                 FPxMem.WLX[i]=KBusMem.WLX[i];
236             }                
237 //             KBusMem.WLY[0]=0x0301;            
238             break;
239         
240         default:
241             break;
242     }
243     return 0;
244 }
245
8b51c7 246
Q 247 /* USER CODE END 0 */
248
249 /**
250   * @brief  The application entry point.
251   *
252   * @retval None
253   */
254 int main(void)
255 {
256   /* USER CODE BEGIN 1 */
257 //    RemapIrqVector();
258 ///*    
259       __set_PRIMASK(0);    //打开全局中断
260     
261     KMRunStat.bLEDFlick = 1;
262     
263     InitUartstat(&Uart1Stat,Uart1RxBuf,sizeof(Uart1RxBuf),Uart1TxBuf,sizeof(Uart1TxBuf));
264     InitUartstat(&Uart2Stat,Uart2RxBuf,sizeof(Uart2RxBuf),Uart2TxBuf,sizeof(Uart2TxBuf));
265   /* USER CODE END 1 */
266
267   /* MCU Configuration----------------------------------------------------------*/
268
269   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
270   HAL_Init();
271
272   /* USER CODE BEGIN Init */
273
5dd1b7 274
8b51c7 275         KMem.LastScanTime=0;
Q 276         KMem.ScanTimeuS=0;
277         KMem.MinScanTimeuS=99999;
278         KMem.MaxScanTimeuS=0;
279
280 //        KMem.SDD[14]=(unsigned int)&KMStoreSysCfg;
281 //        KMem.SDD[15]=(unsigned int)&KMStoreSysCfg1;
282         KMem.SDD[12]=((uint32_t *)UID_BASE)[0];
283 //        KMem.SDD[13]=((uint32_t *)UID_BASE)[1];
284 //        KMem.SDD[14]=((uint32_t *)UID_BASE)[2];
285         KMem.SDD[13]=PendSvCount;
286         KMem.SDD[14]=RCC->CSR;
287 //        KMem.SDD[15]=*(uint32_t *)FLASHSIZE_BASE;
288 //        KMem.SDD[16]=(unsigned int)&KMSysCfg;
289     
290   /* USER CODE END Init */
291
292   /* Configure the system clock */
293   SystemClock_Config();
294
295   /* USER CODE BEGIN SysInit */
296     TickFreq=10000;        //Tick频率
297     InituS(TickFreq);    
298  // HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/TickFreq);    //重新定义SysTick的频率
299
300   /* USER CODE END SysInit */
301
302   /* Initialize all configured peripherals */
303   MX_GPIO_Init();
304   MX_DMA_Init();
305     
306     KMachineInit();
5dd1b7 307     
8b51c7 308     ReadSysCfgFromFlash(&storedKMSysCfg);
Q 309     
310     KMRunStat.bLEDFlick = 1;
311     
5dd1b7 312     int bKBusMaster,bKBusSlave,bKBusRepeater;;
Q 313     int nChilds;
8b51c7 314     KMem.CurJumperSW=ReadJumperSW();
Q 315     KMem.EffJumperSW=KMem.CurJumperSW;
5dd1b7 316     nChilds=KMem.EffJumperSW&0x0f;
8b51c7 317 //    Uart2Baud = AlterUart2Baud;
5dd1b7 318     
Q 319     KBusSetEvCallBackFunc(&KBus1, &KBusEvCallBackFunc),
320     KBusInitMaster(&KBus1, (KBusSendPktFuncDef)PutStr2, nChilds);
8b51c7 321     
Q 322 #if (BOARD_TYPE == 14)
323     KMem.EffJumperSW|=0x10;
5dd1b7 324     nChilds=KMem.EffJumperSW&0x0f;
8b51c7 325   if ((KMem.EffJumperSW&0x10)!=0) {bKBusMaster=1;bKBusSlave=0;}
Q 326     else{bKBusMaster=0;bKBusSlave=1;}
5dd1b7 327     
Q 328     FPxSetCallBackFunc(&FPxCallBackFunc);
329     FPx_Init(nChilds);
330     FPx_SetIOCount(8,5);
331     
8b51c7 332 #elif (BOARD_TYPE == 15 || BOARD_TYPE == 16)
Q 333     nStationID=1 ;//KMem.EffJumperSW&0x0f;
334 //    if (KMem.EffJumperSW == 0x1f) {bKBusRepeater=1;bKBusMaster=1;bKBusSlave=0;}
335 //  else if ((KMem.EffJumperSW&0x10)!=0) {bKBusMaster=1;bKBusSlave=0;}
336 //    else
337         {bKBusMaster=0;bKBusSlave=1;}    
338 #else
339     nStationID=KMem.EffJumperSW&0x0f;
340     if (KMem.EffJumperSW == 0x1f) {bKBusRepeater=1;bKBusMaster=1;bKBusSlave=0;}
341   else if ((KMem.EffJumperSW&0x10)!=0) {bKBusMaster=1;bKBusSlave=0;}
342     else{bKBusMaster=0;bKBusSlave=1;}
343 #endif
5dd1b7 344     
8b51c7 345     //if (KMem.EffJumperSW == 0x00)
Q 346         Uart1Baud = DefaultUart1Baud;
347   MX_USART1_UART_Init();
348   MX_USART2_UART_Init();
349
350     MX_SPI1_Init();
351     LL_SPI_EnableIT_RXNE(SPI1);
352
353 #if (BOARD_TYPE == 14)
354 //    MX_SPI2_Init();
355 //  MX_ADC_Init();
356 #else
357     MX_SPI2_Init();
358   MX_ADC_Init();
359 #endif
360
361     MX_IWDG_Init();
362
363     MX_TIM6_Init();
364     LL_TIM_EnableCounter(TIM6);
365     
366   /* USER CODE BEGIN 2 */
367     LL_USART_EnableIT_RXNE(USART1);
368     LL_USART_EnableIT_IDLE(USART1);
369     LL_USART_EnableIT_TC(USART1);
370
371 //    LL_USART_EnableIT_RXNE(USART2);
372     Uart2RecvDMA(Uart2RecvBuf1,sizeof(Uart2RecvBuf1));    
373     LL_USART_EnableIT_IDLE(USART2);
374     LL_USART_EnableIT_TC(USART2);
375 #if (BOARD_TYPE == 13)
376     int res;
377     res = w5500_init();
378     KMem.SDD[28]=res;
379     
380 //    res=socket(0,Sn_MR_TCP,5000,0);
381     KMem.SDD[29]=res;    
382     
383 //    res = listen(0);
384 #endif    
385 //    if (bKBusSlave)
386     {
387     //    LL_USART_EnableAutoBaudRate(USART1);
388     //    LL_USART_SetAutoBaudRateMode(USART1, LL_USART_AUTOBAUD_DETECT_ON_FALLINGEDGE);        
389     //    LL_USART_EnableAutoBaudRate(USART2);
390     //    LL_USART_SetAutoBaudRateMode(USART2, LL_USART_AUTOBAUD_DETECT_ON_FALLINGEDGE);        
391     }
392     //LL_USART_EnableIT_TXE(USART1);
393   /* USER CODE END 2 */
394
395     
396   /* Infinite loop */
397   /* USER CODE BEGIN WHILE */
398
399     HAL_Delay(10);                
400     SetRunLed(1);                //Turn On Run Led
401     SetErrLed(0);                //Turn Off Err Led
402
403 #if (BOARD_TYPE == 14)
404 //    PutOutput (0);                    //Clear all Output
405 //    Enable595(1);                        //Enable 595 Output 
406 #else
407     PutOutput (0);                    //Clear all Output
408     Enable595(1);                        //Enable 595 Output 
409 #endif
410
411         if (GetBoardType() == 7 || GetBoardType() ==8 
412             || GetBoardType() == 9 || GetBoardType() ==10 ||GetBoardType() ==13 ||GetBoardType() ==15 || BOARD_TYPE == 16) 
413         {
414             displayInput(0xffff);        //
415             EnableDisIn(1);                //Input Diaplay Enable 595 
416         }
417     SetOutStat(0);            //OK Good, signal
418     ShowInitInfo();
419     KMem.LastScanTime = GetuS();
420
421     KMRunStat.WorkMode=0;
422     KMRunStat.WorkMode2=0;
423         
424     KMRunStat.WorkMode = storedKMSysCfg.theKMSysCfg.workmode;
842bb6 425 #if (ENABLE_PLC)        
8b51c7 426     if (KMRunStat.WorkMode == 1){
Q 427         InitPLC();
428         KMRunStat.WorkMode2 = KMem.CurJumperSW&0x20 ;
429         if (KMRunStat.WorkMode2) {
430             StartPLC(); }
431     }
842bb6 432 #endif
Q 433     
8b51c7 434 #if (BOARD_TYPE == 15 || BOARD_TYPE == 16)
Q 435     KWireLessInit(KMem.EffJumperSW&0x20,KMem.EffJumperSW&0x0f);
436     KWireLessStart();
437 #endif
438     
439   while (1)
440   {
441         //int MyKeyStat1,MyKeyStat2;
442         //MyKeyStat1=GetInput();
443
444         //*((unsigned int *)&(PLCMem.SDT[10]))=nRunCount;
445     //    KMem.nRunCount=nRunCount;
446         SlowFlicker=0;
447         FastFlicker=1;        
448         us1=GetuS();
449         int haltick=HAL_GetTick();
450         
451         int thisJumperSW=ReadJumperSW();
842bb6 452 #if (ENABLE_PLC)        
8b51c7 453         if (KMRunStat.WorkMode&1){
Q 454             if (thisJumperSW&0x20 && !(KMem.CurJumperSW&0x20))  // Run 开关 正 跳变。
455             {StartPLC();}
456             if (!(thisJumperSW&0x20) && (KMem.CurJumperSW&0x20))  // Run 开关 负 跳变。
457             {StopPLC();}
458         }
842bb6 459 #endif        
8b51c7 460         KMem.CurJumperSW=thisJumperSW;
Q 461         KMem.haltick=haltick;
462 //        KMem.TotalRunTime=TotalRunTime;
463 //        KMem.ThisRunTime=ThisRunTime;        
464         
465 //        *((unsigned int *)&(PLCMem.SDT[2]))=nChilds;
466 //        KMem.SDD[13]=PendSvCount;
467 //        KMem.SDD[14]=RCC->CSR;        
468         
469         int a;
470         a        = LL_GPIO_ReadInputPort(GPIOA);
471         KMem.WDT[120]=a;
472         a        = LL_GPIO_ReadInputPort(GPIOB);
473         KMem.WDT[121]=a;
474         a        = LL_GPIO_ReadInputPort(GPIOC);
475         KMem.WDT[122]=a;
476         a        = LL_GPIO_ReadInputPort(GPIOD);
477         KMem.WDT[123]=a;
478         
479 #if (BOARD_TYPE == 14)
480 //        KMem.WX[0]= GetInput();        
5dd1b7 481         FPx_Proc();
8b51c7 482 //        KMem.WYB[0]++;
Q 483 //        KMem.WYB[1]++;
484         
485 #else
486         KMem.WX[0]= GetInput();        
487 #endif
488         
489         if (GetBoardType() == 7 || GetBoardType() ==8 
490             || GetBoardType() == 9 || GetBoardType() ==10 || GetBoardType() ==15 || GetBoardType() ==16) 
491         {
492             displayInput(KMem.WX[0]);
493         }
494         us2=GetuS();
495 /*
496         if (PowerDownEvent) {        KMem.WX[0]=0;}
497         if ((KMem.nRunCount &0x1f) == 0x02)
498         {
499             ADCProcess();
500             if (PowerDownEvent)
501             {
502                 KMem.WX[0]=0;
503                 if (!OldPowerDownEvent)
504                 {
505                     OldPowerDownEvent = PowerDownEvent;
506                     OldPowerDownEventTime = nCurTick;
507                     PowerDownProcess();
508                 }
509             }else
510             {
511                 if (OldPowerDownEvent)
512                 {
513                     OldPowerDownEvent=PowerDownEvent;
514                     PowerRecoverProcess();
515                     
516                 }
517             }
518         }
519 // */
520
521 #if (BOARD_TYPE == 15 || BOARD_TYPE == 16)
522         Radio.IrqProcess( ); // Process Radio IRQ
523         KWL_Process(1);
524         
525 #endif
526
527 //        pProgs = (stBinProg1 *) STORE_PRG_BASE;
842bb6 528 #if (ENABLE_PLC)
8b51c7 529         if (    KMRunStat.WorkMode==1 ) //&& bKBusMaster)
Q 530         {
531             if (KMRunStat.nBinProgBank == 0){
532                 pProgs=(stBinProg1 *)STORE_PRG_BASE;
533             }else {
534                 pProgs=(stBinProg1 *)ALT_PRG_BASE;
535             }
536             nSizeProg1=KMRunStat.nBinProgSize;
537         //    pProgs=(stBinProg1 *)prog1;
538             
539             ProcessPLCBinProg(pProgs, nSizeProg1);
540         }
842bb6 541 #endif
8b51c7 542         KMem.ScanTimeuS=us2-KMem.LastScanTime;
Q 543         KMem.LastScanTime = us2;
544         if (KMem.ScanTimeuS < KMem.MinScanTimeuS) {KMem.MinScanTimeuS = KMem.ScanTimeuS;}
545         if (KMem.ScanTimeuS > KMem.MaxScanTimeuS) {KMem.MaxScanTimeuS = KMem.ScanTimeuS;}
546
547         //        if (bKBusRepeater)        {    KBusRepeaterFunc();    }
548
549         us3=GetuS();
550
551         if (bKBusMaster)        
552         {
553 #if (BOARD_TYPE == 14)
5dd1b7 554             for (int i=0;i<FPxStat.nOutputBytes;i++)
Q 555             {KBusMem.WLYB[i]=FPxMem.WLYB[i];}
8b51c7 556 #endif
5dd1b7 557             if (nChilds>0) {        KBusMasterFunc(&KBus1); }
8b51c7 558
Q 559         }
560             if (haltick&0x00002000) SlowFlicker=1;
561             else SlowFlicker=0;
562             if (haltick&0x00000800) FastFlicker=1;
563             else FastFlicker=0;    
564
565         if (bKBusSlave)        
566         {
567
5dd1b7 568             KBusSlaveFunc(&KBus1);    
Q 569             if (KBus1.nSlaveTick&0x00002000) SlowFlicker=1;
570             else SlowFlicker=0;
571             if (KBus1.nSlaveTick&0x00000800) FastFlicker=1;
572             else FastFlicker=0;            
8b51c7 573         }
Q 574
575 //        KMem.WY[0]=nCount2>>5;
576         if (KMem.RunStat) {KMem.RunStat--;}
577         if (KMem.ErrStat) {KMem.ErrStat--;}
578         
579         if (KMRunStat.bLEDFlick)
580         {
581             SetRunLed(FastFlicker);
582             SetErrLed(FastFlicker);
583             SetErr2Led(FastFlicker);
584             SetOutStat(!FastFlicker);
585             //KMRunStat.bLEDFlick-- ;
586         }
587         else
588         {
842bb6 589 #if (ENABLE_PLC)            
8b51c7 590             if (KMRunStat.WorkMode==1 ) {
Q 591                 if (PLCMem.bPLCRunning){SetRunLed(SlowFlicker);}
592                     else {SetRunLed(0);}
593             }
842bb6 594             else 
Q 595 #endif                
596             {
5dd1b7 597                     if (!KBus1.RunStat) SetRunLed(SlowFlicker);
8b51c7 598                     else SetRunLed(FastFlicker);
Q 599             }
5dd1b7 600             if (!KBus1.ErrStat) 
8b51c7 601             {
Q 602                 SetErrLed(0);
603                 SetErr2Led(0);
604                 SetOutStat(1);
605             }
606             else 
607             {
608                 SetErrLed(FastFlicker);
609                 SetErr2Led(FastFlicker);
610                 SetOutStat(0);
611             }
612         }
613         
614 //        SetRunLed(RunStat);
615 //        SetErrLed(ErrStat);
616         
617         us4=GetuS();
618 //        EffJumperSW = GetInput(20)&0xff;
619
620 #if (BOARD_TYPE == 15 || BOARD_TYPE == 16)        
621         
622         if ((KMem.EffJumperSW&0x10)==0x10) {
623             KMem.WFY[1]=KMem.WLY[0];
624             KMem.WLX[0]=KMem.WFX[1];            
625         }else
626         {
627             KMem.WFY[1]=KMem.WX[0];
628             KMem.WY[0]=KMem.WFX[1];
629         }
630 //    KMem.WY[0]=KMem.WLY[0];
631 #elif (BOARD_TYPE == 14)
632
633 #else
634         
635         KMem.WLX[0]=KMem.WX[0];
636         KMem.WY[0]=KMem.WLY[0];
637 #endif
638
639         us5=GetuS();
640         
641 #if (BOARD_TYPE == 14)
642 //        PutOutput (KMem.WY[0]);
643 #else
644         PutOutput (KMem.WY[0]);
645 #endif
646         //PutOutput (KMem.nRunCount>>8);
647         //PutOutput(0x0f70);
648
649 //        if (bKBusMaster) ShowInfo();
650 //        if (bKBusSlave) ShowInfo();
651         us6=GetuS();
652         add1(10,10);
653         for (int i=0;i<64;i++)
654         {
655 //            ProcessTimer(i);
656         }
657         KMem.nRunCount++;
658 //        int nSize=sizeof(stKBusChnStat);
659 //        memcpy(&KMem.SDT[64],&KBusChnStats[1],nSize);
660 //        memcpy(&KMem.SDT[64+nSize/2],&KBusChnStats[2],nSize);
661 //        for (int i=0;i<128;i++)    {        SDT[i]=i;    }
662 //        SDT[48]=55;
663         if (Uart1RecvBuf1DataLen >0 && Uart1Stat.bPacketRecved)
664         {
665             int res1 = -1;
666             res1 = ModBusSlaveParsePkg(1, Uart1RecvBuf1, Uart1RecvBuf1DataLen);
667             if (res1 !=0)
668             {
669                 KLParsePacket(1, Uart1RecvBuf1, Uart1RecvBuf1DataLen);
670             }
671             Uart1RecvBuf1DataLen=0;
672             Uart1Stat.bPacketRecved=0;
673             Uart1IdelTimer = 0;
674         }else {
675             if (Uart1IdelTimer>600000) { // 超过60秒没有数据传输,重新进入自适应波特率状态
676                 LL_USART_EnableAutoBaudRate(USART1);
677                 LL_USART_SetAutoBaudRateMode(USART1, LL_USART_AUTOBAUD_DETECT_ON_FALLINGEDGE);
678             }else {
679                     Uart1IdelTimer++;
680             }
681         }
682  if (bKBusSlave)    HAL_Delay(0);
683 /*
684         if (!IsEmpty(&Uart1Stat.QRx))
685         {
686             unsigned char k=PopOne(&Uart1Stat.QRx);
687             if (k=='L')
688             {
689                 clearscreen();
690             }
691         }
692 */
693
694 #if (BOARD_TYPE == 14)
695 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};
696         //process 6 output
697         {
698                 // mapping bits.
699             for (int i=0;i<6;i++)
700             {
701                 USHORT bitaddr = storedKMSysCfg.theKMSysCfg.OutMappings[i];
702                 UCHAR type =  (bitaddr&0xf000) >>12;
703                 USHORT byteaddr = (bitaddr&0x0ff0) >>4;
704                 UCHAR bitpos = bitaddr &0x0f;
705                 UCHAR bitvalue = 0 ;
706                 if (byteaddr>0) {
707                     if (type == 0) bitvalue = KMem.WXB[byteaddr-1] & ( 1 << bitpos );
708                     else if (type == 1 ) bitvalue = KMem.WYB[byteaddr-1] & ( 1 << bitpos );
709                 }
710                 if (bitvalue){ LL_GPIO_SetOutputPin(GPIOB,pins[i]);}
711                 else {LL_GPIO_ResetOutputPin(GPIOB,pins[i]);}
712             }
713         }
714 #endif
715
716 /*        
717         {
718         unsigned char pos,seg;
719         unsigned short val;
720         pos=((KMem.nRunCount)&0x3);
721         //val=(KMem.nRunCount)&0xfff;
722         val=KMem.ErrStat;
723         char buf5[20];
724         sprintf(buf5,"%4d",val);
725         val=buf5[3-pos];
726         if (val <'0' || val >'9') {seg=0;}
727         else {seg=LEDSEGTAB[val-'0'];}
728         
729         pos=1<<pos;
730         //pos=1;
731         //seg=2;
732         seg=~seg;
733         //    PutOutputSPI1(pos|(seg<<8));
734     }
735 */
736
737 #if (BOARD_TYPE == 13)    
738      w5500_network_info_show();
739 //     loopback_tcps(0,str1,5000);
740 #endif
741
742      LL_IWDG_ReloadCounter(IWDG);
743         
744   }    //while (1) ;
745   /* USER CODE END WHILE */
746
747   /* USER CODE BEGIN 3 */
748
749   /* USER CODE END 3 */
750
751 }
752
753
754 /* USER CODE BEGIN 4 */
755
756 /* USER CODE END 4 */
757
758 /**
759   * @brief  This function is executed in case of error occurrence.
760   * @param  file: The file name as string.
761   * @param  line: The line in file as a number.
762   * @retval None
763   */
764 void _Error_Handler(char *file, int line)
765 {
766   /* USER CODE BEGIN Error_Handler_Debug */
767   /* User can add his own implementation to report the HAL error return state */
768   while(1)
769   {
770   }
771   /* USER CODE END Error_Handler_Debug */
772 }
773
774 #ifdef  USE_FULL_ASSERT
775 /**
776   * @brief  Reports the name of the source file and the source line number
777   *         where the assert_param error has occurred.
778   * @param  file: pointer to the source file name
779   * @param  line: assert_param error line source number
780   * @retval None
781   */
782 void assert_failed(uint8_t* file, uint32_t line)
783
784   /* USER CODE BEGIN 6 */
785   /* User can add his own implementation to report the file name and line number,
786      tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
787   /* USER CODE END 6 */
788 }
789 #endif /* USE_FULL_ASSERT */
790
791 /**
792   * @}
793   */
794
795 /**
796   * @}
797   */
798
799 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/