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