Преглед изворни кода

reduce frequency by 8M, repair temperature

terry пре 2 година
родитељ
комит
c4fbd6f8cf

+ 0 - 64
Core/Inc/Data_deal.h

@@ -1,64 +0,0 @@
-#ifndef __data_deal_H__
-#define __data_deal_H__
-
-
-#include "stdio.h"
-#include "string.h"
-#include "stdint.h"
-#include <ctype.h>  
-
-
-void StrToHex(uint8_t *pbDest, uint8_t *pbSrc, int nLen);														//字符串转成16进制数
-void HexToStr(uint8_t *pbDest, uint8_t *pbSrc, int nLen);														//16进制转换成字符串
-
-void Switch_U32_To_BYTE4(unsigned long temp_U32_data, unsigned char*data);		//将32位无符号整数转成4字节数组存储
-unsigned long Switch_BYTE4_To_U32(unsigned char*data);												//将U32的4字节数组转成32位无符号整数
-
-void Switch_S32_to_ASCII(signed long data, unsigned char*str);								//将32位有符号整数转成ASCII字符串显示
-void Switch_Float_To_ASCII(float temp_float_data, unsigned char*str);					//将浮点数转成ASCII字符串
-
-void Switch_S16_To_Byte2(signed short temp_S16_data, unsigned char*data);			//将有符号整数转成2字节数组存储
-signed short Switch_Byte2_To_S16(unsigned char*data);													//2字节数组转成有符号整数
-
-float Switch_Byte4_To_Float(unsigned char*data);															//四字节数组转成浮点数
-void Switch_Float_To_Byte4(float temp_float_data, unsigned char*data);				//将浮点数转成四字节数组存储
-
-void Data32ToBuf(uint16_t *buf, uint32_t data32);															//4字节数存放到数组中	数组起始地址存放高字节
-int32_t BufToData32(uint16_t *buf);																						//2字节数组组成一个32位数	数组起始地址存放高字节
-
-void S32_to_u8(signed long data,unsigned char*str);
-
-uint16_t LRC_Check(uint8_t *data);
-uint16_t Calc_LRC(uint8_t* data, int data_len);
-uint8_t MODBUS_ASCII_GetLrc(uint8_t *pCyAsciiBuf, uint8_t cyLen);
-
-uint8_t MODBUS_ASCII_AsciiToHex(uint8_t *pbDest);
-uint8_t MODBUS_ASCII_GetLrc(uint8_t *pCyAsciiBuf, uint8_t cyLen);						//MODBUS  LDR校验
-void MODBUS_S32_to_ASCII(int32_t data32 ,uint8_t *pAsciiBuf );
-void MODBUS_S16_to_ASCII(int16_t data16 ,uint8_t *pAsciiBuf );
-void MODBUS_S8_to_ASCII(int8_t data8 ,uint8_t *pAsciiBuf );
-
-uint16_t CRC16(unsigned char *pBuf,int nLength) ;
-
-
-unsigned short CRC16_MODBUS(unsigned char *puchMsg, unsigned int usDataLen);
-
-float MODBUS_ASCII_AsciiToFlaot(uint8_t *pbDest);
-
-void MODBUS_Float_to_ASCII(float data32 ,uint8_t *pAsciiBuf );
-
-//单字节BCD转为HEX子程序
-unsigned char BCDtoHEX(unsigned char bcd_data); 
-
-//单字节HEX转为BCD子程序
-unsigned char HEXtoBCD(unsigned char hex_data); 
-
-/********** BCD to HEX **********/
-//双字节数值范围:0~9999
-uint16_t BCD2HEX(uint16_t bcd);
-
-/********** BCD to HEX **********/
-//双字节数值范围:0~9999
-uint16_t HEX2BCD(uint16_t hex);
-
-#endif

+ 8 - 6
Core/Inc/adc.h

@@ -35,12 +35,12 @@ extern "C" {
 extern ADC_HandleTypeDef hadc1;
 
 /* USER CODE BEGIN Private defines */
-extern uint8_t adc1_byte1 ;   
-extern uint8_t adc2_byte1 ;                      // 定义一个字节变量用于存储转换结果
-extern uint8_t adc3_byte1 ;   
-extern uint8_t adc1_byte2 ;   
-extern uint8_t adc2_byte2 ;                      // 定义一个字节变量用于存储转换结果
-extern uint8_t adc3_byte2 ;  
+//extern uint8_t adc1_byte1 ;   
+//extern uint8_t adc2_byte1 ;                      // 定义一个字节变量用于存储转换结果
+//extern uint8_t adc3_byte1 ;   
+//extern uint8_t adc1_byte2 ;   
+//extern uint8_t adc2_byte2 ;                      // 定义一个字节变量用于存储转换结果
+//extern uint8_t adc3_byte2 ;  
 extern uint16_t adc1_filtered;
 extern uint16_t adc2_filtered;
 extern uint16_t adc3_filtered;
@@ -48,6 +48,8 @@ extern uint16_t Value_old_addr2;
 extern uint16_t Value_old_addr3; 
 extern uint16_t adc2_rawValue;
 extern uint16_t adc3_rawValue;
+extern uint16_t Adc2_CalibrationValue ;
+extern uint16_t Adc3_CalibrationValue ;
 /* USER CODE END Private defines */
 
 void MX_ADC1_Init(void);

+ 52 - 0
Core/Inc/dataHandling.h

@@ -0,0 +1,52 @@
+#ifndef __DATAHANDLING_H__
+#define __DATAHANDLING_H__
+
+#include "main.h"
+#include "string.h"
+#include "stdio.h"
+#include "usart.h"
+#include "stmflash.h"
+#include "iap.h"
+
+#define STM32_FLASH_SIZE 	512 	 		//所选STM32的FLASH容量大小(单位为K)
+#define STM32_FLASH_WREN 	1              	//使能FLASH写入(0,不是能;1,使能)
+#define FLASH_WAITETIME  	50000          	//FLASH等待超时时间
+
+extern uint32_t flash_addr;
+extern uint16_t iapversion[5];
+extern uint16_t iapmd5[10];
+
+
+
+// 定义一个长度为16的字符数组,用于存储MD5摘要
+extern unsigned char digest[16];
+
+//FLASH起始地址
+#define STM32_FLASH_BASE 	0x08000000 		//STM32 FLASH的起始地址
+
+void Flash_ReadBytes(uint16_t* sorBuf,uint32_t FlashAddr,uint16_t len);
+int App2_MD5_Check(uint32_t addr,unsigned int all_len);
+void  Flash_WriteBytes(uint16_t* sorBuf,uint32_t FlashAddr,uint16_t len);
+void Set_App2_Flag(void);
+void delay_sys_us(uint32_t Delay);//1个delay,大概1.5us
+
+void search_seat(const uint8_t* hexData);
+uint16_t crc16_xmodem(uint8_t *data, uint16_t length);
+void Set_Update_Down(void);
+void iap_write_appbin(uint32_t appxaddr, uint32_t appbuf, uint32_t appsize);
+void Set_jump_Flag(void);
+void convertHexToAscii(uint16_t version[4], uint32_t* System_version);
+
+void readFlashToArr(uint8_t *arr, uint32_t addr);
+void Set_normal_Flag(void);
+
+
+
+
+
+
+
+
+
+
+#endif

+ 3 - 2
Core/Inc/gpio.h

@@ -33,6 +33,9 @@ extern "C" {
 /* USER CODE END Includes */
 
 /* USER CODE BEGIN Private defines */
+
+extern uint8_t  gpioaStatus ;
+extern uint8_t  gpiobStatus ; 
 /* USER CODE END Private defines */
 
 void MX_GPIO_Init(void);
@@ -41,8 +44,6 @@ void MX_GPIO_Init(void);
 uint8_t GetPaInputStatus(void);
 uint8_t GetPbOutputStatus(void);
 void updatePbStatus(uint16_t temp);
-
-
 uint16_t calculate_crc(uint8_t* buffer, uint8_t length);
 /* USER CODE END Prototypes */
 

+ 38 - 16
Core/Inc/iap.h

@@ -7,28 +7,50 @@
 #include "usart.h"
 
 
-#define FLASH_APP1_ADDR		0x08010000  	//第一个应用程序起始地址(存放在FLASH)
-											//保留0X08000000~0X0800FFFF的空间为IAP使用
-/* 启动选项 */
-#define Startup_Normal 	0xBBBBBBBB	///< 正常启动   跳转到APP1
-#define Startup_Update 	0xAAAAAAAA	///< 升级再启动 
-#define Startup_Reset  	0x5555AAAA	///< ***恢复出厂 目前没使用***
-#define Startup_APP2  	0x5555BBBB	///< ***跳转到APP2***
 
-#define StartBytes_IAP   ((uint32_t)0xA55A55AA) //远程升级的起始字节
-#define EndBytes_IAP     ((uint32_t)0x5AA5AA55) //远程升级的结束字节
+#define Startup_Normal 					((uint32_t)0xFFFFFFFF)	
+#define Startup_Update 					((uint32_t)0xAAAAAAAA)	
+#define Startup_APP2  					((uint32_t)0x5555BBBB)	
+#define Jump_app	  					((uint32_t)0x6666CCCC)	
 
 
+#define Startup_Reset  					((uint32_t)0x5555AAAA)	
+#define StartBytes_IAP  	 			((uint32_t)0xA55A55AA) 
+#define EndBytes_IAP    	 			((uint32_t)0x5AA5AA55)
 
+#define ADD_UPDATE_PROG                	((uint32_t)0x08040000U)                          
+#define Application_Buffer_Addr        	((uint32_t)0x08060000U)        
 
+#define StartMode_Addr                	((uint32_t)0x807F07A) 
 
+#define BUFFER_SIZE_length 100           
+    
+#if 0
+#define indexfl   4
+#else
+#define indexfl   5
+#endif
+
+extern int FileLength_IAP;
+extern unsigned int all_len;
+extern uint8_t buffer[BUFFER_SIZE_length];
+extern uint8_t buffer_length[100];
+extern uint16_t start_addr;
+extern uint8_t YmodemID;
+extern uint16_t version[4];
+extern uint8_t startFrame[40];
+extern uint8_t binName[32] ;
+extern uint8_t binLength[10] ;
+extern uint8_t binMd5[16] ;
+extern uint32_t update_flag;
+extern uint16_t packTotalNum;
+extern uint16_t packIndex ;
+
+extern int lenindex;
+extern uint16_t iapbinMd5[8] ;
 void Process_CMD_IAP_Update(void);
-void Set_Update_Down(void);
-void Res_Update_Down(void);
 void Start_BootLoader(void);
-void Set_App2_Flag(void);
-void iap_load_app(uint32_t appxaddr);			//执行flash里面的app程序
-
-void iap_write_appbin(uint32_t appxaddr,uint8_t *appbuf,uint32_t applen);	//在指定地址开始,写入bin
-
+extern uint16_t FileBuffArray[512];
+extern uint16_t FileBuffArray1[512];
 #endif
+

+ 27 - 33
Core/Inc/main.h

@@ -33,11 +33,7 @@ extern "C" {
 /* USER CODE BEGIN Includes */
 #include "stdio.h"
 #include "string.h"
-
-#include "Data_deal.h"
 #include "iap.h"
-#include "md5c.h"
-#include "stmflash.h"
 /* USER CODE END Includes */
 
 /* Exported types ------------------------------------------------------------*/
@@ -60,20 +56,16 @@ extern "C" {
 /* USER CODE END EC */
 
 /* Exported macro ------------------------------------------------------------*/
-/* USER CODE BEGIN EM */
-#define Rx_Max 1024  	
-#define Version_sys 0x23062500  	
-
-extern uint16_t Adc2_CalibrationValue ;
-extern uint16_t Adc3_CalibrationValue ;
-extern uint8_t  gpioaStatus ;
-extern uint8_t  gpiobStatus ; 
-extern uint8_t	Rx_Flag;
-extern uint16_t	Rx_Len;
-extern uint8_t	Rx_Buf[Rx_Max];
-
-extern int data_lengthU2;
-extern int flagU2Rx;
+/* USER CODE BEGIN EM */	
+extern uint16_t initial_address;
+extern int nameLength;
+extern int sizeLength ;
+extern int	md5Length;
+
+extern uint32_t System_version;
+// 定义数组大小
+#define ARRAY_SIZE 1024
+
 /* USER CODE END EM */
 
 /* Exported functions prototypes ---------------------------------------------*/
@@ -83,9 +75,12 @@ void Error_Handler(void);
 uint16_t read_flash_16(uint32_t addr);
 void read_new_address(uint32_t addr);
 void Write_Information(uint32_t addr, uint8_t* rx_buffer, uint8_t buffer_index);
-void delay_sys_us(uint32_t Delay);
 void ModBus(void);
-void reboot_sys(void);
+void receive_modbus_9_1(uint16_t addr, uint8_t funcode, uint16_t startaddr, uint16_t reg, uint8_t byteNum);
+void receive_modbus_4(uint16_t addr, uint8_t funcode);
+void clear_buf(void);
+void erase_flash(uint32_t ADDR_FLASH);
+uint32_t read_flash_32(uint32_t addr);
 /* USER CODE END EFP */
 
 /* Private defines -----------------------------------------------------------*/
@@ -95,21 +90,20 @@ void reboot_sys(void);
 #define DEBOUNCE_COUNT 10
 #define Modbus 1
 
-#define newline 0
-#define ADDR_FLASH_PAGE_94    ((uint32_t)0x802F000)  // Flash扇区94页的起始地址      address
-#define ADDR_FLASH_PAGE_104   ((uint32_t)0x8034000)  // Flash扇区104页的起始地址     PbStatus
-#define ADDR_FLASH_PAGE_114   ((uint32_t)0x8039000)  // Flash扇区114页的起始地址     Baudrate
-#define ADDR_FLASH_PAGE_124   ((uint32_t)0x803E000)  // Flash扇区124页的起始地址     Adc2_Calibration    4-20mA
-#define ADDR_FLASH_PAGE_134   ((uint32_t)0x8043000)  // Flash扇区134页的起始地址     Adc3_Calibration    4-20mA
-#define ADDR_FLASH_PAGE_144   ((uint32_t)0x8048000)  // Flash扇区144页的起始地址      
-  
-#define ADDR_UPDATE_FLAG               	 0x0807F078                     
-#define StartMode_Addr                	 0x0807F07A                       
+#define addr_FLASH_ADDR    		((uint32_t)0x8070000)  // address
+#define pbstatus_FLASH_ADDR   	((uint32_t)0x8070800)  // PbStatus
+#define baudrate_FLASH_ADDR   	((uint32_t)0x8071000)  // Baudrate
+#define ADC1_FLASH_ADDR   		((uint32_t)0x8071800)  // Adc2_Calibration    4-20mA
+#define ADC2_FLASH_ADDR   		((uint32_t)0x8072000)  // Adc3_Calibration    4-20mA
 
-#define Application_Buffer_Addr      	 0x08040000
-#define ADD_UPDATE_PROG             	 0x08020000                          
-#define ADD_UPDATE_PROG1            	 0x08000000
+#define SYSVERSION_ADDR   		((uint32_t)0x8072800)  
+#define CURPACKAGE_ADDR   		((uint32_t)0x8073000)  
+#define CURADDRESS_ADDR   		((uint32_t)0x8073800)  
+#define VERSION_ADDR			((uint32_t)0x8074000)  
+#define LENGTH_ADDR				((uint32_t)0x8074800)  
+#define MD5_ADDR				((uint32_t)0x8075000)  
 
+  
 
 /* USER CODE END Private defines */
 

+ 12 - 0
Core/Inc/md5.h

@@ -0,0 +1,12 @@
+#ifndef __MD5_H
+#define __MD5_H
+#include <stdint.h>
+typedef struct {
+  uint32_t state[4];
+  uint32_t count[2];
+  uint8_t buffer[64];
+} MD5_CTX;
+void MD5_Init(MD5_CTX *ctx);
+void MD5_Update(MD5_CTX *ctx, const uint8_t *input, uint32_t inputLen);
+void MD5_Final(uint8_t *digest, MD5_CTX *ctx);
+#endif /* __MD5_H */

+ 1 - 0
Core/Inc/stm32f1xx_it.h

@@ -53,6 +53,7 @@ void BusFault_Handler(void);
 void UsageFault_Handler(void);
 void DebugMon_Handler(void);
 void DMA1_Channel3_IRQHandler(void);
+void DMA1_Channel4_IRQHandler(void);
 void DMA1_Channel5_IRQHandler(void);
 void ADC1_2_IRQHandler(void);
 void TIM2_IRQHandler(void);

+ 23 - 13
Core/Inc/usart.h

@@ -29,6 +29,7 @@ extern "C" {
 #include "main.h"
 
 /* USER CODE BEGIN Includes */
+#include "dataHandling.h"
 
 /* USER CODE END Includes */
 
@@ -37,20 +38,27 @@ extern UART_HandleTypeDef huart1;
 extern UART_HandleTypeDef huart3;
 
 /* USER CODE BEGIN Private defines */
-#define BUF_SIZE 500
-#define Uart1_BUF_SIZE  256
-#define Uart2_BUF_SIZE  1024     /*为UART2、3专门开一个DMA接收存储区 2021-4-12 by Daiyf*/
-#define Uart3_BUF_SIZE  256
+#define RX_BUF_SIZE 1024
 	 
-extern uint8_t usart1_rx_flag;
-extern uint8_t usart3_rx_flag;
-extern uint16_t rx1_len;
-extern uint16_t rx3_len;
+extern uint8_t USART_IAP_RX[RX_BUF_SIZE];
+extern uint8_t USART_PUB_RX[RX_BUF_SIZE];
+extern uint8_t USART_MODBUS_RX[RX_BUF_SIZE];
+extern uint8_t USART_IAP_FLAG;
+extern uint8_t USART_MODBUS_FLAG;
+extern uint16_t USART_PUB_LENGTH;
+extern uint16_t package_num;
+extern uint16_t app_Cache_buf[RX_BUF_SIZE] ;
+extern uint8_t destArray[128];
+extern uint8_t nameArray[16];
+extern uint16_t sizeArray[1] ;
+extern uint8_t md5Array[16];
 
-extern uint8_t USART_RX_BUF[Uart1_BUF_SIZE];
-extern uint16_t LIB_CRC_MODBUS(uint8_t* Buf, uint16_t srLen);
-extern uint8_t USART2_RX_BUF[Uart2_BUF_SIZE];
-extern uint8_t USART2_RX_BUF002[Uart2_BUF_SIZE];
+extern int count;
+extern int nameIndex ;
+extern int sizeIndex ;
+
+extern uint16_t curpackage;
+extern uint32_t curaddress;
 /* USER CODE END Private defines */
 
 void MX_USART1_UART_Init(void);
@@ -58,7 +66,9 @@ void MX_USART3_UART_Init(void);
 
 /* USER CODE BEGIN Prototypes */
 void update_baudrate(uint16_t temp);
-
+void update_sysVersion(uint32_t addr);
+void update_iaplength(uint32_t addr);
+void updateiapMd5(uint32_t addr);
 /* USER CODE END Prototypes */
 
 #ifdef __cplusplus

+ 0 - 779
Core/Src/Data_deal.c

@@ -1,779 +0,0 @@
-#include "Data_deal.h"
-
-//note: 2021-2-23 新加入BCDtoHEX相互转的几个函数  ---- Daiyf。 
-union Tmp
-{
-    float  value;									//浮点运算联合体
-    unsigned char array[4];
-};
-
-union Tmp1
-{
-    signed short  value;							//S16运算联合体   -32768-32767
-    unsigned char array[2];
-};
-
-union Tmp2
-{
-    signed long  value;							    //S32运算联合体   -2147483648--2147483647   存放18位AD值 -131072-131071
-    unsigned char array[4];
-};
-
-union Tmp3
-{
-    unsigned long  value;							//U32运算联合体   存放18位AD值0x00000-0x3FFFF
-    unsigned char array[4];
-};
-
-
-/*
-// C prototype : void StrToHex(BYTE *pbDest, BYTE *pbSrc, int nLen)
-// parameter(s): [OUT] pbDest - 输出缓冲区
-//	[IN] pbSrc - 字符串
-//	[IN] nLen - 16进制数的字节数(字符串的长度/2)
-// return value: 
-// remarks : 字符串转成16进制数
-*/
-void StrToHex(uint8_t *pbDest, uint8_t *pbSrc, int nLen)
-{
-	char h1,h2;
-	uint8_t s1,s2;
-	int i;
-
-	for (i=0; i<nLen; i++)
-	{
-		h1 = pbSrc[2*i];
-		h2 = pbSrc[2*i+1];
-
-		s1 = toupper(h1) - 0x30;
-		if (s1 > 9) 
-		s1 -= 7;
-
-		s2 = toupper(h2) - 0x30;
-		if (s2 > 9) 
-		s2 -= 7;
-
-		pbDest[i] = s1*16 + s2;
-	}
-}
-
-/*
-// C prototype : void HexToStr(BYTE *pbDest, BYTE *pbSrc, int nLen)
-// parameter(s): [OUT] pbDest - 存放在目标字符串中
-//	[IN] pbSrc - 输入16进制的起始地址
-//	[IN] nLen - 16进制的字节数
-// return value: 
-// remarks : 16进制转换成字符串
-*/
-void HexToStr(uint8_t *pbDest, uint8_t *pbSrc, int nLen)
-{
-	char	ddl,ddh;
-	int i;
-
-	for (i=0; i<nLen; i++)
-	{
-		ddh = 48 + pbSrc[i] / 16;
-		ddl = 48 + pbSrc[i] % 16;
-		if (ddh > 57) ddh = ddh + 7;
-		if (ddl > 57) ddl = ddl + 7;
-		pbDest[i*2] = ddh;
-		pbDest[i*2+1] = ddl;
-	}
-
-	pbDest[nLen*2] = '\0';
-}
-
-/*******************************************************************************
-* Function Name  : Switch_U32_To_AD7691BYTE4
-* Description    : 将32位无符号整数转成4字节数组存储
-* Input          : temp_U32_data--要转换的U32变量   data--转换后的4字节存储
-* Output         : None
-* Return         : None
-*******************************************************************************/
-void Switch_U32_To_BYTE4(unsigned long temp_U32_data, unsigned char*data)
-{
-    union Tmp3 U32Tmp;
-    unsigned char i = 0;
-    U32Tmp.value = temp_U32_data;
-    for(i = 0; i < 4; i++)
-    {
-        data[i] = U32Tmp.array[i];		//将U32转换成四字节
-    }
-}
-
-/*******************************************************************************
-* Function Name  : Switch_BYTE4_To_U32
-* Description    : 将U32的4字节数组转成32位无符号整数
-* Input          : data--转换前四字节数组    temp_U32_data--要转换的U32变量
-* Output         : None
-* Return         : None
-*******************************************************************************/
-unsigned long Switch_BYTE4_To_U32(unsigned char*data)
-{
-    union Tmp3 U32Tmp;
-    unsigned char i = 0;
-    unsigned long temp_U32_data = 0;
-    for(i = 0; i < 4; i++)
-    {
-        U32Tmp.array[i] = *(data + i);		//4字节数据暂存
-    }
-    temp_U32_data = U32Tmp.value; 	//4字节转换的U32有符号整数
-    return(temp_U32_data);
-
-}
-
-/*******************************************************************************
-* Function Name  : Switch_S32_to_ASCII
-* Description    : 将32位有符号整数转成ASCII字符串显示
-* Input          : S32
-* Output         : ASCII字符串
-* Return         : None
-*******************************************************************************/
-
-void Switch_S32_to_ASCII(signed long data, unsigned char*str)
-{
-    unsigned short i;       //u16
-    signed long temp, tempoten; //s32
-    unsigned char temp_length, temp_str[12] = {0};
-
-
-    if(data < 0)
-    {
-        str[0] = '-';    //1.确定符号位
-        data = -data;
-    }
-    else str[0] = '+';
-
-    temp = data;
-
-    i = 0;
-    tempoten = temp / 10;
-    while(tempoten != 0)			    //由低到高存储ASCII码
-    {
-        temp_str[i] = temp - 10 * tempoten + 48; //to ascii code
-        temp = tempoten;
-        tempoten = temp / 10;
-        i++;
-    }
-    temp_str[i] = temp + 48;
-    temp_length = i + 1;
-
-    for(i = 0; i < temp_length; i++)
-    {
-        str[i + 1] =	temp_str[temp_length - 1 - i]; //由高到低存储ASCII码
-    }
-
-}
-
-
-/*******************************************************************************
-* Function Name  : S32_to_u8  
-* Description    : 将32位数转换成8位数组
-* Input          : data--要转变量   str--转换后的字节数组
-* Output         : None
-* Return         : None
-*******************************************************************************/
-void S32_to_u8(signed long data,unsigned char*str)
-{
-	 str[0] = data>>24;
-	 str[1] = data>>16;
-	 str[2] = data>>8;
-	 str[3] = data;
-
-}
-
-
-/*******************************************************************************
-* Function Name  : Switch_Float_To_ASCII  注:小数点有效数字3位
-* Description    : 将浮点数转成ASCII字符串
-* Input          : temp_float_data--要转换的float变量   str--转换后的字节数组
-* Output         : None
-* Return         : None
-*******************************************************************************/
-void Switch_Float_To_ASCII(float temp_float_data, unsigned char*str)
-{
-    unsigned short  i, j, k;
-    signed long temp, tempoten;
-    unsigned char intpart[20], data[20];
-
-    if(temp_float_data < 0)
-    {
-        str[0] = '-';
-        temp_float_data = -temp_float_data;
-    }
-    else str[0] = '+';
-
-
-    temp = (signed long)temp_float_data;
-
-    i = 0;
-    tempoten = temp / 10;
-    while(tempoten != 0)
-    {
-        intpart[i] = temp - 10 * tempoten + 48; //to ASCII code
-        temp = tempoten;
-        tempoten = temp / 10;
-        i++;
-    }
-    intpart[i] = temp + 48;
-
-    for(k = 1; k <= i + 1; k++) str[k] = intpart[i + 1 - k];
-
-
-    for(j = 0; j < 20; j++)
-    {
-        data[j] = 0;
-    }
-
-    temp = (temp_float_data * 1000) - ((signed long)(temp_float_data)) * 1000; //取小数
-    if(temp)
-    {
-        Switch_S32_to_ASCII(temp, data);
-        str[i + 2] = '.';
-
-        str[i + 3] = data[1]; //第1位肯定不为0
-
-        if(data[2] != '0')
-        {
-            str[i + 4] = data[2]; //取2位
-        }
-        else
-        {
-            str[i + 4] = 0;
-        }
-        if(data[3] != '0')
-        {
-            str[i + 5] = data[3]; //取3位
-        }
-        else
-        {
-            str[i + 5] = 0;
-        }
-        str[i + 6] = 0;
-    }
-    else
-    {
-        str[i + 3] = 0;
-    }
-
-}
-
-/*******************************************************************************
-* Function Name  : Switch_S16_To_Byte2
-* Description    : 将有符号整数转成2字节数组存储
-* Input          : temp_S16_data--要转换的S16变量   data--转换后的2字节数组
-* Output         : None
-* Return         : None
-*******************************************************************************/
-void Switch_S16_To_Byte2(signed short temp_S16_data, unsigned char*data)
-{
-    union Tmp1 S16Tmp;
-    unsigned char i = 0;
-    S16Tmp.value = temp_S16_data;       //将S16转存
-    for(i = 0; i < 2; i++)
-    {
-        data[i] = S16Tmp.array[i];		//将S16转换成2字节
-    }
-}
-
-/*******************************************************************************
-* Function Name  : Switch_Byte2_To_S16
-* Description    : 2字节数组转成有符号整数
-* Input          : data--转换前的2字节数组
-* Output         : None
-* Return         : 转换后的有符号整数
-*******************************************************************************/
-signed short Switch_Byte2_To_S16(unsigned char*data)
-{
-    union Tmp1 S16Tmp;
-    unsigned char i = 0;
-    signed short temp_S16_data = 0;
-    for(i = 0; i < 2; i++)
-    {
-        S16Tmp.array[i] = data[i];		//2字节数据暂存
-    }
-    temp_S16_data = S16Tmp.value; 	    //2字节转换的S16有符号整数
-
-    return(temp_S16_data);
-}
-
-/*******************************************************************************
-* Function Name  : Switch_Byte4_To_Float
-* Description    : 四字节数组转成浮点数
-* Input          : data--转换前的四字节数组
-* Output         : None
-* Return         : 转换后的浮点数
-*******************************************************************************/
-float Switch_Byte4_To_Float(unsigned char*data)
-{
-    union Tmp floatTmp;
-    unsigned char i = 0;
-    float temp_float_data = 0;
-    for(i = 0; i < 4; i++)
-    {
-        floatTmp.array[i] = data[i];		//四字节数据暂存
-    }
-    temp_float_data = floatTmp.value; 	//四字节转换的浮点数
-
-    return(temp_float_data);
-}
-
-
-
-/*******************************************************************************
-* Function Name  : Switch_Float_To_Byte4
-* Description    : 将浮点数转成四字节数组存储
-* Input          : temp_float_data--要转换的float变量   data--转换后的四字节数组
-* Output         : None
-* Return         : None
-*******************************************************************************/
-void Switch_Float_To_Byte4(float temp_float_data, unsigned char*data)
-{
-    union Tmp floatTmp;
-    unsigned char i = 0;
-    floatTmp.value = temp_float_data;   //将浮点数转存
-    for(i = 0; i < 4; i++)
-    {
-        data[i] = floatTmp.array[i];		//将浮点数转换成四字节
-    }
-}
-
-
-/******************************************************************************
-
-//4字节数存放到数组中	数组起始地址存放高字节
-//输入:uint16_t *buf数组起始地址, uint32_t data32存放数 
-//返回:无
-		
-******************************************************************************/
-void Data32ToBuf(uint16_t *buf, uint32_t data32)
-{
-	*buf++ = data32>>16;
-	*buf   = data32;
-}
-/******************************************************************************
-
-//2字节数组组成一个32位数	数组起始地址存放高字节
-//输入:uint16_t *buf数组起始地址, int32_t data32存放数 
-//返回:32位数
-		
-******************************************************************************/
-int32_t BufToData32(uint16_t *buf)
-{
-	uint8_t i;
-	int32_t temp=0;
-	int32_t data32=0 ;
-	for(i=0;i<2;i++)
-	{
-		temp = *buf++;
-		data32 = (data32<<16) + (temp&0xffff);
-	}
-	return 	data32;
-}
-
-
-/*******************************************************************************
-* Function Name  : Calc_LRC
-* Description    : LRC校验
-* Input          : data--要校验的数组  data_len--校验的长度
-* Output         : None
-* Return         : lrc 校验后的值
-*******************************************************************************/
-uint16_t Calc_LRC(uint8_t* data, int data_len)
-{
-	int i;
-	uint16_t lrc = 0;
-	for ( i = 0; i < data_len; i++)
-	{
-		lrc ^=  data[i];
-	}
-	return lrc;
-}
-/*******************************************************************************
-* Function Name  : LRC_Check
-* Description    : LRC校验
-* Input          : data--要校验的数组 
-* Output         : None
-* Return         : result 校验后的值
-*******************************************************************************/
-uint16_t LRC_Check(uint8_t *data)
-{
-	uint8_t i;
-	int k;
-	uint16_t result;
-	uint16_t lrcdata[12];
-
-	for (i = 1;i < 12 + 1;i++)
-	{
-		if (data[i]>0x40)
-			lrcdata[i - 1] = data[i] - 0x41 + 10;
-		else
-			lrcdata[i - 1] = data[i] - 0x30;
-	}
-	k = 0;
-	for (i = 0;i<12 / 2;i++) 
-	{
-		k += (lrcdata[2 * i] * 16 + lrcdata[2 * i + 1]);
-	}
-	k = k % 256;
-	k = 256 - k;
-	result = k % 256;
-	return result;
-}
-
-//单字节BCD转为HEX子程序
-unsigned char BCDtoHEX(unsigned char bcd_data)  
-{
-    unsigned char temp; 
-    temp=(bcd_data/16*10 + bcd_data%16); 
-    return temp; 
-} 
-
-//单字节HEX转为BCD子程序
-unsigned char HEXtoBCD(unsigned char hex_data)  
-{ 
-    unsigned char temp; 
-    temp=(hex_data/10*16 + hex_data%10); 
-    return temp; 
-}
-/********** BCD to HEX **********/
-//双字节数值范围:0~9999
-uint16_t BCD2HEX(uint16_t bcd)
-{
-  uint16_t temp;
-  temp = (((bcd>>12) & 0x000f) * 1000)
-       + (((bcd>>8) & 0x000f) * 100)
-       + (((bcd>>4) & 0x000f) * 10)
-       + (bcd& 0x000f);
-  return temp;
-}
-
-/********** BCD to HEX **********/
-//双字节数值范围:0~9999
-uint16_t HEX2BCD(uint16_t hex)
-{
-      uint16_t bcd;
-    bcd = ((HEXtoBCD((hex/100))) << 8);
-    bcd += HEXtoBCD(hex%100);
-    return bcd;
-}
-
-
-
-
-/*******************************************************************************
-* Function Name  : MODBUS_ASCII_AsciiToFloat
-* Description    : 将目标中的8个字节转化为一个浮点数
-* Input          : pbDest--要转化的数组
-* Output         : None
-* Return         : float 转化后的值
-*******************************************************************************/
-float MODBUS_ASCII_AsciiToFlaot(uint8_t *pbDest)
-{
-
-	union Tmp floatTmp;
-	unsigned char  data[8];
-    unsigned char i = 0;
-    float temp_float_data = 0;
-    for(i = 0; i < 4; i++)
-    {   
-			  data[i] =  MODBUS_ASCII_AsciiToHex(pbDest+i*2);   //一个字节一个转
-        floatTmp.array[3-i] = data[i];		//四字节数据暂存
-    }
-    temp_float_data = floatTmp.value; 	//四字节转换的浮点数
-
-    return(temp_float_data);
-}
-
-
-/*******************************************************************************
-* Function Name  : MODBUS_Float_to_ASCII
-* Description    : float数据转换为8个字节的ASCII数据
-* Input          : data32--要转换的数据
-* Output         : pAsciiBuf  转换后的数组
-* Return         : 
-*******************************************************************************/
-void MODBUS_Float_to_ASCII(float data32 ,uint8_t *pAsciiBuf )
-{
-	uint8_t i;
-	union Tmp2 a32Tmp;
-	union Tmp floatTmp;
-	floatTmp.value = data32;
-	
-	for(i=0;i<4;i++)a32Tmp.array[i]=floatTmp.array[i];
-	
-	for(i=0;i<8;i++)
-	{
-	
-		pAsciiBuf[i] = (a32Tmp.value>>(28-i*4))&0x0F;
-		if(pAsciiBuf[i]<=0x09)
-			pAsciiBuf[i] = pAsciiBuf[i]+0x30;
-		else
-		{
-			pAsciiBuf[i]=toupper(pAsciiBuf[i])+55;
-		}
-		
-	}
-	
-}
-/*******************************************************************************
-* Function Name  : MODBUS_ASCII_AsciiToHex
-* Description    : 转化为16进制
-* Input          : pbDest--要转化的数组
-* Output         : None
-* Return         : s1*16 + s2 转化后的值
-*******************************************************************************/
-uint8_t MODBUS_ASCII_AsciiToHex(uint8_t *pbDest)
-{
-	
-	char h1,h2;
-	uint8_t s1,s2;
-	
-		h1 = pbDest[0];
-		h2 = pbDest[1];
-
-		s1 = toupper(h1) - 0x30;
-		if (s1 > 9) 
-		s1 -= 7;
-
-		s2 = toupper(h2) - 0x30;
-		if (s2 > 9) 
-		s2 -= 7;
-
-		return (s1*16 + s2);
-}
-
-/*******************************************************************************
-* Function Name  : MODBUS_ASCII_GetLrc
-* Description    : LRC校验
-* Input          : pCyAsciiBuf--要校验的数组 cyLen--长度
-* Output         : None
-* Return         : cyLrcVal 校验后的值
-*******************************************************************************/
-uint8_t MODBUS_ASCII_GetLrc(uint8_t *pCyAsciiBuf, uint8_t cyLen)
-{
-	uint8_t i;
-	uint8_t cyLrcVal;
-	
-	if (1 == (cyLen % 2) )
-	{
-		return 0;
-	}
-	
-	cyLen /= 2;
-	cyLrcVal = 0;
-	for (i = 0; i < cyLen; i++)
-	{
-		cyLrcVal +=  MODBUS_ASCII_AsciiToHex(pCyAsciiBuf + i * 2);
-	}
-	
-	cyLrcVal = ~cyLrcVal;
-	cyLrcVal += 1;
-	
-	return (cyLrcVal);
-}
-
-/*******************************************************************************
-* Function Name  : MODBUS_S32_to_ASCII
-* Description    : 32位数据转换为单个8位数据
-* Input          : data32--要转换的数据
-* Output         : pAsciiBuf  转换后的数组
-* Return         : 
-*******************************************************************************/
-void MODBUS_S32_to_ASCII(int32_t data32 ,uint8_t *pAsciiBuf )
-{
-	uint8_t i;
-	for(i=0;i<8;i++)
-	{
-		pAsciiBuf[i] = (data32>>(28-i*4))&0x0F;
-		if(pAsciiBuf[i]<=0x09)
-			pAsciiBuf[i] = pAsciiBuf[i]+0x30;
-		else
-		{
-			pAsciiBuf[i]=toupper(pAsciiBuf[i])+55;
-		}
-		
-	}
-	
-}
-
-/*******************************************************************************
-* Function Name  : MODBUS_S16_to_ASCII
-* Description    : 16为数据转换为ASCII数据
-* Input          : data16--要转换的数据
-* Output         : pAsciiBuf  转换后的数组
-* Return         : 
-*******************************************************************************/
-void MODBUS_S16_to_ASCII(int16_t data16 ,uint8_t *pAsciiBuf )
-{
-	uint8_t i;
-	for(i=0;i<4;i++)
-	{
-		pAsciiBuf[i] = (data16>>(12-i*4))&0x0F;
-		if(pAsciiBuf[i]<=0x09)//if((pAsciiBuf[i]>=0x00)&&(pAsciiBuf[i]<=0x09))
-			pAsciiBuf[i] = pAsciiBuf[i]+0x30;
-		else
-		{
-			pAsciiBuf[i]=toupper(pAsciiBuf[i])+55;
-		}
-		
-	}
-}
-
-/*******************************************************************************
-* Function Name  : MODBUS_S8_to_ASCII
-* Description    : 8为数据转换为ASCII数据
-* Input          : data8--要转换的数据
-* Output         : pAsciiBuf  转换后的数组
-* Return         : 
-*******************************************************************************/
-void MODBUS_S8_to_ASCII(int8_t data8 ,uint8_t *pAsciiBuf )
-{
-	uint8_t i;
-	for(i=0;i<2;i++)
-	{
-		pAsciiBuf[i] = (data8>>(4-i*4))&0x0F;
-		if(pAsciiBuf[i]<=0x09)//if((pAsciiBuf[i]>=0x00)&&(pAsciiBuf[i]<=0x09))
-			pAsciiBuf[i] = pAsciiBuf[i]+0x30;
-		else
-		{
-			pAsciiBuf[i]=toupper(pAsciiBuf[i])+55;
-		}
-	}
-}
-
-
-
-/*******************************************************************************
-* Function Name  : CRC16
-* Description    : CRC16校验
-* Input          : pBuf--要校验的数据  nLength--校验的长度
-* Output         : ((wReturn & 0xff) << 8) | (wReturn >> 8)  校验后的数组
-* Return         : 
-*******************************************************************************/ 
-uint16_t CRC16(unsigned char *pBuf,int nLength)  
-{  
-	uint16_t wReturn = 0xFFFF;
-	int nDataLen=0;
-	int nIndex=0;
-	for(nDataLen=0;nDataLen<nLength;nDataLen++)
-	{
-		wReturn^=(unsigned short)(pBuf[nDataLen]);//(BYTE(pBuf[nDataLen]));
-		for(nIndex=0;nIndex<8;nIndex++)
-		{
-			if(wReturn&0x0001)
-			{
-				wReturn>>=1;
-				wReturn^=0xA001;
-			}
-			else
-			{
-				wReturn>>=1;
-			}
-		}
-	}
-		return	((wReturn & 0xff) << 8) | (wReturn >> 8);//高低互换
-}
-
-
-
-static uint16_t const wCRC16Table[256] = {      
-    0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241,     
-    0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440,     
-    0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40,      
-    0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841,     
-    0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40,       
-    0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41,     
-    0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641,     
-    0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040,     
-    0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240,     
-    0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441,        
-    0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41,     
-    0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840,     
-    0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41,     
-    0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40,     
-    0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640,        
-    0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041,     
-    0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240,     
-    0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441,     
-    0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41,     
-    0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840,        
-    0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41,     
-    0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40,     
-    0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640,     
-    0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041,     
-    0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241,       
-    0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440,     
-    0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40,     
-    0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841,     
-    0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40,     
-    0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41,       
-    0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641,     
-    0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040};
-
-
-uint16_t Key_CRC16(const unsigned char* pDataIn, const unsigned char iLenIn)     
-{     
-     uint16_t wResult = 0xFFFF;     
-     uint16_t wTableNo = 0;     
-     int i = 0;
-    for( i = 0; i < iLenIn; i++)     
-    {     
-        wTableNo = ((wResult & 0xff) ^ (pDataIn[i] & 0xff));     
-        wResult = ((wResult >> 8) & 0xff) ^ wCRC16Table[wTableNo];     
-    }     
-    return wResult;     
-} 
-
-
-void InvertUint8(unsigned char *dBuf, unsigned char *srcBuf)
-{
-    int i;
-    unsigned char tmp[4];
-    tmp[0] = 0;
-    for(i = 0; i < 8; i++)
-    {
-        if(srcBuf[0] & (1 << i))
-            tmp[0] |= 1 << (7 - i);
-    }
-    dBuf[0] = tmp[0];
-}
-
-void InvertUint16(unsigned short *dBuf, unsigned short *srcBuf)
-{
-    int i;
-    unsigned short tmp[4];
-    tmp[0] = 0;
-    for (i = 0; i < 16; i++)
-    {
-        if(srcBuf[0] & (1 << i))
-            tmp[0] |= 1 << (15 - i);
-    }
-    dBuf[0] = tmp[0];
-}
-unsigned short CRC16_MODBUS(unsigned char *puchMsg, unsigned int usDataLen)
-{
-    int i;
-	unsigned short temp;
-	unsigned short temp1;
-    unsigned short wCRCin = 0xFFFF;
-    unsigned short wCPoly = 0x8005;
-    unsigned char wChar = 0;
-    while(usDataLen--)
-    {
-        wChar = *(puchMsg++);
-        InvertUint8(&wChar, &wChar);
-        wCRCin ^= (wChar << 8);
-        for(i = 0; i < 8; i++)
-        {
-            if(wCRCin & 0x8000)
-                wCRCin = (wCRCin << 1)^wCPoly;
-            else
-                wCRCin = wCRCin << 1;
-        }
-    }
-    InvertUint16(&wCRCin, &wCRCin);
-		temp1=wCRCin>>8&0x00ff;
-		temp=(temp1)+(wCRCin<<8);
-    return(temp);
-}

+ 23 - 34
Core/Src/adc.c

@@ -147,12 +147,6 @@ void HAL_ADC_MspDeInit(ADC_HandleTypeDef* adcHandle)
 
 /* USER CODE BEGIN 1 */
 
-uint8_t adc1_byte1 = 0;   
-uint8_t adc2_byte1 = 0;                      // 定义一个字节变量用于存储转换结果
-uint8_t adc3_byte1 = 0;   
-uint8_t adc1_byte2 = 0;   
-uint8_t adc2_byte2 = 0;                      // 定义一个字节变量用于存储转换结果
-uint8_t adc3_byte2 = 0;
 uint16_t Value_old_addr2;
 uint16_t Value_old_addr3;
 uint16_t adc1_filtered = 0;
@@ -167,10 +161,13 @@ uint8_t adc3_raw_buffer_index = 0;
 uint16_t adc2_rawValue = 0;
 uint16_t adc3_rawValue = 0;
 
+uint16_t Adc2_CalibrationValue ;
+uint16_t Adc3_CalibrationValue ;
+
 void AdcCalibration_init(void)
 {
-    Value_old_addr2 = read_flash_16(ADDR_FLASH_PAGE_124);
-    Value_old_addr3 = read_flash_16(ADDR_FLASH_PAGE_134);
+    Value_old_addr2 = read_flash_16(ADC1_FLASH_ADDR);
+    Value_old_addr3 = read_flash_16(ADC2_FLASH_ADDR);
     
     Adc2_CalibrationValue = Value_old_addr2 != 0xFFFF ? Value_old_addr2 : Adc2_CalibrationValue;
     Adc3_CalibrationValue = Value_old_addr3 != 0xFFFF ? Value_old_addr3 : Adc3_CalibrationValue;
@@ -190,19 +187,6 @@ void ApplyFilter(uint16_t raw_data, uint16_t* filtered_data, uint16_t* raw_data_
 }
 
 
-//#define R_NOMINAL 10000.0f   // 注册时NTC热敏电阻的阻值
-//#define T_NOMINAL 298.15f    // 注册时NTC热敏电阻的温度值,转化为开尔文温标
-//#define B_FACTOR  3950.0f    // NTC热敏电阻的B参数
-//float CalculateTemperature(uint16_t adc_value, float vref)
-//{
-//    float voltage = adc_value * vref / 4096.0f;   // 根据ADC值计算输入电压
-//    float resistance = R_NOMINAL * (voltage / (vref - voltage));   // 根据电压计算NTC热敏电阻阻值
-//    
-//    float steinhart = log(resistance / R_NOMINAL) / B_FACTOR + 1.0f / T_NOMINAL;   // 根据瑞利恒式计算温度
-//    float temperature = 1.0f / steinhart - 273.15f;   // 转换为摄氏温度
-//	return temperature;
-//}
-
 float array1[] = {-40, -39, -38, -37, -36, -35, -34, -33, -32, -31, -30, 
                     -29, -28, -27, -26, -25, -24, -23, -22, -21, -20, 
                     -19, -18, -17, -16, -15, -14, -13, -12, -11, -10, 
@@ -248,7 +232,7 @@ uint16_t temperature1 = 0;
 				  
 void findIndexAndTemp(float resistance, float array1[], float array2[], int index2, int index1, int arrLen){
 	
-	uint8_t temp = 0;
+	uint16_t temp = 0;
     const float resRange = (array2[index2] - array2[index2+1]) / 10.0f;
     float resArr[arrLen];
     for(int i = 0; i < arrLen; i++){
@@ -268,19 +252,25 @@ void findIndexAndTemp(float resistance, float array1[], float array2[], int inde
         tempArr[i] = array1[index1] + i * tempRange; 
     }
 	
-	if(resArr[index] > 340.9821f){
+	if(resArr[index] > 340.9821f){			//-40
 		temperature1 = 0x8190;
 	}
-	else if(resArr[index] > 32.7421f){
+	
+	else if(resArr[index] > 32.7421f && resArr[index] <= 340.9821f){		//负数
 		temp = fabs(tempArr[index]) * 10;
-		temperature1 = temp | 0x8000;
+		temp |= 0x8000;
+		temperature1 = temp;
 	}
-	else if(resArr[index] > 0.5821f){
+	
+	else if(resArr[index] >= 0.5821f && resArr[index] <= 32.7421f){			//正数
 		temperature1 = tempArr[index] * 10;
 	}
-	else{
+	else if(resArr[index] < 0.5821f){							//105度
 		temperature1 = 0x041A;
 	}
+	else {
+		temperature1 = 0x0000;
+	}
 	temp = 0;
 }
 				  
@@ -296,7 +286,6 @@ float CalculateTemperature(uint16_t adc_value, float vref)
 //	HAL_Delay(500);
 //	printf("%.4f\n",array2[0]);	
 //	printf("%.4f\n",array2[0]);
-	
 	for (int  i = 0; i < sizeof(array2) - 1; i++) {
 	  if (resistance >= array2[i+1] && resistance < array2[i]) {
 		findIndexAndTemp(resistance, array1, array2, i, i, 10);
@@ -343,12 +332,12 @@ void GetADCResults(ADC_HandleTypeDef* hadc)
     }
     ApplyFilter(adc3_raw, &adc3_filtered, adc3_raw_buffer, &adc3_raw_buffer_index);
 	
-    adc1_byte1 = (uint8_t)(adc1_filtered >> 8);
-    adc1_byte2 = (uint8_t)(adc1_filtered);
-    adc2_byte1 = (uint8_t)(adc2_filtered >> 8);
-    adc2_byte2 = (uint8_t)(adc2_filtered);
-    adc3_byte1 = (uint8_t)(adc3_filtered >> 8);
-    adc3_byte2 = (uint8_t)(adc3_filtered);
+//    adc1_byte1 = (uint8_t)(adc1_filtered >> 8);
+//    adc1_byte2 = (uint8_t)(adc1_filtered);
+//    adc2_byte1 = (uint8_t)(adc2_filtered >> 8);
+//    adc2_byte2 = (uint8_t)(adc2_filtered);
+//    adc3_byte1 = (uint8_t)(adc3_filtered >> 8);
+//    adc3_byte2 = (uint8_t)(adc3_filtered);
 
     HAL_ADC_Stop(&hadc1); //关闭ADC以降低功耗
 }

+ 381 - 0
Core/Src/dataHandling.c

@@ -0,0 +1,381 @@
+#include "main.h"
+#include "dataHandling.h"
+#include "md5c.h"
+
+
+void Flash_ReadBytes(uint16_t* sorBuf,uint32_t FlashAddr,uint16_t len)
+{
+	uint16_t* p = sorBuf;
+	uint8_t i = 0,j = 0;
+	uint32_t addr = FlashAddr;
+	while(len--)
+	{
+		i = *(uint32_t*)addr++;
+		j = *(uint32_t*)addr++;
+		*p++ = j<<8|i;
+	}
+}
+
+uint16_t iapbuf[1024];
+uint16_t iapversion[5];
+uint16_t iapmd5[10];
+
+// 定义一个长度为16的字符数组,用于存储MD5摘要
+unsigned char digest[16];
+
+int App2_MD5_Check(uint32_t addr,unsigned int all_len)
+{
+    // 定义变量i和update_len
+    unsigned int i,update_len;
+    // 定义一个MD5上下文结构体
+    MD5_CTX md5c;
+    // 减去摘要的长度,得到实际数据长度
+//    all_len -= 16;
+    // 初始化MD5上下文结构体
+    MD5Init(&md5c);
+    // 循环处理数据
+    for(i=0;i<all_len;)
+    {
+        // 判断剩余数据长度是否大于512,如果是则取512,否则取剩余长度
+        if(all_len>(i+512))
+            update_len = 512;
+        else
+            update_len = all_len-i;
+        // 将数据从指定地址拷贝到iapbuf缓冲区
+        memcpy(iapbuf,(const void *)(addr+i),update_len);
+        // 更新MD5上下文
+        MD5Update (&md5c, (unsigned char *)iapbuf, update_len);
+        // 更新i的值
+        i += update_len;
+    }
+    // 计算最后的MD5摘要
+    MD5Final(digest,&md5c);
+    // 验证摘要是否与给定地址的数据一致
+    for(i=0;i<16;++i)
+    {
+//        if(digest[i]!=*(unsigned char *)(addr+all_len+i))
+        if(digest[i]!=*(unsigned char *)(MD5_ADDR+i))
+            break;
+    }
+    // 如果验证通过,则返回1,否则返回0
+    if(i>=16)
+        return 1;
+    else
+        return 0;
+}
+
+void delay_sys_us(uint32_t Delay)//1个delay,大概1.5us
+{
+	uint32_t cnt = Delay * 8;  
+    uint32_t i = 0;
+    for(i = 0; i < cnt; i++)__NOP();
+}
+
+
+uint16_t STMFLASH_ReadHalfWord(uint32_t faddr)
+{
+	return *(uint16_t*)faddr; 
+}
+
+void STMFLASH_Read(uint32_t ReadAddr,uint16_t *pBuffer,uint16_t NumToRead)   	
+{
+	uint16_t i;
+	for(i=0;i<NumToRead;i++)
+	{
+		pBuffer[i]=STMFLASH_ReadHalfWord(ReadAddr);//读取2个字节.
+		ReadAddr+=2;//偏移2个字节.	
+	}
+}
+
+
+void STMFLASH_Write_NoCheck(uint32_t WriteAddr,uint16_t *pBuffer,uint16_t NumToWrite)   
+{ 			 		 
+	uint16_t i;
+	for(i=0;i<NumToWrite;i++)
+	{
+		HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD,WriteAddr,pBuffer[i]);
+	  WriteAddr+=2;//地址增加2.
+	}  
+} 
+
+
+
+// 定义Flash缓冲区
+uint16_t Flashbuf[2048] __attribute__((at(0X20001000)));
+// Flash写入函数
+void Flash_WriteBytes(uint16_t* sorBuf, uint32_t FlashAddr, uint16_t len)
+{
+    uint32_t Offset_ADDR = 0, Page_StartAddr = 0, i = 0;
+    // 计算偏移地址和起始地址
+    Offset_ADDR = FlashAddr % FLASH_PAGE_SIZE;
+    Page_StartAddr = FlashAddr - Offset_ADDR;
+    // 设置PageError
+    uint32_t PageError = 0;
+    // 初始化擦除参数
+    FLASH_EraseInitTypeDef f;
+    f.TypeErase = FLASH_TYPEERASE_PAGES;
+    f.PageAddress = Page_StartAddr;
+    f.NbPages = 1;
+	
+    // 读取Flash缓冲区数据
+    Flash_ReadBytes(Flashbuf, Page_StartAddr, 0x400);//写一半先1024字节
+    // 将源缓冲区数据写入Flash缓冲区
+    for (i = 0; i < len; i++)
+        Flashbuf[Offset_ADDR / 2 + i] = sorBuf[i];	 //后一半也存入缓存中
+    // 解锁FLASH
+    HAL_FLASH_Unlock();
+    // 擦除FLASH
+    HAL_FLASHEx_Erase(&f, &PageError);
+    // 写入Flash缓冲区数据到FLASH
+    for (uint16_t i = 0; i < 0x400; i++)
+    {
+        HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, Page_StartAddr + (i * 2), Flashbuf[i]);
+    }
+    // 锁住FLASH
+    HAL_FLASH_Lock();
+}
+
+void Set_App2_Flag(void)
+{
+	uint16_t update_flag1[2];
+	update_flag = Startup_APP2;
+	update_flag1[1] = (uint16_t)update_flag;
+	update_flag1[0] = (uint16_t)(update_flag >> 16);
+	Flash_WriteBytes(update_flag1, StartMode_Addr, 2);
+	
+	NVIC_SystemReset();
+	
+	
+}
+
+void Set_jump_Flag(void)
+{
+	uint16_t update_flag1[2];
+	update_flag = Jump_app;
+	update_flag1[1] = (uint16_t)update_flag;
+	update_flag1[0] = (uint16_t)(update_flag >> 16);
+	Flash_WriteBytes(update_flag1, StartMode_Addr, 2);
+
+}
+
+void Set_normal_Flag(void)
+{
+	uint16_t update_flag1[2];
+	update_flag = Startup_Normal;
+	update_flag1[1] = (uint16_t)update_flag;
+	update_flag1[0] = (uint16_t)(update_flag >> 16);
+	Flash_WriteBytes(update_flag1, StartMode_Addr, 2);
+}
+
+
+
+void convertHexToAscii(uint16_t version[4], uint32_t* System_version) {
+
+    *System_version = (((((version[0] >> 8 & 0xF) << 4) | (version[0] & 0xF)) & 0xFF) << 24) |
+	(((((version[1] >> 8 & 0xF) << 4) | (version[1] & 0xF)) & 0xFF) << 16) | 
+	(((((version[2] >> 8 & 0xF) << 4) | (version[2] & 0xF)) & 0xFF) << 8) | 
+	((((version[3] >> 8 & 0xF) << 4) | (version[3] & 0xF)) & 0xFF);
+}
+
+/*
+    uint8_t hexData[] = {0x34, 0x34, 0x30, 0x30, 0x00};
+    size_t length = sizeof(hexData) / sizeof(hexData[0]);
+    uint16_t intValue = convertHexToInt(hexData, length);
+*/
+void convertToUint16(uint8_t* uint8Data, size_t length, uint16_t* uint16Data)
+{
+    for (size_t i = 0; i < length; i += 2)
+    {
+        uint16Data[i / 2] = (uint16_t)uint8Data[i] << 8 | uint8Data[i + 1];
+    }
+}
+
+
+void search_seat(const uint8_t* hexData)
+{
+    int i, j, k;
+    for (i = 0; i < sizeof(hexData); i++) {
+        if (hexData[i] == 0x00) {  // 找到第一个占位符
+            break;  // 结束循环
+        }
+        binName[i] = hexData[i]; // 将第一个占位符之前的数据放入binName中
+    }
+	
+	
+    for (j = i + 1; j < sizeof(hexData); j++) {
+        if (hexData[j] == 0x00) {  // 找到第二个占位符
+            break;  // 结束循环
+        }
+        binLength[j - i - 1] = hexData[j]; // 将第一个占位符至第二个占位符之间的数据放入binLength中
+    }
+	
+	
+    for (k = j + 1; k < sizeof(hexData); k++) {
+        if (hexData[k] == 0x00) {  // 找到第三个占位符
+            break;  // 结束循环
+        }
+        binMd5[k - j - 1] = hexData[k]; // 将第三个占位符至第四个占位符之间的数据放入binMd5中
+    }
+
+}
+
+
+uint16_t crc16_xmodem(uint8_t *data, uint16_t length) {
+    uint16_t crc = 0;
+    for (uint16_t i = 0; i < length; i++) {
+        crc ^= (uint16_t)data[i] << 8;
+        for (uint8_t j = 0; j < 8; j++) {
+            if (crc & 0x8000) {
+                crc = (crc << 1) ^ 0x1021;
+            } else {
+                crc <<= 1;
+            }
+        }
+    }
+    return crc;
+}
+
+void Set_Update_Down(void)
+{
+//	uint16_t update_flag1[2];
+//	update_flag = Startup_Update; 
+//	update_flag1[0] = (uint16_t)update_flag;
+//	update_flag1[1] = (uint16_t)(update_flag >> 16);
+//	Flash_WriteBytes(update_flag1, StartMode_Addr, 2);
+	
+	uint16_t update_flag1[2];
+	update_flag = Startup_Update;
+	update_flag1[0] = (uint16_t)update_flag;
+	update_flag1[1] = update_flag & 0xFFFF;
+	memcpy(&update_flag1, &update_flag, sizeof(uint16_t) * 2);
+	Flash_WriteBytes(update_flag1, StartMode_Addr, sizeof(update_flag1));
+	
+	int txLen = sprintf((char *)USART_IAP_RX, "reboot\r\n");
+	HAL_UART_Transmit_IT(&huart1,USART_IAP_RX,txLen);		
+	while (huart1.gState == HAL_UART_STATE_BUSY_TX)
+	{
+		HAL_Delay(1);
+	}
+	
+	__NOP();__NOP();
+//	__disable_irq();
+	NVIC_SystemReset();
+}
+
+
+void readFlashToArr(uint8_t *arr, uint32_t addr) {
+	if(lenindex!=0)
+	{
+		for (int i = 0; i < 5; i++) {
+			arr[i] = *(uint8_t*)(addr + i);
+		}
+	}
+	else 
+	{
+		for (int i = 0; i < 4; i++) {
+			arr[i] = *(uint8_t*)(addr + i);
+		}
+	}
+
+	
+}
+
+#if STM32_FLASH_SIZE<256
+#define STM_SECTOR_SIZE 1024 //字节
+#else 
+#define STM_SECTOR_SIZE	2048
+#endif		 
+uint16_t STMFLASH_BUF[STM_SECTOR_SIZE/2];//最多是2K字节
+void STMFLASH_Write(uint32_t WriteAddr,uint16_t *pBuffer,uint16_t NumToWrite)	
+{
+	uint32_t secpos;	   //扇区地址
+	uint16_t secoff;	   //扇区内偏移地址(16位字计算)
+	uint16_t secremain; 	//扇区内剩余地址(16位字计算)	   
+ 	uint16_t i;    
+	uint32_t offaddr;   //去掉0X08000000后的地址
+	
+	if(WriteAddr<STM32_FLASH_BASE||(WriteAddr>=(STM32_FLASH_BASE+1024*STM32_FLASH_SIZE)))return;//非法地址
+	
+	HAL_FLASH_Unlock();					//解锁
+	
+	offaddr=WriteAddr-STM32_FLASH_BASE;		//实际偏移地址.
+	secpos=offaddr/STM_SECTOR_SIZE;			//扇区地址  0~127 for STM32F103RBT6
+	secoff=(offaddr%STM_SECTOR_SIZE)/2;		//在扇区内的偏移(2个字节为基本单位.)
+	secremain=STM_SECTOR_SIZE/2-secoff;		//扇区剩余空间大小   
+	if(NumToWrite<=secremain)secremain=NumToWrite;//不大于该扇区范围
+	while(1) 
+	{	
+		STMFLASH_Read(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE,STMFLASH_BUF,STM_SECTOR_SIZE/2);//读出整个扇区的内容
+		for(i=0;i<secremain;i++)	//校验数据
+		{
+			if(STMFLASH_BUF[secoff+i]!=0XFFFF)break;//需要擦除  	  
+		}
+		if(i<secremain)			//需要擦除
+		{
+			FLASH_PageErase(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE);	//擦除这个扇区
+			FLASH_WaitForLastOperation(FLASH_WAITETIME);            	//等待上次操作完成
+			CLEAR_BIT(FLASH->CR, FLASH_CR_PER);							//清除CR寄存器的PER位,此操作应该在FLASH_PageErase()中完成!
+																		//但是HAL库里面并没有做,应该是HAL库bug!
+			for(i=0;i<secremain;i++)//复制
+			{
+				STMFLASH_BUF[i+secoff]=pBuffer[i];	  
+			}
+			STMFLASH_Write_NoCheck(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE,STMFLASH_BUF,STM_SECTOR_SIZE/2);//写入整个扇区  
+		}else 
+		{
+			FLASH_WaitForLastOperation(FLASH_WAITETIME);       	//等待上次操作完成
+			STMFLASH_Write_NoCheck(WriteAddr,pBuffer,secremain);//写已经擦除了的,直接写入扇区剩余区间. 
+		}
+		if(NumToWrite==secremain)break;//写入结束了
+		else//写入未结束
+		{
+			secpos++;				//扇区地址增1
+			secoff=0;				//偏移位置为0 	 
+		   	pBuffer+=secremain;  	//指针偏移
+			WriteAddr+=secremain*2;	//写地址偏移(16位数据地址,需要*2)	   
+		   	NumToWrite-=secremain;	//字节(16位)数递减
+			if(NumToWrite>(STM_SECTOR_SIZE/2))secremain=STM_SECTOR_SIZE/2;//下一个扇区还是写不完
+			else secremain=NumToWrite;//下一个扇区可以写完了
+		}	 
+	};	
+	HAL_FLASH_Lock();		//上锁
+}
+
+uint16_t pagesize;
+uint32_t addrtowrite;
+int z;
+void iap_write_appbin(uint32_t appxaddr, uint32_t appbuf, uint32_t appsize)
+{
+    uint16_t size = appsize;
+    uint32_t fwaddr = appbuf; // 当前写入的地址
+	addrtowrite = ADD_UPDATE_PROG;
+	
+	
+	pagesize =(size + 2048) / 2048;
+	memset(iapbuf, 0, sizeof(iapbuf));	
+	
+	uint8_t ACK_Arr[5] = "ack=";
+	
+	for( z =1; z<=pagesize ;z++)
+	{
+		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
+		HAL_Delay(1);  
+		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
+		Flash_ReadBytes(&iapbuf[0], fwaddr, 2048);//2048
+		Flash_WriteBytes(&iapbuf[0],addrtowrite,1024);
+		delay_sys_us(80);
+		
+		
+		
+		memset(iapbuf, 0, sizeof(iapbuf));	
+		int txLen;
+		txLen = sprintf((char *)USART_IAP_RX, "%s%d\r\n", ACK_Arr,z);
+		HAL_UART_Transmit_IT(&huart1,USART_IAP_RX,txLen);	
+
+		fwaddr = fwaddr + 0x800;
+		addrtowrite = addrtowrite + 0x800;		
+
+	}
+	
+}
+

+ 3 - 0
Core/Src/dma.c

@@ -46,6 +46,9 @@ void MX_DMA_Init(void)
   /* DMA1_Channel3_IRQn interrupt configuration */
   HAL_NVIC_SetPriority(DMA1_Channel3_IRQn, 5, 0);
   HAL_NVIC_EnableIRQ(DMA1_Channel3_IRQn);
+  /* DMA1_Channel4_IRQn interrupt configuration */
+  HAL_NVIC_SetPriority(DMA1_Channel4_IRQn, 5, 0);
+  HAL_NVIC_EnableIRQ(DMA1_Channel4_IRQn);
   /* DMA1_Channel5_IRQn interrupt configuration */
   HAL_NVIC_SetPriority(DMA1_Channel5_IRQn, 5, 0);
   HAL_NVIC_EnableIRQ(DMA1_Channel5_IRQn);

+ 11 - 107
Core/Src/freertos.c

@@ -48,99 +48,7 @@
 
 /* Private variables ---------------------------------------------------------*/
 /* USER CODE BEGIN Variables */
-#ifdef iap_
-typedef struct _T2C_RemoteCaliData
-{
-	uint16_t   FrameHead;   		//帧头 0-1
-	uint32_t   AddrExtModule; 	//4字节扩展地址   2--5
-	uint16_t   FunctionCode;		//功能码2字节   只能是0x0003、0x0006或者0x0010    6--7
-	uint16_t   AddrRegStart;		//寄存器起始地址2字节:合法范围为0x0000~0xffff    8--9
-	uint16_t   NumberOfRegs;		//数据个数2字节:最多读取0xffff字节;实际取决于终端限制,目前为256字节  10--11
-	uint32_t   ReserveData001;	//保留字4字节 12--15
-	uint8_t    PayLoadData[44+32+32];	//有效载荷具体有三种:44,或者76字节,或者108字节;字节 16--59
-	uint16_t   ReserveData002;	//保留字2字节    60--61
-	uint16_t   CheckSum;				//校验2字节      62--63
-}sT2C_RemoteCaliDat;
-
-typedef struct{
-	uint16_t USE_RKG;								//控制器占用人孔盖总线
-	uint16_t USE_XYF;								//控制器占用卸油阀总线
-	uint16_t KZQ_ErrorCnt;					//校验错误计数
-	uint16_t KZQ_Error;							//控制器通信错误
-	uint8_t sensor_addr;						//操作的传感器地址
-	uint8_t sensor_RW;							//操作的传感器读写属性
-	uint16_t sensor_reg;							//操作的传感器寄存器地址,即功能码
-	uint8_t sensor_datelen;					//操作数据长度
-	uint8_t data_buf[70];          //下发数据缓存 
-}KZQ_Inf;
-#define 	ADDR_Is_In_ElecFence	0x05D0	//	1488		车是否在电子围栏内
- 
- sT2C_RemoteCaliDat T2C_RemoteCaliDat001  =
-{
- 
-	0x3901,
-	0x9551000,
-	0x0003,
-	ADDR_Is_In_ElecFence,//0x0000,
-	0x0001,        //操作的数据个数
-	0x55AA55AA,    //保留字4字节
-	{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,\
-	25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44},
-	0x7788,//保留字2字节
-	0x99AA   //校验2字节
-};
-sT2C_RemoteCaliDat *pT2C_RemoteCaliData = &T2C_RemoteCaliDat001; 
-
-	uint8_t CMD_KZQ[256] =
-	{0x39,0x01,0x95,0x50,0x00,0x01,0x00,0x03,
-	 0x00,0x00,0x00,0x00,0x95,0x05,0xAA,0xAA,
-	 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-	 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-	 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-	 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-	 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-	 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-	};
-	int flagU2Rx=0;
-	int data_lengthU2;
-	uint8_t* ptx = CMD_KZQ;   
-	uint16_t ModbusCRC   = 0;
-	uint16_t SetSuccess  = 0;
-	uint16_t ModbusCRC1  = 0;
-	uint16_t SetSuccess1 = 0;
-	uint16_t SetSuccess2 = 0;
-	uint16_t SetSuccess3 = 0;                 
-
-	int i000;
-	uint8_t* send_ptr;
-	uint16_t send_len;
-	uint32_t tmpU32;
-	KZQ_Inf kzq_inf;
-	KZQ_Inf* pkzq = &kzq_inf;
-	uint8_t USART2_RX_BUF003[128];
-	uint8_t F_STATE[70] = {0};
-	uint8_t ptxCang01Temp[150];
-	uint32_t KZQ_RTerror = 0;
-	
-void RstCPU(void)
-{
-  uint16_t j;
-  __disable_irq();
-  HAL_NVIC_SystemReset();
-	
-	while(1)
-	{
-		__disable_irq();	
-		NVIC_SystemReset();  
-		while(j --)
-		{
-	    __nop(); __nop(); __nop(); __nop(); 
-		}
-	}
-}
-
 
-#endif
 /* USER CODE END Variables */
 osThreadId iapTaskHandle;
 osThreadId myTask02Handle;
@@ -238,20 +146,17 @@ void StartiapTask(void const * argument)
   for(;;)
   {
     osDelay(1);
-#ifdef iap_
-	if ((data_lengthU2 > 300) || flagU2Rx == 1) {
-		flagU2Rx = 0;
-		if ((USART2_RX_BUF002[0] == 0xA5) && (USART2_RX_BUF002[1] == 0x5A))
-		{
-			tmpU32 = (USART2_RX_BUF002[0] << 24) | (USART2_RX_BUF002[1] << 16) | (USART2_RX_BUF002[2] << 8) | (USART2_RX_BUF002[3]);
-			if (StartBytes_IAP == tmpU32)
-			{
-				Process_CMD_IAP_Update();
-				continue;
-			}
+	if(USART_IAP_FLAG == 1 && USART_PUB_LENGTH == 142 && USART_MODBUS_RX[0] == (uint8_t)initial_address && USART_MODBUS_RX[1] == 0x10 && \
+		(calculate_crc(USART_IAP_RX,140) == (USART_MODBUS_RX[141] << 8 | USART_MODBUS_RX[140]))){
+			
+			Process_CMD_IAP_Update();
+			
+
 		}
-	}
-#endif
+		else{
+			ModBus();
+		}
+		
   }
   /* USER CODE END StartiapTask */
 }
@@ -294,8 +199,7 @@ void StartTask03(void const * argument)
   /* Infinite loop */
   for(;;)
   {
-    osDelay(1);
-	ModBus();
+    osDelay(1);	
   }
   /* USER CODE END StartTask03 */
 }

+ 3 - 0
Core/Src/gpio.c

@@ -22,6 +22,9 @@
 #include "gpio.h"
 
 /* USER CODE BEGIN 0 */
+
+uint8_t  gpioaStatus 	= 0;
+uint8_t  gpiobStatus 	= 0;
 /* USER CODE END 0 */
 
 /*----------------------------------------------------------------------------*/

+ 309 - 334
Core/Src/iap.c

@@ -3,12 +3,10 @@
 #include "stdio.h"
 #include "usart.h"
 #include "iap.h"
-#include "stmflash.h"
+#include "dataHandling.h"
 #include "md5c.h"
 
-uint16_t iapbuf[1024];
-
-
+extern void __set_FAULTMASK(uint32_t faultMask);
 /* 采用汇编设置栈的值 */
 __asm void MSR_MSP(unsigned int ulAddr)
 {
@@ -17,7 +15,6 @@ __asm void MSR_MSP(unsigned int ulAddr)
 }
 
 typedef void (*Jump_Fun)(void);
-
 void IAP_ExecuteApp(unsigned int App_Addr)
 {
     Jump_Fun JumpToApp;
@@ -30,393 +27,371 @@ void IAP_ExecuteApp(unsigned int App_Addr)
     }
 }
 
-void Flash_ReadBytes(uint16_t* sorBuf,uint32_t FlashAddr,uint16_t len)
-{
-	uint16_t* p = sorBuf;
-	uint8_t i = 0,j = 0;
-	uint32_t addr = FlashAddr;
-	while(len--)
-	{
-		i = *(uint32_t*)addr++;
-		j = *(uint32_t*)addr++;
-		*p++ = j<<8|i;
-	}
-}
-
-uint16_t Flashbuf[2048]__attribute__ ((at(0X20001000)));
-
-void Flash_WriteBytes(uint16_t* sorBuf,uint32_t FlashAddr,uint16_t len)
-{
-
-	uint32_t Offset_ADDR = 0,Page_StartAddr = 0,i = 0;
-	Offset_ADDR = FlashAddr%0x800;
-	Page_StartAddr = FlashAddr - Offset_ADDR;
-	//设置PageError
-	uint32_t PageError = 0;
-	FLASH_EraseInitTypeDef f;
-
-	f.TypeErase = FLASH_TYPEERASE_PAGES;
-	f.PageAddress =Page_StartAddr;
-	f.NbPages = 1;
-
-	Flash_ReadBytes(Flashbuf,Page_StartAddr,0x400);
-	
-	for(i = 0;i<len;i++)
-		Flashbuf[Offset_ADDR/2+i] = sorBuf[i];
-	
-	//1、解锁FLASH
-  HAL_FLASH_Unlock();
-
-  //2、擦除FLASH
-  //初始化FLASH_EraseInitTypeDef
-
-  //调用擦除函数
-  HAL_FLASHEx_Erase(&f, &PageError);
-	
-  //3、对FLASH烧写
-  for(uint16_t i = 0;i< 0x400 ;i++)
-  {
-      HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD , Page_StartAddr + (i * 2), Flashbuf[i]);
-  }
-
-    //4、锁住FLASH
-    HAL_FLASH_Lock();
-	
-}
-
-
-int App2_MD5_Check(uint32_t addr,unsigned int all_len)
-{
-	unsigned char digest[16];
-	
-	unsigned int i,update_len;
-	MD5_CTX md5c;
-	all_len -= 16;
-	MD5Init(&md5c);
-	for(i=0;i<all_len;)
-	{
-		if(all_len>(i+512))
-			update_len = 512;
-		else
-			update_len = all_len-i;
-		memcpy(iapbuf,(const void *)(addr+i),update_len);
-		MD5Update (&md5c, (unsigned char *)iapbuf, update_len);
-		i += update_len;
-	}
-	MD5Final(digest,&md5c);
-	for(i=0;i<16;++i)
-	{
-		if(digest[i]!=*(unsigned char *)(addr+all_len+i))
-			break;
-	}
-	if(i>=16)
-		return 1;
-	else
-		return 0;
-}
-// appxaddr:应用程序的起始地址
-// appbuf:应用程序CODE.
-// appsize:应用程序大小(字节).
-void iap_write_appbin(uint32_t appxaddr, uint8_t *appbuf, uint32_t appsize)
-{
-	uint32_t t;
-	uint16_t i = 0;
-	uint16_t temp;
-	uint32_t fwaddr = appxaddr; //当前写入的地址
-	uint8_t *dfu = appbuf;
-	for (t = 0; t < appsize; t += 2)
-	{
-		temp = (uint16_t)dfu[1] << 8;
-		temp += (uint16_t)dfu[0];
-		dfu += 2; //偏移2个字节
-		iapbuf[i++] = temp;
-		if (i == 1024)
-		{
-			i = 0;
-			STMFLASH_Write(fwaddr, iapbuf, 1024);
-			fwaddr += 2048; //偏移2048  16=2*8.所以要乘以2.
-		}
-		
-	}
-	if (i)
-		STMFLASH_Write(fwaddr, iapbuf, i); //将最后的一些内容字节写进去.
-}
-
+uint8_t YmodemID;
+uint8_t startFrame[40] = {0};
+uint16_t version[4];
+uint16_t length[3];
 
-	unsigned int update_flag = 0xAAAAAAAA; ///< 对应bootloader的启动步骤
-	unsigned int ModeStart;
-	unsigned int i,all_len;
-/**
- * @bieaf 进行BootLoader的启动
- *
- * @param none
- * @return none
- */
-void Start_BootLoader(void)
-{
-	uint16_t ModeStart1[2];
-	Flash_ReadBytes(ModeStart1, StartMode_Addr, 2);
-	ModeStart = ModeStart1[0];
-	ModeStart <<= 16;
-	ModeStart |= ModeStart1[1];
-	switch (ModeStart) ///< 读取是否启动应用程序 */
-	{
-		case Startup_Normal: ///< 正常启动 */   //在APP2中可以设定此标志位   使得下次重启之后进入APP1
-		{
-			break;
-		}
-		case Startup_Update: /*启动最新的程序 */
-			
-			for (i = 0, all_len = 0; i < 4; ++i)
-			{
-				all_len = all_len << 8;
-				all_len |= *(unsigned char *)(StartMode_Addr + 68 + i);
-			}
-			if (App2_MD5_Check(Application_Buffer_Addr,all_len))
-			{
-				iap_write_appbin(ADD_UPDATE_PROG,(uint8_t *)Application_Buffer_Addr,all_len);
-				Flash_WriteBytes((uint16_t*)(StartMode_Addr + 68), StartMode_Addr+132, 2);
-			}
-			Set_App2_Flag();
-			
-		case Startup_APP2: /*启动最新的程序 */
-			for (i = 0, all_len = 0; i < 4; ++i)
-				{
-					all_len = all_len << 8;
-					all_len |= *(unsigned char *)(StartMode_Addr + 132 + i);
-				}
-				if ((all_len < 0x20000) && App2_MD5_Check(ADD_UPDATE_PROG,all_len))
-				{				
-					IAP_ExecuteApp(ADD_UPDATE_PROG); //执行FLASH APP2代码 
-				}
-			break;
-				
-		default: ///< 启动失败
-		{
-			return;
-		}
-	}
-}
+uint8_t binName[32] = {0};
+uint8_t binLength[10] = {0};
+uint8_t binMd5[16] = {0};
 
-uint8_t  YmodemID	  = 0;
-uint16_t packIndex 	  = 0;
+uint16_t iapbinMd5[8] = {0};
+uint16_t FileBuffArray[512];  
+uint16_t FileBuffArray1[512]; 
+uint16_t start_addr = 0;
+uint16_t packIndex = 0;
 uint16_t packTotalNum = 0;
-uint16_t packIndexbak = 0; //当前包号,总包数
-uint16_t crcIAP;
-uint16_t crcIAP1;
-uint16_t crcTerminal;
-uint16_t FileBuffArray[512]  = {0};  // MD5校验
-uint16_t FileBuffArray1[512] = {0}; // MD5校验
-uint32_t FileLength_IAP = 0;  //文件长度
+uint16_t packIndexbak = 0; 
+uint16_t crcIAP = 0;
+uint16_t crcTerminal = 0;
 uint32_t AddrToWrite = Application_Buffer_Addr;
-uint32_t DataReadFlash;
-uint32_t DataReadFlash1;
-uint32_t update_flag;
-
-void Set_Update_Down(void)
-{
-	uint16_t update_flag1[2];
-	update_flag = Startup_Update; ///< 对应bootloader的启动步骤
-	update_flag1[0] = (uint16_t)update_flag;
-	update_flag1[1] = (uint16_t)(update_flag >> 16);
-	Flash_WriteBytes(update_flag1, StartMode_Addr, 2);
-	reboot_sys();
-}
-
-void Res_Update_Down(void)
-{
-	uint16_t update_flag1[2];
-	update_flag = Startup_Normal; ///< 对应bootloader的启动步骤
-	update_flag1[0] = (uint16_t)update_flag;
-	update_flag1[1] = (uint16_t)(update_flag >> 16);
-	Flash_WriteBytes(update_flag1, StartMode_Addr, 2);
-	reboot_sys();
-}
-
+int FileLength_IAP; 
+uint32_t update_flag = 0;
+//uint16_t iapbigbuf[20000];
 
-void Set_App2_Flag(void)
-{
-	uint16_t update_flag1[2];
-	update_flag = Startup_APP2; ///< 对应bootloader的启动步骤
-	update_flag1[1] = (uint16_t)update_flag;
-	update_flag1[0] = (uint16_t)(update_flag >> 16);
-	Flash_WriteBytes(update_flag1, StartMode_Addr, 2);
+int tag = 0;
+int lenindex=0;
+//int indexbuf=0;
 
-}
 
 void Process_CMD_IAP_Update(void)
 {
 
-	int lenRx1, lenRx2;
+	int lenRx1;
 	int i;
+	USART_IAP_FLAG = 0;
+	packIndex = USART_IAP_RX[8] << 8 | USART_IAP_RX[9];
 	
-	for (i = 0; i < 512; i++)
-	{
-		FileBuffArray[i] = 0;
-		FileBuffArray1[i] = 0;
-	}
-	YmodemID = USART2_RX_BUF002[4]; 
-	packIndex = (USART2_RX_BUF002[5] << 8) + USART2_RX_BUF002[6];
-	packTotalNum = (USART2_RX_BUF002[7] << 8) + USART2_RX_BUF002[8];
-	lenRx1 = data_lengthU2;
-	data_lengthU2 = 0;
-	uint8_t ERR_Arr[8] = "error\r\n";
-	uint8_t ACK_Arr[16] = "acknowlege";
+	lenRx1 = USART_PUB_LENGTH;
 
+	uint8_t ERR_Arr[8] = "error\r\n";
+//	uint8_t ACK_Arr[16] = "acknowlege=ok";
+	
+	YmodemID = USART_IAP_RX[7];
+	memset(FileBuffArray, 0, sizeof(FileBuffArray));
+	memset(FileBuffArray1, 0, sizeof(FileBuffArray1));
+	
+	
+	
 	switch (YmodemID)
 	{
-	case 0x01: //起始帧与结束帧解析  根据包序号判别该帧为起始帧还是结束帧
-		if (packIndex == 1)
-		{ //起始帧处理
-			FileLength_IAP = (USART2_RX_BUF002[73] << 24) + (USART2_RX_BUF002[74] << 16) + (USART2_RX_BUF002[75] << 8) + (USART2_RX_BUF002[76]);
-			
-			crcIAP = LIB_CRC_MODBUS(&USART2_RX_BUF002[4], 133); 
-			crcTerminal = (USART2_RX_BUF002[lenRx1 - 5] << 8) + USART2_RX_BUF002[lenRx1 - 6];
+		case 0x01: //起始帧与结束帧解析  根据包序号判别该帧为起始帧还是结束帧
+			memcpy(startFrame, &USART_IAP_RX[10], 40);
+			crcIAP = crc16_xmodem(&USART_IAP_RX[10], 128); 
+			crcTerminal = (USART_IAP_RX[lenRx1 - 4] << 8) | USART_IAP_RX[lenRx1 - 3];
+		
 			if (crcIAP == crcTerminal)
 			{
+/*升级起始帧标记0*/				
 				for (i = 0; i < 88; ++i)
 				{
-					if (*(unsigned char *)(StartMode_Addr + i + 4) != USART2_RX_BUF002[9 + i])
+					if (*(unsigned char *)(StartMode_Addr + i + 4) != USART_IAP_RX[10 + i])
 						break;
 				}
-				if (i < 88)
+				if (i < 50)
 				{
-					for (i = 0; i < 44; i++)
+					for (i = 0; i < 25; i++)
 					{
-						FileBuffArray[i] = (uint16_t)(USART2_RX_BUF002[i * 2 + 10] << 8 | USART2_RX_BUF002[i * 2 + 9]);
+						FileBuffArray[i] = (uint16_t)(USART_IAP_RX[i * 2 + 11] << 8 | USART_IAP_RX[i * 2 + 10]);
 					}
-					Flash_WriteBytes(FileBuffArray, StartMode_Addr + 4, 44);
-					packIndexbak = 0;
-					AddrToWrite = Application_Buffer_Addr;
-				}
-				else
-				{
-					if(packIndexbak>1)
-						packIndexbak-=1;
-				}
+					Flash_WriteBytes(FileBuffArray, StartMode_Addr + 4, 25); //从StartMode_Addr+4 ,开始写入数据
+					delay_sys_us(50);
+/*升级起始帧标记1*/	
+					
+/*IAP总长度标记0*/	
+
+					
+#if	indexfl == 4	
+   	lenindex =0;//长度为4位数
+#else	
+	
+   	lenindex =1;//长度为5位数
+#endif	
 
-				{
-					static uint16_t txLen;
-					for (i = 0; i < 1024; i++)
+					readFlashToArr(binLength, StartMode_Addr+27);
+					if(lenindex != 0)
 					{
-						USART2_RX_BUF002[i] = 0;
+						FileLength_IAP = ((binLength[0]&0xF)*10000) + ((binLength[1]&0xF) *1000) +((binLength[2]&0xF) *100) +\
+																((binLength[3]&0xF) *10)  + ((binLength[4]&0xF) );
 					}
-					txLen = sprintf((char *)FileBuffArray, "file=%d\r\n", packIndexbak);
-					HAL_UART_Transmit_IT(&huart1,(unsigned char *)FileBuffArray,txLen);		
-					while (huart1.gState == HAL_UART_STATE_BUSY_TX);
+					else
+					{
+						FileLength_IAP = ((binLength[0]&0xF)*1000) + ((binLength[1]&0xF) *100) +((binLength[2]&0xF) *10) +\
+																((binLength[3]&0xF) *1) ;
+					}
+					
+
+					
+					all_len = FileLength_IAP;
+					
+					
+					erase_flash(LENGTH_ADDR);
+					HAL_FLASH_Unlock();  // 解锁Flash
+					HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, LENGTH_ADDR, all_len);
+					HAL_FLASH_Lock();  // 上锁Flash
+/*IAP总长度标记1*/		
+					
+/*IAP_MD5标记0*/
+					if(lenindex!=0)
+					{
+						Flash_ReadBytes(iapbinMd5, StartMode_Addr + 33, 16);
+
+						Flash_WriteBytes(iapbinMd5, MD5_ADDR, 8);
+						for (int i = 0; i < 8; i++) {
+							iapbinMd5[i] = ((iapbinMd5[i] >> 8) & 0xFF) | ((iapbinMd5[i] << 8) & 0xFF00);
+						}
+					}
+					else
+					{
+						Flash_ReadBytes(iapbinMd5, StartMode_Addr + 32, 16);
+
+						Flash_WriteBytes(iapbinMd5, MD5_ADDR, 8);
+						for (int i = 0; i < 8; i++) {
+							iapbinMd5[i] = ((iapbinMd5[i] >> 8) & 0xFF) | ((iapbinMd5[i] << 8) & 0xFF00);
+						}
+					}
+
+						
+				
+/*IAP_MD5标记1*/	
+					
+					AddrToWrite = Application_Buffer_Addr;
 				}
+
+				memset(USART_IAP_RX, 0, sizeof(USART_IAP_RX));	
+				delay_sys_us(80);
+				receive_modbus_9_1(initial_address, USART_MODBUS_RX[1], ((uint16_t)USART_MODBUS_RX[2] << 8) | USART_MODBUS_RX[3], \
+									((uint16_t)USART_MODBUS_RX[4] << 8) | USART_MODBUS_RX[5], USART_MODBUS_RX[6]);
+
+				
+				__NOP();
 			}
+
 			else
 			{
-				for (i = 0; i < 1024; i++)
-				{
-					USART2_RX_BUF002[i] = 0;
-				}
+				memset(USART_IAP_RX, 0, sizeof(USART_IAP_RX));
 				HAL_UART_Transmit(&huart1, ERR_Arr, strlen((char *)ERR_Arr), 100);
 			}
 			
-		}
-		else
-		{
+			memset(FileBuffArray, 0, sizeof(FileBuffArray));
+			memset(FileBuffArray1, 0, sizeof(FileBuffArray1));
+			break;
 			
-		}
-		break;
-	case 0x02:														//有效载荷帧数据处理
-		crcIAP = LIB_CRC_MODBUS(&USART2_RX_BUF002[4], lenRx1 - 10); //
-		crcTerminal = (USART2_RX_BUF002[lenRx1 - 5] << 8) + USART2_RX_BUF002[lenRx1 - 6];
-		if ((crcIAP == crcTerminal) && (((packIndexbak + 1) == packIndex) || ((packIndexbak) == packIndex)))
-		{
-			if ((packIndexbak + 1) == packIndex)
+/***
+ *	存储并迁移下载区
+ */			
+			
+		case 0x02:														//有效载荷帧数据处理
+			crcIAP = crc16_xmodem(&USART_IAP_RX[10], 128); 
+			crcTerminal = (USART_IAP_RX[lenRx1 - 4] << 8) + USART_IAP_RX[lenRx1 - 3];
+		
+
+		
+			if (crcIAP == crcTerminal)
 			{
-				lenRx2 = (lenRx1 - 15) % 2;
-				if (!lenRx2)
+				for (i = 0; i < 64; i++)
 				{
-					for (i = 0; i < ((lenRx1 - 15) / 2); i++)
-					{
-						FileBuffArray[i] = (uint16_t)(USART2_RX_BUF002[i * 2 + 10] << 8 | USART2_RX_BUF002[i * 2 + 9]);
-						FileBuffArray1[i] = (uint16_t)(USART2_RX_BUF002[i * 2 + 10] << 8 | USART2_RX_BUF002[i * 2 + 9]);
-					}
-					Flash_WriteBytes(FileBuffArray, AddrToWrite, ((lenRx1 - 15) / 2));
-					Flash_ReadBytes(FileBuffArray1, AddrToWrite, ((lenRx1 - 15) / 2));
+					FileBuffArray[i] = (uint16_t)(USART_IAP_RX[i * 2 + 11] << 8 | USART_IAP_RX[i * 2 + 10]);
 				}
-				else
+
+				Flash_WriteBytes(FileBuffArray, AddrToWrite, 64);
+				AddrToWrite += 128;
+				
+				
+				
+
+//				Flash_ReadBytes(&iapbigbuf[indexbuf], AddrToWrite, 128);
+//				indexbuf+=128;
+
+				
+				
+				HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
+				HAL_Delay(1);  
+				HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
+				
+				if((AddrToWrite & 0xffff) != (USART_IAP_RX[2] << 8 | USART_IAP_RX[3]))
+				{
+					HAL_UART_Transmit(&huart1, ERR_Arr, strlen((char *)ERR_Arr), 100);
+					break;
+				}
+				
+				
+				memset(USART_IAP_RX, 0, sizeof(USART_IAP_RX));	
+				delay_sys_us(80);
+				
+				receive_modbus_9_1(initial_address, USART_MODBUS_RX[1], ((uint16_t)USART_MODBUS_RX[2] << 8) | USART_MODBUS_RX[3], \
+									((uint16_t)USART_MODBUS_RX[4] << 8) | USART_MODBUS_RX[5], USART_MODBUS_RX[6]);
+
+			}				
+			break;
+			
+			
+		case 0x04:
+			{				
+				
+				crcIAP = crc16_xmodem(&USART_IAP_RX[10], 128); 
+				crcTerminal = (USART_IAP_RX[lenRx1 - 4] << 8) + USART_IAP_RX[lenRx1 - 3];
+				if (crcIAP == crcTerminal)
 				{
-					for (i = 0; i < ((lenRx1 - 16) / 2); i++)
+//					int txLen;
+//					txLen = sprintf((char *)USART_IAP_RX, "%s\r\n", ACK_Arr);
+//					HAL_UART_Transmit_IT(&huart1,USART_IAP_RX,txLen);		
+//					while (huart1.gState == HAL_UART_STATE_BUSY_TX)
+//					{
+//						HAL_Delay(1);
+//					}
+					
+/*系统版本标记0*/					
+					Flash_ReadBytes(version, StartMode_Addr + 14, 8);
+					for (int i = 0; i < 4; i++) {
+						version[i] = ((version[i] >> 8) & 0xFF) | ((version[i] << 8) & 0xFF00);
+					}
+					convertHexToAscii(version, &System_version);
+					erase_flash(VERSION_ADDR);
+					HAL_FLASH_Unlock();  // 解锁Flash
+					HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, VERSION_ADDR, System_version);
+					HAL_FLASH_Lock();  // 上锁Flash
+/*系统版本标记1*/	
+					
+					
+					tag = App2_MD5_Check(Application_Buffer_Addr,all_len);
+					
+					if(tag)
 					{
-						FileBuffArray[i] = (uint16_t)(USART2_RX_BUF002[i * 2 + 10] << 8 | USART2_RX_BUF002[i * 2 + 9]);
-						FileBuffArray1[i] = (uint16_t)(USART2_RX_BUF002[i * 2 + 10] << 8 | USART2_RX_BUF002[i * 2 + 9]);
+						
+						Set_Update_Down(); //设定标志位  下次启动时进行程序拷贝
+					}else{
+						int	txLen = sprintf((char *)USART_IAP_RX,"check=error\r\n");
+						delay_sys_us(80);
+						HAL_UART_Transmit_IT(&huart1,USART_IAP_RX,txLen);					
+						while (huart1.gState == HAL_UART_STATE_BUSY_TX)
+						{
+							HAL_Delay(1);
+						}
 					}
-					FileBuffArray[(lenRx1 - 16) / 2] = USART2_RX_BUF002[(lenRx1 - 16 + 10)] << 8;
-					FileBuffArray1[(lenRx1 - 16) / 2] = USART2_RX_BUF002[(lenRx1 - 16 + 10)] << 8;
-					Flash_WriteBytes(FileBuffArray, AddrToWrite, ((lenRx1 - 15 + 1) / 2));
-					Flash_ReadBytes(FileBuffArray1, AddrToWrite, ((lenRx1 - 15 + 1) / 2));
-				}
-				AddrToWrite += lenRx1 - 15;
-				DataReadFlash = *((uint32_t *)(AddrToWrite));
-				DataReadFlash1 = (*(__IO uint32_t *)AddrToWrite);
-				HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);
-			}
-			if (DataReadFlash == DataReadFlash1)
-			{
-				packIndexbak = packIndex;
-			}
 
-			{
-				int txLen;
-				for (i = 0; i < 1024; i++)
+				}
+				else
 				{
-					USART2_RX_BUF002[i] = 0;
+					delay_sys_us(80);
+					HAL_UART_Transmit(&huart1, ERR_Arr, strlen((char *)ERR_Arr), 100);
+					delay_sys_us(80);
 				}
-				txLen = sprintf((char *)USART2_RX_BUF002, "%s=%d\r\n", ACK_Arr, packIndex);
-				HAL_UART_Transmit_IT(&huart1,USART2_RX_BUF002,txLen);		
-				while (huart1.gState == HAL_UART_STATE_BUSY_TX);
 			}
-		}
-		else
+			break;
+		default:
+			break;
+	}
+}
+
+
+uint8_t buffer[BUFFER_SIZE_length];
+uint8_t buffer_length[100];
+unsigned int all_len;
+int i;
+unsigned int ModeStart;
+
+void Start_BootLoader(void)
+{
+	
+	uint16_t ModeStart1[2];
+	Flash_ReadBytes(ModeStart1, StartMode_Addr, 2);
+	
+	ModeStart = (ModeStart1[0] << 16) | ModeStart1[1];
+	all_len = FileLength_IAP;
+	int tag;
+	int txLen;
+	memset(USART_IAP_RX, 0, sizeof(USART_IAP_RX));	
+	uint16_t pagenum =  (all_len+2048)/2048;
+	
+	switch (ModeStart)
+	{
+		case Startup_Normal: // 正常启动  在APP2中可以设定此标志位   使得下次重启之后进入APP1
 		{
-			HAL_UART_Transmit(&huart1, ERR_Arr, strlen((char *)ERR_Arr), 100);
+			txLen = sprintf((char *)USART_IAP_RX, "normalStart");
+			
+			HAL_UART_Transmit_IT(&huart1,USART_IAP_RX,txLen);		
+			break;
 		}
-		break;
-	case 3:
-		{														 //结束帧处理
-			int i,all_len;
-			crcIAP1 = LIB_CRC_MODBUS(&USART2_RX_BUF002[4], 133); //
-			crcTerminal = (USART2_RX_BUF002[lenRx1 - 5] << 8) + USART2_RX_BUF002[lenRx1 - 6];
-			if (crcIAP1 == crcTerminal)
+		
+		case Startup_Update: /*启动最新的程序 */
 			{
-				int txLen;
-				txLen = sprintf((char *)USART2_RX_BUF002, "%s\r\n", ACK_Arr);
-				HAL_UART_Transmit_IT(&huart1,USART2_RX_BUF002,txLen);		
-				while (huart1.gState == HAL_UART_STATE_BUSY_TX);
-				for (i = 0, all_len = 0; i < 4; ++i)
-				{
-					all_len = all_len << 8;
-					all_len |= *(unsigned char *)(StartMode_Addr + 68 + i);
-				}
-			if (1)//App2_MD5_Check(Application_Buffer_Addr,all_len))
+				FLASH_EraseInitTypeDef erase_init;
+				erase_init.TypeErase = FLASH_TYPEERASE_PAGES;  // 擦除类型为页擦除
+				erase_init.PageAddress = ADD_UPDATE_PROG;  
+				erase_init.NbPages = pagenum;  // 擦除的页数
+				uint32_t page_error = 0;
+				HAL_FLASH_Unlock();  // 解锁Flash
+				HAL_StatusTypeDef status = HAL_FLASHEx_Erase(&erase_init, &page_error);  // 执行擦除操作
+				HAL_FLASH_Lock();  // 上锁Flash
+			}
+			all_len = FileLength_IAP;
+			
+			tag = App2_MD5_Check(Application_Buffer_Addr,all_len);
+			if (tag)
 			{
-				txLen = sprintf((char *)USART2_RX_BUF002, "md5 check=ok\r\n");
-				HAL_UART_Transmit_IT(&huart1,USART2_RX_BUF002,txLen);		
-				while (huart1.gState == HAL_UART_STATE_BUSY_TX);
+				iap_write_appbin(ADD_UPDATE_PROG,Application_Buffer_Addr,all_len);
 
-				Set_Update_Down(); 
+				txLen = sprintf((char *)USART_IAP_RX, "update\r\n");
+				HAL_UART_Transmit_IT(&huart1,USART_IAP_RX,txLen);		
+				while (huart1.gState == HAL_UART_STATE_BUSY_TX)
+				{
+					HAL_Delay(1);
+				}	
+				
+				
 			}
 			else
 			{
-				txLen = sprintf((char *)USART2_RX_BUF002,"md5 check=error\r\n");
+				txLen = sprintf((char *)USART_IAP_RX,"checkfail");
+				delay_sys_us(80);
+				HAL_UART_Transmit_IT(&huart1,USART_IAP_RX,txLen);					
+				while (huart1.gState == HAL_UART_STATE_BUSY_TX)
+				{
+					HAL_Delay(1);
+				}
+				return ;
+			}	
+			
+			
+			if (App2_MD5_Check(ADD_UPDATE_PROG,all_len))
+			{		
+				txLen = sprintf((char *)USART_IAP_RX, "updateok\r\n");
+				HAL_UART_Transmit_IT(&huart1,USART_IAP_RX,txLen);			
+				while (huart1.gState == HAL_UART_STATE_BUSY_TX)
+				{
+					HAL_Delay(1);
+				}
+				Set_App2_Flag();
 			}
-				HAL_UART_Transmit_IT(&huart1,USART2_RX_BUF002,txLen);		
-				while (huart1.gState == HAL_UART_STATE_BUSY_TX);
+			break;
+		case Startup_APP2: /*启动最新的程序 */
 
-			}
-			else
+			txLen = sprintf((char *)USART_IAP_RX, "jump");
+			HAL_UART_Transmit_IT(&huart1,USART_IAP_RX,txLen);		
+			while (huart1.gState == HAL_UART_STATE_BUSY_TX)
 			{
-				HAL_UART_Transmit(&huart1, ERR_Arr, strlen((char *)ERR_Arr), 100);
+				HAL_Delay(1);
 			}
+			
+			
+			__set_FAULTMASK(0);		
+//			Set_normal_Flag();
+			
+			IAP_ExecuteApp(ADD_UPDATE_PROG); //执行FLASH APP2代码
+
+//			Set_jump_Flag();
+//	
+//		case Jump_app:
+////			Set_normal_Flag();
+//			IAP_ExecuteApp(0x8020000); //执行FLASH APP2代码
+//			
+			break;
+		default: // 启动失败
+		{
+			return;
 		}
-		break;
-	default:
-		break;
 	}
 }
 

+ 261 - 319
Core/Src/main.c

@@ -47,21 +47,15 @@
 /* Private variables ---------------------------------------------------------*/
 
 /* USER CODE BEGIN PV */
-int spr000;
+int rebootTip;
 uint8_t  data_to_send[50];
 uint16_t CRC_value 		 = 0;
 uint16_t initial_address = 0x00C1;
 uint16_t BaudrateValue 	 = 0x0000;
-uint16_t Adc2_CalibrationValue ;
-uint16_t Adc3_CalibrationValue ;
-uint32_t System_version  = Version_sys;
-
-uint8_t	 Rx_Flag 		= 0;
-uint8_t  gpioaStatus 	= 0;
-uint8_t  gpiobStatus 	= 0;
+uint32_t System_version  = 0x23080700;
 uint8_t  bufMain[128] 	= {0};
-uint8_t	 Rx_Buf[Rx_Max] = {0};	
-uint16_t Rx_Len = 0;
+
+
 
 /* USER CODE END PV */
 
@@ -84,14 +78,8 @@ void MX_FREERTOS_Init(void);
 int main(void)
 {
   /* USER CODE BEGIN 1 */
-	
-#if	IR_ROM1 == 0x08000000	
-	Start_BootLoader();
-#else	
-	SCB->VTOR = 0x08020000;
-	__set_PRIMASK(0);
-#endif	
-	
+
+
   /* USER CODE END 1 */
 
   /* MCU Configuration--------------------------------------------------------*/
@@ -119,15 +107,26 @@ int main(void)
   MX_USART3_UART_Init();
   /* USER CODE BEGIN 2 */
   HAL_TIM_Base_Start_IT(&htim2);
-  read_new_address(ADDR_FLASH_PAGE_94); 
-  updatePbStatus(read_flash_16(ADDR_FLASH_PAGE_104));
-  update_baudrate(read_flash_16(ADDR_FLASH_PAGE_114));
+//更新标定数据  
   AdcCalibration_init();
+  updateiapMd5(StartMode_Addr);
+  update_iaplength(LENGTH_ADDR);
+  read_new_address(addr_FLASH_ADDR); 
+  update_sysVersion(StartMode_Addr+14);
+  updatePbStatus(read_flash_16(pbstatus_FLASH_ADDR));
+  update_baudrate(read_flash_16(baudrate_FLASH_ADDR));
+//更新结束  
+#if	IR_ROM1 == 0x08000000	
+   	Start_BootLoader();
+#else	
+	SCB->VTOR = 0x08020000;
+	__set_PRIMASK(0);
+#endif	
   
-  spr000 = sprintf((char*)bufMain, "system reboot...");
-  HAL_UART_Transmit(&huart1, bufMain, spr000, 300);
-  
-  HAL_UART_Receive_DMA(&huart1,USART2_RX_BUF,Uart2_BUF_SIZE); 
+
+//  rebootTip = sprintf((char*)bufMain, "reboot ok");
+//  HAL_UART_Transmit(&huart1, bufMain, rebootTip, 300);
+  HAL_UART_Receive_DMA(&huart1,USART_PUB_RX,RX_BUF_SIZE); 
   __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); 
   /* USER CODE END 2 */
 
@@ -142,6 +141,7 @@ int main(void)
   while (1)
   { 
 
+
 	
     /* USER CODE END WHILE */
 
@@ -169,7 +169,7 @@ void SystemClock_Config(void)
   RCC_OscInitStruct.HSIState = RCC_HSI_ON;
   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
-  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL6;
+  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL2;
   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
   {
     Error_Handler();
@@ -180,11 +180,11 @@ void SystemClock_Config(void)
   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
-  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
+  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV2;
   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
 
-  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
+  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
   {
     Error_Handler();
   }
@@ -202,6 +202,12 @@ uint16_t read_flash_16(uint32_t addr){
     return data;
 }
 
+uint32_t read_flash_32(uint32_t addr){
+    uint32_t data = *(volatile uint32_t*)addr;
+    return data;
+}
+
+
 void read_new_address(uint32_t addr){
 		uint16_t init_address = read_flash_16(addr);
 	  if(init_address == 0xFFFF) {
@@ -221,411 +227,347 @@ void erase_flash(uint32_t ADDR_FLASH){                //
     HAL_StatusTypeDef status = HAL_FLASHEx_Erase(&erase_init, &page_error);  // 执行擦除操作
     HAL_FLASH_Lock();  // 上锁Flash
     if(status == HAL_OK){
-        if(ADDR_FLASH == ADDR_FLASH_PAGE_94) {
+        if(ADDR_FLASH == addr_FLASH_ADDR) {
             initial_address = 0;         // 将initial_address清零
         }
-        else if(ADDR_FLASH == ADDR_FLASH_PAGE_104) {
+        else if(ADDR_FLASH == pbstatus_FLASH_ADDR) {
             gpiobStatus = 0;             // 将pb_status清零
         }
-        else if(ADDR_FLASH == ADDR_FLASH_PAGE_114) {
+        else if(ADDR_FLASH == baudrate_FLASH_ADDR) {
             BaudrateValue = 0xFFFF;  
         }
-        else if(ADDR_FLASH == ADDR_FLASH_PAGE_124) {
+        else if(ADDR_FLASH == ADC1_FLASH_ADDR) {
             Adc2_CalibrationValue = 0x0000;  // 清零
         }
-        else if(ADDR_FLASH == ADDR_FLASH_PAGE_134) {
+        else if(ADDR_FLASH == ADC2_FLASH_ADDR) {
             Adc3_CalibrationValue = 0x0000;  // 清零
         }
         
     }
 }
 
+
+
 void Write_Information(uint32_t addr, uint8_t* rx_buffer, uint8_t buffer_index) {
     uint16_t newValue = 0;
-	  erase_flash(addr);
+	erase_flash(addr);
     HAL_FLASH_Unlock();  // 解锁Flash
 	
-    if (addr == ADDR_FLASH_PAGE_94) {  // 写入地址到Flash
+    if (addr == addr_FLASH_ADDR) {  // 写入地址到Flash
         newValue = rx_buffer[buffer_index];
-        HAL_StatusTypeDef status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ADDR_FLASH_PAGE_94, newValue);
+        HAL_StatusTypeDef status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, addr_FLASH_ADDR, newValue);
         if (status == HAL_OK) {
             initial_address = newValue;  // 将新地址赋值给initial_address
         }
     } 
-		else if (addr == ADDR_FLASH_PAGE_104) {  // 写入PB状态到Flash
+	else if (addr == pbstatus_FLASH_ADDR) {  // 写入PB状态到Flash
         newValue = rx_buffer[buffer_index];
-        HAL_StatusTypeDef status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ADDR_FLASH_PAGE_104, newValue);
+        HAL_StatusTypeDef status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, pbstatus_FLASH_ADDR, newValue);
         if (status == HAL_OK) {
             gpiobStatus = newValue;  // 将新状态赋值给gpiobStatus
         }
     } 
-		else if (addr == ADDR_FLASH_PAGE_114) {  // 写入波特率到Flash
+	else if (addr == baudrate_FLASH_ADDR) {  // 写入波特率到Flash
         newValue = rx_buffer[buffer_index];
-        HAL_StatusTypeDef status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ADDR_FLASH_PAGE_114, newValue);
+        HAL_StatusTypeDef status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, baudrate_FLASH_ADDR, newValue);
         if (status == HAL_OK) {
             BaudrateValue = newValue;  // 将新状态赋值给BaudrateValue
         }
     } 
-		else if (addr == ADDR_FLASH_PAGE_124 || addr == ADDR_FLASH_PAGE_134) {  // 写入ADC校准值到Flash
+	else if (addr == ADC1_FLASH_ADDR || addr == ADC2_FLASH_ADDR) {  // 写入ADC校准值到Flash
         uint16_t Standard_value = (0.6 / (3.3 / 4096));
-        if (addr == ADDR_FLASH_PAGE_124) {
+        if (addr == ADC1_FLASH_ADDR) {
             if (adc2_rawValue >= Standard_value) {
                 newValue = adc2_rawValue - Standard_value;
             } else {
                 newValue = Standard_value - adc2_rawValue;
                 newValue |= 0x8000;
             }
-            HAL_StatusTypeDef status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ADDR_FLASH_PAGE_124, newValue);
+            HAL_StatusTypeDef status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ADC1_FLASH_ADDR, newValue);
             if (status == HAL_OK) {
                 Adc2_CalibrationValue = newValue & 0x7FFF;
 							  Value_old_addr2 = newValue;
             }
-        } else if (addr == ADDR_FLASH_PAGE_134) {
+        } 
+	else if (addr == ADC2_FLASH_ADDR) {
             if (adc3_rawValue >= Standard_value) {
                 newValue = adc3_rawValue - Standard_value;
             } else {
                 newValue = Standard_value - adc3_rawValue;
                 newValue |= 0x8000;
             }
-            HAL_StatusTypeDef status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ADDR_FLASH_PAGE_134, newValue);
+            HAL_StatusTypeDef status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, ADC2_FLASH_ADDR, newValue);
             if (status == HAL_OK) {
                 Adc3_CalibrationValue = newValue & 0x7FFF;
 							  Value_old_addr3 = newValue;
             }
         }
     }
-    
-		HAL_FLASH_Lock();  // 上锁Flash
+	HAL_FLASH_Lock();  // 上锁Flash
 }
 
 
-void delay_sys_us(uint32_t Delay)//1个delay,大概1.5us
-{
-	uint32_t cnt = Delay * 8;  
-    uint32_t i = 0;
-    for(i = 0; i < cnt; i++)__NOP();
+
+void clear_buf(void){
+	memset(USART_MODBUS_RX, 0, sizeof(USART_MODBUS_RX)); 
+	memset(USART_PUB_RX, 0, RX_BUF_SIZE); 
+	USART_MODBUS_FLAG = 0;	
+	USART_IAP_FLAG = 0;
+}
+
+void re_receive(void){
+	HAL_UART_AbortReceive(&huart1);
+	HAL_UART_Receive_DMA(&huart1, USART_PUB_RX, RX_BUF_SIZE); 
+}
+
+
+void receive_modbus_7(uint16_t addr, uint8_t funcode, uint8_t byteNum, uint16_t byte, int byteSize){
+	uint8_t data_to_send[] = {(uint8_t)addr, funcode, byteNum, (uint8_t)(byte >> 8), (uint8_t)(byte & 0xFF), 0x00, 0x00};
+	uint16_t CRC_value = calculate_crc(data_to_send, (byteSize - 2));
+	data_to_send[(byteSize - 2)] = (uint8_t)(CRC_value & 0xFF);
+	data_to_send[(byteSize - 1)] = (uint8_t)(CRC_value >> 8);
+	HAL_UART_Transmit(&huart1, data_to_send, byteSize, byteSize);
+	clear_buf();
+	re_receive();
+}
+
+void receive_modbus_8(uint16_t addr, uint8_t funcode, uint16_t startaddr, uint16_t reg){
+	
+	uint8_t data_to_send[] = {(uint8_t)addr, funcode, (uint8_t)(startaddr >> 8), (uint8_t)(startaddr & 0xFF), \
+	(uint8_t)(reg >> 8), (uint8_t)(reg & 0xFF), 0x00, 0x00};
+	uint16_t CRC_value = calculate_crc(data_to_send, 6);
+	data_to_send[6] = (uint8_t)(CRC_value & 0xFF);
+	data_to_send[7] = (uint8_t)(CRC_value >> 8);
+	HAL_UART_Transmit(&huart1, data_to_send, 8, 7);
+	clear_buf();
+	re_receive();
 }
 
+void receive_modbus_9_1(uint16_t addr, uint8_t funcode, uint16_t startaddr, uint16_t reg, uint8_t byteNum){
+	
+	uint8_t data_to_send[] = {(uint8_t)addr, funcode, (uint8_t)(startaddr >> 8), (uint8_t)(startaddr & 0xFF), \
+	(uint8_t)(reg >> 8), (uint8_t)(reg & 0xFF), byteNum, 0x00, 0x00};
+	uint16_t CRC_value = calculate_crc(data_to_send, 7);
+	data_to_send[7] = (uint8_t)(CRC_value & 0xFF);
+	data_to_send[8] = (uint8_t)(CRC_value >> 8);
+	HAL_UART_Transmit(&huart1, data_to_send, 9, 9);
+
+	clear_buf();
+	re_receive();
+}
+
+void receive_modbus_9(uint16_t addr, uint8_t funcode, uint8_t byteNum, uint16_t byte1, uint16_t byte2, int byteSize){
+	uint8_t data_to_send[] = {(uint8_t)addr, funcode, byteNum, (uint8_t)(byte1 >> 8), (uint8_t)(byte1 & 0xFF), (uint8_t)(byte2 >> 8), \
+	(uint8_t)(byte2 & 0xFF), 0x00, 0x00};
+	uint16_t CRC_value = calculate_crc(data_to_send, (byteSize - 2));
+	data_to_send[(byteSize - 2)] = (uint8_t)(CRC_value & 0xFF);
+	data_to_send[(byteSize - 1)] = (uint8_t)(CRC_value >> 8);
+	HAL_UART_Transmit(&huart1, data_to_send, byteSize, (byteSize - 1));
+	clear_buf();
+	re_receive();
+}
+
+void receive_modbus_11(uint16_t addr, uint8_t funcode, uint8_t byteNum, uint16_t byte1, uint16_t byte2, uint16_t byte3, int byteSize){
+	uint8_t data_to_send[] = {(uint8_t)addr, funcode, byteNum, (uint8_t)(byte1 >> 8), (uint8_t)(byte1 & 0xFF), (uint8_t)(byte2 >> 8), \
+	(uint8_t)(byte2 & 0xFF), (uint8_t)(byte3 >> 8), (uint8_t)(byte3 & 0xFF), 0x00, 0x00};
+	uint16_t CRC_value = calculate_crc(data_to_send, (byteSize - 2));
+	data_to_send[(byteSize - 2)] = (uint8_t)(CRC_value & 0xFF);
+	data_to_send[(byteSize - 1)] = (uint8_t)(CRC_value >> 8);
+	HAL_UART_Transmit(&huart1, data_to_send, byteSize, (byteSize - 1));
+	clear_buf();
+	re_receive();
+}
+
+void receive_modbus_13(uint16_t addr, uint8_t funcode, uint8_t byteNum, uint16_t byte1, uint16_t byte2, uint16_t byte3, uint16_t byte4, int byteSize){
+	uint8_t data_to_send[] = {(uint8_t)addr, funcode, byteNum, (uint8_t)(byte1 >> 8), (uint8_t)(byte1 & 0xFF), (uint8_t)(byte2 >> 8), \
+		(uint8_t)(byte2 & 0xFF), (uint8_t)(byte3 >> 8), (uint8_t)(byte3 & 0xFF), (uint8_t)(byte4 >> 8), (uint8_t)(byte4 & 0xFF), 0x00, 0x00};
+	uint16_t CRC_value = calculate_crc(data_to_send, (byteSize - 2));
+	data_to_send[(byteSize - 2)] = (uint8_t)(CRC_value & 0xFF);
+	data_to_send[(byteSize - 1)] = (uint8_t)(CRC_value >> 8);
+	HAL_UART_Transmit(&huart1, data_to_send, byteSize, (byteSize - 1));
+	clear_buf();
+	re_receive();
+}
+
+void receive_modbus_15(uint16_t addr, uint8_t funcode, uint8_t byteNum, uint16_t byte1, uint16_t byte2, uint16_t byte3, uint16_t byte4, uint16_t byte5, int byteSize){
+	uint8_t data_to_send[] = {(uint8_t)addr, funcode, byteNum, (uint8_t)(byte1 >> 8), (uint8_t)(byte1 & 0xFF), (uint8_t)(byte2 >> 8), \
+		(uint8_t)(byte2 & 0xFF), (uint8_t)(byte3 >> 8), (uint8_t)(byte3 & 0xFF), (uint8_t)(byte4 >> 8), (uint8_t)(byte4 & 0xFF), (uint8_t)(byte5 >> 8),\
+		(uint8_t)(byte5 & 0xFF), 0x00, 0x00};
+	uint16_t CRC_value = calculate_crc(data_to_send, (byteSize - 2));
+	data_to_send[(byteSize - 2)] = (uint8_t)(CRC_value & 0xFF);
+	data_to_send[(byteSize - 1)] = (uint8_t)(CRC_value >> 8);
+	HAL_UART_Transmit(&huart1, data_to_send, byteSize, (byteSize - 1));
+	clear_buf();
+	re_receive();
+}
+
+
 
 void ModBus(void) {
-	if (Rx_Flag == 1 && (calculate_crc(Rx_Buf,6) == (Rx_Buf[7] << 8 | Rx_Buf[6])) && data_lengthU2 < 10) {		
-		if(Rx_Buf[0] == (uint8_t)initial_address && Rx_Buf[1] == 0x03 && Rx_Buf[2] == 0x00 && Rx_Buf[3] == 0x01 && Rx_Buf[4] == 0x00 && Rx_Buf[5] == 0x01){
-			uint8_t data_to_send[] = {(uint8_t)initial_address, 0x03, 0x02, 0x00, gpioaStatus, 0x00, 0x00};
-			uint16_t CRC_value = calculate_crc(data_to_send, 5);
-			data_to_send[5] = (uint8_t)(CRC_value & 0xFF);
-			data_to_send[6] = (uint8_t)(CRC_value >> 8);
-			HAL_UART_Transmit(&huart1, data_to_send, 7, 6);
-			memset(Rx_Buf, 0, sizeof(Rx_Buf)); 
-			memset(USART2_RX_BUF, 0, Uart2_BUF_SIZE); 
-			Rx_Flag = 0;	
-			HAL_UART_AbortReceive(&huart1);
-			HAL_UART_Receive_DMA(&huart1, USART2_RX_BUF, Uart2_BUF_SIZE); 
+	
+	if (USART_MODBUS_FLAG == 1 && (calculate_crc(USART_MODBUS_RX,6) == (USART_MODBUS_RX[7] << 8 | USART_MODBUS_RX[6])) && USART_PUB_LENGTH < 10) {		
+		if(USART_MODBUS_RX[0] == (uint8_t)initial_address && USART_MODBUS_RX[1] == 0x03 && USART_MODBUS_RX[2] == 0x00 \
+			&& USART_MODBUS_RX[3] == 0x01 && USART_MODBUS_RX[4] == 0x00 && USART_MODBUS_RX[5] == 0x01){
+				
+			receive_modbus_7(initial_address, 0x03, 0x02, gpioaStatus, 7);
 		}
 
-		else if(Rx_Buf[0] == (uint8_t)initial_address && Rx_Buf[1] == 0x03 && Rx_Buf[2] == 0x00 && Rx_Buf[3] == 0x02 && Rx_Buf[4] == 0x00 && Rx_Buf[5] == 0x01){
-			uint8_t data_to_send[] = {(uint8_t)initial_address, 0x03, 0x02, 0x00, gpiobStatus, 0x00, 0x00};
-			uint16_t CRC_value = calculate_crc(data_to_send, 5);
-			data_to_send[5] = (uint8_t)(CRC_value & 0xFF);
-			data_to_send[6] = (uint8_t)(CRC_value >> 8);
-			HAL_UART_Transmit(&huart1, data_to_send, 7, 6);
-			memset(Rx_Buf, 0, sizeof(Rx_Buf)); 
-			memset(USART2_RX_BUF, 0, Uart2_BUF_SIZE); 
-			Rx_Flag = 0;	
-			HAL_UART_AbortReceive(&huart1);
-			HAL_UART_Receive_DMA(&huart1, USART2_RX_BUF, Uart2_BUF_SIZE); 
+		else if(USART_MODBUS_RX[0] == (uint8_t)initial_address && USART_MODBUS_RX[1] == 0x03 && USART_MODBUS_RX[2] == 0x00 \
+			&& USART_MODBUS_RX[3] == 0x02 && USART_MODBUS_RX[4] == 0x00 && USART_MODBUS_RX[5] == 0x01){
+				
+			receive_modbus_7(initial_address, 0x03, 0x02, gpiobStatus, 7);
+				
 		}
 				
-		else if(Rx_Buf[0] == (uint8_t)initial_address && Rx_Buf[1] == 0x03 && Rx_Buf[2] == 0x00 && Rx_Buf[3] == 0x03 && Rx_Buf[4] == 0x00 && Rx_Buf[5] == 0x01){	
-			uint8_t data_to_send[] = {(uint8_t)initial_address, 0x03, 0x02, adc2_byte1, adc2_byte2, 0x00, 0x00};
-			uint16_t CRC_value = calculate_crc(data_to_send, 5);
-			data_to_send[5] = (uint8_t)(CRC_value & 0xFF);
-			data_to_send[6] = (uint8_t)(CRC_value >> 8);
-			HAL_UART_Transmit(&huart1, data_to_send, 7, 6);
-			memset(Rx_Buf, 0, sizeof(Rx_Buf)); 
-			memset(USART2_RX_BUF, 0, Uart2_BUF_SIZE); 
-			Rx_Flag = 0;	
-			HAL_UART_AbortReceive(&huart1);
-			HAL_UART_Receive_DMA(&huart1, USART2_RX_BUF, Uart2_BUF_SIZE); 
+		else if(USART_MODBUS_RX[0] == (uint8_t)initial_address && USART_MODBUS_RX[1] == 0x03 && USART_MODBUS_RX[2] == 0x00 \
+			&& USART_MODBUS_RX[3] == 0x03 && USART_MODBUS_RX[4] == 0x00 && USART_MODBUS_RX[5] == 0x01){	
+			
+			receive_modbus_7(initial_address, 0x03, 0x02, adc2_filtered, 7);
+		
 		}
 				
-		else if(Rx_Buf[0] == (uint8_t)initial_address && Rx_Buf[1] == 0x03 && Rx_Buf[2] == 0x00 && Rx_Buf[3] == 0x04 && Rx_Buf[4] == 0x00 && Rx_Buf[5] == 0x01){
-			uint8_t data_to_send[] = {(uint8_t)initial_address, 0x03, 0x02, adc3_byte1, adc3_byte2, 0x00, 0x00};
-			uint16_t CRC_value = calculate_crc(data_to_send, 5);
-			data_to_send[5] = (uint8_t)(CRC_value & 0xFF);
-			data_to_send[6] = (uint8_t)(CRC_value >> 8);
-			HAL_UART_Transmit(&huart1, data_to_send, 7, 6);
-			memset(Rx_Buf, 0, sizeof(Rx_Buf)); 
-			memset(USART2_RX_BUF, 0, Uart2_BUF_SIZE); 
-			Rx_Flag = 0;	
-			HAL_UART_AbortReceive(&huart1);
-			HAL_UART_Receive_DMA(&huart1, USART2_RX_BUF, Uart2_BUF_SIZE); 
+		else if(USART_MODBUS_RX[0] == (uint8_t)initial_address && USART_MODBUS_RX[1] == 0x03 && USART_MODBUS_RX[2] == 0x00 \
+			&& USART_MODBUS_RX[3] == 0x04 && USART_MODBUS_RX[4] == 0x00 && USART_MODBUS_RX[5] == 0x01){
+			
+			receive_modbus_7(initial_address, 0x03, 0x02, adc3_filtered, 7);
 		}
 				
-		else if(Rx_Buf[0] == (uint8_t)initial_address && Rx_Buf[1] == 0x03 && Rx_Buf[2] == 0x00 && Rx_Buf[3] == 0x05 && Rx_Buf[4] == 0x00 && Rx_Buf[5] == 0x01){
-			uint8_t data_to_send[] = {(uint8_t)initial_address, 0x03, 0x02, adc1_byte1, adc1_byte2, 0x00, 0x00};
-			uint16_t CRC_value = calculate_crc(data_to_send, 5);
-			data_to_send[5] = (uint8_t)(CRC_value & 0xFF);
-			data_to_send[6] = (uint8_t)(CRC_value >> 8);
-			HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 7, 6);
-			memset(Rx_Buf, 0, sizeof(Rx_Buf)); 
-			memset(USART2_RX_BUF, 0, Uart2_BUF_SIZE); 
-			Rx_Flag = 0;	
-			HAL_UART_AbortReceive(&huart1);
-			HAL_UART_Receive_DMA(&huart1, USART2_RX_BUF, Uart2_BUF_SIZE); 
+		else if(USART_MODBUS_RX[0] == (uint8_t)initial_address && USART_MODBUS_RX[1] == 0x03 && USART_MODBUS_RX[2] == 0x00 \
+			&& USART_MODBUS_RX[3] == 0x05 && USART_MODBUS_RX[4] == 0x00 && USART_MODBUS_RX[5] == 0x01){
+
+			receive_modbus_7(initial_address, 0x03, 0x02, adc1_filtered, 7);
 		}
 
-		else if(Rx_Buf[0] == (uint8_t)initial_address && Rx_Buf[1] == 0x03 && Rx_Buf[2] == 0x00 && Rx_Buf[3] == 0x01 && Rx_Buf[4] == 0x00 && Rx_Buf[5] == 0x02){
-			uint8_t data_to_send[] = {(uint8_t)initial_address, 0x03, 0x04, 0x00, gpioaStatus, 0x00, gpiobStatus, 0x00, 0x00};
-			uint16_t CRC_value = calculate_crc(data_to_send, 7);
-			data_to_send[7] = (uint8_t)(CRC_value & 0xFF);
-			data_to_send[8] = (uint8_t)(CRC_value >> 8);
-			HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 9, 8);
-			memset(Rx_Buf, 0, sizeof(Rx_Buf)); 
-			memset(USART2_RX_BUF, 0, Uart2_BUF_SIZE); 
-			Rx_Flag = 0;	
-			HAL_UART_AbortReceive(&huart1);
-			HAL_UART_Receive_DMA(&huart1, USART2_RX_BUF, Uart2_BUF_SIZE); 
+		else if(USART_MODBUS_RX[0] == (uint8_t)initial_address && USART_MODBUS_RX[1] == 0x03 && USART_MODBUS_RX[2] == 0x00 \
+			&& USART_MODBUS_RX[3] == 0x01 && USART_MODBUS_RX[4] == 0x00 && USART_MODBUS_RX[5] == 0x02){
+			
+			receive_modbus_9(initial_address, 0x03, 0x04, gpioaStatus, gpiobStatus, 9);
 		}
 		
-		else if(Rx_Buf[0] == (uint8_t)initial_address && Rx_Buf[1] == 0x03 && Rx_Buf[2] == 0x00 && Rx_Buf[3] == 0x01 && Rx_Buf[4] == 0x00 && Rx_Buf[5] == 0x03){
-			uint8_t data_to_send[] = {(uint8_t)initial_address, 0x03, 0x06, 0x00, gpioaStatus, 0x00, gpiobStatus, adc2_byte1, adc2_byte2, 0x00, 0x00};
-			uint16_t CRC_value = calculate_crc(data_to_send, 9);
-			data_to_send[9] = (uint8_t)(CRC_value & 0xFF);
-			data_to_send[10] = (uint8_t)(CRC_value >> 8);
-			HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 11, 10);
-			memset(Rx_Buf, 0, sizeof(Rx_Buf)); 
-			memset(USART2_RX_BUF, 0, Uart2_BUF_SIZE); 
-			Rx_Flag = 0;	
-			HAL_UART_AbortReceive(&huart1);
-			HAL_UART_Receive_DMA(&huart1, USART2_RX_BUF, Uart2_BUF_SIZE); 
+		else if(USART_MODBUS_RX[0] == (uint8_t)initial_address && USART_MODBUS_RX[1] == 0x03 && USART_MODBUS_RX[2] == 0x00 \
+			&& USART_MODBUS_RX[3] == 0x01 && USART_MODBUS_RX[4] == 0x00 && USART_MODBUS_RX[5] == 0x03){
+			
+			receive_modbus_11(initial_address, 0x03, 0x06, gpioaStatus, gpiobStatus, adc2_filtered, 11);
+
 		}
 
-		else if(Rx_Buf[0] == (uint8_t)initial_address && Rx_Buf[1] == 0x03 && Rx_Buf[2] == 0x00 && Rx_Buf[3] == 0x01 && Rx_Buf[4] == 0x00 && Rx_Buf[5] == 0x04){
-			uint8_t data_to_send[] = {(uint8_t)initial_address, 0x03, 0x08, 0x00, gpioaStatus, 0x00, gpiobStatus, adc2_byte1, adc2_byte2, adc3_byte1, adc3_byte2, 0x00, 0x00};
-			uint16_t CRC_value = calculate_crc(data_to_send, 11);
-			data_to_send[11] = (uint8_t)(CRC_value & 0xFF);
-			data_to_send[12] = (uint8_t)(CRC_value >> 8);
-			HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 13, 12);
-			memset(Rx_Buf, 0, sizeof(Rx_Buf)); 
-			memset(USART2_RX_BUF, 0, Uart2_BUF_SIZE); 
-			Rx_Flag = 0;	
-			HAL_UART_AbortReceive(&huart1);
-			HAL_UART_Receive_DMA(&huart1, USART2_RX_BUF, Uart2_BUF_SIZE); 
+		else if(USART_MODBUS_RX[0] == (uint8_t)initial_address && USART_MODBUS_RX[1] == 0x03 && USART_MODBUS_RX[2] == 0x00 \
+			&& USART_MODBUS_RX[3] == 0x01 && USART_MODBUS_RX[4] == 0x00 && USART_MODBUS_RX[5] == 0x04){
+				
+			receive_modbus_13(initial_address, 0x03, 0x08, gpioaStatus, gpiobStatus, adc2_filtered, adc3_filtered, 13);
+
 		}
 				
-		else if(Rx_Buf[0] == (uint8_t)initial_address && Rx_Buf[1] == 0x03 && Rx_Buf[2] == 0x00 && Rx_Buf[3] == 0x01 && Rx_Buf[4] == 0x00 && Rx_Buf[5] == 0x05){
-			uint8_t data_to_send[] = {(uint8_t)initial_address, 0x03, 0x0A, 0x00, gpioaStatus, 0x00, gpiobStatus, adc2_byte1, adc2_byte2, adc3_byte1, adc3_byte2, adc1_byte1, adc1_byte2, 0x00, 0x00};
-			uint16_t CRC_value = calculate_crc(data_to_send, 13);
-			data_to_send[13] = (uint8_t)(CRC_value & 0xFF);
-			data_to_send[14] = (uint8_t)(CRC_value >> 8);
-			HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 15, 14);
-			memset(Rx_Buf, 0, sizeof(Rx_Buf)); 
-			memset(USART2_RX_BUF, 0, Uart2_BUF_SIZE); 
-			Rx_Flag = 0;	
-			HAL_UART_AbortReceive(&huart1);
-			HAL_UART_Receive_DMA(&huart1, USART2_RX_BUF, Uart2_BUF_SIZE); 
+		else if(USART_MODBUS_RX[0] == (uint8_t)initial_address && USART_MODBUS_RX[1] == 0x03 && USART_MODBUS_RX[2] == 0x00 \
+			&& USART_MODBUS_RX[3] == 0x01 && USART_MODBUS_RX[4] == 0x00 && USART_MODBUS_RX[5] == 0x05){
+				
+			receive_modbus_15(initial_address, 0x03, 0x0A, gpioaStatus, gpiobStatus, adc2_filtered, adc3_filtered, adc1_filtered, 15);
+
 		}  
 		
-		else if(Rx_Buf[0] == (uint8_t)initial_address && Rx_Buf[1] == 0x03 && Rx_Buf[2] == 0x00 && Rx_Buf[3] == 0x02 && Rx_Buf[4] == 0x00 && Rx_Buf[5] == 0x02){
-			uint8_t data_to_send[] = {(uint8_t)initial_address, 0x03, 0x04, 0x00, gpiobStatus, adc2_byte1, adc2_byte2, 0x00, 0x00};
-			uint16_t CRC_value = calculate_crc(data_to_send, 7);
-			data_to_send[7] = (uint8_t)(CRC_value & 0xFF);
-			data_to_send[8] = (uint8_t)(CRC_value >> 8);
-			HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 9, 8);
-			memset(Rx_Buf, 0, sizeof(Rx_Buf)); 
-			memset(USART2_RX_BUF, 0, Uart2_BUF_SIZE); 
-			Rx_Flag = 0;	
-			HAL_UART_AbortReceive(&huart1);
-			HAL_UART_Receive_DMA(&huart1, USART2_RX_BUF, Uart2_BUF_SIZE); 
+		else if(USART_MODBUS_RX[0] == (uint8_t)initial_address && USART_MODBUS_RX[1] == 0x03 && USART_MODBUS_RX[2] == 0x00 \
+			&& USART_MODBUS_RX[3] == 0x02 && USART_MODBUS_RX[4] == 0x00 && USART_MODBUS_RX[5] == 0x02){
+			
+			receive_modbus_9(initial_address, 0x03, 0x04, gpiobStatus, adc2_filtered, 9);
 		}  
 
-		else if(Rx_Buf[0] == (uint8_t)initial_address && Rx_Buf[1] == 0x03 && Rx_Buf[2] == 0x00 && Rx_Buf[3] == 0x02 && Rx_Buf[4] == 0x00 && Rx_Buf[5] == 0x03){
-			uint8_t data_to_send[] = {(uint8_t)initial_address, 0x03, 0x06, 0x00, gpiobStatus, adc2_byte1, adc2_byte2, adc3_byte1, adc3_byte2, 0x00, 0x00};
-			uint16_t CRC_value = calculate_crc(data_to_send, 9);
-			data_to_send[9] = (uint8_t)(CRC_value & 0xFF);
-			data_to_send[10] = (uint8_t)(CRC_value >> 8);
-			HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 11, 10);
-			memset(Rx_Buf, 0, sizeof(Rx_Buf)); 
-			memset(USART2_RX_BUF, 0, Uart2_BUF_SIZE); 
-			Rx_Flag = 0;	
-			HAL_UART_AbortReceive(&huart1);
-			HAL_UART_Receive_DMA(&huart1, USART2_RX_BUF, Uart2_BUF_SIZE); 
+		else if(USART_MODBUS_RX[0] == (uint8_t)initial_address && USART_MODBUS_RX[1] == 0x03 && USART_MODBUS_RX[2] == 0x00 \
+			&& USART_MODBUS_RX[3] == 0x02 && USART_MODBUS_RX[4] == 0x00 && USART_MODBUS_RX[5] == 0x03){
+			
+			receive_modbus_11(initial_address, 0x03, 0x06, gpiobStatus, adc2_filtered, adc3_filtered, 11);
 		}  
 		
-		else if(Rx_Buf[0] == (uint8_t)initial_address && Rx_Buf[1] == 0x03 && Rx_Buf[2] == 0x00 && Rx_Buf[3] == 0x02 && Rx_Buf[4] == 0x00 && Rx_Buf[5] == 0x04){
-			uint8_t data_to_send[] = {(uint8_t)initial_address, 0x03, 0x08, 0x00, gpiobStatus, adc2_byte1, adc2_byte2, adc3_byte1, adc3_byte2, adc1_byte1, adc1_byte2, 0x00, 0x00};
-			uint16_t CRC_value = calculate_crc(data_to_send, 11);
-			data_to_send[11] = (uint8_t)(CRC_value & 0xFF);
-			data_to_send[12] = (uint8_t)(CRC_value >> 8);
-			HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 13, 12);
-			memset(Rx_Buf, 0, sizeof(Rx_Buf)); 
-			memset(USART2_RX_BUF, 0, Uart2_BUF_SIZE); 
-			Rx_Flag = 0;	
-			HAL_UART_AbortReceive(&huart1);
-			HAL_UART_Receive_DMA(&huart1, USART2_RX_BUF, Uart2_BUF_SIZE); 
+		else if(USART_MODBUS_RX[0] == (uint8_t)initial_address && USART_MODBUS_RX[1] == 0x03 && USART_MODBUS_RX[2] == 0x00 \
+			&& USART_MODBUS_RX[3] == 0x02 && USART_MODBUS_RX[4] == 0x00 && USART_MODBUS_RX[5] == 0x04){
+			
+			receive_modbus_13(initial_address, 0x03, 0x08, gpiobStatus, adc2_filtered, adc3_filtered, adc1_filtered, 13);
 		}       
 				
-		else if(Rx_Buf[0] == (uint8_t)initial_address && Rx_Buf[1] == 0x03 && Rx_Buf[2] == 0x00 && Rx_Buf[3] == 0x03 && Rx_Buf[4] == 0x00 && Rx_Buf[5] == 0x02){
-			uint8_t data_to_send[] = {(uint8_t)initial_address, 0x03, 0x04, adc2_byte1, adc2_byte2, adc3_byte1, adc3_byte2, 0x00, 0x00};
-			uint16_t CRC_value = calculate_crc(data_to_send, 7);
-			data_to_send[7] = (uint8_t)(CRC_value & 0xFF);
-			data_to_send[8] = (uint8_t)(CRC_value >> 8);
-			HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 9, 8);
-			memset(Rx_Buf, 0, sizeof(Rx_Buf)); 
-			memset(USART2_RX_BUF, 0, Uart2_BUF_SIZE); 
-			Rx_Flag = 0;	
-			HAL_UART_AbortReceive(&huart1);
-			HAL_UART_Receive_DMA(&huart1, USART2_RX_BUF, Uart2_BUF_SIZE); 
+		else if(USART_MODBUS_RX[0] == (uint8_t)initial_address && USART_MODBUS_RX[1] == 0x03 && USART_MODBUS_RX[2] == 0x00 \
+			&& USART_MODBUS_RX[3] == 0x03 && USART_MODBUS_RX[4] == 0x00 && USART_MODBUS_RX[5] == 0x02){
+				
+			receive_modbus_9(initial_address, 0x03, 0x04, adc2_filtered, adc3_filtered, 9);
+				
 		}  
 		
-		else if(Rx_Buf[0] == (uint8_t)initial_address && Rx_Buf[1] == 0x03 && Rx_Buf[2] == 0x00 && Rx_Buf[3] == 0x03 && Rx_Buf[4] == 0x00 && Rx_Buf[5] == 0x03){
-			uint8_t data_to_send[] = {(uint8_t)initial_address, 0x03, 0x06, adc2_byte1, adc2_byte2, adc3_byte1, adc3_byte2, adc1_byte1, adc1_byte2, 0x00, 0x00};
-			uint16_t CRC_value = calculate_crc(data_to_send, 9);
-			data_to_send[9] = (uint8_t)(CRC_value & 0xFF);
-			data_to_send[10] = (uint8_t)(CRC_value >> 8);
-			HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 11, 10);
-			memset(Rx_Buf, 0, sizeof(Rx_Buf)); 
-			memset(USART2_RX_BUF, 0, Uart2_BUF_SIZE); 
-			Rx_Flag = 0;	
-			HAL_UART_AbortReceive(&huart1);
-			HAL_UART_Receive_DMA(&huart1, USART2_RX_BUF, Uart2_BUF_SIZE); 
+		else if(USART_MODBUS_RX[0] == (uint8_t)initial_address && USART_MODBUS_RX[1] == 0x03 && USART_MODBUS_RX[2] == 0x00 \
+			&& USART_MODBUS_RX[3] == 0x03 && USART_MODBUS_RX[4] == 0x00 && USART_MODBUS_RX[5] == 0x03){
+			
+			receive_modbus_11(initial_address, 0x03, 0x06, adc2_filtered, adc3_filtered, adc1_filtered, 11);
 		} 
 
-		else if(Rx_Buf[0] == (uint8_t)initial_address && Rx_Buf[1] == 0x03 && Rx_Buf[2] == 0x00 && Rx_Buf[3] == 0x04 && Rx_Buf[4] == 0x00 && Rx_Buf[5] == 0x02){
-			uint8_t data_to_send[] = {(uint8_t)initial_address, 0x03, 0x04, adc3_byte1, adc3_byte2, adc1_byte1, adc1_byte2, 0x00, 0x00};
-			uint16_t CRC_value = calculate_crc(data_to_send, 7);
-			data_to_send[7] = (uint8_t)(CRC_value & 0xFF);
-			data_to_send[8] = (uint8_t)(CRC_value >> 8);
-			HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 9, 8);
-			memset(Rx_Buf, 0, sizeof(Rx_Buf)); 
-			memset(USART2_RX_BUF, 0, Uart2_BUF_SIZE); 
-			Rx_Flag = 0;	
-			HAL_UART_AbortReceive(&huart1);
-			HAL_UART_Receive_DMA(&huart1, USART2_RX_BUF, Uart2_BUF_SIZE); 
+		else if(USART_MODBUS_RX[0] == (uint8_t)initial_address && USART_MODBUS_RX[1] == 0x03 && USART_MODBUS_RX[2] == 0x00 \
+			&& USART_MODBUS_RX[3] == 0x04 && USART_MODBUS_RX[4] == 0x00 && USART_MODBUS_RX[5] == 0x02){
+			
+			receive_modbus_9(initial_address, 0x03, 0x04, adc3_filtered, adc1_filtered, 9);
 		}   
 		
-		else if(Rx_Buf[0] == 0xFA && Rx_Buf[1] == 0x03 && Rx_Buf[2] == 0x00 && Rx_Buf[3] == 0xAA && Rx_Buf[4] == 0x00 && Rx_Buf[5] == 0x01){
-			uint8_t data_to_send[] = {0xFA, 0x03, 0x02, 0x00, (uint8_t)initial_address, 0x00, 0x00};
-			uint16_t CRC_value = calculate_crc(data_to_send, 5);
-			data_to_send[5] = (uint8_t)(CRC_value & 0xFF);
-			data_to_send[6] = (uint8_t)(CRC_value >> 8);
-			HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 7, 6);
-			memset(Rx_Buf, 0, sizeof(Rx_Buf)); 
-			memset(USART2_RX_BUF, 0, Uart2_BUF_SIZE); 
-			Rx_Flag = 0;	
-			HAL_UART_AbortReceive(&huart1);
-			HAL_UART_Receive_DMA(&huart1, USART2_RX_BUF, Uart2_BUF_SIZE); 
+		else if(USART_MODBUS_RX[0] == 0xFA && USART_MODBUS_RX[1] == 0x03 && USART_MODBUS_RX[2] == 0x00 && USART_MODBUS_RX[3] == 0xAA \
+			&& USART_MODBUS_RX[4] == 0x00 && USART_MODBUS_RX[5] == 0x01){
+			
+			receive_modbus_7(0xFA, 0x03, 0x02, initial_address, 7);
 		} 
 		
-		else if(Rx_Buf[0] == (uint8_t)initial_address && Rx_Buf[1] == 0x03 && Rx_Buf[2] == 0x00 && Rx_Buf[3] == 0xBB && Rx_Buf[4] == 0x00 && Rx_Buf[5] == 0x02){
-			uint8_t data_to_send[] = {(uint8_t)initial_address, 0x03, 0x04, (uint8_t)(System_version >> 24), (uint8_t)(System_version >> 16), (uint8_t)(System_version >> 8), (uint8_t)(System_version ), 0x00, 0x00};
-			uint16_t CRC_value = calculate_crc(data_to_send, 7);
-			data_to_send[7] = (uint8_t)(CRC_value & 0xFF);
-			data_to_send[8] = (uint8_t)(CRC_value >> 8);
-			HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 9, 8);
-			memset(Rx_Buf, 0, sizeof(Rx_Buf)); 
-			memset(USART2_RX_BUF, 0, Uart2_BUF_SIZE); 
-			Rx_Flag = 0;	
-			HAL_UART_AbortReceive(&huart1);
-			HAL_UART_Receive_DMA(&huart1, USART2_RX_BUF, Uart2_BUF_SIZE); 
+		else if(USART_MODBUS_RX[0] == (uint8_t)initial_address && USART_MODBUS_RX[1] == 0x03 && USART_MODBUS_RX[2] == 0x50 \
+			&& USART_MODBUS_RX[3] == 0x00 && USART_MODBUS_RX[4] == 0x00 && USART_MODBUS_RX[5] == 0x02){
+
+			receive_modbus_9(initial_address, 0x03, 0x04,  ((System_version >> 16) & 0xFFFF), (System_version & 0xFFFF), 9);
 		}
 
-		else if(Rx_Buf[0] == (uint8_t)initial_address && Rx_Buf[1] == 0x06 && Rx_Buf[2] == 0x00 && Rx_Buf[3] == 0x02 && Rx_Buf[4] == 0x00){
-			updatePbStatus(Rx_Buf[5]);
-			Write_Information(ADDR_FLASH_PAGE_104, Rx_Buf, 5);  // 写入Flash
-			uint8_t data_to_send[] = {(uint8_t)initial_address, 0x06, 0x02, 0x00, Rx_Buf[5], 0x00, 0x00};
-			uint16_t CRC_value = calculate_crc(data_to_send, 5);
-			data_to_send[5] = (uint8_t)(CRC_value & 0xFF);
-			data_to_send[6] = (uint8_t)(CRC_value >> 8);
-			HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 7, 7);
-			memset(Rx_Buf, 0, sizeof(Rx_Buf)); 
-			memset(USART2_RX_BUF, 0, Uart2_BUF_SIZE); 
-			Rx_Flag = 0;	
-			HAL_UART_AbortReceive(&huart1);
-			HAL_UART_Receive_DMA(&huart1, USART2_RX_BUF, Uart2_BUF_SIZE); 
+		else if(USART_MODBUS_RX[0] == (uint8_t)initial_address && USART_MODBUS_RX[1] == 0x06 && USART_MODBUS_RX[2] == 0x00 \
+			&& USART_MODBUS_RX[3] == 0x02 && USART_MODBUS_RX[4] == 0x00){
+			
+			updatePbStatus(USART_MODBUS_RX[5]);
+			Write_Information(pbstatus_FLASH_ADDR, USART_MODBUS_RX, 5); 
+			receive_modbus_8(initial_address, USART_MODBUS_RX[1], ((uint16_t)USART_MODBUS_RX[2] << 8) | USART_MODBUS_RX[3], \
+				((uint16_t)USART_MODBUS_RX[4] << 8) | USART_MODBUS_RX[5]);
 		} 
-		else if(Rx_Buf[0] == (uint8_t)initial_address && Rx_Buf[1] == 0x06 && Rx_Buf[2] == 0x00 && Rx_Buf[3] == 0x0A && Rx_Buf[4] == 0x00 && Rx_Buf[5] == 0x01){
-			Write_Information(ADDR_FLASH_PAGE_124, Rx_Buf, 0);
-			uint16_t now_calibrationValue = Adc2_CalibrationValue;
-			uint8_t data_to_send[] = {(uint8_t)initial_address, 0x06, 0x02, (uint8_t)((now_calibrationValue >> 8) & 0xFF), (uint8_t)(now_calibrationValue & 0xFF), 0x00, 0x00};
-			uint16_t CRC_value = calculate_crc(data_to_send, 5);
-			data_to_send[5] = (uint8_t)(CRC_value & 0xFF);
-			data_to_send[6] = (uint8_t)(CRC_value >> 8);
-			HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 7, 7);
-			memset(Rx_Buf, 0, sizeof(Rx_Buf)); 
-			memset(USART2_RX_BUF, 0, Uart2_BUF_SIZE); 
-			Rx_Flag = 0;	
-			HAL_UART_AbortReceive(&huart1);
-			HAL_UART_Receive_DMA(&huart1, USART2_RX_BUF, Uart2_BUF_SIZE); 
+		
+		else if(USART_MODBUS_RX[0] == (uint8_t)initial_address && USART_MODBUS_RX[1] == 0x06 && USART_MODBUS_RX[2] == 0x00 \
+			&& USART_MODBUS_RX[3] == 0x0A && USART_MODBUS_RX[4] == 0x00 && USART_MODBUS_RX[5] == 0x01){
+			Write_Information(ADC1_FLASH_ADDR, USART_MODBUS_RX, 0);
+			receive_modbus_8(initial_address, USART_MODBUS_RX[1], ((uint16_t)USART_MODBUS_RX[2] << 8) | USART_MODBUS_RX[3], \
+				((uint16_t)USART_MODBUS_RX[4] << 8) | USART_MODBUS_RX[5]);
 		}    
 				
-		else if(Rx_Buf[0] == (uint8_t)initial_address && Rx_Buf[1] == 0x06 && Rx_Buf[2] == 0x00 && Rx_Buf[3] == 0x0B && Rx_Buf[4] == 0x00 && Rx_Buf[5] == 0x01){
-			Write_Information(ADDR_FLASH_PAGE_134, Rx_Buf, 0);
-			uint16_t now_calibrationValue = Adc3_CalibrationValue;
-			uint8_t data_to_send[] = {(uint8_t)initial_address, 0x06, 0x02, (uint8_t)((now_calibrationValue >> 8) & 0xFF), (uint8_t)(now_calibrationValue & 0xFF), 0x00, 0x00};
-			uint16_t CRC_value = calculate_crc(data_to_send, 5);
-			data_to_send[5] = (uint8_t)(CRC_value & 0xFF);
-			data_to_send[6] = (uint8_t)(CRC_value >> 8);
-			HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 7, 7);
-			memset(Rx_Buf, 0, sizeof(Rx_Buf)); 
-			memset(USART2_RX_BUF, 0, Uart2_BUF_SIZE); 
-			Rx_Flag = 0;	
-			HAL_UART_AbortReceive(&huart1);
-			HAL_UART_Receive_DMA(&huart1, USART2_RX_BUF, Uart2_BUF_SIZE); 
+		else if(USART_MODBUS_RX[0] == (uint8_t)initial_address && USART_MODBUS_RX[1] == 0x06 && USART_MODBUS_RX[2] == 0x00 \
+			&& USART_MODBUS_RX[3] == 0x0B && USART_MODBUS_RX[4] == 0x00 && USART_MODBUS_RX[5] == 0x01){
+			Write_Information(ADC2_FLASH_ADDR, USART_MODBUS_RX, 0);
+			receive_modbus_8(initial_address, USART_MODBUS_RX[1], ((uint16_t)USART_MODBUS_RX[2] << 8) | USART_MODBUS_RX[3], \
+				((uint16_t)USART_MODBUS_RX[4] << 8) | USART_MODBUS_RX[5]);
 		}   
 		
-		else if(Rx_Buf[0] == (uint8_t)initial_address && Rx_Buf[1] == 0x06 && Rx_Buf[2] == 0x00 && Rx_Buf[3] == 0x0C && Rx_Buf[4] == 0x00){
-			update_baudrate(Rx_Buf[5]);
-			Write_Information(ADDR_FLASH_PAGE_114, Rx_Buf, 5);  // 写入Flash
-			uint8_t data_to_send[] = {(uint8_t)initial_address, 0x06, 0x00, 0x0C, 0x00, Rx_Buf[5], 0x00, 0x00};
-			uint16_t CRC_value = calculate_crc(data_to_send, 6);
-			data_to_send[6] = (uint8_t)(CRC_value & 0xFF);
-			data_to_send[7] = (uint8_t)(CRC_value >> 8);
-			HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 8, 8);
-			memset(Rx_Buf, 0, sizeof(Rx_Buf)); 
-			memset(USART2_RX_BUF, 0, Uart2_BUF_SIZE); 
-			Rx_Flag = 0;	
-			HAL_UART_AbortReceive(&huart1);
-			HAL_UART_Receive_DMA(&huart1, USART2_RX_BUF, Uart2_BUF_SIZE); 
+		else if(USART_MODBUS_RX[0] == (uint8_t)initial_address && USART_MODBUS_RX[1] == 0x06 && USART_MODBUS_RX[2] == 0x00 \
+			&& USART_MODBUS_RX[3] == 0x0C && USART_MODBUS_RX[4] == 0x00){
+			update_baudrate(USART_MODBUS_RX[5]);
+			Write_Information(baudrate_FLASH_ADDR, USART_MODBUS_RX, 5); 
+			receive_modbus_8(initial_address, USART_MODBUS_RX[1], ((uint16_t)USART_MODBUS_RX[2] << 8) | USART_MODBUS_RX[3], \
+				((uint16_t)USART_MODBUS_RX[4] << 8) | USART_MODBUS_RX[5]);
 		}  
 		
-		else if(Rx_Buf[0] == (uint8_t)initial_address && Rx_Buf[1] == 0x06 && Rx_Buf[2] == 0x00 && Rx_Buf[3] == 0xAA && Rx_Buf[4] == 0x00){
-			Write_Information(ADDR_FLASH_PAGE_94, Rx_Buf, 5);  // 写入Flash
-			uint8_t data_to_send[] = {(uint8_t)initial_address, 0x06, 0x02, 0x00, (uint8_t)initial_address, 0x00, 0x00};
-			uint16_t CRC_value = calculate_crc(data_to_send, 5);
-			data_to_send[5] = (uint8_t)(CRC_value & 0xFF);
-			data_to_send[6] = (uint8_t)(CRC_value >> 8);
-			HAL_StatusTypeDef status = HAL_UART_Transmit(&huart1, data_to_send, 7, 7);
-			memset(Rx_Buf, 0, sizeof(Rx_Buf));
-			memset(USART2_RX_BUF, 0, Uart2_BUF_SIZE); 
-			Rx_Flag = 0;	
-			HAL_UART_AbortReceive(&huart1);
-			HAL_UART_Receive_DMA(&huart1, USART2_RX_BUF, Uart2_BUF_SIZE); 
+		else if(USART_MODBUS_RX[0] == (uint8_t)initial_address && USART_MODBUS_RX[1] == 0x06 && USART_MODBUS_RX[2] == 0x00 \
+			&& USART_MODBUS_RX[3] == 0xAA && USART_MODBUS_RX[4] == 0x00){
+			Write_Information(addr_FLASH_ADDR, USART_MODBUS_RX, 5); 
+			receive_modbus_8(initial_address, USART_MODBUS_RX[1], ((uint16_t)USART_MODBUS_RX[2] << 8) | USART_MODBUS_RX[3], \
+				((uint16_t)USART_MODBUS_RX[4] << 8) | USART_MODBUS_RX[5]);
 		}   
 
-		else if(Rx_Buf[0] == (uint8_t)initial_address && Rx_Buf[1] == 0x06 && Rx_Buf[2] == 0x00 && Rx_Buf[3] == 0xCC && Rx_Buf[4] == 0xA5 && Rx_Buf[5] == 0x5A){
-			Rx_Flag = 0; // 将标志位重新置为0
-			memset(Rx_Buf,0,sizeof(Rx_Buf));
-			memset(USART2_RX_BUF, 0, Uart2_BUF_SIZE); 
+		else if(USART_MODBUS_RX[0] == (uint8_t)initial_address && USART_MODBUS_RX[1] == 0x06 && USART_MODBUS_RX[2] == 0x00 \
+			&& USART_MODBUS_RX[3] == 0xCC && USART_MODBUS_RX[4] == 0xA5 && USART_MODBUS_RX[5] == 0x5A){
+			clear_buf();
 			HAL_NVIC_SystemReset();
 		}	
+			
+			
 		else {
-			memset(Rx_Buf, 0, sizeof(Rx_Buf));
-			memset(USART2_RX_BUF, 0, Uart2_BUF_SIZE);  
-			Rx_Flag = 0;	
-			HAL_UART_AbortReceive(&huart1);
-			HAL_UART_Receive_DMA(&huart1, USART2_RX_BUF, Uart2_BUF_SIZE); 
+			clear_buf();
+			re_receive();
 		}
 	}
-}
 
-void reboot_sys(void)
-{
-	
-  __disable_irq();
-  HAL_NVIC_SystemReset();
 }
 
+
 /* USER CODE END 4 */
 
 /**

+ 25 - 0
Core/Src/md5c.c

@@ -1,3 +1,27 @@
+/* MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm 
+ */ 
+ 
+/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All 
+rights reserved. 
+ 
+License to copy and use this software is granted provided that it 
+is identified as the "RSA Data Security, Inc. MD5 Message-Digest 
+Algorithm" in all material mentioning or referencing this software 
+or this function. 
+ 
+License is also granted to make and use derivative works provided 
+that such works are identified as "derived from the RSA Data 
+Security, Inc. MD5 Message-Digest Algorithm" in all material 
+mentioning or referencing the derived work. 
+ 
+RSA Data Security, Inc. makes no representations concerning either 
+the merchantability of this software or the suitability of this 
+software for any particular purpose. It is provided "as is" 
+without express or implied warranty of any kind. 
+ 
+These notices must be retained in any copies of any part of this 
+documentation and/or software. 
+ */ 
 #include "md5c.h" 
 #include <string.h> 
 #include <stdio.h> 
@@ -5,6 +29,7 @@
 /* Constants for MD5Transform routine. 
 */ 
  
+ 
 #define S11 7 
 #define S12 12 
 #define S13 17 

+ 25 - 9
Core/Src/stm32f1xx_it.c

@@ -62,13 +62,13 @@
 extern ADC_HandleTypeDef hadc1;
 extern TIM_HandleTypeDef htim2;
 extern DMA_HandleTypeDef hdma_usart1_rx;
+extern DMA_HandleTypeDef hdma_usart1_tx;
 extern DMA_HandleTypeDef hdma_usart3_rx;
 extern UART_HandleTypeDef huart1;
 extern UART_HandleTypeDef huart3;
 extern TIM_HandleTypeDef htim3;
 
 /* USER CODE BEGIN EV */
-extern uint8_t USART2_RX_BUF002[Uart2_BUF_SIZE];
 
 /* USER CODE END EV */
 
@@ -184,6 +184,20 @@ void DMA1_Channel3_IRQHandler(void)
   /* USER CODE END DMA1_Channel3_IRQn 1 */
 }
 
+/**
+  * @brief This function handles DMA1 channel4 global interrupt.
+  */
+void DMA1_Channel4_IRQHandler(void)
+{
+  /* USER CODE BEGIN DMA1_Channel4_IRQn 0 */
+
+  /* USER CODE END DMA1_Channel4_IRQn 0 */
+  HAL_DMA_IRQHandler(&hdma_usart1_tx);
+  /* USER CODE BEGIN DMA1_Channel4_IRQn 1 */
+
+  /* USER CODE END DMA1_Channel4_IRQn 1 */
+}
+
 /**
   * @brief This function handles DMA1 channel5 global interrupt.
   */
@@ -246,20 +260,22 @@ void TIM3_IRQHandler(void)
 void USART1_IRQHandler(void)
 {
   /* USER CODE BEGIN USART1_IRQn 0 */
-	
 
 	if(RESET != __HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE))   //判断是否是空闲中断
 	{
+		
 		__HAL_UART_CLEAR_IDLEFLAG(&huart1);                     //清楚空闲中断标志(否则会一直不断进入中断)
 		HAL_UART_DMAStop(&huart1);  
-		data_lengthU2  = Uart2_BUF_SIZE - hdma_usart1_rx.Instance->CNDTR;
-		
-		memcpy(USART2_RX_BUF002,USART2_RX_BUF,data_lengthU2);	
-		memcpy(Rx_Buf,USART2_RX_BUF,data_lengthU2);	
+		USART_PUB_LENGTH  = RX_BUF_SIZE - hdma_usart1_rx.Instance->CNDTR;
+
+		memcpy(USART_IAP_RX,USART_PUB_RX,USART_PUB_LENGTH);	
+
+		memcpy(USART_MODBUS_RX,USART_PUB_RX,USART_PUB_LENGTH);	
+
 		
-		HAL_UART_Receive_DMA(&huart1,USART2_RX_BUF,Uart2_BUF_SIZE); 
-		Rx_Flag = 1;
-		flagU2Rx =1;
+		HAL_UART_Receive_DMA(&huart1,USART_PUB_RX,RX_BUF_SIZE); 
+		USART_IAP_FLAG = 1;
+		USART_MODBUS_FLAG = 1;
 	}
 
 

+ 1 - 1
Core/Src/tim.c

@@ -41,7 +41,7 @@ void MX_TIM2_Init(void)
 
   /* USER CODE END TIM2_Init 1 */
   htim2.Instance = TIM2;
-  htim2.Init.Prescaler = 4800-1;
+  htim2.Init.Prescaler = 800-1;
   htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
   htim2.Init.Period = 8000-1;
   htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

+ 77 - 90
Core/Src/usart.c

@@ -21,72 +21,35 @@
 #include "usart.h"
 
 /* USER CODE BEGIN 0 */
-static const char LIB_CRC_MODBUS_HI[] =
-{
-    0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
-    0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
-    0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
-    0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
-    0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
-    0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
-    0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
-    0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
-    0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
-    0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
-    0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
-    0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
-    0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
-    0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
-    0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
-    0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
-    0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
-    0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
-    0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
-    0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
-    0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
-    0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
-    0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
-    0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
-    0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
-    0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
-};
-
-static const char LIB_CRC_MODBUS_LO[] =
-{
-    0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,
-    0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,
-    0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
-    0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,
-    0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,
-    0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
-    0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,
-    0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,
-    0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
-    0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,
-    0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,
-    0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
-    0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,
-    0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,
-    0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
-    0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,
-    0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,
-    0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
-    0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,
-    0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,
-    0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
-    0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,
-    0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,
-    0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
-    0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,
-    0x43, 0x83, 0x41, 0x81, 0x80, 0x40
-};
-uint8_t USART2_RX_BUF[Uart2_BUF_SIZE];
-uint8_t USART2_RX_BUF002[Uart2_BUF_SIZE];
+
+uint8_t USART_IAP_RX[RX_BUF_SIZE];
+uint8_t USART_PUB_RX[RX_BUF_SIZE];
+uint8_t USART_MODBUS_RX[RX_BUF_SIZE];
+uint8_t USART_IAP_FLAG  = 0;
+uint8_t USART_MODBUS_FLAG  = 0;
+uint16_t USART_PUB_LENGTH = 0;
+uint16_t package_num = 0;
+uint16_t app_Cache_buf[ARRAY_SIZE] = {0};
+
+uint8_t destArray[128];
+
+
+int nameIndex = -1;
+int sizeIndex = -1;
+int count = 0; // 用于统计0x00出现的次数
+uint8_t nameArray[16] = {0};
+uint16_t sizeArray[1] = {0};
+uint8_t md5Array[16] = {0};
+uint8_t VERArray[10] = {0};
+
+uint16_t curpackage=0;
+uint32_t curaddress=0;
 /* USER CODE END 0 */
 
 UART_HandleTypeDef huart1;
 UART_HandleTypeDef huart3;
 DMA_HandleTypeDef hdma_usart1_rx;
+DMA_HandleTypeDef hdma_usart1_tx;
 DMA_HandleTypeDef hdma_usart3_rx;
 
 /* USART1 init function */
@@ -192,6 +155,22 @@ void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
 
     __HAL_LINKDMA(uartHandle,hdmarx,hdma_usart1_rx);
 
+    /* USART1_TX Init */
+    hdma_usart1_tx.Instance = DMA1_Channel4;
+    hdma_usart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
+    hdma_usart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
+    hdma_usart1_tx.Init.MemInc = DMA_MINC_ENABLE;
+    hdma_usart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
+    hdma_usart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
+    hdma_usart1_tx.Init.Mode = DMA_NORMAL;
+    hdma_usart1_tx.Init.Priority = DMA_PRIORITY_LOW;
+    if (HAL_DMA_Init(&hdma_usart1_tx) != HAL_OK)
+    {
+      Error_Handler();
+    }
+
+    __HAL_LINKDMA(uartHandle,hdmatx,hdma_usart1_tx);
+
     /* USART1 interrupt Init */
     HAL_NVIC_SetPriority(USART1_IRQn, 5, 0);
     HAL_NVIC_EnableIRQ(USART1_IRQn);
@@ -267,6 +246,7 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
 
     /* USART1 DMA DeInit */
     HAL_DMA_DeInit(uartHandle->hdmarx);
+    HAL_DMA_DeInit(uartHandle->hdmatx);
 
     /* USART1 interrupt Deinit */
     HAL_NVIC_DisableIRQ(USART1_IRQn);
@@ -331,40 +311,47 @@ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
 }
 
 
-
-/*****************************************************************
-* 串口发送数组函数
-******************************************************************/
-void UartWrite(UART_HandleTypeDef *uartHandle, uint8_t *buf , uint8_t len)
+void update_sysVersion(uint32_t addr)
 {
-    uint8_t i;
-    for(i = 0; i < len; i++)
-    {
-        HAL_UART_Transmit(uartHandle, &buf[i], 1, 0xFFFF);
-    }
+	Flash_ReadBytes(version, StartMode_Addr + 14, 8);
+	for (int i = 0; i < 4; i++) {
+		version[i] = ((version[i] >> 8) & 0xFF) | ((version[i] << 8) & 0xFF00);
+	}
+	
+	uint32_t ver;
+	convertHexToAscii(version, &ver);
+	
+	if(ver == 0xFFFFFFFF)
+	{
+		return;
+	}else{
+		System_version = ver;
+	}
+	
 }
-// 重定向函数1
-int fputc(int ch,FILE *f)
+
+void update_iaplength(uint32_t addr)
 {
-    uint8_t temp[1]={ch};
-    HAL_UART_Transmit(&huart1,temp,1,2);        //
-    HAL_UART_Transmit(&huart3,temp,1,2);        //
-		return 0;
+	Flash_ReadBytes(sizeArray, addr, 2);
+	for (int i = 0; i < 1; i++) {
+		sizeArray[i] = ((sizeArray[i] >> 8) & 0xFF) | ((sizeArray[i] << 8) & 0xFF00);
+	}
+	
+	if(sizeArray[0] == 0xFFFF)
+	{
+		FileLength_IAP = 0;
+	}else{
+		FileLength_IAP = ((sizeArray[0] >> 8) & 0xFF) | ((sizeArray[0] << 8) & 0xFF00);
+	}
 }
 
-//16位modbusCRC校验
-uint16_t LIB_CRC_MODBUS(uint8_t* Buf, uint16_t srLen)
+void updateiapMd5(uint32_t addr)
 {
-    uint32_t srIndex;
-    char ucHI = 0xFF;
-    char ucLO = 0xFF;
-
-    while(srLen--)
-    {
-        srIndex = ucHI ^ *Buf++;
-        ucHI = ucLO ^ LIB_CRC_MODBUS_HI[srIndex];
-        ucLO = LIB_CRC_MODBUS_LO[srIndex];
-    }
-    return ((uint16_t)ucHI<<8) + ucLO;
+//	Flash_ReadBytes(iapbinMd5, addr + 33, 16);
+	Flash_ReadBytes(iapbinMd5, MD5_ADDR, 16);
+	
+	for (int i = 0; i < 8; i++) {
+		iapbinMd5[i] = ((iapbinMd5[i] >> 8) & 0xFF) | ((iapbinMd5[i] << 8) & 0xFF00);
+	}
 }
 /* USER CODE END 1 */

BIN
Doc/iocollect软件功能说明及操作说明书.docx


+ 0 - 36
MDK-ARM/DebugConfig/iocollect_STM32F103RE_1.0.0.dbgconf

@@ -1,36 +0,0 @@
-// File: STM32F101_102_103_105_107.dbgconf
-// Version: 1.0.0
-// Note: refer to STM32F101xx STM32F102xx STM32F103xx STM32F105xx STM32F107xx Reference manual (RM0008)
-//                STM32F101xx STM32F102xx STM32F103xx STM32F105xx STM32F107xx datasheets
-
-// <<< Use Configuration Wizard in Context Menu >>>
-
-// <h> Debug MCU configuration register (DBGMCU_CR)
-//                                   <i> Reserved bits must be kept at reset value
-//   <o.30> DBG_TIM11_STOP           <i> TIM11 counter stopped when core is halted
-//   <o.29> DBG_TIM10_STOP           <i> TIM10 counter stopped when core is halted
-//   <o.28> DBG_TIM9_STOP            <i> TIM9 counter stopped when core is halted
-//   <o.27> DBG_TIM14_STOP           <i> TIM14 counter stopped when core is halted
-//   <o.26> DBG_TIM13_STOP           <i> TIM13 counter stopped when core is halted
-//   <o.25> DBG_TIM12_STOP           <i> TIM12 counter stopped when core is halted
-//   <o.21> DBG_CAN2_STOP            <i> Debug CAN2 stopped when core is halted
-//   <o.20> DBG_TIM7_STOP            <i> TIM7 counter stopped when core is halted
-//   <o.19> DBG_TIM6_STOP            <i> TIM6 counter stopped when core is halted
-//   <o.18> DBG_TIM5_STOP            <i> TIM5 counter stopped when core is halted
-//   <o.17> DBG_TIM8_STOP            <i> TIM8 counter stopped when core is halted
-//   <o.16> DBG_I2C2_SMBUS_TIMEOUT   <i> SMBUS timeout mode stopped when core is halted
-//   <o.15> DBG_I2C1_SMBUS_TIMEOUT   <i> SMBUS timeout mode stopped when core is halted
-//   <o.14> DBG_CAN1_STOP            <i> Debug CAN1 stopped when Core is halted
-//   <o.13> DBG_TIM4_STOP            <i> TIM4 counter stopped when core is halted
-//   <o.12> DBG_TIM3_STOP            <i> TIM3 counter stopped when core is halted
-//   <o.11> DBG_TIM2_STOP            <i> TIM2 counter stopped when core is halted
-//   <o.10> DBG_TIM1_STOP            <i> TIM1 counter stopped when core is halted
-//   <o.9>  DBG_WWDG_STOP            <i> Debug window watchdog stopped when core is halted
-//   <o.8>  DBG_IWDG_STOP            <i> Debug independent watchdog stopped when core is halted
-//   <o.2>  DBG_STANDBY              <i> Debug standby mode
-//   <o.1>  DBG_STOP                 <i> Debug stop mode
-//   <o.0>  DBG_SLEEP                <i> Debug sleep mode
-// </h>
-DbgMCU_CR = 0x00000007;
-
-// <<< end of configuration section >>>

Разлика између датотеке није приказан због своје велике величине
+ 0 - 1896
MDK-ARM/iocollect.uvguix.Administrator


+ 95 - 78
MDK-ARM/iocollect.uvoptx

@@ -140,7 +140,7 @@
         <SetRegEntry>
           <Number>0</Number>
           <Key>JL2CM3</Key>
-          <Name>-U69618568 -O76 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(1BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8001 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO31 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32F103RE$Flash\STM32F10x_512.FLM)</Name>
+          <Name>-U69618568 -O76 -S4 -ZTIFSpeedSel2000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(1BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8001 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO31 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32F103RE$Flash\STM32F10x_512.FLM)</Name>
         </SetRegEntry>
         <SetRegEntry>
           <Number>0</Number>
@@ -158,31 +158,66 @@
         <Ww>
           <count>0</count>
           <WinNumber>1</WinNumber>
-          <ItemText>input</ItemText>
+          <ItemText>FileLength_IAP</ItemText>
         </Ww>
         <Ww>
           <count>1</count>
           <WinNumber>1</WinNumber>
-          <ItemText>count</ItemText>
+          <ItemText>tag</ItemText>
         </Ww>
         <Ww>
           <count>2</count>
           <WinNumber>1</WinNumber>
-          <ItemText>count</ItemText>
+          <ItemText>iapbuf</ItemText>
+        </Ww>
+        <Ww>
+          <count>3</count>
+          <WinNumber>1</WinNumber>
+          <ItemText>FileLength_IAP</ItemText>
+        </Ww>
+        <Ww>
+          <count>4</count>
+          <WinNumber>1</WinNumber>
+          <ItemText>ModeStart</ItemText>
+        </Ww>
+        <Ww>
+          <count>5</count>
+          <WinNumber>1</WinNumber>
+          <ItemText>ModeStart</ItemText>
+        </Ww>
+        <Ww>
+          <count>6</count>
+          <WinNumber>1</WinNumber>
+          <ItemText>pagesize</ItemText>
+        </Ww>
+        <Ww>
+          <count>7</count>
+          <WinNumber>1</WinNumber>
+          <ItemText>packIndex</ItemText>
+        </Ww>
+        <Ww>
+          <count>8</count>
+          <WinNumber>1</WinNumber>
+          <ItemText>all_len</ItemText>
+        </Ww>
+        <Ww>
+          <count>9</count>
+          <WinNumber>1</WinNumber>
+          <ItemText>z</ItemText>
         </Ww>
       </WatchWindow1>
       <WatchWindow2>
         <Ww>
           <count>0</count>
           <WinNumber>2</WinNumber>
-          <ItemText>Rx_Buf</ItemText>
+          <ItemText>digest</ItemText>
         </Ww>
       </WatchWindow2>
       <MemoryWindow1>
         <Mm>
           <WinNumber>1</WinNumber>
           <SubType>0</SubType>
-          <ItemText>0x8039000</ItemText>
+          <ItemText>0x807F07A</ItemText>
           <AccSizeX>0</AccSizeX>
         </Mm>
       </MemoryWindow1>
@@ -190,7 +225,7 @@
         <Mm>
           <WinNumber>2</WinNumber>
           <SubType>0</SubType>
-          <ItemText>0x8034000</ItemText>
+          <ItemText>0x807F07A</ItemText>
           <AccSizeX>0</AccSizeX>
         </Mm>
       </MemoryWindow2>
@@ -198,7 +233,7 @@
         <Mm>
           <WinNumber>3</WinNumber>
           <SubType>0</SubType>
-          <ItemText>0x8043000</ItemText>
+          <ItemText>0x8040000+31119</ItemText>
           <AccSizeX>0</AccSizeX>
         </Mm>
       </MemoryWindow3>
@@ -216,7 +251,7 @@
       <DebugFlag>
         <trace>0</trace>
         <periodic>1</periodic>
-        <aLwin>1</aLwin>
+        <aLwin>0</aLwin>
         <aCover>0</aCover>
         <aSer1>0</aSer1>
         <aSer2>0</aSer2>
@@ -252,12 +287,6 @@
       <pszMrulep></pszMrulep>
       <pSingCmdsp></pSingCmdsp>
       <pMultCmdsp></pMultCmdsp>
-      <SystemViewers>
-        <Entry>
-          <Name>System Viewer\GPIOA</Name>
-          <WinId>35905</WinId>
-        </Entry>
-      </SystemViewers>
       <DebugDescription>
         <Enable>1</Enable>
         <EnableFlashSeq>1</EnableFlashSeq>
@@ -313,8 +342,8 @@
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
       <bDave2>0</bDave2>
-      <PathWithFileName>..\Core\Src\md5c.c</PathWithFileName>
-      <FilenameWithoutPath>md5c.c</FilenameWithoutPath>
+      <PathWithFileName>..\Core\Src\dataHandling.c</PathWithFileName>
+      <FilenameWithoutPath>dataHandling.c</FilenameWithoutPath>
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
@@ -322,31 +351,7 @@
       <GroupNumber>2</GroupNumber>
       <FileNumber>4</FileNumber>
       <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\Core\Src\stmflash.c</PathWithFileName>
-      <FilenameWithoutPath>stmflash.c</FilenameWithoutPath>
-      <RteFlg>0</RteFlg>
-      <bShared>0</bShared>
-    </File>
-    <File>
-      <GroupNumber>2</GroupNumber>
-      <FileNumber>5</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\Core\Src\Data_deal.c</PathWithFileName>
-      <FilenameWithoutPath>Data_deal.c</FilenameWithoutPath>
-      <RteFlg>0</RteFlg>
-      <bShared>0</bShared>
-    </File>
-    <File>
-      <GroupNumber>2</GroupNumber>
-      <FileNumber>6</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
+      <tvExp>1</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
       <bDave2>0</bDave2>
       <PathWithFileName>../Core/Src/main.c</PathWithFileName>
@@ -356,7 +361,7 @@
     </File>
     <File>
       <GroupNumber>2</GroupNumber>
-      <FileNumber>7</FileNumber>
+      <FileNumber>5</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -368,7 +373,7 @@
     </File>
     <File>
       <GroupNumber>2</GroupNumber>
-      <FileNumber>8</FileNumber>
+      <FileNumber>6</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -380,7 +385,7 @@
     </File>
     <File>
       <GroupNumber>2</GroupNumber>
-      <FileNumber>9</FileNumber>
+      <FileNumber>7</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -392,7 +397,7 @@
     </File>
     <File>
       <GroupNumber>2</GroupNumber>
-      <FileNumber>10</FileNumber>
+      <FileNumber>8</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -404,7 +409,7 @@
     </File>
     <File>
       <GroupNumber>2</GroupNumber>
-      <FileNumber>11</FileNumber>
+      <FileNumber>9</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -416,7 +421,7 @@
     </File>
     <File>
       <GroupNumber>2</GroupNumber>
-      <FileNumber>12</FileNumber>
+      <FileNumber>10</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -428,7 +433,7 @@
     </File>
     <File>
       <GroupNumber>2</GroupNumber>
-      <FileNumber>13</FileNumber>
+      <FileNumber>11</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -440,7 +445,7 @@
     </File>
     <File>
       <GroupNumber>2</GroupNumber>
-      <FileNumber>14</FileNumber>
+      <FileNumber>12</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -452,7 +457,7 @@
     </File>
     <File>
       <GroupNumber>2</GroupNumber>
-      <FileNumber>15</FileNumber>
+      <FileNumber>13</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -462,6 +467,18 @@
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>14</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\Core\Src\md5c.c</PathWithFileName>
+      <FilenameWithoutPath>md5c.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
   </Group>
 
   <Group>
@@ -472,7 +489,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>16</FileNumber>
+      <FileNumber>15</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -484,7 +501,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>17</FileNumber>
+      <FileNumber>16</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -496,7 +513,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>18</FileNumber>
+      <FileNumber>17</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -508,7 +525,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>19</FileNumber>
+      <FileNumber>18</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -520,7 +537,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>20</FileNumber>
+      <FileNumber>19</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -532,7 +549,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>21</FileNumber>
+      <FileNumber>20</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -544,7 +561,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>22</FileNumber>
+      <FileNumber>21</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -556,7 +573,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>23</FileNumber>
+      <FileNumber>22</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -568,7 +585,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>24</FileNumber>
+      <FileNumber>23</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -580,7 +597,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>25</FileNumber>
+      <FileNumber>24</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -592,7 +609,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>26</FileNumber>
+      <FileNumber>25</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -604,7 +621,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>27</FileNumber>
+      <FileNumber>26</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -616,7 +633,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>28</FileNumber>
+      <FileNumber>27</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -628,7 +645,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>29</FileNumber>
+      <FileNumber>28</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -640,7 +657,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>30</FileNumber>
+      <FileNumber>29</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -652,7 +669,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>31</FileNumber>
+      <FileNumber>30</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -672,7 +689,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>32</FileNumber>
+      <FileNumber>31</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -692,7 +709,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>33</FileNumber>
+      <FileNumber>32</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -704,7 +721,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>34</FileNumber>
+      <FileNumber>33</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -716,7 +733,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>35</FileNumber>
+      <FileNumber>34</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -728,7 +745,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>36</FileNumber>
+      <FileNumber>35</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -740,7 +757,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>37</FileNumber>
+      <FileNumber>36</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -752,7 +769,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>38</FileNumber>
+      <FileNumber>37</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -764,7 +781,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>39</FileNumber>
+      <FileNumber>38</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -776,7 +793,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>40</FileNumber>
+      <FileNumber>39</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -788,7 +805,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>41</FileNumber>
+      <FileNumber>40</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -800,7 +817,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>42</FileNumber>
+      <FileNumber>41</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>

+ 9 - 14
MDK-ARM/iocollect.uvprojx

@@ -49,7 +49,7 @@
             <InvalidFlash>1</InvalidFlash>
           </TargetStatus>
           <OutputDirectory>..\Output\</OutputDirectory>
-          <OutputName>iocollect_230625</OutputName>
+          <OutputName>iocollect_23080700</OutputName>
           <CreateExecutable>1</CreateExecutable>
           <CreateLib>0</CreateLib>
           <CreateHexFile>1</CreateHexFile>
@@ -82,7 +82,7 @@
           <AfterMake>
             <RunUserProg1>1</RunUserProg1>
             <RunUserProg2>0</RunUserProg2>
-            <UserProg1Name>fromelf.exe --bin --output ..\Output\iocollect_230625.bin ..\Output\*.axf</UserProg1Name>
+            <UserProg1Name>fromelf.exe --bin --output ..\Output\iocollect_23080700.bin ..\Output\*.axf</UserProg1Name>
             <UserProg2Name></UserProg2Name>
             <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
             <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
@@ -400,19 +400,9 @@
               <FilePath>..\Core\Src\iap.c</FilePath>
             </File>
             <File>
-              <FileName>md5c.c</FileName>
+              <FileName>dataHandling.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\Core\Src\md5c.c</FilePath>
-            </File>
-            <File>
-              <FileName>stmflash.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>..\Core\Src\stmflash.c</FilePath>
-            </File>
-            <File>
-              <FileName>Data_deal.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>..\Core\Src\Data_deal.c</FilePath>
+              <FilePath>..\Core\Src\dataHandling.c</FilePath>
             </File>
             <File>
               <FileName>main.c</FileName>
@@ -719,6 +709,11 @@
                 </FileArmAds>
               </FileOption>
             </File>
+            <File>
+              <FileName>md5c.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\Core\Src\md5c.c</FilePath>
+            </File>
           </Files>
         </Group>
         <Group>

+ 32 - 21
iocollect.ioc

@@ -19,7 +19,8 @@ CAD.pinconfig=
 CAD.provider=
 Dma.Request0=USART1_RX
 Dma.Request1=USART3_RX
-Dma.RequestsNb=2
+Dma.Request2=USART1_TX
+Dma.RequestsNb=3
 Dma.USART1_RX.0.Direction=DMA_PERIPH_TO_MEMORY
 Dma.USART1_RX.0.Instance=DMA1_Channel5
 Dma.USART1_RX.0.MemDataAlignment=DMA_MDATAALIGN_BYTE
@@ -29,6 +30,15 @@ Dma.USART1_RX.0.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
 Dma.USART1_RX.0.PeriphInc=DMA_PINC_DISABLE
 Dma.USART1_RX.0.Priority=DMA_PRIORITY_LOW
 Dma.USART1_RX.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
+Dma.USART1_TX.2.Direction=DMA_MEMORY_TO_PERIPH
+Dma.USART1_TX.2.Instance=DMA1_Channel4
+Dma.USART1_TX.2.MemDataAlignment=DMA_MDATAALIGN_BYTE
+Dma.USART1_TX.2.MemInc=DMA_MINC_ENABLE
+Dma.USART1_TX.2.Mode=DMA_NORMAL
+Dma.USART1_TX.2.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
+Dma.USART1_TX.2.PeriphInc=DMA_PINC_DISABLE
+Dma.USART1_TX.2.Priority=DMA_PRIORITY_LOW
+Dma.USART1_TX.2.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
 Dma.USART3_RX.1.Direction=DMA_PERIPH_TO_MEMORY
 Dma.USART3_RX.1.Instance=DMA1_Channel3
 Dma.USART3_RX.1.MemDataAlignment=DMA_MDATAALIGN_BYTE
@@ -95,6 +105,7 @@ MxDb.Version=DB.6.0.81
 NVIC.ADC1_2_IRQn=true\:5\:0\:false\:false\:true\:true\:true\:true\:true
 NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false
 NVIC.DMA1_Channel3_IRQn=true\:5\:0\:false\:false\:true\:true\:false\:true\:true
+NVIC.DMA1_Channel4_IRQn=true\:5\:0\:false\:false\:true\:true\:false\:true\:true
 NVIC.DMA1_Channel5_IRQn=true\:5\:0\:false\:false\:true\:true\:false\:true\:true
 NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false
 NVIC.ForceEnableDMAVector=true
@@ -192,31 +203,31 @@ ProjectManager.TargetToolchain=MDK-ARM V5.32
 ProjectManager.ToolChainLocation=
 ProjectManager.UnderRoot=false
 ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_USART1_UART_Init-USART1-false-HAL-true,5-MX_ADC1_Init-ADC1-false-HAL-true,6-MX_TIM2_Init-TIM2-false-HAL-true,7-MX_USART3_UART_Init-USART3-false-HAL-true
-RCC.ADCFreqValue=12000000
+RCC.ADCFreqValue=2000000
 RCC.ADCPresc=RCC_ADCPCLK2_DIV4
-RCC.AHBFreq_Value=48000000
+RCC.AHBCLKDivider=RCC_SYSCLK_DIV2
+RCC.AHBFreq_Value=8000000
 RCC.APB1CLKDivider=RCC_HCLK_DIV2
-RCC.APB1Freq_Value=24000000
-RCC.APB1TimFreq_Value=48000000
-RCC.APB2Freq_Value=48000000
-RCC.APB2TimFreq_Value=48000000
-RCC.FCLKCortexFreq_Value=48000000
+RCC.APB1Freq_Value=4000000
+RCC.APB1TimFreq_Value=8000000
+RCC.APB2Freq_Value=8000000
+RCC.APB2TimFreq_Value=8000000
+RCC.FCLKCortexFreq_Value=8000000
 RCC.FamilyName=M
-RCC.HCLKFreq_Value=48000000
-RCC.I2S2Freq_Value=48000000
-RCC.I2S3Freq_Value=48000000
-RCC.IPParameters=ADCFreqValue,ADCPresc,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,I2S2Freq_Value,I2S3Freq_Value,MCOFreq_Value,PLLCLKFreq_Value,PLLMCOFreq_Value,PLLMUL,PLLSourceVirtual,SDIOFreq_Value,SDIOHCLKDiv2FreqValue,SYSCLKFreq_VALUE,SYSCLKSource,TimSysFreq_Value,USBFreq_Value,VCOOutput2Freq_Value
-RCC.MCOFreq_Value=48000000
-RCC.PLLCLKFreq_Value=48000000
-RCC.PLLMCOFreq_Value=24000000
-RCC.PLLMUL=RCC_PLL_MUL6
+RCC.HCLKFreq_Value=8000000
+RCC.I2S2Freq_Value=16000000
+RCC.I2S3Freq_Value=16000000
+RCC.IPParameters=ADCFreqValue,ADCPresc,AHBCLKDivider,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,I2S2Freq_Value,I2S3Freq_Value,MCOFreq_Value,PLLCLKFreq_Value,PLLMCOFreq_Value,PLLSourceVirtual,SDIOFreq_Value,SDIOHCLKDiv2FreqValue,SYSCLKFreq_VALUE,SYSCLKSource,TimSysFreq_Value,USBFreq_Value,VCOOutput2Freq_Value
+RCC.MCOFreq_Value=16000000
+RCC.PLLCLKFreq_Value=16000000
+RCC.PLLMCOFreq_Value=8000000
 RCC.PLLSourceVirtual=RCC_PLLSOURCE_HSE
-RCC.SDIOFreq_Value=48000000
-RCC.SDIOHCLKDiv2FreqValue=24000000
-RCC.SYSCLKFreq_VALUE=48000000
+RCC.SDIOFreq_Value=8000000
+RCC.SDIOHCLKDiv2FreqValue=4000000
+RCC.SYSCLKFreq_VALUE=16000000
 RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK
-RCC.TimSysFreq_Value=48000000
-RCC.USBFreq_Value=48000000
+RCC.TimSysFreq_Value=8000000
+RCC.USBFreq_Value=16000000
 RCC.VCOOutput2Freq_Value=8000000
 SH.ADCx_IN10.0=ADC1_IN10,IN10
 SH.ADCx_IN10.ConfNb=1