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