Pārlūkot izejas kodu

235升级修改。

liyi 1 gadu atpakaļ
vecāks
revīzija
ed3f7d91e5

+ 4 - 14
control/bootloader64k_dc/boot/Modbus/BARE/port/portserial.c

@@ -105,16 +105,6 @@ xMBPortSerialInit( UCHAR ucPORT, ULONG ulBaudRate, UCHAR ucDataBits, eMBParity e
 	//return FALSE;
 }
 
-void del_modbus_uart(void)
-{
-	usart_disable(USART0); 
-	usart_deinit(USART0);
-	nvic_irq_disable(USART0_IRQn);
-	rcu_periph_clock_disable(RCU_USART0);
-	rcu_periph_clock_disable(RCU_GPIOA); 
-}
-
-
 
 BOOL
 xMBPortSerialPutByte( CHAR ucByte )
@@ -138,9 +128,9 @@ xMBPortSerialGetByte( CHAR * pucByte )
 void USART0_IRQHandler(void)            
 {
   if(usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE) != RESET)  //接收缓冲区非空中断
-  {         
+  {         		
+    usart_interrupt_flag_clear(USART0, USART_INT_FLAG_RBNE);  //清除USART1中断挂起      
 		prvvUARTRxISR();		
-    usart_interrupt_flag_clear(USART0, USART_INT_FLAG_RBNE);  //清除USART1中断挂起                                                                                     
   }                                                         
                                                             
   if(usart_flag_get(USART0, USART_FLAG_ORERR) == SET) //溢出错误标志为1
@@ -150,13 +140,13 @@ void USART0_IRQHandler(void)
   }                                                                                                           
 	if(usart_interrupt_flag_get(USART0, USART_INT_FLAG_TBE)!= RESET)  //发送缓冲区空中断
   {     
-		prvvUARTTxReadyISR();		
     usart_interrupt_flag_clear(USART0, USART_INT_FLAG_TBE);        //清除发送中断标志
+		prvvUARTTxReadyISR();
   }
 	if(usart_interrupt_flag_get(USART0, USART_INT_FLAG_TC)!= RESET)  //发送完成中断
   {     	
-    prvvUARTTxReadyISR();
 		usart_interrupt_flag_clear(USART0, USART_INT_FLAG_TC);         //清除发送完成中断   
+		prvvUARTTxReadyISR();
 //		gpio_bit_reset(GPIOA, GPIO_PIN_8);														 //接收		
   }
 } 

+ 4 - 0
control/bootloader64k_dc/boot/Modbus/include/mb.h

@@ -409,6 +409,10 @@ eMBErrorCode    eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress,
  */
 eMBErrorCode    eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress,
                                   USHORT usNDiscrete );
+																	
+																	
+																	
+uint8_t eMBCheck(void);
 
 #ifdef __cplusplus
 PR_END_EXTERN_C

+ 14 - 0
control/bootloader64k_dc/boot/Modbus/mb.c

@@ -327,6 +327,20 @@ eMBDisable( void )
     return eStatus;
 }
 
+
+uint8_t eMBCheck(void)
+{
+	if( eMBState != STATE_ENABLED)
+	{
+		return 1;
+	}else
+	{
+		return 0;
+	}
+}
+
+
+
 eMBErrorCode
 eMBPoll( void )
 {

+ 36 - 9
control/bootloader64k_dc/boot/Modbus/rtu/mbrtu.c

@@ -153,8 +153,14 @@ eMBRTUReceive( UCHAR * pucRcvAddress, UCHAR ** pucFrame, USHORT * pusLength )
     eMBErrorCode    eStatus = MB_ENOERR;
 
     ENTER_CRITICAL_SECTION(  );
-    assert( usRcvBufferPos < MB_SER_PDU_SIZE_MAX );
-
+		
+    //assert( usRcvBufferPos < MB_SER_PDU_SIZE_MAX );
+		if(usRcvBufferPos >= MB_SER_PDU_SIZE_MAX)
+		{
+			eStatus = MB_EIO;
+			EXIT_CRITICAL_SECTION(  );
+			return eStatus;
+		}
     /* Length and CRC check */
     if( ( usRcvBufferPos >= MB_SER_PDU_SIZE_MIN )
         && ( usMBCRC16( ( UCHAR * ) ucRTUBuf, usRcvBufferPos ) == 0 ) )
@@ -237,7 +243,12 @@ xMBRTUReceiveFSM( void )
     BOOL            xTaskNeedSwitch = FALSE;
     UCHAR           ucByte;
 
-    assert( eSndState == STATE_TX_IDLE );
+    //assert( eSndState == STATE_TX_IDLE );
+		if(eSndState != STATE_TX_IDLE)
+		{
+			eMBDisable();
+			return xTaskNeedSwitch;
+		}
 
     /* Always read the character. */
     ( void )xMBPortSerialGetByte( ( CHAR * ) & ucByte );
@@ -296,8 +307,18 @@ xMBRTUTransmitFSM( void )
 {
     BOOL            xNeedPoll = FALSE;
 
-    assert( eRcvState == STATE_RX_IDLE );
-
+    //assert( eRcvState == STATE_RX_IDLE );
+		if(eRcvState != STATE_RX_IDLE)
+		{
+			eMBDisable();
+			return xNeedPoll;
+		}
+//		if(eRcvState != STATE_RX_IDLE)
+//		{
+//			eMBDisable();
+//			eMBRTUStart();
+//			return xNeedPoll;
+//		}
     switch ( eSndState )
     {
         /* We should not get a transmitter event if the transmitter is in
@@ -320,8 +341,9 @@ xMBRTUTransmitFSM( void )
             xNeedPoll = xMBPortEventPost( EV_FRAME_SENT );
             /* Disable transmitter. This prevents another transmit buffer
              * empty interrupt. */
-            vMBPortSerialEnable( TRUE, FALSE );
-            eSndState = STATE_TX_IDLE;
+						eSndState = STATE_TX_IDLE; 
+						vMBPortSerialEnable( TRUE, FALSE );
+            
         }
         break;
     }
@@ -353,8 +375,13 @@ xMBRTUTimerT35Expired( void )
 
         /* Function called in an illegal state. */
     default:
-        assert( ( eRcvState == STATE_RX_INIT ) ||
-                ( eRcvState == STATE_RX_RCV ) || ( eRcvState == STATE_RX_ERROR ) );
+			{
+				eMBDisable();
+				eRcvState = STATE_RX_IDLE;
+				return xNeedPoll;
+				//  assert( ( eRcvState == STATE_RX_INIT ) ||
+				//          ( eRcvState == STATE_RX_RCV ) || ( eRcvState == STATE_RX_ERROR ) );
+			}
     }
 
     vMBPortTimersDisable(  );

+ 20 - 10
control/bootloader64k_dc/boot/USER/main.c

@@ -311,16 +311,7 @@ uint8_t md5_check(uint32_t addr,uint32_t lenth,uint32_t* md5)
 
 int main(void)
 {
-	InitLED();
-	InitKey();
-	InitTimer();
-	CurrentAddr = ReadKeyValue();
-	eMBInit(MB_RTU, CurrentAddr, 0, 115200, MB_PAR_NONE);
-	eMBEnable();
 	flash_get_meta(&meta_data);
-	//Fwdgt_Init();
-	
-	//read data and 
 	uint8_t app1_checum = 0xFF;
 	uint8_t app2_checum = 0xFF;
 	
@@ -476,11 +467,27 @@ int main(void)
 		}else
 		{
 					//wait to upgrade
-		}
+		}	
+	InitLED();
+	InitKey();
+	InitTimer();
+	CurrentAddr = ReadKeyValue();
+	eMBInit(MB_RTU, CurrentAddr, 0, 115200, MB_PAR_NONE);
+	eMBEnable();
+	
+	//Fwdgt_Init();
+	
+	//read data and 
+
+
 		md_status = UPGRADE_STATUS_IDE;	
 	
 		while(1)
 		{
+			if(eMBCheck())
+			{
+				eMBEnable();
+			}
 			eMBPoll();
 			//Fwdgt_reload();
 			if(flash_flag)
@@ -609,7 +616,10 @@ int main(void)
 						//jiaoyan and break
 						app1_checum = md5_check(meta_data.app1_rom_addr,meta_data.app1_size,meta_data.app1_md5);
 						if(app1_checum == 0)
+						{
+							eMBDisable();
 							UserJumpToApplication(start_addr);
+						}
 						
 						md_status = UPGRADE_STATUS_IDE;
 						meta_write_complete_flag = 0;   //