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