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