xuy il y a 3 ans
commit
6fa869bb94
45 fichiers modifiés avec 25061 ajouts et 0 suppressions
  1. 384 0
      Inc/CollectMaster485.h
  2. 61 0
      Inc/DS1302.h
  3. 76 0
      Inc/Data_deal.h
  4. 72 0
      Inc/Dwin.h
  5. 76 0
      Inc/Elec_Seal.h
  6. 172 0
      Inc/FreeRTOSConfig.h
  7. 667 0
      Inc/KeySlave485.h
  8. 6 0
      Inc/Randomcode.h
  9. 15 0
      Inc/ScreenMaster485.h
  10. 468 0
      Inc/TerminalSlave485.h
  11. 86 0
      Inc/dma.h
  12. 91 0
      Inc/ds1302drv.h
  13. 87 0
      Inc/gpio.h
  14. 55 0
      Inc/leaf_ota.h
  15. 189 0
      Inc/main.h
  16. 27 0
      Inc/md5c.h
  17. 104 0
      Inc/spi.h
  18. 455 0
      Inc/stm32f7xx_hal_conf.h
  19. 92 0
      Inc/stm32f7xx_it.h
  20. 91 0
      Inc/tim.h
  21. 131 0
      Inc/usart.h
  22. 3437 0
      Src/CollectMaster485.c
  23. 469 0
      Src/DS1302.c
  24. 379 0
      Src/DS1302Drv.c
  25. 857 0
      Src/Data_deal.c
  26. 971 0
      Src/Dwin.c
  27. 1086 0
      Src/Elec_Seal.c
  28. 1131 0
      Src/KeySlave485.c
  29. 504 0
      Src/LTF_sa/leaf_ota.c
  30. 55 0
      Src/LTF_sa/leaf_ota.h
  31. 25 0
      Src/Randomcode.c
  32. 50 0
      Src/ScreenMaster485.c
  33. 5559 0
      Src/TerminalSlave485.c
  34. 101 0
      Src/dma.c
  35. 3603 0
      Src/freertos.c
  36. 190 0
      Src/gpio.c
  37. 358 0
      Src/main.c
  38. 364 0
      Src/md5c.c
  39. 286 0
      Src/spi.c
  40. 116 0
      Src/stm32f7xx_hal_msp.c
  41. 144 0
      Src/stm32f7xx_hal_timebase_tim.c
  42. 826 0
      Src/stm32f7xx_it.c
  43. 278 0
      Src/system_stm32f7xx.c
  44. 185 0
      Src/tim.c
  45. 682 0
      Src/usart.c

+ 384 - 0
Inc/CollectMaster485.h

@@ -0,0 +1,384 @@
+#ifndef __COLLECTMASTER485_H
+#define __COLLECTMASTER485_H
+#include "stm32f7xx_hal.h"
+#include "TerminalSlave485.h"
+////////////////////////////////////////////////////////////////////////////////// 	
+//临时定义一下卸尽状态,后续根据485读来的值进行判断 
+
+#define EN_Read_Press          1
+#define EN_Read_YeWei          1
+#define EN_Read_Temperature    1
+
+
+#define indexHaiDiFa01 		18
+#define indexXieYouFa01 	19
+#define indexDaGai01 			20
+#define indexXiaoGai01 		21	
+
+#define indexHaiDiFa02 		28
+#define indexXieYouFa02 	29
+#define indexDaGai02 			20
+#define indexXiaoGai02 		21
+
+#define indexHaiDiFa03 		38
+#define indexXieYouFa03   39
+#define indexDaGai03 			30
+#define indexXiaoGai03 		31
+
+#define indexHaiDiFa04 		48
+#define indexXieYouFa04   49
+#define indexDaGai04 			40
+#define indexXiaoGai04 		41	
+
+
+
+
+
+#define U32_BIT_00                 ((uint32_t)0x00000001U)  
+#define U32_BIT_01                 ((uint32_t)0x00000002U)  
+#define U32_BIT_02                 ((uint32_t)0x00000004U)  
+#define U32_BIT_03                 ((uint32_t)0x00000008U)  
+#define U32_BIT_04                 ((uint32_t)0x00000010U)  
+#define U32_BIT_05                 ((uint32_t)0x00000020U)  
+#define U32_BIT_06                 ((uint32_t)0x00000040U)  
+#define U32_BIT_07                 ((uint32_t)0x00000080U)  
+#define U32_BIT_08                 ((uint32_t)0x00000100U)  
+#define U32_BIT_09                 ((uint32_t)0x00000200U)  
+#define U32_BIT_10                 ((uint32_t)0x00000400U)  
+#define U32_BIT_11                 ((uint32_t)0x00000800U)  
+#define U32_BIT_12                 ((uint32_t)0x00001000U)  
+#define U32_BIT_13                 ((uint32_t)0x00002000U)  
+#define U32_BIT_14                 ((uint32_t)0x00004000U)  
+#define U32_BIT_15                 ((uint32_t)0x00008000U)  
+
+
+#define U32_BIT_16                 ((uint32_t)0x00010000U) 
+#define U32_BIT_17                 ((uint32_t)0x00020000U) 
+#define U32_BIT_18                 ((uint32_t)0x00040000U) 
+#define U32_BIT_19                 ((uint32_t)0x00080000U) 
+#define U32_BIT_20                 ((uint32_t)0x00100000U) 
+#define U32_BIT_21                 ((uint32_t)0x00200000U) 
+#define U32_BIT_22                 ((uint32_t)0x00400000U) 
+#define U32_BIT_23                 ((uint32_t)0x00800000U) 
+#define U32_BIT_24                 ((uint32_t)0x01000000U) 
+#define U32_BIT_25                 ((uint32_t)0x02000000U) 
+#define U32_BIT_26                 ((uint32_t)0x04000000U) 
+#define U32_BIT_27                 ((uint32_t)0x08000000U) 
+#define U32_BIT_28                 ((uint32_t)0x10000000U) 
+#define U32_BIT_29                 ((uint32_t)0x20000000U) 
+#define U32_BIT_30                 ((uint32_t)0x40000000U) 
+#define U32_BIT_31                 ((uint32_t)0x80000000U) 
+
+
+
+//236字节的数组偏移量    16+8=24;接下来为52个浮点数数据=8个整车数据+4个*11个每仓=52
+#define MoiLiangFrom_CaijibanOffset    24   
+
+
+#define ALL_SensorData_From_CaijibanOffset    16
+#define FloatData_Num_Caijiban    52 
+#define LengthOfData_From_Caijiban_Cang_1to4    236 
+#define LengthOfData_From_Caijiban_Cang_01    150   //每仓数据长度长度为帧头16+4*33+crc2=150字节
+
+#define LengthOfData_From_Caijiban_WholeCar    98   //每仓数据长度长度为帧头16+4*20+crc2=98字节
+
+//总长度为33个4字节-----每仓传感器数量
+#define ALL_Sensor_Data_Num_Caijiban    33 
+
+//总长度为20个4字节-----整车传感器数量
+#define ALL_Sensor_Data_Num_WholeCar    20 
+
+
+#define NumOf_WenYouPanduan    300   //是否进行了稳油操作   稳油判断
+
+extern uint8_t Pneumatic_PR1 ;
+extern uint8_t Pneumatic_PR2 ;  
+extern uint8_t Pneumatic_PR3 ;
+extern uint8_t Pneumatic_PR4 ;
+typedef struct
+{
+	uint8_t  ErrorCode_Collect;
+	uint8_t  ValveState_Num1;  //1仓阀门开关状态   低四位Bit0:关 Bit1:开 高四位Bit0:正常 Bit1:异常
+  uint8_t  ValveState_Num2;  //2仓阀门开关状态		           X X X X X X X X
+  uint8_t  ValveState_Num3;  //3仓阀门开关状态							 | | | | | | | |__________1仓大盖开关状态  0:关 1:开
+	uint8_t  ValveState_Num4;  //4仓阀门开关状态							 | | | | | | |____________2仓大盖开关状态  0:关 1:开
+	uint8_t  ValveState_Num5;  //5仓阀门开关状态							 | | | | | |______________3仓大盖开关状态  0:关 1:开
+  uint8_t  ValveState_Num6;  //6仓阀门开关状态							 | | | | |________________4仓大盖开关状态  0:关 1:开
+  uint8_t  ValveState_Num7;  //7仓阀门开关状态							 | | | |__________________1仓大盖异常状态  0:正常 1:异常
+	uint8_t  ValveState_Num8;  //8仓阀门开关状态							 | | |____________________2仓大盖异常状态  0:正常 1:异常
+	uint8_t  UnloadState_Num1; //1仓卸尽传感器状态						 | |______________________3仓大盖异常状态  0:正常 1:异常
+  uint8_t  UnloadState_Num2; //2仓卸尽传感器状态						 |________________________4仓大盖异常状态  0:正常 1:异常
+  uint8_t  UnloadState_Num3; //3仓卸尽传感器状态
+	uint8_t  UnloadState_Num4; //4仓卸尽传感器状态
+	uint8_t  UnloadState_Num5; //5仓卸尽传感器状态
+  uint8_t  UnloadState_Num6; //6仓卸尽传感器状态
+  uint8_t  UnloadState_Num7; //7仓卸尽传感器状态
+	uint8_t  UnloadState_Num8; //8仓卸尽传感器状态
+	uint8_t  Write_StorNum;
+	uint8_t  Collect_CommError;//采集器通信错误,排除软件设计有误,有错误默认采集器通信不上或者其他原因
+	
+}Collect485_TypeDef;
+extern Collect485_TypeDef Collect485;
+
+typedef struct
+{
+	uint8_t  Stor_ID;  //分配的仓号
+  uint8_t  rkgID[3]; //人孔盖ID号
+  uint8_t  stat[2];  //人孔小盖,人孔盖状态
+	
+	
+  //uint16_t yewei[2]; //液位
+	int16_t yewei[2]; //液位   20210120-------整形数表示的液位,单位为0.1mm
+	
+  uint32_t Press;    //压力值
+	uint16_t Volume;   //体积
+	
+	
+	//20210331更改为有符号数据,因为目前的倾角传感器输出为有符号数据 李伟修改
+	int16_t QingJiao;//倾角数据  角度范围0--360
+	//uint16_t QingJiao;//倾角数据  角度范围0--360
+	
+ 
+	float QingJiaoFlo;
+	
+	
+	
+  uint8_t  xyf_state;//卸油阀状态
+  uint8_t  hdf_state;//海底阀状态
+  uint8_t  Oil_sate; //装卸油状态
+	float  Temperature;//温度
+	float  yewei_flo[2]; //液位   20210305--浮点数表示的液位,单位为mm
+	//float  GasPressure;//压力
+	//灌仓温度
+}STOR_TypeDef;
+extern STOR_TypeDef Stor[8];
+
+typedef struct
+{
+	uint8_t xyf[8];  //卸油阀状态缓存
+	uint8_t bottm[8] ;//海底阀状态缓存
+	uint8_t rkgx[8];  //人孔小盖状态缓存
+	uint8_t rkg[8] ;  //人孔盖状态缓存
+}STatetemp_TypeDef; 
+extern STatetemp_TypeDef Statetemp,Fg;
+typedef struct
+{
+	uint8_t StartCalibrat_Flag;
+	uint16_t Threshold_Angle;
+	uint16_t Times;
+	uint16_t Reserve_Register;
+	uint8_t  Restart_Controller;
+	uint8_t  Restart_Collect;
+	uint8_t  Restart_ErHeYi;
+	uint8_t  Restart_Encoder;
+	
+	uint8_t  Restart_Function;
+	uint8_t  ReturnData;
+	uint8_t  DeviceNum;
+	uint8_t  FunctionCode;
+	uint8_t  DeviceAddr;
+	
+	uint8_t  SetOilStyleFlag;//在家新增
+	uint8_t  OilStyleStore;//在家新增,油品种类仓号
+	uint8_t  OilStyle;//在家新增
+	uint8_t  ErrorStore;//在家新增,异常仓号
+	uint8_t  ErrorStyle;//在家新增,异常种类
+	uint8_t  ErrorFlag;//异常标志	
+}Calibrat_TypeDef;
+
+
+
+///////////////新疆样机项目添加,在屏幕上独立显示温度、液位、倾角等参数
+//李伟 20201211
+typedef union{
+ float flo_Data;
+ char farray[4];
+ uint32_t u32Dat;
+} uni_temper;//uni_temper001;//温度参数,浮点数表示
+
+
+typedef union{
+ float flo_Data;
+ char array_u8[4];
+ uint32_t u32Dat;
+} uni_float;//uni_temper001;//4字节浮点数表示
+
+
+
+
+typedef union{
+ float flo_Data;
+ uint8_t farray[4];
+ uint32_t u32Dat;
+} uni_OilDensity;//密度参数,浮点数表示
+
+
+//李伟修改  20210305   以浮点数格式上发给平台温度与液位数据----开始
+typedef union{
+ float flo_Data;
+ uint8_t farray[4];
+ uint32_t u32Dat;
+} uni_YeweiToPlatForm;//上发至平台的4字节液位数据,浮点数格式
+
+typedef union{
+ float flo_Data;
+ uint8_t farray[4];
+ uint32_t u32Dat;
+} uni_TempToPlatForm;//上发至平台的4字节温度数据,浮点数格式
+//李伟修改  20210305   以浮点数格式上发给平台温度与液位数据----结束
+
+
+typedef union{
+ float flo_Data;
+ char farray[4];
+} uni_QingJiao;//uni_temper001;//倾角参数,浮点数表示
+
+typedef union{
+ float flo_Data;
+ char farray[4];
+ uint32_t u32Dat;
+} uni_LiqLev;//uni_LiqLev001;//液位;liquid level
+
+typedef union {
+ float flo_Data;
+ char farray[4];
+}uni_TankVol_Realtime;//uni_TankVol_Realtime001;//实时换算出的罐容
+
+
+typedef union {
+ float flo_Data;
+ char farray[4];
+}uni_TankVol_Tempe20;//uni_TankVol_Tempe20_001;//温度为20时候的罐容
+
+
+typedef union {
+ float flo_Data;
+ char farray[4];
+ uint32_t u32_Data;
+}uni_Float;//浮点数表示为4字节数组
+
+typedef union {
+ float flo_Data;
+ char farray[4];
+}uni_IncliAngle;//倾角
+
+typedef union {
+ float flo_Data;
+ char farray[4];
+}uni_GasPressure;//气压
+
+typedef union {
+ float flo_Data;
+ char farray[4];
+}uni_OilWeight;//重量
+
+typedef union {
+ float flo_Data;
+ char farray[4];
+}uni_LeiDaYewei;//雷达液位
+
+
+
+
+
+extern uni_IncliAngle uni_IncliAngle001;
+extern uni_TankVol_Tempe20 uni_TankVol_Tempe20_001,uni_TankVol_Tempe20_002,uni_TempRealtime001;
+extern uni_TankVol_Realtime uni_TankVol_Realtime001,uni_TankVol_Realtime002,uni_TankVol_Realtime003,uni_TankVol_Realtime004;
+extern uni_temper uni_temper001,uni_temper002,uni_temper003,uni_temper004;
+extern uni_QingJiao uni_QingJiao001,uni_QingJiao002;
+extern uni_LiqLev uni_LiqLev001,uni_LiqLev002,uni_LiqLev003,uni_LiqLev004;//4个仓位的液位高度数据
+extern uni_GasPressure uni_GasPressure001;
+extern uni_OilWeight uni_OilWeight001;
+
+extern uni_OilDensity uni_OilDensity001;
+extern uni_LeiDaYewei uni_LeiDaYewei001;
+extern uint8_t CabinetNumForWenYou;
+
+//李伟修改 20210305
+extern uni_YeweiToPlatForm uni_YeweiToPlatForm001,uni_YeweiToPlatForm002,uni_YeweiToPlatForm003,uni_YeweiToPlatForm004;
+extern uni_TempToPlatForm uni_TempToPlatForm001,uni_TempToPlatForm002;
+
+extern float Zero_Of_LiquidMeter[8];//8个仓的雷达液位计零点参数
+extern float Zero_Of_TankCapacity[8];//8个仓的罐容表零点参数
+
+
+extern uint8_t HaiDiFa001;//8个海底阀的状态
+
+//20210129李伟修改---增加一个全局数组用于保存8个仓的阀门状态(按照平台的位定义协议进行组包)
+extern uint8_t Array_Of_Valve[32];
+
+//20210201李伟修改---增加一个全局数组用于上传按下打印键之后的车辆状态
+//具体详见<控制器平台通信协议增加20210126李伟修改回传数据格式.xlsx>
+extern uint8_t Array_Of_Tank_0x64[68];//
+
+
+extern float ArrOfTempeSensor_Flo[3];//三点式温度传感器的数据
+//extern float ArrYewei[300];
+extern float ArrYeweiForWenyou[NumOf_WenYouPanduan+3];//存储300s的液位数据    打印的时候作为是否稳油判断依据
+extern float Yewei_max000,Yewei_min000,Yewei_peak000;
+
+
+extern uint8_t Array_Of_IO_0xA1[64];//
+
+extern uint32_t IO_OnOff_State01,IO_OnOff_State02,IO_OnOff_State03,IO_OnOff_State04;
+extern uint32_t IO_Exception_State01,IO_Exception_State02,IO_Exception_State03,IO_Exception_State04;
+
+
+
+extern uint32_t IO_OnOff_StateArr[];//
+extern uint32_t IO_Exception_StateArr[];
+
+extern uint16_t Usart2_ErrorTimes,chkRetCaiJiBan;
+
+extern uint8_t  Array_IO_OnOff_AllStore[];
+extern uint8_t  Array_IO_Exception_AllStore[];
+
+
+extern uint8_t ValState01,ValState02,ValState03,ValState04,ValState05,ValState06,ValState07,ValState08;
+
+extern Calibrat_TypeDef  PlatformCalibrat;
+extern uint8_t StoreNumber,all_Store;
+
+
+#define Uart2_BUF_SIZE  1024u      /*为UART2、3专门开一个DMA接收存储区 2021-4-12 by Daiyf*/
+
+extern uint8_t USART2_RX_BUF_Collector[Uart2_BUF_SIZE];
+extern uint8_t ValStateArr_0x13[64],ValStateArr_PoFeng_0x13[64];//破封时的阀门状态
+extern uint8_t ValStateArr_0x20[64],ValStateArr_PoFeng_0x20[64];//破封时的阀门状态
+
+
+extern uint8_t ValStateArr_0x20_Cang01[64],ValStateArr_PoFeng_0x20_Cang01[64];//破封时的阀门状态
+extern uint8_t ValStateArr_0x20_Cang02[64],ValStateArr_PoFeng_0x20_Cang02[64];//破封时的阀门状态
+extern uint8_t ValStateArr_0x20_Cang03[64],ValStateArr_PoFeng_0x20_Cang03[64];//破封时的阀门状态
+extern uint8_t ValStateArr_0x20_Cang04[64],ValStateArr_PoFeng_0x20_Cang04[64];//破封时的阀门状态
+
+
+
+//uint8_t CheckInFrame_Collect485(void);
+uint16_t CheckInFrame_Collect485(uint16_t LenRx,uint16_t MsgID);
+void TestUsart2_Receive(void);
+void CollectMaster485_Send_Data(uint8_t *buf,uint16_t len);	
+void CollectMaster485_TX_Set(uint8_t en);
+void ReadAllStoreValue(void);
+void ReadCollect_QingJiao_TX(void);
+void CollectData_Transform_UsefullData(void);//实时数据转换
+void Immediate_Processing_Function(void);//新增
+void Send_Yewei_offset_To_Collect(void);//
+void ValStateConvertTo91(void);
+void UpdateWenYouFifo(void);//稳油数据更新
+
+void Get_All_Moniliang_Data_4Cang(uint16_t GroupNum);
+
+//void ReadCollect_ValveState_64Byte(uint8_t CangNum);
+void ReadCollect_ValveState_64Byte(uint16_t para001,uint16_t para002,uint16_t para003,uint16_t para004,uint16_t para005);
+
+void Parse_AllSensor_Data_For_SingleStore(sT2C_ALL_Sensor_Data_Each_Cang* pT2C_ALL_Sensor_Data,uint16_t msgID);
+void Parse_AllSensor_Data_For_WholeCar(sT2C_ALL_Sensor_Data_WholeCar* pT2C_ALL_Sensor_Data,uint16_t msgID,uint16_t LenOfPara);
+
+void Parse_0x0020_Data_64Byte(void);
+void Parse_0x0013_Data(void);
+
+void Translate_IO_to_U32Bit(void);
+void Translate_IO_to_U32Bit_V2(void);
+
+#endif

+ 61 - 0
Inc/DS1302.h

@@ -0,0 +1,61 @@
+#ifndef __DS1302_H__
+#define __DS1302_H__
+#include "stm32f7xx_hal.h"
+//IO方向设置
+//#define DS1302_IO_IN()  {GPIOC->CRL&=0X0FFFFFFF;GPIOC->CRL|=((unsigned int)8<<28);}
+
+//#define DS1302_IO_OUT() {GPIOC->CRL&=0X0FFFFFFF;GPIOC->CRL|=((unsigned int)3<<28);}
+//IO操作函数									   
+//#define	DS1302_DATA_OUT PCout(7) //数据端口	Pc7 
+//#define	DS1302_DATA_IN  PCin(7)  //数据端口	Pc7 
+#define DS1302_SCK   GPIO_PIN_9 
+#define	DS1302_RST   GPIO_PIN_1
+#define	DS1302_DATA  GPIO_PIN_0
+//#define	DS1302_SCK  PCout(8)
+//#define	DS1302_RST  PCout(6)
+#define	DS1302_RST_1  HAL_GPIO_WritePin(GPIOE, DS1302_RST, GPIO_PIN_SET)
+#define	DS1302_RST_0  HAL_GPIO_WritePin(GPIOE, DS1302_RST, GPIO_PIN_RESET)
+
+#define	DS1302_SCK_1  HAL_GPIO_WritePin(GPIOB, DS1302_SCK, GPIO_PIN_SET)
+#define	DS1302_SCK_0  HAL_GPIO_WritePin(GPIOB, DS1302_SCK, GPIO_PIN_RESET)
+
+#define	DS1302_DATA_OUT_1  HAL_GPIO_WritePin(GPIOE, DS1302_DATA, GPIO_PIN_SET)
+#define	DS1302_DATA_OUT_0  HAL_GPIO_WritePin(GPIOE, DS1302_DATA, GPIO_PIN_RESET)
+
+#define DS1302_DATA_IN()     HAL_GPIO_ReadPin(GPIOE,  DS1302_DATA)
+//DS1302地址定义
+#define ds1302_sec_add			  0x80		//秒数据地址
+#define ds1302_min_add			  0x82		//分数据地址
+#define ds1302_hr_add			    0x84		//时数据地址
+#define ds1302_date_add			  0x86		//日数据地址
+#define ds1302_month_add		  0x88		//月数据地址
+#define ds1302_day_add			  0x8a		//星期数据地址
+#define ds1302_year_add			  0x8c		//年数据地址
+#define ds1302_control_add		0x8e		//控制数据地址
+#define ds1302_charger_add		0x90 					 
+#define ds1302_clkburst_add		0xbe
+
+extern uint8_t time_buf[7];
+extern char tableDS1302[7];
+
+void DS1302_IO_IN(void);
+void DS1302_IO_OUT(void);
+void ds1302_Init(void);
+void ds1302_Write_Byte(uint8_t addr, uint8_t data);
+uint8_t ds1302_Read_Byte(uint8_t addr);
+void ds1302_Write_Time(uint8_t *Time_buf);
+void ds1302_Read_Time(void);
+void ds1302_Get_Time(uint8_t *time);
+void delay_us(uint32_t us);
+
+//新增函数  李伟修改
+void Set_IO_INPUT(void);
+void Set_IO_OUT(void);
+void ds1302_writeV2(unsigned char time_tx);
+void ds1302_initV2(void);
+void DS1302_get_all(void);
+
+
+#endif
+
+

+ 76 - 0
Inc/Data_deal.h

@@ -0,0 +1,76 @@
+#ifndef __data_deal_H__
+#define __data_deal_H__
+
+
+#include "stdio.h"
+#include "string.h"
+#include "stdint.h"
+#include <ctype.h>  
+
+typedef struct _SDateTime{
+	int year;
+	char month;
+	char day;
+	char hour;
+	char min;
+	char sec;
+	char week;
+	int  msec;
+}SDateTime;
+
+
+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, uint16_t cyLen);
+uint8_t MODBUS_Hex_GetLrc(uint8_t *pCyAsciiBuf, uint8_t cyLen);
+
+uint8_t MODBUS_ASCII_AsciiToHex(uint8_t *pbDest);
+ 
+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

+ 72 - 0
Inc/Dwin.h

@@ -0,0 +1,72 @@
+#ifndef __DWIN_H
+#define __DWIN_H
+#include "stm32f7xx_hal.h"
+//#include "cmd_queue.h"
+
+
+#define STARTSIGN_H    0x5a     //帧头高字节
+#define STARTSIGN_L    0xa5	    //帧头低字节
+#define CMDBUF_SIZE    50
+#define BLACK          0x0000	  //黑色
+#define RED            0xF000	  //红色
+//#define BLUE				 0x001F	  //深蓝色
+#define BLUE				   0x041f	  //蓝色
+#define GREEN				   0x07E0	  //青色
+#define YELLOW         0xFFF0   //黄色
+#define YELLOW1        0xbae0
+
+
+typedef  struct	 
+{
+   uint8_t    Cmd_Flag;		//命令标志位
+   uint16_t   Cmd_Addr;		//接收到的命令
+   uint32_t   Cmd_Data;		//接收到的数据
+}RxCmdArray;
+
+typedef  struct	
+{
+	uint8_t key;//按键键值
+	uint8_t Key_up_flag;//按键按下有数据输入
+	uint8_t mode;//系统运行模式 0系统运行  1调试模式  2
+	uint8_t current_page;//当前界面
+	uint8_t Main_Page_id;//主界面ID
+	uint8_t Full_oil_id;//装油界面
+	uint8_t offLoading_oil_id;//卸油界面ID
+	uint8_t Liquid_id;  //液位温度页面ID
+}Run_mode_key;
+extern Run_mode_key Run_mode_key_info;
+extern uint8_t Lcd_sleep_flag;
+ 
+extern uint8_t time_Set_Dwin[14];
+extern uint8_t DateDwin[8];
+void GetDateFromDwin(void);
+
+void WrDwinCmd8(uint16_t addr16,uint8_t data8);
+void WrDwinCmd16(uint16_t addr16,uint16_t data16);
+void WrDwinCmd32(uint16_t addr16,uint32_t data32);
+void WrDwinBuf16(uint16_t addr16,uint16_t *buf);
+void WrDwinBuf32(uint16_t addr16,uint16_t *buf);
+//void WrDwinBuf(uint16_t addr16,uint16_t *buf,uint8_t n);
+void WrDwinBuf(uint16_t addr16,uint16_t *buf,uint16_t n,uint8_t LSB_Mode);
+void RdDwinData16(uint16_t addr16,uint8_t len);
+void RdDwinData32(uint16_t addr16,uint8_t len);
+void Lcd_Cmd_Handle(void);
+void Lcd_Init(void );//IO_Data_frame
+void Dispaly_CarAndValveState(void);
+void Jump_page_id(uint8_t id);
+void FULL_oil_draw(uint8_t mode,uint8_t se_data);
+void Off_loading_draw(uint8_t se_data);
+void PopWinCmdFunc(uint8_t *buf);
+void Read_REAL_Time(void);
+void Wakeup_lcd(void);
+void Display_input_time(uint8_t flag,uint8_t *time);
+void Send_Time(uint8_t * time);
+void Dispay_login(uint8_t flag,uint8_t pawd_num);
+void Go_homepage(void);
+
+void Restart_LCD(void);
+
+void WrDwinBuf_u8(uint16_t addr16,uint8_t *buf,uint8_t n);
+#endif
+
+

+ 76 - 0
Inc/Elec_Seal.h

@@ -0,0 +1,76 @@
+#ifndef __ELEC_SEAL_H
+#define __ELEC_SEAL_H
+#include "stm32f7xx_hal.h"
+
+#define User_Screen_5size  1
+typedef struct
+{
+	uint16_t Car_type;//车型号
+	uint16_t Full_Oil_Mode;//装油模式
+	uint16_t Auto_Sealing_time;//自动施封时间
+	uint16_t Decrease_Oil_time;//卸油完成时间
+	uint8_t Car_state;					//车辆状态
+	uint8_t Car_state_disp;
+	uint16_t Random_code;//随机码
+	uint16_t Ask_code;//匹配码
+	uint16_t Real_operation_ID;//实时操作仓号(装卸油)1 2 3 4
+	uint8_t Auto_full_oil_mode;//装油模式,0手动按键  1自动监测
+	uint16_t Start_Full_flag;//开始装油标志 0 默认 1开始装油 2装油中  3装油完成 进行施封  4.装油异常
+	uint16_t Start_Decrease_flag;//开始卸油标志
+	uint8_t Start_Seal_flag;//开始施封标志
+	uint16_t Charge_num;//开始切换界面
+	uint16_t Null_ID;//空仓编号  bit显示-----某一位为1表明该仓号的状态为空仓状态//李伟添加注释 20210722
+	uint16_t Null_ID_disp;
+	uint16_t Break_sealing_Id;//破封仓号      bit显示-----某一位为1表明该仓号的状态为破封状态//李伟添加注释 20210722 
+//	u8 Break_sealing_taiId;//具体破封单个仓号
+	uint8_t Auto_sealedOK_ID;//自动施封OK的仓号  bit显示-----某一位为1表明该仓号的状态为施封状态//李伟添加注释 20210722 
+	uint8_t Auto_sealedNOK_ID;//自动施封NOK的仓号  bit显示
+	uint8_t Auto_Sealing_state;//解封状态, 0默认  1成功  2失败
+	uint8_t Auto_Write_history_flag;//历史数据开始写标志  1 破封 2施封  3解封 0默认不记录
+	uint8_t Auto_Write_history_ID;//写历史数据的仓号
+	uint8_t Save_flag ;//保存到EEPROM里面标志
+	uint8_t Re_sealing_falg;//补封标志
+	uint8_t Re_star_sealing_flag;//手动补封开关
+	uint8_t Set_Null_ID_flag ;//手动回复空仓
+	uint8_t Bottom_key_all;//气动底阀开关状态
+	uint8_t Bottom_unload_all;//卸尽状态
+	uint8_t Loading_Oil_state;//装油状态   1正在装油  0,装油结束
+	uint8_t Read_NULL_ID;//空仓读取,位为1 读取,为0则不读取,开机需要去读取这个值,默认为0
+	uint8_t finger_mark_time;//指纹解锁时间标记
+}Full_Oil_Info_TypeDef;
+extern Full_Oil_Info_TypeDef Full_Oil_allinfo;
+
+extern uint8_t Send_data_nu;
+
+extern uint8_t SealedOK_backup;
+extern uint8_t Full_oil_flag ;
+extern uint8_t Fill_Oil_fish_ID ;
+extern uint8_t Fill_Oil_Nfish_ID ;
+extern uint8_t Auto_unload_clear_info_flag,Auto_unload_clear_start_flag;
+void Elect_cover(void);
+void Usart2_data_analysis(void);
+
+
+void Test_get_state(void);//获取阀门实施状态
+void Real_time_display(void);//
+void Offloading_Oil( void);//卸油
+void Fill_Oil( void);//装油
+
+void Write_State_history(void);//写历史数据检测
+void Break_Seal(void);
+void Un_sealing_loading(void);
+void  Save_elect_data(void );//保存EEPROM数据,防止掉电丢失
+void Car_stateUpdate(void);//车辆状态判断是否OK
+void ReSealing_data(void );//自动补封(5分钟内时间在中断函数中改)
+void Write_resealing_screen(void);//写自动补封状态
+void Read_autoResealing(void);//读自动补封的设置开关
+
+void Send_Sealing_fish(void);//写施封完成
+void Write_Clear_Random_code(void);//清空随机码与匹配码
+void Auto_Set_NUllID(void);//自动回复空仓
+void Auto_unload_clear_info(void);
+void Auto_check_Seal_all(void);//自动施封
+
+
+#endif
+

+ 172 - 0
Inc/FreeRTOSConfig.h

@@ -0,0 +1,172 @@
+/* USER CODE BEGIN Header */
+/*
+    FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd.
+    All rights reserved
+
+    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
+
+    This file is part of the FreeRTOS distribution.
+
+    FreeRTOS is free software; you can redistribute it and/or modify it under
+    the terms of the GNU General Public License (version 2) as published by the
+    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.
+
+	***************************************************************************
+    >>!   NOTE: The modification to the GPL is included to allow you to     !<<
+    >>!   distribute a combined work that includes FreeRTOS without being   !<<
+    >>!   obliged to provide the source code for proprietary components     !<<
+    >>!   outside of the FreeRTOS kernel.                                   !<<
+	***************************************************************************
+
+    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
+    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+    FOR A PARTICULAR PURPOSE.  Full license text is available on the following
+    link: http://www.freertos.org/a00114.html
+
+    ***************************************************************************
+     *                                                                       *
+     *    FreeRTOS provides completely free yet professionally developed,    *
+     *    robust, strictly quality controlled, supported, and cross          *
+     *    platform software that is more than just the market leader, it     *
+     *    is the industry's de facto standard.                               *
+     *                                                                       *
+     *    Help yourself get started quickly while simultaneously helping     *
+     *    to support the FreeRTOS project by purchasing a FreeRTOS           *
+     *    tutorial book, reference manual, or both:                          *
+     *    http://www.FreeRTOS.org/Documentation                              *
+     *                                                                       *
+    ***************************************************************************
+
+    http://www.FreeRTOS.org/FAQHelp.html - Having a problem?  Start by reading
+	the FAQ page "My application does not run, what could be wrong?".  Have you
+	defined configASSERT()?
+
+	http://www.FreeRTOS.org/support - In return for receiving this top quality
+	embedded software for free we request you assist our global community by
+	participating in the support forum.
+
+	http://www.FreeRTOS.org/training - Investing in training allows your team to
+	be as productive as possible as early as possible.  Now you can receive
+	FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers
+	Ltd, and the world's leading authority on the world's leading RTOS.
+
+    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
+    including FreeRTOS+Trace - an indispensable productivity tool, a DOS
+    compatible FAT file system, and our tiny thread aware UDP/IP stack.
+
+    http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.
+    Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.
+
+    http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High
+    Integrity Systems ltd. to sell under the OpenRTOS brand.  Low cost OpenRTOS
+    licenses offer ticketed support, indemnification and commercial middleware.
+
+    http://www.SafeRTOS.com - High Integrity Systems also provide a safety
+    engineered and independently SIL3 certified version for use in safety and
+    mission critical applications that require provable dependability.
+
+    1 tab == 4 spaces!
+*/
+/* USER CODE END Header */
+
+#ifndef FREERTOS_CONFIG_H
+#define FREERTOS_CONFIG_H
+
+/*-----------------------------------------------------------
+ * Application specific definitions.
+ *
+ * These definitions should be adjusted for your particular hardware and
+ * application requirements.
+ *
+ * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
+ * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
+ *
+ * See http://www.freertos.org/a00110.html.
+ *----------------------------------------------------------*/
+
+/* USER CODE BEGIN Includes */   	      
+/* Section where include file can be added */
+/* USER CODE END Includes */ 
+
+/* Ensure stdint is only used by the compiler, and not the assembler. */
+#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)
+    #include <stdint.h>
+    extern uint32_t SystemCoreClock;
+#endif
+
+#define configUSE_PREEMPTION                     1
+#define configSUPPORT_STATIC_ALLOCATION          0
+#define configSUPPORT_DYNAMIC_ALLOCATION         1
+#define configUSE_IDLE_HOOK                      0
+#define configUSE_TICK_HOOK                      0
+#define configCPU_CLOCK_HZ                       ( SystemCoreClock )
+#define configTICK_RATE_HZ                       ((TickType_t)1000)
+#define configMAX_PRIORITIES                     ( 7 )
+#define configMINIMAL_STACK_SIZE                 ((uint16_t)256)
+#define configTOTAL_HEAP_SIZE                    ((size_t)16384+10240)
+#define configMAX_TASK_NAME_LEN                  ( 16 )
+#define configUSE_16_BIT_TICKS                   0
+#define configUSE_MUTEXES                        1
+#define configQUEUE_REGISTRY_SIZE                8
+#define configUSE_PORT_OPTIMISED_TASK_SELECTION  1
+
+/* Co-routine definitions. */
+#define configUSE_CO_ROUTINES                    0
+#define configMAX_CO_ROUTINE_PRIORITIES          ( 2 )
+
+/* Set the following definitions to 1 to include the API function, or zero
+to exclude the API function. */
+#define INCLUDE_vTaskPrioritySet            1
+#define INCLUDE_uxTaskPriorityGet           1
+#define INCLUDE_vTaskDelete                 1
+#define INCLUDE_vTaskCleanUpResources       0
+#define INCLUDE_vTaskSuspend                1
+#define INCLUDE_vTaskDelayUntil             0
+#define INCLUDE_vTaskDelay                  1
+#define INCLUDE_xTaskGetSchedulerState      1
+
+/* Cortex-M specific definitions. */
+#ifdef __NVIC_PRIO_BITS
+ /* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */
+ #define configPRIO_BITS         __NVIC_PRIO_BITS
+#else
+ #define configPRIO_BITS         4
+#endif
+
+/* The lowest interrupt priority that can be used in a call to a "set priority"
+function. */
+#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY   15
+
+/* The highest interrupt priority that can be used by any interrupt service
+routine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL
+INTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER
+PRIORITY THAN THIS! (higher priorities are lower numeric values. */
+#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5
+
+/* Interrupt priorities used by the kernel port layer itself.  These are generic
+to all Cortex-M ports, and do not rely on any particular library functions. */
+#define configKERNEL_INTERRUPT_PRIORITY 		( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
+/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!
+See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
+#define configMAX_SYSCALL_INTERRUPT_PRIORITY 	( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
+
+/* Normal assert() semantics without relying on the provision of an assert.h
+header file. */
+/* USER CODE BEGIN 1 */
+#define configASSERT( x ) if ((x) == 0) {taskDISABLE_INTERRUPTS(); for( ;; );} 
+/* USER CODE END 1 */
+
+/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS
+standard names. */
+#define vPortSVCHandler    SVC_Handler
+#define xPortPendSVHandler PendSV_Handler
+
+/* IMPORTANT: This define is commented when used with STM32Cube firmware, when timebase is systick,
+              to prevent overwriting SysTick_Handler defined within STM32Cube HAL */
+#define xPortSysTickHandler SysTick_Handler
+
+/* USER CODE BEGIN Defines */   	      
+/* Section where parameter definitions can be added (for instance, to override default ones in FreeRTOS.h) */
+/* USER CODE END Defines */ 
+
+#endif /* FREERTOS_CONFIG_H */

+ 667 - 0
Inc/KeySlave485.h

@@ -0,0 +1,667 @@
+#ifndef __KEYSLAVE485_H
+#define __KEYSLAVE485_H
+#include "stm32f7xx_hal.h"
+
+
+//必须配置三项参数:看门狗,液位计类型,油品类型。李伟修改  20210420
+
+//0----关闭看门狗SP706   1----打开看门狗SP706--------------必须配置的参数1/3
+#define WatchDogOn   						1   //是否打开看门狗 
+//#define WatchDogOn   							0   //是否打开看门狗 
+
+#define TIME_OF_Break_seal_cnt 		1  //30     连续破封判断次数
+
+
+#define En_AnHuiKaiLe  						0     //安徽开乐产品试用增加温度  压力显示
+
+
+#define En_XieYouFa_OverSample  	1     //卸油阀优化   增加一次读取
+
+
+#define ElecFence_AutoSeal_EN   	1  //电子围栏自动施封
+
+#define DisplaySensorData_En   		1   //是否允许模拟量传感器数据显示,比如温度压力等参数
+
+#define Max_Usart2_ErrorTime   		32   //最大读取错误次数  
+
+
+#define VoicePlay_En   						0   //串口4上的语音播报;已经有打印机、按键两个设备
+#define Printer_En   							1   //串口4上的打印机是否启用   新疆项目则启用;北京部队试用不启用
+#define KeyPad_Set_SealState_En   1   //允许按键修改电子铅封的状态
+
+/* Base address of the Flash sectors */ 
+#define ADDR_FLASH_SECTOR_0     ((uint32_t)0x08000000) /* Base address of Sector 0, 32 Kbytes */
+#define ADDR_FLASH_SECTOR_1     ((uint32_t)0x08008000) /* Base address of Sector 1, 32 Kbytes */
+#define ADDR_FLASH_SECTOR_2     ((uint32_t)0x08010000) /* Base address of Sector 2, 32 Kbytes */
+#define ADDR_FLASH_SECTOR_3     ((uint32_t)0x08018000) /* Base address of Sector 3, 32 Kbytes */
+#define ADDR_FLASH_SECTOR_4     ((uint32_t)0x08020000) /* Base address of Sector 4, 128 Kbytes */
+#define ADDR_FLASH_SECTOR_5     ((uint32_t)0x08040000) /* Base address of Sector 5, 256 Kbytes */
+#define ADDR_FLASH_SECTOR_6     ((uint32_t)0x08080000) /* Base address of Sector 6, 256 Kbytes */
+#define ADDR_FLASH_SECTOR_7     ((uint32_t)0x080C0000) /* Base address of Sector 7, 256 Kbytes */
+
+#define StartBytes_IAP     ((uint32_t)0xA55A55AA) //远程升级的起始字节
+#define EndBytes_IAP     ((uint32_t)0x5AA5AA55) //远程升级的结束字节
+
+
+#define New236Byte_En_0x1121   					0   //新增的236字节传输1-4仓、5-8仓协议
+#define New150Byte_En_0x1193   					1   //新增的150字节传输每仓所有传感器的协议,一帧数据中传输每仓铅封、IO、模拟量数据
+#define New64Byte_En_0x0013   					1   //阀门状态或运算之后进行传输
+#define New80Byte_En_0x119B   					1   //新增的传输整车传感器,倾角、备电、等
+
+
+#define New64Byte_En_0x0020   					1   //北京部队试用新增的一组64字节的阀门状态传输协议
+
+
+#define ExtAddr_ControllBoard    	0x95020002   //控制板的4字节地址  扩展地址
+#define ExtAddr_ControllBoard2   	0x95500002   //控制板的4字节地址  扩展地址
+
+#define Length_Of_PayLoad_RemCali   44   //远程标定的有效载荷长度   帧长度64,有效载荷44字节
+#define DataMode_For_RemCali   			0x01   //远程标定的数据模式,00=ASCII,01=HEX
+#define Length_Of_Reply_RemCali   	67   //远程标定返回的数据长度,分别为131和67;十六进制模式下为67
+
+
+#define F2_and_key4   	0xbffb
+
+ 
+//20210120新增   液位计类型                   --------------必须配置的参数2/3
+//01--磁致伸缩液位计; 02————雷达液位计
+#define TypeOf_YeWeiJi		 0x02
+//#define TypeOf_YeWeiJi		 0x01
+
+/////////油品配置!!!必须要配置!!!       --------------必须配置的参数3/3
+//0.08%为柴油的膨胀系数   0.12%为汽油的膨胀系数
+//20210419   --56454为柴油车;54021为汽油车
+#define SCL_Factor_diesel  ((float)0.08)    //柴油与汽油的膨胀系数    0808车为柴油,56454柴油
+			
+#define SCL_ControllToPlatForm (1000.00f)
+
+
+//屏幕唤醒的休眠时间间隔 20210408 同北京迪文屏供应商联系之后确认40ms是屏幕的刷新间隔,留下10ms余量
+#define LCD_TimeOfWake		 50 
+
+
+#define ShowPassword_JieFeng_En   0  //是否在屏幕上显示密码 
+#define ShowCang02_IO_EN   1  //是否在屏幕上显示2仓阀门开关信息 
+#define Show_Sys_Info_EN   1  //是否在屏幕上显示运行信息 
+
+
+//采集器上传给控制器的液位、温度数据,int16格式传输,精度为0.1mm  所以要缩小10倍
+#define SCL_Yewei_Collect2Contr		 (0.1f)
+#define SCL_Temp_Collect2Contr	   (0.1f)
+
+#define SCL_Angle	   (180.0f/32768.0f)
+
+//三点式温度传感器,1=启用;0=未安装或者未启用
+#define TriTempSensorOn   1    
+
+//是否打印日期和时间  调试比武期间不打印时间信息,手写出库、到站信息
+#define PrintDateTime   0     
+
+//读取采集器的时间间隔  单位为毫秒ms
+#define READ_COLLECT_INTERVAL ((uint16_t)500U)
+ 
+//远程标定的时间
+//#define SPAN_RemoteCali_INTERVAL  ((uint32_t)(600000))   //600秒
+#define SPAN_RemoteCali_INTERVAL  ((uint32_t)(10000))   //10秒
+
+
+#define SPAN_ControllerAndCollector_INTERVAL_100  ((uint32_t)(100))   //150ms   采集器的命令响应时间
+#define SPAN_ControllerAndCollector_INTERVAL_120  ((uint32_t)(120))   //120ms   采集器的命令响应时间
+#define SPAN_ControllerAndCollector_INTERVAL_180  ((uint32_t)(180))   //180ms   采集器的命令响应时间
+
+//手工输入温度制后默认的保持时间   20210303调整为60分钟
+#define SPAN_Manual_Input_Temp    ((uint32_t)(3600000))   //40分钟=2400s换算为ms
+//#define SPAN_Manual_Input_Temp    ((uint32_t)(1200000))   //20分钟=1200s换算为ms
+
+
+//任何按键按下后默认的保持时间 ----控制屏幕强制唤醒的时间
+#define SPAN_KeyPress_Time    ((uint32_t)(600000))   //600秒
+ 
+
+///////异常状态标志
+#define ADDR_DWIN_StateYiChang_CoverSmall 0x1046   //迪文屏幕人孔小盖地址
+#define ADDR_DWIN_StateYiChang_CoverBig 0x1048   //迪文屏幕人孔大盖地址
+#define ADDR_DWIN_StateYiChang_XieYouFa 0x1042   //迪文屏幕卸油阀地址
+#define ADDR_DWIN_StateYiChang_HaiDiFa 0x1044   //迪文屏幕海底阀地址
+
+#define ADDR_DWIN_Seal_Lock 0x100C   //迪文屏幕施封图标(关闭的锁)地址
+#define ADDR_DWIN_Seal_UnLock 0x100F   //迪文屏幕破封图标(打开的锁)地址
+
+#define ADDR_DWIN_Car_State 0x1022   //迪文屏幕车辆状态图标地址
+#define ADDR_DWIN_Operation_State 0x1024   //迪文屏幕操作状态状态图标地址   装油   卸油  空闲
+#define ADDR_DWIN_Loading_Oil_Mode 0x1028   //迪文屏幕装油模式图标地址   上装  下装
+#define ADDR_DWIN_UnLoading_Oil_Mode 0x102a   //迪文屏幕卸油动画图标地址   上装  下装
+
+#define ADDR_DWIN_Num_Of_CangId 0x103A   //迪文屏幕仓号图标地址   1--8
+
+
+#define ADDR_DWIN_CoverSmall 0x1000   //迪文屏幕人孔小盖开关地址   打开或者关闭
+#define ADDR_DWIN_CoverBig 0x1003   //迪文屏幕人孔大盖开关地址   打开或者关闭
+#define ADDR_DWIN_HaiDiFa 0x1006   //迪文屏幕海底阀开关地址   打开或者关闭
+#define ADDR_DWIN_XieYouFa 0x1009   //迪文屏幕卸油阀开关地址   打开或者关闭
+
+
+
+#define ADDR_DWIN_Seal_UnLock 0x100F   //迪文屏幕破封图标(打开的锁)地址
+
+#define ADDR_DWIN_Loading_Oil 0x1012   //迪文屏幕装油动画图标(打开的锁)地址第一仓,后边每仓地址+2
+
+
+#define ADDR_DWIN_Text01 0x1070   //迪文屏幕显示文本框的地址
+#define ADDR_DWIN_Text02 0x1270   //迪文屏幕显示文本框的地址
+
+#define ADDR_DWIN_Text03_sysInfo 	0x1470   //迪文屏幕显示文本框的地址----------系统运行信息
+#define ADDR_DWIN_Text04 					0x1670   //迪文屏幕显示文本框的地址
+#define ADDR_DWIN_Text05 					0x1870   //迪文屏幕显示文本框的地址---启动界面的版本信息
+
+
+
+
+
+//#define ADDR_DWIN_Title_IO 0x1B00   //阀门名称标志
+//#define ADDR_DWIN_Cang01_IO 0x1C00   //仓1的阀门状态信息
+//#define ADDR_DWIN_Cang02_IO 0x1A00   //仓2的阀门状态信息
+//#define ADDR_DWIN_Cang03_IO 0x1D00   //仓3的阀门状态信息
+//#define ADDR_DWIN_Cang04_IO 0x1E00   //仓4的阀门状态信息
+
+
+#define ADDR_DWIN_Title_IO 			0x1A00   //阀门名称标志
+#define ADDR_DWIN_Cang01_IO 		0x1B00   //仓1的阀门状态信息
+#define ADDR_DWIN_Cang02_IO 		0x1C00   //仓2的阀门状态信息
+#define ADDR_DWIN_Cang03_IO 		0x1D00   //仓3的阀门状态信息
+#define ADDR_DWIN_Cang04_IO 		0x1E00   //仓4的阀门状态信息
+#define ADDR_DWIN_SensorInfo 		0x2100   //模拟传感器类信息描述指针
+#define ADDR_DWIN_SensorInfoAll 0x3100   //
+
+#define ADDR_DWIN_Text01_SP 		0x5000   //迪文屏幕显示文本框的描述指针地址
+#define ADDR_DWIN_Text02_SP 		0x5010   
+																		 
+#define ADDR_DWIN_Text03_SP 		0x5020   
+#define ADDR_DWIN_Text04_SP 		0x5030   
+#define ADDR_DWIN_Text05_SP 		0x5040 
+
+
+#define ADDR_DWIN_Title_IO_SP 		0x5050   //阀门名称描述指针
+#define ADDR_DWIN_Cang01_IO_SP 		0x5060   //仓1的阀门状态信息描述指针
+#define ADDR_DWIN_Cang02_IO_SP 		0x5070   //仓2的阀门状态信息描述指针
+#define ADDR_DWIN_Cang03_IO_SP 		0x5080   //仓3的阀门状态信息描述指针
+#define ADDR_DWIN_Cang04_IO_SP 		0x5090   //仓4的阀门状态信息描述指针
+#define ADDR_DWIN_SensorInfo_SP 	0x50A0   //模拟传感器类信息描述指针
+
+
+
+#define ADDR_DWIN_Tempe01 0x2040    //1仓温度数据
+#define ADDR_DWIN_Pressure01 0x2044    //1仓压力数据
+#define ADDR_DWIN_Yewei01_Cang01 0x2048    //1仓液位数据
+#define ADDR_DWIN_Qingjiao01 0x204c    //倾角1数据
+#define ADDR_DWIN_Qingjiao02 0x207c    //倾角2数据
+#define ADDR_DWIN_Zhongliang 0x2050    //1仓重量数据,或等于整车油品重量
+#define ADDR_DWIN_TempeManualInput 0x2080    //手工输入的1仓温度;主要用于新疆现场比武
+
+#define ADDR_DWIN_Yewei01_Cang02 0x2060    //2仓液位数据
+#define ADDR_DWIN_Yewei01_Cang03 0x2064    //3仓液位数据
+#define ADDR_DWIN_Yewei01_Cang04 0x2068    //4仓液位数据
+
+
+
+#define ADDR_DWIN_Vt_Cang01 0x2054    //第1仓的Vt数据
+#define ADDR_DWIN_Vt_Cang02 0x20A0    //第2仓的Vt数据
+#define ADDR_DWIN_Vt_Cang03 0x20A4    //第3仓的Vt数据
+#define ADDR_DWIN_Vt_Cang04 0x20A8    //第4仓的Vt数据
+
+
+#define ADDR_DWIN_V20_Cang01 0x2058    //第一仓的V20数据
+
+#define ADDR_DWIN_Tempe01_Cang01 0x2084    //第一仓的温度测量点1
+#define ADDR_DWIN_Tempe02_Cang01 0x2088    //第一仓的温度测量点2
+#define ADDR_DWIN_Tempe03_Cang01 0x208c    //第一仓的温度测量点3
+ 
+#define ADDR_DWIN_Density_Cang01 0x2090    //第一仓的密度数据
+
+
+
+
+/////////////////以下内容不需要修改!!!!!!!
+//将会根据上述液位计类型修改相应的参数
+/*
+#if(TypeOf_YeWeiJi==0x02)     
+    //注释掉柴油的膨胀系数则切换为汽油,否则自动切换为柴油
+		#define SCL_Factor_diesel  ((float)0.08)    //柴油的膨胀系数    0808车为柴油
+#endif	
+*/	
+
+
+//Fram中存储的所有参数
+#define 	ADDR_Extended_ContBoard	0x0000	//	0	95010001	扩展地址
+#define 	ADDR_Version_ContBoard	0x0004	//	4	STM32F746VGT6+2021v1.06	版本号
+#define 	ADDR_AutoSealed_Time	0x0024	//	36		自动施封时长
+#define 	ADDR_DataSource_LiquidoMeter	0x002C	//	44		液晶屏数据显示来源——液位参数
+#define 	ADDR_DataSource_ElecSeal	0x0030	//	48		液晶屏数据显示来源——铅封参数
+#define 	ADDR_V20_Point	0x0034	//	52		V20计算温度点的选择
+#define 	ADDR_CarPlate_Number	0x0044	//	68		车牌号
+#define 	ADDR_Zero_Of_LiquidMeter	0x0064	//	100	兼容8仓	液位计零点
+#define 	ADDR_Zero_Of_TankCapacity	0x0084	//	132		罐容Vt零点
+#define 	ADDR_ManHoLe_Number	0x00A4	//	164		人孔盖卸油阀数量
+#define 	ADDR_OiLType_Data	0x00E4	//	228		油品参数   膨胀系数 0.0008  0.0012
+#define 	ADDR_Zero_Of_TempSensor	0x0104	//	260		温度偏移参数
+#define 	ADDR_TankShape_01	0x0124	//	292	1—4仓	罐车参数1
+#define 	ADDR_TankShape_02	0x0164	//	356	5—8仓	罐车参数2
+#define 	ADDR_SampIntervaL_Collector	0x01A4	//	420	单位为毫秒。取值范围为	同采集板的采样间隔
+#define 	ADDR_CommuIntervaL_ScreenDwin	0x01B4	//	436		同迪文屏的通信间隔
+#define 	ADDR_SleepTime_ScreenDwin	0x01C4	//	452		屏幕休眠时间
+#define 	ADDR_RTC_ScreenDwin	0x01CC	//	460		屏幕RTC标定
+#define 	ADDR_TiltAngle_Sensor	0x01DC	//	476		倾角补偿参数
+#define 	ADDR_WarningOf_TiltAngle	0x01EC	//	492	x报警门限5度,y报警门限5度,启用报警。	倾角报警门限
+#define 	ADDR_Auto_OilStatic_Judgement	0x01FC	//	508	10s滑动窗口时间,3mm液位波动,启用自动稳油	自动稳油参数/打印机自动稳油判断
+#define 	ADDR_Restart_ContBoard	0x020C	//	524		复位指令
+#define 	ADDR_Unique_ID_ContBoard	0x0210	//	528		唯一ID
+#define 	ADDR_VersionOf_Software	0x0220	//	544	1.0.0.0	软件版本号
+#define 	ADDR_VersionOf_Hardware	0x0240	//	576	1.0.0.1	硬件版本号
+#define 	ADDR_VersionOf_LCD	0x0260		//608		
+#define 	ADDR_FactoryParam_ContBoard	0x0280	//	640	所有参数恢复为默认值	出厂参数
+#define 	ADDR_SelfTest_ContBoard	0x0284	//	644		自检结果
+#define 	ADDR_BaudRate_ContBoard	0x0288	//	648		波特率
+#define 	ADDR_Zero001_ContBoard	0x0298	//	664		零点参数
+#define 	ADDR_Scale001_ContBoard	0x02A8	//	680		灵敏度参数
+#define 	ADDR_ThreshHold001_ContBoard	0x02B8	//	696		阈值参数
+#define 	ADDR_Precision_ContBoard	0x02C8	//	712		精度
+#define 	ADDR_TempFactor_ContBoard	0x02D8	//	728		温度补偿系数
+#define 	ADDR_YmodemMode_ContBoard	0x02E8	//	744		Ymodem模式
+#define 	ADDR_Reserve001_ContBoard	0x02EC	//	748		Res001
+
+//李伟修改  20211130   压力报警上限、下限、温度上限、下限、温度修正、压力窗口时长、压力正偏门限、负偏门限、压力修正、算法类型等
+//数据格式统一标准化未浮点数,每个数据占用4字节。平台下发数据均为浮点数格式,控制板根据需要进行强制类型转换。
+#define 	ADDR_RunAn_AlarmThreshold 	0x02EC	//	748		Res001  44个字节
+//诸正龙增加 20220113 
+#define   ADDR_USART1_RE_TIMEOUT			0x0318   //终端通信多少时间无接收重启 4字节
+#define   ADDR_DISP_VT_TYPE           0x031C    //VT 20的显示数据来源
+
+#define 	ADDR_Reserve002_ContBoard	0x02F0	//	752		Res002
+#define 	ADDR_Reserve003_ContBoard	0x02F4	//	756		Res003
+#define 	ADDR_Reserve004_ContBoard	0x02F8	//	760		Res004
+#define 	ADDR_Reserve005_ContBoard	0x02FC	//	764		Res005
+#define 	ADDR_Reserve006_ContBoard	0x0300	//	768		Res006
+#define 	ADDR_Reserve007_ContBoard	0x0304	//	772		Res007
+#define 	ADDR_Reserve008_ContBoard	0x0308	//	776		Res008
+#define 	ADDR_ElecSealData_BulkTrans_ContBoard	0x030C	//	780		铅封液位批量上传
+#define 	ADDR_Cabinet01_ContBoard	0x0310	//	784	32个浮点数参数或者64个int16类型数据,4字节对齐。一帧数据128*2=256字符上发给平台.	仓1
+#define 	ADDR_Cabinet02_ContBoard	0x0390	//	912		仓2
+#define 	ADDR_Cabinet03_ContBoard	0x0410	//	1040		仓3
+#define 	ADDR_Cabinet04_ContBoard	0x0490	//	1168		仓4
+#define 	ADDR_Cabinet05_ContBoard	0x0510	//	1296		仓5
+#define 	ADDR_Cabinet06_ContBoard	0x0530	//	1328		仓6
+#define 	ADDR_Cabinet07_ContBoard	0x0550	//	1360		仓7
+#define 	ADDR_Cabinet08_ContBoard	0x0570	//	1392		仓8
+#define 	ADDR_AuthorizeCode	0x0590	//	1424	8仓,每仓4字节	授权解封密码
+#define 	ADDR_Is_In_ElecFence	0x05D0	//	1488		车是否在电子围栏内
+#define 	ADDR_TankCapacity_Table	0x05D4	//	1492	200cm高度,200个u16数据	罐容表标定
+#define 	ADDR_Auto_sealedOK_ID	0x0764	//	1892		原控制板兼容地址
+#define 	ADDR_Break_sealing_Id	0x0768	//	1896		原控制板兼容地址
+#define 	ADDR_Config_fun_id	0x076C	//	1900		原控制板兼容地址
+#define 	ADDR_Auto_Seal_Time	0x0770	//	1904		原控制板兼容地址
+#define 	ADDR_Baseval_ID	0x0774	//	1908		原控制板兼容地址
+#define 	ADDR_StoreNumber	0x0778	//	1912		原控制板兼容地址
+#define 	ADDR_ManHole_Big_info	0x077C	//	1916		原控制板兼容地址
+#define 	ADDR_ManHole_small_info	0x0780	//	1920		原控制板兼容地址
+#define 	ADDR_Dump_info	0x0784	//	1924		原控制板兼容地址
+#define 	ADDR_Foot_info	0x0788	//	1928		原控制板兼容地址
+#define 	ADDR_DebugControll	0x078C	//	1932		调试信息控制
+#define 	ADDR_TotalRunTime	0x0794		//1940累计运行时间计数器
+#define 	ADDR_State_ElecSeal_FSM	0x0798	//	1944		基于状态机的电子铅封状态
+#define 	ADDR_SW_Voice_Printer	0x07A0	//	1952		是否开启打印机,语音播报-----每个bit表示一个外设;4个字节,最多支持32个外接设备
+
+#define 	ADDR_Enable_BlankSeal	0x07A4     //	1956		是否允许空仓施封
+
+#define 	ADDR_Enable_DispSysInfo	0x07A8	//	1960		是否允许显示系统信息等
+
+
+//以下参数不用保存在FRAM中,地址跟实际的存储地址无关联,仅用于功能跳转   --开启液位传感器,压力传感器,断电保存,两边有油算法,允许重复施封,液晶类型,保留字,自动施封
+#define 	ADDR_Enable_ReSeal	0x4000	//	16384		是否允许显示系统信息等
+
+
+//////最高地址不大于0x07ff=2047
+
+
+
+
+#define 	ADDR_Sw_VoicePlay	0x8000	//切换语音播报功能  
+#define 	ADDR_Sw_ValveRaw	0x8001	////切换阀门的原始数据或者汉字数据 
+
+
+//新增密码存储地址
+
+//-----按键功能码
+#define 	DebugFun_LCD_Version			90004	//	1920	版本信息
+#define 	DebugFun_LCD_SleepTime			90002	//	LCD 休眠时间
+#define 	DebugFun_DS1302Time				90003	//	1928		显示DS1302时间
+#define 	DebugFun_CarLicensePlate	90068	//	显示车牌号
+#define 	DebugFun_CarLicensePlate1	90005	//	显示车牌号	
+
+#define 	DebugFun__Restart_ContBoard00	90523	//立即重启
+#define 	DebugFun__Restart_ContBoard01	90524	//可以取消的重启
+#define 	DebugFun_VersionOf_Software		90544	//软件版本号
+
+//强制清除各仓的显示信息,避免乱码无法消除----因为正常只有39字符,原始数字较长,所以后边有残余
+#define 	DebugFun_Clear_Valve_Info	99997	
+#define 	DebugFun_Show_product_ID	99998	//显示产品ID
+#define 	DebugFun_Show_Terminal		99999	//显示来自终端的命令信息
+
+
+
+
+#define 	DebugFun_Sw_VoicePlay					98000	//切换语音播报功能
+#define 	DebugFun_Sw_ValveRaw					98001	//切换阀门的原始数据或者汉字数据
+#define 	DebugFun_Sw_DisplaySensorData		98002	//切换是否显示模拟量类的传感器数据  flag_Sw_DisplaySensorData
+#define 	DebugFun_Refresh_Title_IO			98003	//强制刷新一次阀门名称显示
+#define 	DebugFun_Sw_DispSysInfo				98004	//是否实时显示系统运行信息等
+#define 	DebugFun_Disp_Valve_Info_Bit	98005	//在1仓的位置显示老协议的阀门信息,每个bit表示一个阀门状态,帧标志为0xA1
+
+
+#define 	DebugFun_Set_Cang_NUM01	98101	//手动设定为1仓1阀门
+#define 	DebugFun_Set_Cang_NUM02	98102	//手动设定为2仓2阀门
+#define 	DebugFun_Set_Cang_NUM03	98103	//手动设定为3仓3阀门
+#define 	DebugFun_Set_Cang_NUM04	98104	//手动设定为4仓4阀门
+#define 	DebugFun_Set_Cang_NUM05	98105	//手动设定为5仓5阀门
+#define 	DebugFun_Set_Cang_NUM06	98106	//手动设定为6仓6阀门
+#define 	DebugFun_Set_Cang_NUM07	98107	//手动设定为7仓7阀门
+#define 	DebugFun_Set_Cang_NUM08	98108	//手动设定为8仓8阀门
+
+#define 	DebugFun_Set_BlankSeal_Enable 	98109	//手动设定空仓允许施封
+#define 	DebugFun_Set_BlankSeal_Disable	98110	//手动设定空仓禁止施封
+
+
+
+#define 	DebugFun_Set_Cang_NUM01_Seal	98111	//手动强制施封1仓
+#define 	DebugFun_Set_Cang_NUM02_Seal	98112	//手动强制施封2仓
+#define 	DebugFun_Set_Cang_NUM03_Seal	98113	//手动强制施封3仓
+#define 	DebugFun_Set_Cang_NUM04_Seal	98114	//手动强制施封4仓
+#define 	DebugFun_Set_Cang_NUM05_Seal	98115	//手动强制施封5仓
+#define 	DebugFun_Set_Cang_NUM06_Seal	98116	//手动强制施封6仓
+#define 	DebugFun_Set_Cang_NUM07_Seal	98117	//手动强制施封7仓
+#define 	DebugFun_Set_Cang_NUM08_Seal	98118	//手动强制施封8仓
+
+
+#define 	DebugFun_Set_Cang_NUM01_Broken	98121	//手动强制破封1仓
+#define 	DebugFun_Set_Cang_NUM02_Broken	98122	//手动强制破封2仓
+#define 	DebugFun_Set_Cang_NUM03_Broken	98123	//手动强制破封3仓
+#define 	DebugFun_Set_Cang_NUM04_Broken	98124	//手动强制破封4仓
+#define 	DebugFun_Set_Cang_NUM05_Broken	98125	//手动强制破封5仓
+#define 	DebugFun_Set_Cang_NUM06_Broken	98126	//手动强制破封6仓
+#define 	DebugFun_Set_Cang_NUM07_Broken	98127	//手动强制破封7仓
+#define 	DebugFun_Set_Cang_NUM08_Broken	98128	//手动强制破封8仓
+
+
+#define 	DebugFun_Set_Cang_NUM01_JieFeng	98131	//手动强制解封1仓
+#define 	DebugFun_Set_Cang_NUM02_JieFeng	98132	//手动强制解封2仓
+#define 	DebugFun_Set_Cang_NUM03_JieFeng	98133	//手动强制解封3仓
+#define 	DebugFun_Set_Cang_NUM04_JieFeng	98134	//手动强制解封4仓
+#define 	DebugFun_Set_Cang_NUM05_JieFeng	98135	//手动强制解封5仓
+#define 	DebugFun_Set_Cang_NUM06_JieFeng	98136	//手动强制解封6仓
+#define 	DebugFun_Set_Cang_NUM07_JieFeng	98137	//手动强制解封7仓
+#define 	DebugFun_Set_Cang_NUM08_JieFeng	98138	//手动强制解封8仓
+
+#define 	DebugFun_Set_Enable_ReSeal	98139	// 允许重复施封
+#define 	DebugFun_Set_Disable_ReSeal	98140	//  
+
+#define 	DebugFun_SW_ExpansionRatio	80228	//显示8仓的膨胀系数  
+#define 	DebugFun_SW_ExtAddr_ControllBoard	80000	//显示控制板的扩展地址
+#define 	DebugFun_SW_ExtAddr_IO_OnOff_Group	80001	//显示分组后的阀门开关状态0x91打包用
+#define 	DebugFun_SW_ExtAddr_IO_Exception_Group	80002	////显示分组后的阀门异常状态0x91打包用
+#define 	DebugFun_SW_ExtAddr_ControllBoardtmp	80003	//显示控制板的扩展地址
+#define 	DebugFun_SW_ValveState_PoFeng0x13	80004	//显示破封时的阀门状态
+#define 	DebugFun_SW_ValveState_PoFeng0x20	80005	//显示破封时的阀门状态 
+
+#define 	DebugFun_Show_Sensor001	91001	//显示地址为001的传感器的状态
+#define 	DebugFun_Show_Sensor002	91002	
+#define 	DebugFun_Show_Sensor003	91003	
+#define 	DebugFun_Show_Sensor004	91004	
+#define 	DebugFun_Show_Sensor005	91005	
+#define 	DebugFun_Show_Sensor006	91006	
+#define 	DebugFun_Show_Sensor007	91007	
+#define 	DebugFun_Show_Sensor008	91008	
+#define 	DebugFun_Show_Sensor009	91009	
+#define 	DebugFun_Show_Sensor010	91010	
+#define 	DebugFun_Show_Sensor011	91011	
+#define 	DebugFun_Show_Sensor012	91012	
+#define 	DebugFun_Show_Sensor013	91013	
+#define 	DebugFun_Show_Sensor014	91014	
+#define 	DebugFun_Show_Sensor015	91015	
+#define 	DebugFun_Show_Sensor016	91016	
+
+
+
+
+
+
+
+//李伟修改  20200209    空气温度修正为实际油品温度
+#define SCL_Air_To_Oil (1.000001f)
+
+
+//李伟修改    20200210  同龚经理商定后  当温度超过10度之后直接加上49℃
+#define Offset_diesel   (49.001f)
+
+ 
+
+#define SCL_Factor_petrol  ((float)0.12)    //汽油的膨胀系数   0817车为汽油
+	
+//运输的油品的最大可能的温度---已经观察到的可以的达到65度
+#define Max_Oil_Tempe ((float)120.01)
+	
+
+//运输的油品的最大可能的温度---已经观察到的可以的达到65度
+#define Max_Oil_Height ((float)2.54321)
+	
+//运输的油品的最低可能的温度---极限低温为-60.01
+#define Min_Oil_Tempe ((float)-60.01)
+
+
+//控制器显示的数据源;0x00表示本机数据;0x01表示显示服务器下发的数据
+#define DWIN_Display_Source    0x00 
+
+#define Key_F1 0x1b
+#define Key_F2 0x02
+#define Key_F3 0x03
+#define Key_F4 0x06
+#define Key_00 0x30
+#define Key_01 0x31
+#define Key_02 0x32
+#define Key_03 0x33
+#define Key_04 0x34
+#define Key_05 0x35
+#define Key_06 0x36
+#define Key_07 0x37
+#define Key_08 0x38
+#define Key_09 0x39
+
+#define Key_CLR 0x7f
+#define Key_POT 0x2e
+
+
+
+//功能码
+#define FrameHeader_Collect  0xAA
+#define EquipmentNum_Collect 0x00
+#define ValveState_Fuction   0x01
+#define SensorValue_Function 0x02
+#define WriteStore_Function  0x03
+#define PlatformCal_Function 0x04
+#define PlatformRestartCllect 0x05
+#define PlatformSetOilStyle  0x06//新增
+#define PlatformExceptionHandling		 0x07//新增
+
+
+#define FrameHeader_Collect02  0x39
+#define EquipmentNum_Collect02 0x01
+#define ValveState_Fuction02   0x01
+#define SensorValue_Function02 0x02
+#define WriteStore_Function02  0x03
+#define PlatformCal_Function02 0x04
+#define PlatformRestartCllect02 0x05
+#define PlatformSetOilStyle02  0x06//新增
+#define PlatformExceptionHandling02		 0x07//新增
+
+
+#define Collector_Reset		 								0x0010           //采集器复位
+#define Collector_Get_Valve_State		 			0x0020	//0x3901标定命令的功能码   读取阀门状态
+#define Collector_Get_Sensor_State				0x0027  //3.	读取某仓阀门之外传感器数据   
+#define Collector_Set_XieYouFa_Closed			0x0050 	//4.	卸油阀标定为关
+#define Collector_Set_XieYouFa_MenXian 		0x0051  //5.	设置卸油阀门限
+#define Collector_Set_RenKongGai_Zero			0x0052	//6.	人孔盖传感器置零
+#define Collector_GetSensor_From485Addr		0x0055  //7.	读取液位温度传感器数据(模拟量类的) ----需要指定485地址
+#define Collector_Set_RenKongGai_MenXian	0x0072	//8.	设置人孔盖门限
+#define Collector_Set_PanDuanCiShu			  0x0073  //9.	设置传感器判断次数(主要是人孔盖)
+#define Collector_Set_CangFaMen_Num 			0x0074	//10.	设置采集器参数—仓数,每仓阀门数量
+#define Collector_Set_RenKongGai_Num			0x0075  //11.	设置人孔盖种类数量----实际就是人孔大盖数量
+#define Collector_Set_XieYouFa_Num		 		0x0076	//12.	设置卸油阀种类数量
+#define Collector_Set_HaiDiFa_Num		 			0x0077	//13.	设置海底阀种类数量
+
+
+
+
+#define Collector_Get_Wendu_Data		 			0x0121	//从采集板读取温度数据---8仓数据,float类型有效32字节 李伟修改20210928
+#define Collector_Get_Yewei_Data		 			0x0122	//从采集板读取液位数据---8仓数据,float类型有效32字节 李伟修改20210928
+
+
+//从采集板一次性读取读取温度、液位数据、体积、压力等---8仓数据,float类型有效
+//16字节帧头
+//液位,平均温度,温度1,温度2,温度3,Vt,压力,参数1,参数2,参数3.。。。,参数N共11个。
+//前16字节为固定帧头,接下来8字节为保留待扩展,接下来8个参数32字节为整车模拟量信息(倾角、速度等),
+//最后为4仓的模拟量参数与校验信息。总长度:16+8+32+4*4*11+4=236字节。
+#define Collector_Get_WenduYewei_Data_1to4		 			0x1121	 //1--4仓数据
+#define Collector_Get_WenduYewei_Data_5to8		 			0x1122	 //5--8仓数据
+
+
+#define Collector_Get_All_Sensor_Data_Cang01		 			0x1193	 //传送1仓所有传感器命令,每个传感器4字节,不区分IO类或者模拟量类,详见《淡仓数据传输协议》
+#define Collector_Get_All_Sensor_Data_Cang02		 			0x1194	 //传送2仓所有传感器命令
+#define Collector_Get_All_Sensor_Data_Cang03		 			0x1195	 //传送3仓所有传感器命令
+#define Collector_Get_All_Sensor_Data_Cang04		 			0x1196	 //传送4仓所有传感器命令
+#define Collector_Get_All_Sensor_Data_Cang05		 			0x1197	 //传送5仓所有传感器命令
+#define Collector_Get_All_Sensor_Data_Cang06		 			0x1198	 //传送6仓所有传感器命令
+#define Collector_Get_All_Sensor_Data_Cang07		 			0x1199	 //传送7仓所有传感器命令
+#define Collector_Get_All_Sensor_Data_Cang08		 			0x119A	 //传送8仓所有传感器命令
+#define Collector_Get_All_Sensor_Data_WholeCar		 			0x119B	 //传送8仓所有传感器命令
+
+
+#define Collector_Get_Valve_OldFormat		  0x0013	//14.	读取运算后的阀门状态,兼容之前的阀门协议,每个bit表示一个状态
+
+
+#define Get_IO_State_New64Byte		 0x20//20210712新增   获取每个仓位的阀门状态
+
+#define SetPara_Yewei_Offset		 0x10//20210122新增   调节液位传感器的高度,间隔1s向控制板发送数据
+#define GuanRongMenXian		 50//当液位高度大于某一门限值强制进行罐容修正
+
+
+
+
+
+
+
+
+
+								  
+////////////////////////////////////////////////////////////////////////////////// 	
+/*********此处关于设置参数以及参数设置后赋值处理,后续有更合适的方法时配置代码不应在按键串口里(如在终端里配置)**************/
+typedef struct //配置的阀门信息
+{
+	uint8_t Config_fun_id;//功能配置ID--是否具备液位传感器;压力传感器;有油无油算法;自动施封
+  uint8_t Collection_id;//采集器ID
+  uint8_t All_number ;//所有的仓数
+  uint8_t ManHole_Big_info; //人孔盖信息
+  uint8_t ManHole_small_info; //人孔小盖信息
+	uint8_t Dump_info; //卸油阀信息
+	uint8_t HaiDiFa_info; //海底阀信息
+	uint16_t Auto_Seal_Time;
+ }Config_INFO_TypeDef;	
+
+ 
+extern Config_INFO_TypeDef Config_info_all;
+extern uint8_t Baseval_ID;
+extern uint8_t  Set_CollectPara_Flag; 
+ 
+extern uint16_t FnKey;//=0x0000;//组合键
+ 
+extern uint8_t Auto_sealedOK_ID_bak;
+extern float V20_Seal[8],Vt_Seal[8],Ht_Seal[8];
+extern float V20_Break[8],Vt_Break[8],Ht_Break[8];
+ 
+//extern  float Vt_Local,V20_Local;//控制器计算的结果或者采集器传来的结果
+extern  float Vt_Local[8]; 
+extern  float V20_Local[8]; 
+//extern   float Vt_Local_Disp;
+ 
+//extern  float Vt_Disp,V20_Disp;
+extern float Vt_Disp[8],V20_Disp[8];//[8]
+extern float ExpansionRatio[8];
+extern float Tempe_For_V20[8];
+extern float  Vt_Local_Disp,V20_Local_Disp;
+ 
+extern uint32_t data_Src_To_Disp;
+ 
+ 
+/******************************************END**********************************************************************/
+extern uint8_t flag_Seal_Break;//破封标志,按键板破封蜂鸣器响
+extern uint16_t Sleep_Timer_cnt3;
+ 
+extern uint16_t tmrForPrinter;
+ 
+extern uint32_t tmrForKeyPad;
+ 
+extern  uint32_t tmrForRemoteCali;
+ 
+extern uint32_t tmrForTemp_ManualInput; 
+ 
+extern uint8_t dbgArray[8];
+extern uint8_t flag_exitReset;
+extern uint8_t flag_Uart4_Busy; 
+extern uint8_t flag_Sw_VoicePlay;
+
+extern  uint8_t product_ID[20];
+extern  uint8_t flag_ShowValveRaw;//是否显示阀门的原始信息00,01等
+extern  uint8_t flag_Sw_DispSysInfo;//是否显示系统运行信息
+ 
+ 
+extern  char PrintBuff[64];
+extern  uint16_t PrintCnt;
+
+extern  uint8_t flag_En_BlankSeal;
+
+
+ 
+extern  int16_t OffsetYewei[8];//offsetLeiDa004;
+//extern  int16_t offsetLeiDa005;
+extern  int16_t OffsetTankCapacity[8];//1仓罐容零点,两字节定时发给采集器
+
+//李伟修改  湖南润安项目    新增传感器与报警信息
+extern float AlarmOfTempeThreshold_Upper,AlarmOfTempeThreshold_Lower;
+extern float AlarmOfPressureThreshold_Upper,AlarmOfPressureThreshold_Lower;
+extern float AlarmArrayData[11];
+extern float BiasOfTempe;//温度修正
+extern float PressureWindowsSpan;//压力窗口时长
+
+extern float PressurePositiveThreshold;//压力正偏门限
+extern float PressureNegativeThreshold;//压力负偏门限
+extern float BiasOfPressure;//压力修正
+extern uint32_t AlgType;//算法类型配置
+
+extern uint32_t usart_timeout,usart_timesec;
+extern uint8_t vt_disp_type;
+
+extern char Version_software[30];
+extern uint8_t Version_hardware[];
+extern uint8_t product_ID[20];
+extern uint32_t FunDebugCode;
+extern uint32_t input_ArrFunDebugCode[5];
+extern uint32_t Version_Soft[8];
+
+void TestUsart4_Receive(void);
+
+void KeySlave485_Init(uint32_t bound);
+void KeySlave485_Send_Data(uint8_t *buf,uint8_t len);
+void KeySlave485_TX_Set(uint8_t en);
+
+uint8_t Get_keyvalue(void );
+void Mode_key_pageID(void );
+void Send_alarm10S(void);
+//void About_KeyFunction(void);
+#endif

+ 6 - 0
Inc/Randomcode.h

@@ -0,0 +1,6 @@
+#ifndef __RANDOMCODE_H
+#define __RANDOMCODE_H
+#include "stm32f7xx_hal.h"
+uint16_t Four_num_encrypt(uint16_t number);
+
+#endif

+ 15 - 0
Inc/ScreenMaster485.h

@@ -0,0 +1,15 @@
+#ifndef __SCREENMASTER485_H
+#define __SCREENMASTER485_H
+#include "stm32f7xx_hal.h"
+								  
+////////////////////////////////////////////////////////////////////////////////// 	
+
+
+
+
+
+void TestUsart3_Receive(void);
+void ScreenMaster485_Init(uint32_t bound);
+void ScreenMaster485_Send_Data(uint8_t *buf,uint8_t len);
+void ScreenMaster485_TX_Set(uint8_t en);
+#endif

+ 468 - 0
Inc/TerminalSlave485.h

@@ -0,0 +1,468 @@
+#ifndef __TERMINALSLAVE485_H
+#define __TERMINALSLAVE485_H
+#include "stm32f7xx_hal.h"
+								  
+////////////////////////////////////////////////////////////////////////////////// 	
+
+#define USART_REC_LEN  			600  	//定义最大接收字节数 600  升级时一包数据256*2个数据
+#define EN_USART1_RX 			1		//使能(1)/禁止(0)串口1接收
+#define FRAME_HEAD 0x3A    //起始字符,英文状态下的“:”
+#define FRAME_END 0x0D0A
+
+//终端功能码定义
+#define Read_data 	0x04	//读数据
+#define Read_para		0x03	//读参数
+#define Set_para 		0x10	//设置参数
+#define Update			0x41	//升级
+#define Read_Version 0x2B //读取版本号
+#define Control_IO  0x0F  //控制状态IO
+#define TEST_State  0x30  //测试通信状态
+#define Data_alibration 0x05//数据标定
+#define PlatformTransfer  0x06
+#define TERMINAL_CONTROL_CMD_RESPOND     0x30
+#define TERMINAL_CONTROL_GET_SENSOR_D1   0x91
+#define TERMINAL_CONTROL_GET_SENSOR_D2   0x92
+
+//李伟修改    20210610
+#define TERMINAL_CONTROL_CMD_REMOTE_CAL     0x39   //远程标定命令--根据5月份的远程标定会议文件进行修改。固定长度为64字节
+
+//李伟修改    20210702
+#define TERMINAL_CONTROL_Seal_By_ElecFence     0x38   //出电子围栏进行施封
+
+
+
+#define TERMINAL_CONTROL_GET_ELEC_SEAL_STATE    0x40   //李伟增加  20210610  电子铅封状态
+#define TERMINAL_CONTROL_GET_CABINET01_STATE    0x47   //李伟增加  20210610  1仓传感器数据
+#define TERMINAL_CONTROL_GET_CABINET02_STATE    0x48   //李伟增加  20210610  2仓传感器数据
+#define TERMINAL_CONTROL_GET_CABINET03_STATE    0x49   //李伟增加  20210610  3仓传感器数据
+#define TERMINAL_CONTROL_GET_CABINET04_STATE    0x4a   //李伟增加  20210610  4仓传感器数据
+#define TERMINAL_CONTROL_GET_CABINET05_STATE    0x4b   //李伟增加  20210610  5仓传感器数据
+#define TERMINAL_CONTROL_GET_CABINET06_STATE    0x4c   //李伟增加  20210610  6仓传感器数据
+#define TERMINAL_CONTROL_GET_CABINET07_STATE    0x4d   //李伟增加  20210610  7仓传感器数据
+#define TERMINAL_CONTROL_GET_CABINET08_STATE    0x4e   //李伟增加  20210610  8仓传感器数据
+
+
+#define TERMINAL_CONTROL_GET_Store01_ALL_Sensor    0x93    
+#define TERMINAL_CONTROL_GET_Store02_ALL_Sensor    0x94    
+#define TERMINAL_CONTROL_GET_Store03_ALL_Sensor    0x95    
+#define TERMINAL_CONTROL_GET_Store04_ALL_Sensor    0x96    
+#define TERMINAL_CONTROL_GET_Store05_ALL_Sensor    0x97    
+#define TERMINAL_CONTROL_GET_Store06_ALL_Sensor    0x98    
+#define TERMINAL_CONTROL_GET_Store07_ALL_Sensor    0x99    
+#define TERMINAL_CONTROL_GET_Store08_ALL_Sensor    0x9A    
+#define TERMINAL_CONTROL_GET_Whole_Car_Sensor    	 0x9B    
+
+#define LenthOf_Reply0x93    	 159     //1+6+148+2+2 
+
+
+//取自国标的3条modbus命令
+#define JL_COMMON_CMD_ReadReg03     0x0003
+#define JL_COMMON_CMD_WriteReg06    0x0006
+#define JL_COMMON_CMD_WriteRegs10   0x0010
+
+#define Broadcast_data 0x10
+
+//usart Rx data
+typedef struct
+{
+	uint8_t Frame_head;//帧头
+	uint8_t Frame_addr;//外设地址
+	uint8_t Frame_funcode;//功能码
+	uint16_t Frame_message_id;//消息ID
+	
+//	u16 Frame_regaddr;//读取的寄存器
+//	u16 Frame_regcnt;//读取寄存器的个数
+	uint16_t Frame_length;//数据长度
+	uint16_t Carbration_len;//标定数据长度
+	uint16_t Carbration_sum;//标定数据总包
+	uint16_t Carbration_child;//子包
+	uint8_t  *Frame_data;//数据区  后续不知道需不需要扩展
+	uint16_t Frame_LRC;//校验
+	uint16_t Frame_end;//结束符
+}Data_frame_TypeDef;
+extern Data_frame_TypeDef data_frame,Tx_data_frame;
+//typedef struct {
+//	uint8_t ID ;//仓的ID  47 .。。
+//	uint8_t length ;//数据总长度
+//	uint8_t Communication_para[8];//通讯参数
+//	uint8_t Genel_para[56];//常规参数
+//}All_para_TypeDef;
+//extern All_para_TypeDef All_para;
+typedef struct Oil_Data_frame
+{
+	uint32_t Level_ADvalue;					//油位高度AD值----更改为第1个温度数据
+	
+//	
+//	uint32_t Level_temperature;			//液体温度
+//	uint32_t Temperature;						//环境温度
+	
+	uint32_t Liquid_Temp;			//液体温度---实际上为浮点数,u32格式传输,4字节 替换为第2个温度数据
+	uint32_t EnvTemperature;		//环境温度	---实际上为浮点数,u32格式传输,4字节 替换为第3个温度数据
+	 
+	//20201219李伟同龚天平、张毅商量后更改;将加油量替换为倾角数据
+	uint32_t Add_oilvalue;		//加油量---实际上为浮点数,u32格式传输,4字节 
+	
+	////20210227根据戴永峰的协议修改——原来漏油量的位置变更为倾角2
+	uint32_t Dec_oilvalue;		//漏油量---实际上为浮点数,u32格式传输,4字节
+	
+	////油箱油量替换为定期上报的密度数据   李伟修改   20210301  同张毅商定后修改
+	uint32_t Oil_boxvalue;		//油箱油量------更改为密度数据,上位机平台要按照浮点数解析
+	
+	
+	
+	uint32_t LevelPercent_or_PressValue;//液位百分比或者压力值
+	uint32_t Level_value;					 //液位高度---实际上为浮点数,u32格式传输,4字节
+}Oil_Data_frame	;
+
+typedef struct IO_Data_frame
+{
+	uint8_t IO_emergencyflag;			 		//重要数据标识  bit7  0/1
+	uint8_t IO_allnum;			//IO总数  m 1-255
+	uint8_t IO_normaldata;						//正常或者异常数据  0/1
+	uint8_t IO_statenum;					//IO状态组数   n(1~8)  n=(m/32)+1
+	uint32_t IO_state[8];					//IO状态  4*n
+	uint32_t IO_normalstate[8];				//正常异常状态
+	
+	uint32_t Temp_IO_state[8];					//IO临时状态  4*n
+	uint32_t Temp_IO_normalstate[8];				//正常异常临时状态
+	uint8_t  Updata_TempVar[8];
+	uint32_t IO_unload_switch;			//卸尽开关监测 有油位置1,无油位置0
+	uint8_t IO_Discharge_state;		//新版卸尽信号输入监测
+	
+}IO_Data_frame	;
+
+//电子铅封数据帧
+typedef struct Seal_Data_frame
+{
+	uint8_t Sealing_up_datetype;//上传数据类型   常规数据、解封施封等破封  0:默认 1:解封   2 :施封   3:破封
+	uint8_t Sealing_emergencyflag;					//重要数据标识  bit7  0/1
+	uint8_t Sealing_type;			//电子铅封数据类型
+	uint16_t Sesling_All_num;						//仓数量
+	//1~n仓
+	uint8_t Sesling_ID[8];					//仓号
+	uint8_t Sealing_state_oiltype[8];//罐仓状态与油品
+	uint8_t Sealing_Mode[8];					//铅封状态与装油模式
+	uint8_t Sealing_IO_state[8];      //装油模式与阀门逻辑是否正常
+	//1~n仓
+	uint16_t Sealing_num;//解封仓数量
+	uint8_t Sealing_num_id[8];//解封仓号
+	uint8_t Sealing_Random_code[3];//解封码
+	uint8_t Sealing_Ask_code[3];//匹配码
+	
+	uint8_t TerminalOnLineFlag;
+}Seal_Data_frame	;
+
+
+typedef struct Version_Data_frame
+{
+	uint8_t *Version_comname;						//公司名称 SHJL
+	uint8_t *Version_allnum;							//产品代码  02
+	uint8_t *Version_normaldata;					//硬件版本号
+	uint8_t *Version_statenum;						//软件版本号 99.33.22长度不超过8字节
+	uint8_t *Version_state;							//设备ID 
+	uint8_t *Version_normalstate;				//客户代码  
+}Version_Data_frame	;
+
+typedef struct IO_Data_Reg
+{
+	uint16_t IO_Addr;							//2字节外设地址 30寄存器
+	uint16_t IO_bound;							//2字节 波特率	31寄存器
+	uint16_t IO_Parity;						//2字节奇偶校验	32寄存器
+	uint16_t Bacup;								//预留
+}IO_Data_Reg	;
+
+extern uint8_t Oil_Data_Reg[64];
+extern  uint8_t CarLicCodeArray[31][16];
+extern Oil_Data_frame Oil_Data;
+
+
+extern  uint8_t Data_V20_From_Server[68];//来自平台的0x64数据帧
+
+extern  struct All_para  All_Para;
+typedef struct Calibration_data
+{
+	uint16_t ID ;//仓的ID  47 .。。
+	uint16_t  All_pack;//总包数
+	uint16_t Child_pack_len[10];//子包长度
+	uint8_t Oil_Carlibration_data[500];//标定数据
+	uint16_t Old_ID;//上一次的ID
+}Calibration_data;
+
+typedef struct Save_Calibration_Inof
+{
+	uint8_t id[4];//仓号
+	uint16_t ALL_pack[4];//总包数
+	uint16_t Length[4];//总长度
+}Save_Calibration_Inof;
+
+typedef struct Update_data
+{
+	uint16_t All_pack_no;//总包数
+	uint16_t pack_no;//子包序号
+	uint32_t Sum_all;//总校验和
+	uint32_t Sum_pack;//子包校验和
+	uint8_t *data;//数据
+	
+}Update_data;
+
+
+typedef struct Return_data
+{
+	uint8_t *data;
+	uint16_t length;
+	
+}Return_data;
+
+
+
+//Daiyf ??
+typedef struct _T2C_SetupData
+{
+  	uint16_t   year;
+	uint8_t    month;
+	uint8_t    day;
+  	uint8_t    hour;
+	uint8_t    minute;
+	uint8_t    second;
+	uint8_t    m_second;
+	float      longitude;
+	float      latitude;
+	float      Capacity_Vt;
+	float      Capacity_V20;
+	float      liquid_level;
+	float      temperature;
+	float      inclination_angle_x;
+	float      inclination_angle_y;
+	float      pressure;
+	float      density;
+	float      Reserved_parameters_1;
+	float      Reserved_parameters_2;
+	float      Reserved_parameters_3;
+	float      Reserved_parameters_4;
+ 
+}sT2C_SetupData;
+
+
+/*
+前16字节为固定帧头,接下来8字节为保留待扩展,接下来8个参数32字节为整车模拟量信息(倾角、速度等),
+最后为4仓的模拟量参数与校验信息。
+总长度:16+8+32+4*4*11+4=236字节。(废除F3之后容量将会加倍,最大长度按照800字节设计)
+*/
+//李伟修改  20210928   1-4,5-8仓模拟量数据
+typedef struct _T2C_MoniLiang_Data
+{
+  uint8_t   	FrameHead[16];
+	uint8_t    	ResData[8];
+	float      	MoniLiang_DataOf_Car[8];
+	float      	MoniLiang_DataOfCang_1to4[11*4];
+	uint8_t    	chkLRC_Data[2];
+	uint8_t    	chkCRCModbus_Data[2];
+ 
+}sT2C_MoniLiang_Data;
+
+
+typedef struct _T2C_ALL_Sensor_Data_Each_Cang
+{//每仓传感器
+  uint8_t   	FrameHead[16];	
+	uint32_t    ElecSealState;
+	uint32_t    IO_Valve_Data_Every_Cang[21];
+	float      	MoniLiang_Data_Every_Cang[19];
+	uint8_t    	chkCRCModbus_Data[2];
+ 
+}sT2C_ALL_Sensor_Data_Each_Cang;
+
+typedef struct _T2C_ALL_Sensor_Data_WholeCar
+{//整车传感器数据  倾角  备电等
+	uint8_t   	FrameHead[16];
+  	float 	   	tiltXYZ[3];	
+	uint32_t    BeiDian_State_OnOff;//备电开关状态
+	float    		BeiDianDianLiang;
+	uint32_t    YouQiHuiShou_State_OnOff;//开关状态
+	uint32_t    YouQiHuiShou_State_Photo;//光电状态
+	uint32_t    ResPara[13];//备用参数
+	uint8_t    	chkCRCModbus_Data[2];//暂未使用
+ 
+}sT2C_ALL_Sensor_Data_WholeCar;
+
+
+typedef struct _T2C_IO_Valve_Data   //开关量数据---针对内蒙古项目
+{
+  uint8_t   	FrameHead[16];
+	uint8_t    	ResData[8];
+	float      	IO_Valve_DataOf_Car[8];
+	float      	IO_Valve_DataOfCang_1to4[11*4];
+	uint8_t    	chkLRC_Data[2];
+	uint8_t    	chkCRCModbus_Data[2];
+ 
+}sT2C_IO_Valve_Data;
+
+/* zhuzl 20211220 增加发送帧的结构定义*/
+#pragma pack (1)
+typedef struct _NEIMENG_FRAME
+{
+	//uint8_t  Frame_41;
+	uint32_t Frame_Identification;
+	uint16_t Frame_Len;
+	uint16_t Serial_Num;
+	uint16_t Total_Packages;
+	uint16_t Current_Package;
+	uint16_t Message_Num;
+	uint32_t Version;
+	uint8_t  Frame_Head[16];
+	uint8_t  Time[6]; //年、月、日、时、分、秒
+	uint8_t  Is_Retransmit;
+	uint8_t	 Reserver1;
+	uint8_t  Data[768];
+}sNEIMENG_FRAME;
+#pragma pack ()
+//zhuzl add end
+
+
+
+//李伟修改  20210610  远程标定命令结构体
+/*
+总长度为64字节;后期自己研发终端可以扩大,预计1k字节可以实现。
+帧头2字节0x 3901
+地址码 4字节,比如0x95510001
+功能码2字节   只能是0x0003、0x0006或者0x0010
+寄存器起始地址2字节:合法范围为0x0000~0xffff
+数据个数2字节:最多读取0xffff字节;实际取决于终端限制,目前为256字节
+保留字4字节
+有效载荷44字节
+保留字2字节
+校验2字节
+*/
+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[192];	//有效载荷具体有三种:44,或者76字节,或者108字节;字节 16--59
+	uint16_t   ReserveData002;	//保留字2字节    60--61
+	uint16_t   CheckSum;				//校验2字节      62--63
+ 
+ 
+}sT2C_RemoteCaliDat;
+
+typedef struct _T2C_SealByElec_Fence
+{
+  uint8_t   FrameHead;   		//帧头 0-1
+	uint8_t    FrmLength; 	//数据长度
+	uint8_t   FunctionCode;		//功能码1字节   只能是0x03
+  uint8_t   TypeOf_Seal;//离开油库  离开加油站   速度达到xx
+	uint8_t   Array_res000[56];		//数据个数2字节:最多读取0xffff字节;实际取决于终端限制,目前为256字节  10--11
+ //李伟修改   20211208
+	uint8_t   TpyeOfUnSeal;   		//解封类型  01=正常解封   02=强制解封
+	uint8_t   Array_NumOfCab_To_UnSeal[8];//
+ 
+}sT2C_SealByElec_Fence;
+
+
+extern 	sT2C_SetupData *pT2C_SetupData;
+extern 	sT2C_SetupData T2C_SetupData[8];
+
+extern  sT2C_MoniLiang_Data T2C_MoniLiang_Data_Cang1to4,T2C_MoniLiang_Data_Cang5to8;
+extern 	sT2C_MoniLiang_Data *pT2C_MoniLiang_Data;
+
+
+extern 	sT2C_SetupData *pT2C_SetupData_Con2Server;
+
+
+extern sT2C_SealByElec_Fence *pT2C_SealByElec_Fence;
+extern sT2C_SealByElec_Fence T2C_SealByElec_Fence001;
+
+
+extern sT2C_ALL_Sensor_Data_Each_Cang* pT2C_ALL_Sensor_Data;
+extern sT2C_ALL_Sensor_Data_Each_Cang T2C_ALL_Sensor_Data01,T2C_ALL_Sensor_Data02,T2C_ALL_Sensor_Data03,T2C_ALL_Sensor_Data04;
+extern sT2C_ALL_Sensor_Data_Each_Cang T2C_ALL_Sensor_Data05,T2C_ALL_Sensor_Data06,T2C_ALL_Sensor_Data07,T2C_ALL_Sensor_Data08;
+
+
+extern sT2C_ALL_Sensor_Data_WholeCar* pT2C_ALL_Sensor_WholeCar;
+extern sT2C_ALL_Sensor_Data_WholeCar T2C_ALL_Sensor_WholeCar01;
+
+
+typedef struct Data_From_Server_0x6401
+{
+	int16_t Year ;//
+	int16_t  Month;//
+	int16_t Date;//
+	int16_t Hour;//
+	int16_t Minute;//
+	int16_t Second;
+	float Longi;
+	float Lati;
+	float Vt;
+	float V20;
+	float Yewei;
+	float Temper;
+	float QingjiaoX;
+	float QingjiaoY;
+	float Pressure;
+	float Density;
+	float res001;
+	float res002;
+	uint8_t res001_u8;//控制屏幕显示本地计算的数据还是来自服务器的数据,比如Vt,V20等
+	uint8_t res002_u8;
+	uint8_t res003_u8;
+	uint8_t res004_u8;
+	
+}Data_From_Server_0x6401;
+
+
+extern Data_From_Server_0x6401  Data_From_Server_0x6401_001;
+extern char Version[30];
+extern uint8_t Oil_Carlibration_data[500];
+extern uint8_t UP_date_flag ;
+//extern uint8_t  USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符 
+extern struct Save_Calibration_Inof Save_Calibration_inof;
+extern Seal_Data_frame Sealing_Data;
+extern IO_Data_frame IO_Date;
+
+
+extern Data_From_Server_0x6401  Data_From_Server_0x6401_00;
+
+
+
+extern  uint8_t CarLicensePlate[64];
+
+extern  uint32_t addr_ext_controllBoard;
+
+//如果想串口中断接收,请不要注释以下宏定义
+void uart_init1(uint32_t bound);
+void Data_analysis(void);
+uint8_t * Oil_Tx_Readvalue(uint8_t exaddr,uint16_t ID,uint16_t length);
+Return_data * IO_Tx_Readvalue(uint16_t ID,uint16_t length);//读取IO阀门开关的应答;
+//u8 * Version_Tx_Readvalue(u16 ID,u16 length);
+Return_data * Version_Tx_Readvalue(uint16_t ID,uint16_t length);
+Return_data * Oil_Tx_Readpara(uint16_t ID,uint16_t length);
+uint8_t * IO_Tx_Readpara(uint16_t ID,uint16_t length);//读取寄存器的参数值
+uint8_t  Set_Io_Paravalue(uint16_t ID,uint16_t length1,uint8_t * data);
+uint8_t  Set_Oil_Paravalue(uint16_t ID,uint16_t length1,uint8_t * data);
+void Tx_data_to_ask(Data_frame_TypeDef temp_data);
+
+uint8_t Set_Carlibration_data(uint16_t ID,uint8_t pack,uint16_t length1,uint8_t*data);
+//Return_data * Read_Carlibration_data(u16 ID,u8 pack);
+Return_data * Read_Carlibration_data(uint16_t ID,uint8_t pack,uint16_t length);
+
+Return_data * Seal_Tx_Readvalue(uint16_t ID,uint16_t length);//读取电子铅封的应答
+
+uint8_t Get_Ask_code_value(uint16_t ID,uint16_t length1,uint8_t*data);//获取平台下发的解封码 
+
+uint8_t Cang_ID(uint16_t ID);
+
+void WriteCarLicensePlate(void); //保存车牌号
+
+void TerminalSlave485_Send_Data(uint8_t *buf,uint16_t len);
+void TerminalSlave485_TX_Set(uint8_t en);
+void TestUsart1_Receive(void);
+//int  	Process_CMD_0x30(void);//温度、密度等调试数据下发
+
+int 	Process_CMD_0x30_ManualFix(void);//电子围栏自动施封
+int 	Process_CMD_0x38_AutoSeal_By_ElecFence(void);//电子围栏自动施封
+int 	Process_CMD_0x39_RemoteCali(uint8_t dataMode);//远程标定
+void FormatEachStoreData(uint8_t storeNum);
+void FormatWholeCarData(void);
+#endif

+ 86 - 0
Inc/dma.h

@@ -0,0 +1,86 @@
+/**
+  ******************************************************************************
+  * File Name          : dma.h
+  * Description        : This file contains all the function prototypes for
+  *                      the dma.c file
+  ******************************************************************************
+  * This notice applies to any and all portions of this file
+  * that are not between comment pairs USER CODE BEGIN and
+  * USER CODE END. Other portions of this file, whether 
+  * inserted by the user or by software development tools
+  * are owned by their respective copyright owners.
+  *
+  * Copyright (c) 2019 STMicroelectronics International N.V. 
+  * All rights reserved.
+  *
+  * Redistribution and use in source and binary forms, with or without 
+  * modification, are permitted, provided that the following conditions are met:
+  *
+  * 1. Redistribution of source code must retain the above copyright notice, 
+  *    this list of conditions and the following disclaimer.
+  * 2. Redistributions in binary form must reproduce the above copyright notice,
+  *    this list of conditions and the following disclaimer in the documentation
+  *    and/or other materials provided with the distribution.
+  * 3. Neither the name of STMicroelectronics nor the names of other 
+  *    contributors to this software may be used to endorse or promote products 
+  *    derived from this software without specific written permission.
+  * 4. This software, including modifications and/or derivative works of this 
+  *    software, must execute solely and exclusively on microcontroller or
+  *    microprocessor devices manufactured by or for STMicroelectronics.
+  * 5. Redistribution and use of this software other than as permitted under 
+  *    this license is void and will automatically terminate your rights under 
+  *    this license. 
+  *
+  * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" 
+  * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT 
+  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 
+  * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY
+  * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT 
+  * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 
+  * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 
+  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
+  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+  *
+  ******************************************************************************
+  */
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __dma_H
+#define __dma_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+
+/* DMA memory to memory transfer handles -------------------------------------*/
+
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* USER CODE BEGIN Private defines */
+
+/* USER CODE END Private defines */
+
+void MX_DMA_Init(void);
+
+/* USER CODE BEGIN Prototypes */
+
+/* USER CODE END Prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __dma_H */
+
+/**
+  * @}
+  */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

+ 91 - 0
Inc/ds1302drv.h

@@ -0,0 +1,91 @@
+#ifndef __DS1302DRV_H__
+#define __DS1302DRV_H__
+ 
+ 
+#include "stm32f7xx_hal.h"
+ 
+#include "stm32f7xx_hal.h"
+ 
+ 
+#define DEF_true 	1
+#define DEF_false 0
+ 
+ 
+#define kRamSize 31
+ 
+#define DS1302_SCLK_GPIO_Port 	GPIOB
+#define DS1302_SCLK_Pin 				GPIO_PIN_9
+//DS1302_CE_GPIO_Port, DS1302_CE_Pin
+#define DS1302_CE_GPIO_Port 	GPIOE
+#define DS1302_CE_Pin 				GPIO_PIN_1
+
+//DS1302_IO_GPIO_Port, DS1302_IO_Pin
+#define DS1302_IO_GPIO_Port 	GPIOE
+#define DS1302_IO_Pin 				GPIO_PIN_0
+
+
+
+
+typedef enum
+{
+  kSecondReg       = 0,
+  kMinuteReg       = 1,
+  kHourReg         = 2,
+  kDateReg         = 3,
+  kMonthReg        = 4,
+  kDayReg          = 5,
+  kYearReg         = 6,
+  kWriteProtectReg = 7,
+  kChargeReg			 = 8,
+ 
+  // The RAM register space follows the clock register space.
+  kRamAddress0     = 32
+} DS1302_Register;
+ 
+typedef enum
+{
+  kClockBurstRead  = 0xBF,
+  kClockBurstWrite = 0xBE,
+  kRamBurstRead    = 0xFF,
+  kRamBurstWrite   = 0xFE
+} DS1302_Command;
+ 
+typedef enum 
+{
+    kSunday    = 1,
+    kMonday    = 2,
+    kTuesday   = 3,
+    kWednesday = 4,
+    kThursday  = 5,
+    kFriday    = 6,
+    kSaturday  = 7
+} DS1302_Day;		 
+ 
+ 
+ 
+ 
+extern uint8_t time_buf_reg[8];
+ 
+ 
+ 
+uint8_t bcdToDec(const uint8_t bcd) ;
+uint8_t decToBcd(const uint8_t dec) ;
+uint8_t hourFromRegisterValue(const uint8_t value);
+void DS1302_writeOut(const uint8_t value, uint8_t readAfter) ;
+uint8_t DS1302_readIn(void) ;
+uint8_t DS1302_readRegister(const uint8_t reg) ;
+void DS1302_writeRegister(const uint8_t reg, const uint8_t value) ;
+void DS1302_writeProtect(const uint8_t enable) ;
+void DS1302_halt(const uint8_t enable) ;
+void DS1302_writeRam(const uint8_t address, const uint8_t value) ;
+uint8_t DS1302_readRam(const uint8_t address) ;
+void DS1302_writeRamBulk(const uint8_t* const data, int len) ;
+void DS1302_readRamBulk(uint8_t* const data, int len) ;
+ 
+//Top layer function
+void DS1302_timeRead(void) ;
+void DS1302_timeWrite(void) ;
+ 
+ 
+#endif /* __DS1302DRV_H__ */
+

+ 87 - 0
Inc/gpio.h

@@ -0,0 +1,87 @@
+/**
+  ******************************************************************************
+  * File Name          : gpio.h
+  * Description        : This file contains all the functions prototypes for 
+  *                      the gpio  
+  ******************************************************************************
+  * This notice applies to any and all portions of this file
+  * that are not between comment pairs USER CODE BEGIN and
+  * USER CODE END. Other portions of this file, whether 
+  * inserted by the user or by software development tools
+  * are owned by their respective copyright owners.
+  *
+  * Copyright (c) 2019 STMicroelectronics International N.V. 
+  * All rights reserved.
+  *
+  * Redistribution and use in source and binary forms, with or without 
+  * modification, are permitted, provided that the following conditions are met:
+  *
+  * 1. Redistribution of source code must retain the above copyright notice, 
+  *    this list of conditions and the following disclaimer.
+  * 2. Redistributions in binary form must reproduce the above copyright notice,
+  *    this list of conditions and the following disclaimer in the documentation
+  *    and/or other materials provided with the distribution.
+  * 3. Neither the name of STMicroelectronics nor the names of other 
+  *    contributors to this software may be used to endorse or promote products 
+  *    derived from this software without specific written permission.
+  * 4. This software, including modifications and/or derivative works of this 
+  *    software, must execute solely and exclusively on microcontroller or
+  *    microprocessor devices manufactured by or for STMicroelectronics.
+  * 5. Redistribution and use of this software other than as permitted under 
+  *    this license is void and will automatically terminate your rights under 
+  *    this license. 
+  *
+  * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" 
+  * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT 
+  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 
+  * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY
+  * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT 
+  * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 
+  * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 
+  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
+  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+  *
+  ******************************************************************************
+  */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __gpio_H
+#define __gpio_H
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* USER CODE BEGIN Private defines */
+
+/* USER CODE END Private defines */
+
+void MX_GPIO_Init(void);
+
+/* USER CODE BEGIN Prototypes */
+
+/* USER CODE END Prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+#endif /*__ pinoutConfig_H */
+
+/**
+  * @}
+  */
+
+/**
+  * @}
+  */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

+ 55 - 0
Inc/leaf_ota.h

@@ -0,0 +1,55 @@
+#ifndef __LEAF_OTA_H_
+#define __LEAF_OTA_H_
+#include "main.h"
+
+
+/* 开关全局中断的宏 */
+#define ENABLE_INT()	__set_PRIMASK(0)	/* 使能全局中断 */
+#define DISABLE_INT()	__set_PRIMASK(1)	/* 禁止全局中断 */
+
+
+#define PageSize		1024			//1K
+#define Appear_si 128
+
+/*=====用户配置(根据自己的分区进行配置)=====*/
+#define BootLoader_Size 		0xA000			///< BootLoader的大小 40K
+#define Appear_Size 		0x6000			///< BootLoader的大小 40K
+#define Application_Size		0x20000			///< 应用程序的大小 128K
+
+//#define Application_1_Addr		0x08010000		///< 应用程序1的首地址
+//#define Application_2_Addr		0x08030000		///< 应用程序2的首地址
+//#define Application_2_Addr		0x08017FFF		///< 应用程序2的首地址
+
+#define Application_1_Addr		ADDR_FLASH_SECTOR_0		///< 应用程序1的首地址
+#define Application_2_Addr		ADDR_FLASH_SECTOR_6		///< 应用程序2的首地址
+
+#define Application_Buffer_Addr		ADDR_FLASH_SECTOR_7		///< 接收到的文件存储区
+/*==========================================*/
+
+#define StartMode_Addr		ADDR_FLASH_SECTOR_4		///< 应用程序2的首地址
+
+
+
+/* 启动选项 */
+#define Startup_Normal 	0xFFFFFFFF	///< 正常启动   跳转到APP1
+#define Startup_Update 	0xAAAAAAAA	///< 升级再启动 
+#define Startup_Reset  	0x5555AAAA	///< ***恢复出厂 目前没使用***
+#define Startup_APP2  	0x5555BBBB	///< ***跳转到APP2***
+
+
+/* Base address of the Flash sectors */ 
+#define ADDR_FLASH_SECTOR_0     ((uint32_t)0x08000000) /* Base address of Sector 0, 32 Kbytes */
+#define ADDR_FLASH_SECTOR_1     ((uint32_t)0x08008000) /* Base address of Sector 1, 32 Kbytes */
+#define ADDR_FLASH_SECTOR_2     ((uint32_t)0x08010000) /* Base address of Sector 2, 32 Kbytes */
+#define ADDR_FLASH_SECTOR_3     ((uint32_t)0x08018000) /* Base address of Sector 3, 32 Kbytes */
+#define ADDR_FLASH_SECTOR_4     ((uint32_t)0x08020000) /* Base address of Sector 4, 128 Kbytes */
+#define ADDR_FLASH_SECTOR_5     ((uint32_t)0x08040000) /* Base address of Sector 5, 256 Kbytes */
+#define ADDR_FLASH_SECTOR_6     ((uint32_t)0x08080000) /* Base address of Sector 6, 256 Kbytes */
+#define ADDR_FLASH_SECTOR_7     ((uint32_t)0x080C0000) /* Base address of Sector 7, 256 Kbytes */
+
+
+void Start_BootLoader(void);
+uint8_t Erase_page(uint32_t pageaddr, uint32_t num);
+void WriteFlash2(uint32_t addr, uint32_t *buff, int word_size);
+#endif
+

+ 189 - 0
Inc/main.h

@@ -0,0 +1,189 @@
+/* USER CODE BEGIN Header */
+/**
+  ******************************************************************************
+  * @file           : main.h
+  * @brief          : Header for main.c file.
+  *                   This file contains the common defines of the application.
+  ******************************************************************************
+  * This notice applies to any and all portions of this file
+  * that are not between comment pairs USER CODE BEGIN and
+  * USER CODE END. Other portions of this file, whether 
+  * inserted by the user or by software development tools
+  * are owned by their respective copyright owners.
+  *
+  * Copyright (c) 2019 STMicroelectronics International N.V. 
+  * All rights reserved.
+  *
+  * Redistribution and use in source and binary forms, with or without 
+  * modification, are permitted, provided that the following conditions are met:
+  *
+  * 1. Redistribution of source code must retain the above copyright notice, 
+  *    this list of conditions and the following disclaimer.
+  * 2. Redistributions in binary form must reproduce the above copyright notice,
+  *    this list of conditions and the following disclaimer in the documentation
+  *    and/or other materials provided with the distribution.
+  * 3. Neither the name of STMicroelectronics nor the names of other 
+  *    contributors to this software may be used to endorse or promote products 
+  *    derived from this software without specific written permission.
+  * 4. This software, including modifications and/or derivative works of this 
+  *    software, must execute solely and exclusively on microcontroller or
+  *    microprocessor devices manufactured by or for STMicroelectronics.
+  * 5. Redistribution and use of this software other than as permitted under 
+  *    this license is void and will automatically terminate your rights under 
+  *    this license. 
+  *
+  * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" 
+  * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT 
+  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 
+  * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY
+  * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT 
+  * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 
+  * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 
+  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
+  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+  *
+  ******************************************************************************
+  */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __MAIN_H
+#define __MAIN_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32f7xx_hal.h"
+
+#ifndef IR_ROM1
+#define IR_ROM1 0x8000000  //APP1
+//#define IR_ROM1 	0x8080000 //APP2
+#endif
+
+
+
+extern uint32_t sd000,sd001;//浮点数转换为实时显示的参数,4字节
+extern uint16_t uart4RxCounter; //串口4接收数据计数器
+
+
+
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+#define False 0
+#define True !False
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported macro ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions prototypes ---------------------------------------------*/
+void Error_Handler(void);
+
+/* USER CODE BEGIN EFP */
+
+/* USER CODE END EFP */
+
+/* Private defines -----------------------------------------------------------*/
+#define BEEP_Pin GPIO_PIN_4
+#define BEEP_GPIO_Port GPIOE
+#define LED1_Pin GPIO_PIN_5
+#define LED1_GPIO_Port GPIOE
+#define DWI_Pin GPIO_PIN_2
+#define DWI_GPIO_Port GPIOC
+#define EN_USART2_Pin GPIO_PIN_1
+#define EN_USART2_GPIO_Port GPIOA
+#define Collect_TX_Pin GPIO_PIN_2
+#define Collect_TX_GPIO_Port GPIOA
+#define Collect_RX_Pin GPIO_PIN_3
+#define Collect_RX_GPIO_Port GPIOA
+#define Feeler_Lever_Pin GPIO_PIN_0
+#define Feeler_Lever_GPIO_Port GPIOB
+#define Feeler_Lever_EXTI_IRQn EXTI0_IRQn
+#define LED2_Pin GPIO_PIN_7
+#define LED2_GPIO_Port GPIOE
+#define LED3_Pin GPIO_PIN_8
+#define LED3_GPIO_Port GPIOE
+#define LED4_Pin GPIO_PIN_9
+#define LED4_GPIO_Port GPIOE
+#define LED5_Pin GPIO_PIN_10
+#define LED5_GPIO_Port GPIOE
+#define SPI4_FM25_NSS_Pin GPIO_PIN_11
+#define SPI4_FM25_NSS_GPIO_Port GPIOE
+#define SPI4_FM25_SCK_Pin GPIO_PIN_12
+#define SPI4_FM25_SCK_GPIO_Port GPIOE
+#define SPI4_FM25_MISO_Pin GPIO_PIN_13
+#define SPI4_FM25_MISO_GPIO_Port GPIOE
+#define SPI4_FM25_MOSI_Pin GPIO_PIN_14
+#define SPI4_FM25_MOSI_GPIO_Port GPIOE
+#define EN_USART3_Pin GPIO_PIN_15
+#define EN_USART3_GPIO_Port GPIOE
+#define Screen_TX_Pin GPIO_PIN_10
+#define Screen_TX_GPIO_Port GPIOB
+#define Screen_RX_Pin GPIO_PIN_11
+#define Screen_RX_GPIO_Port GPIOB
+#define Key10_Pin GPIO_PIN_10
+#define Key10_GPIO_Port GPIOD
+#define Key10_EXTI_IRQn EXTI15_10_IRQn
+#define Key11_Pin GPIO_PIN_11
+#define Key11_GPIO_Port GPIOD
+#define Key11_EXTI_IRQn EXTI15_10_IRQn
+#define Key12_Pin GPIO_PIN_12
+#define Key12_GPIO_Port GPIOD
+#define Key12_EXTI_IRQn EXTI15_10_IRQn
+#define Key13_Pin GPIO_PIN_13
+#define Key13_GPIO_Port GPIOD
+#define Key13_EXTI_IRQn EXTI15_10_IRQn
+#define EN_USART1_Pin GPIO_PIN_8
+#define EN_USART1_GPIO_Port GPIOC
+#define Terminal_TX_Pin GPIO_PIN_9
+#define Terminal_TX_GPIO_Port GPIOA
+#define Terminal_RX_Pin GPIO_PIN_10
+#define Terminal_RX_GPIO_Port GPIOA
+#define Key_TX_Pin GPIO_PIN_10
+#define Key_TX_GPIO_Port GPIOC
+#define Key_RX_Pin GPIO_PIN_11
+#define Key_RX_GPIO_Port GPIOC
+#define EN_USART4_Pin GPIO_PIN_0
+#define EN_USART4_GPIO_Port GPIOD
+
+
+
+
+
+
+
+
+/* USER CODE BEGIN Private defines */
+
+
+extern uint8_t StoreNumber,all_Store;
+
+
+
+/* USER CODE END Private defines */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __MAIN_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

+ 27 - 0
Inc/md5c.h

@@ -0,0 +1,27 @@
+#ifndef __MD5C_H__
+#define __MD5C_H__
+/* POINTER defines a generic pointer type */ 
+typedef unsigned char * POINTER; 
+ 
+/* UINT2 defines a two byte word */ 
+//typedef unsigned short int UINT2; 
+ 
+/* UINT4 defines a four byte word */ 
+typedef unsigned long int UINT4; 
+ 
+ 
+/* MD5 context. */ 
+typedef struct { 
+ UINT4 state[4];         /* state (ABCD) */ 
+ UINT4 count[2];  /* number of bits, modulo 2^64 (lsb first) */ 
+ unsigned char buffer[64];       /* input buffer */ 
+} MD5_CTX; 
+ 
+void MD5Init (MD5_CTX *context); 
+void MD5Update (MD5_CTX *context, unsigned char *input, unsigned int inputLen); 
+void MD5UpdaterString(MD5_CTX *context,const char *string); 
+int MD5FileUpdateFile (MD5_CTX *context,char *filename); 
+void MD5Final (unsigned char digest[16], MD5_CTX *context); 
+void MDString (char *string,unsigned char digest[16]); 
+int MD5File (char *filename,unsigned char digest[16]); 
+#endif

+ 104 - 0
Inc/spi.h

@@ -0,0 +1,104 @@
+/**
+  ******************************************************************************
+  * File Name          : SPI.h
+  * Description        : This file provides code for the configuration
+  *                      of the SPI instances.
+  ******************************************************************************
+  * This notice applies to any and all portions of this file
+  * that are not between comment pairs USER CODE BEGIN and
+  * USER CODE END. Other portions of this file, whether 
+  * inserted by the user or by software development tools
+  * are owned by their respective copyright owners.
+  *
+  * Copyright (c) 2019 STMicroelectronics International N.V. 
+  * All rights reserved.
+  *
+  * Redistribution and use in source and binary forms, with or without 
+  * modification, are permitted, provided that the following conditions are met:
+  *
+  * 1. Redistribution of source code must retain the above copyright notice, 
+  *    this list of conditions and the following disclaimer.
+  * 2. Redistributions in binary form must reproduce the above copyright notice,
+  *    this list of conditions and the following disclaimer in the documentation
+  *    and/or other materials provided with the distribution.
+  * 3. Neither the name of STMicroelectronics nor the names of other 
+  *    contributors to this software may be used to endorse or promote products 
+  *    derived from this software without specific written permission.
+  * 4. This software, including modifications and/or derivative works of this 
+  *    software, must execute solely and exclusively on microcontroller or
+  *    microprocessor devices manufactured by or for STMicroelectronics.
+  * 5. Redistribution and use of this software other than as permitted under 
+  *    this license is void and will automatically terminate your rights under 
+  *    this license. 
+  *
+  * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" 
+  * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT 
+  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 
+  * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY
+  * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT 
+  * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 
+  * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 
+  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
+  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+  *
+  ******************************************************************************
+  */
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __spi_H
+#define __spi_H
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+extern SPI_HandleTypeDef hspi4;
+
+/* USER CODE BEGIN Private defines */
+
+/* USER CODE END Private defines */
+
+void MX_SPI4_Init(void);
+
+/* USER CODE BEGIN Prototypes */
+#define	FM_WREN		0X06	//写使能
+#define	FM_WRDI		0X04	//写禁止
+#define	FM_RDSR		0X05	//读状态寄存器
+#define	FM_WRSR		0X01	//写状态寄存器
+#define	FM_READ		0X03	//读数据
+#define	FM_WRITE	0X02	//写数据
+
+#define FM_CS_1 HAL_GPIO_WritePin(GPIOE, SPI4_FM25_NSS_Pin, GPIO_PIN_SET);
+#define FM_CS_0 HAL_GPIO_WritePin(GPIOE, SPI4_FM25_NSS_Pin, GPIO_PIN_RESET);
+
+void FM25L16B_Init(void);
+void FM25L16B_Write_N_Bytes(uint16_t addr,uint8_t *data,uint16_t num);
+void FM25L16B_Read_N_Bytes(uint16_t addr,uint8_t *data,uint16_t num);
+void FM25L16B_WriteByte(uint16_t addr,uint8_t data);
+uint8_t FM25L16B_ReadByte(uint16_t addr);
+uint8_t FM25L16B_ReadStatus(void);
+void FM25L16B_WriteStatus(uint8_t data);
+/* USER CODE END Prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+#endif /*__ spi_H */
+
+/**
+  * @}
+  */
+
+/**
+  * @}
+  */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

+ 455 - 0
Inc/stm32f7xx_hal_conf.h

@@ -0,0 +1,455 @@
+/**
+  ******************************************************************************
+  * @file    stm32f7xx_hal_conf.h
+  * @brief   HAL configuration file.
+  ******************************************************************************
+  * @attention
+  *
+  * <h2><center>&copy; COPYRIGHT(c) 2019 STMicroelectronics</center></h2>
+  *
+  * Redistribution and use in source and binary forms, with or without modification,
+  * are permitted provided that the following conditions are met:
+  *   1. Redistributions of source code must retain the above copyright notice,
+  *      this list of conditions and the following disclaimer.
+  *   2. Redistributions in binary form must reproduce the above copyright notice,
+  *      this list of conditions and the following disclaimer in the documentation
+  *      and/or other materials provided with the distribution.
+  *   3. Neither the name of STMicroelectronics nor the names of its contributors
+  *      may be used to endorse or promote products derived from this software
+  *      without specific prior written permission.
+  *
+  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+  *
+  ******************************************************************************
+  */ 
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32F7xx_HAL_CONF_H
+#define __STM32F7xx_HAL_CONF_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+
+/* ########################## Module Selection ############################## */
+/**
+  * @brief This is the list of modules to be used in the HAL driver 
+  */
+#define HAL_MODULE_ENABLED  
+
+/* #define HAL_ADC_MODULE_ENABLED   */
+/* #define HAL_CRYP_MODULE_ENABLED   */
+/* #define HAL_CAN_MODULE_ENABLED   */
+/* #define HAL_CEC_MODULE_ENABLED   */
+/* #define HAL_CRC_MODULE_ENABLED   */
+/* #define HAL_CRYP_MODULE_ENABLED   */
+/* #define HAL_DAC_MODULE_ENABLED   */
+/* #define HAL_DCMI_MODULE_ENABLED   */
+/* #define HAL_DMA2D_MODULE_ENABLED   */
+/* #define HAL_ETH_MODULE_ENABLED   */
+/* #define HAL_NAND_MODULE_ENABLED   */
+/* #define HAL_NOR_MODULE_ENABLED   */
+/* #define HAL_SRAM_MODULE_ENABLED   */
+/* #define HAL_SDRAM_MODULE_ENABLED   */
+/* #define HAL_HASH_MODULE_ENABLED   */
+/* #define HAL_I2S_MODULE_ENABLED   */
+/* #define HAL_IWDG_MODULE_ENABLED   */
+/* #define HAL_LPTIM_MODULE_ENABLED   */
+/* #define HAL_LTDC_MODULE_ENABLED   */
+/* #define HAL_QSPI_MODULE_ENABLED   */
+/* #define HAL_RNG_MODULE_ENABLED   */
+/* #define HAL_RTC_MODULE_ENABLED   */
+/* #define HAL_SAI_MODULE_ENABLED   */
+/* #define HAL_SD_MODULE_ENABLED   */
+/* #define HAL_MMC_MODULE_ENABLED   */
+/* #define HAL_SPDIFRX_MODULE_ENABLED   */
+#define HAL_SPI_MODULE_ENABLED
+#define HAL_TIM_MODULE_ENABLED
+#define HAL_UART_MODULE_ENABLED
+/* #define HAL_USART_MODULE_ENABLED   */
+/* #define HAL_IRDA_MODULE_ENABLED   */
+/* #define HAL_SMARTCARD_MODULE_ENABLED   */
+/* #define HAL_WWDG_MODULE_ENABLED   */
+/* #define HAL_PCD_MODULE_ENABLED   */
+/* #define HAL_HCD_MODULE_ENABLED   */
+/* #define HAL_DFSDM_MODULE_ENABLED   */
+/* #define HAL_DSI_MODULE_ENABLED   */
+/* #define HAL_JPEG_MODULE_ENABLED   */
+/* #define HAL_MDIOS_MODULE_ENABLED   */
+/* #define HAL_SMBUS_MODULE_ENABLED   */
+/* #define HAL_MMC_MODULE_ENABLED   */
+/* #define HAL_EXTI_MODULE_ENABLED   */
+#define HAL_GPIO_MODULE_ENABLED
+#define HAL_DMA_MODULE_ENABLED
+#define HAL_RCC_MODULE_ENABLED
+#define HAL_FLASH_MODULE_ENABLED
+#define HAL_PWR_MODULE_ENABLED
+#define HAL_I2C_MODULE_ENABLED
+#define HAL_CORTEX_MODULE_ENABLED
+
+/* ########################## HSE/HSI Values adaptation ##################### */
+/**
+  * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.
+  *        This value is used by the RCC HAL module to compute the system frequency
+  *        (when HSE is used as system clock source, directly or through the PLL).  
+  */
+#if !defined  (HSE_VALUE) 
+  #define HSE_VALUE    ((uint32_t)25000000U) /*!< Value of the External oscillator in Hz */
+#endif /* HSE_VALUE */
+
+#if !defined  (HSE_STARTUP_TIMEOUT)
+  #define HSE_STARTUP_TIMEOUT    ((uint32_t)100U)   /*!< Time out for HSE start up, in ms */
+#endif /* HSE_STARTUP_TIMEOUT */
+
+/**
+  * @brief Internal High Speed oscillator (HSI) value.
+  *        This value is used by the RCC HAL module to compute the system frequency
+  *        (when HSI is used as system clock source, directly or through the PLL). 
+  */
+#if !defined  (HSI_VALUE)
+  #define HSI_VALUE    ((uint32_t)16000000U) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+/**
+  * @brief Internal Low Speed oscillator (LSI) value.
+  */
+#if !defined  (LSI_VALUE) 
+ #define LSI_VALUE  ((uint32_t)32000U)       /*!< LSI Typical Value in Hz*/
+#endif /* LSI_VALUE */                      /*!< Value of the Internal Low Speed oscillator in Hz
+                                             The real value may vary depending on the variations
+                                             in voltage and temperature.  */
+/**
+  * @brief External Low Speed oscillator (LSE) value.
+  */
+#if !defined  (LSE_VALUE)
+ #define LSE_VALUE  ((uint32_t)32768U)    /*!< Value of the External Low Speed oscillator in Hz */
+#endif /* LSE_VALUE */
+
+#if !defined  (LSE_STARTUP_TIMEOUT)
+  #define LSE_STARTUP_TIMEOUT    ((uint32_t)5000U)   /*!< Time out for LSE start up, in ms */
+#endif /* LSE_STARTUP_TIMEOUT */
+
+/**
+  * @brief External clock source for I2S peripheral
+  *        This value is used by the I2S HAL module to compute the I2S clock source 
+  *        frequency, this source is inserted directly through I2S_CKIN pad. 
+  */
+#if !defined  (EXTERNAL_CLOCK_VALUE)
+  #define EXTERNAL_CLOCK_VALUE    ((uint32_t)12288000U) /*!< Value of the Internal oscillator in Hz*/
+#endif /* EXTERNAL_CLOCK_VALUE */
+
+/* Tip: To avoid modifying this file each time you need to use different HSE,
+   ===  you can define the HSE value in your toolchain compiler preprocessor. */
+
+/* ########################### System Configuration ######################### */
+/**
+  * @brief This is the HAL system configuration section
+  */     
+#define  VDD_VALUE                    ((uint32_t)3300U) /*!< Value of VDD in mv */
+#define  TICK_INT_PRIORITY            ((uint32_t)0U) /*!< tick interrupt priority */
+#define  USE_RTOS                     0U
+#define  PREFETCH_ENABLE              0U
+#define  ART_ACCLERATOR_ENABLE        0U /* To enable instruction cache and prefetch */
+
+/* ########################## Assert Selection ############################## */
+/**
+  * @brief Uncomment the line below to expanse the "assert_param" macro in the 
+  *        HAL drivers code
+  */
+/* #define USE_FULL_ASSERT    1U */
+
+/* ################## Ethernet peripheral configuration ##################### */
+
+/* Section 1 : Ethernet peripheral configuration */
+
+/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */
+#define MAC_ADDR0   2U
+#define MAC_ADDR1   0U
+#define MAC_ADDR2   0U
+#define MAC_ADDR3   0U
+#define MAC_ADDR4   0U
+#define MAC_ADDR5   0U
+
+/* Definition of the Ethernet driver buffers size and count */   
+#define ETH_RX_BUF_SIZE                ETH_MAX_PACKET_SIZE /* buffer size for receive               */
+#define ETH_TX_BUF_SIZE                ETH_MAX_PACKET_SIZE /* buffer size for transmit              */
+#define ETH_RXBUFNB                    ((uint32_t)4U)       /* 4 Rx buffers of size ETH_RX_BUF_SIZE  */
+#define ETH_TXBUFNB                    ((uint32_t)4U)       /* 4 Tx buffers of size ETH_TX_BUF_SIZE  */
+
+/* Section 2: PHY configuration section */
+
+/* DP83848_PHY_ADDRESS Address*/ 
+#define DP83848_PHY_ADDRESS           0x01U
+/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/ 
+#define PHY_RESET_DELAY                 ((uint32_t)0x000000FFU)
+/* PHY Configuration delay */
+#define PHY_CONFIG_DELAY                ((uint32_t)0x00000FFFU)
+
+#define PHY_READ_TO                     ((uint32_t)0x0000FFFFU)
+#define PHY_WRITE_TO                    ((uint32_t)0x0000FFFFU)
+
+/* Section 3: Common PHY Registers */
+
+#define PHY_BCR                         ((uint16_t)0x0000U)    /*!< Transceiver Basic Control Register   */
+#define PHY_BSR                         ((uint16_t)0x0001U)    /*!< Transceiver Basic Status Register    */
+ 
+#define PHY_RESET                       ((uint16_t)0x8000U)  /*!< PHY Reset */
+#define PHY_LOOPBACK                    ((uint16_t)0x4000U)  /*!< Select loop-back mode */
+#define PHY_FULLDUPLEX_100M             ((uint16_t)0x2100U)  /*!< Set the full-duplex mode at 100 Mb/s */
+#define PHY_HALFDUPLEX_100M             ((uint16_t)0x2000U)  /*!< Set the half-duplex mode at 100 Mb/s */
+#define PHY_FULLDUPLEX_10M              ((uint16_t)0x0100U)  /*!< Set the full-duplex mode at 10 Mb/s  */
+#define PHY_HALFDUPLEX_10M              ((uint16_t)0x0000U)  /*!< Set the half-duplex mode at 10 Mb/s  */
+#define PHY_AUTONEGOTIATION             ((uint16_t)0x1000U)  /*!< Enable auto-negotiation function     */
+#define PHY_RESTART_AUTONEGOTIATION     ((uint16_t)0x0200U)  /*!< Restart auto-negotiation function    */
+#define PHY_POWERDOWN                   ((uint16_t)0x0800U)  /*!< Select the power down mode           */
+#define PHY_ISOLATE                     ((uint16_t)0x0400U)  /*!< Isolate PHY from MII                 */
+
+#define PHY_AUTONEGO_COMPLETE           ((uint16_t)0x0020U)  /*!< Auto-Negotiation process completed   */
+#define PHY_LINKED_STATUS               ((uint16_t)0x0004U)  /*!< Valid link established               */
+#define PHY_JABBER_DETECTION            ((uint16_t)0x0002U)  /*!< Jabber condition detected            */
+  
+/* Section 4: Extended PHY Registers */
+#define PHY_SR                          ((uint16_t)0x10U)    /*!< PHY status register Offset                      */
+
+#define PHY_SPEED_STATUS                ((uint16_t)0x0002U)  /*!< PHY Speed mask                                  */
+#define PHY_DUPLEX_STATUS               ((uint16_t)0x0004U)  /*!< PHY Duplex mask                                 */
+
+/* ################## SPI peripheral configuration ########################## */
+
+/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver
+* Activated: CRC code is present inside driver
+* Deactivated: CRC code cleaned from driver
+*/
+
+#define USE_SPI_CRC                     0U
+
+/* Includes ------------------------------------------------------------------*/
+/**
+  * @brief Include module's header file 
+  */
+
+#ifdef HAL_RCC_MODULE_ENABLED
+  #include "stm32f7xx_hal_rcc.h"
+#endif /* HAL_RCC_MODULE_ENABLED */
+
+#ifdef HAL_EXTI_MODULE_ENABLED
+  #include "stm32f7xx_hal_exti.h"
+#endif /* HAL_EXTI_MODULE_ENABLED */
+
+#ifdef HAL_GPIO_MODULE_ENABLED
+  #include "stm32f7xx_hal_gpio.h"
+#endif /* HAL_GPIO_MODULE_ENABLED */
+
+#ifdef HAL_DMA_MODULE_ENABLED
+  #include "stm32f7xx_hal_dma.h"
+#endif /* HAL_DMA_MODULE_ENABLED */
+   
+#ifdef HAL_CORTEX_MODULE_ENABLED
+  #include "stm32f7xx_hal_cortex.h"
+#endif /* HAL_CORTEX_MODULE_ENABLED */
+
+#ifdef HAL_ADC_MODULE_ENABLED
+  #include "stm32f7xx_hal_adc.h"
+#endif /* HAL_ADC_MODULE_ENABLED */
+
+#ifdef HAL_CAN_MODULE_ENABLED
+  #include "stm32f7xx_hal_can.h"
+#endif /* HAL_CAN_MODULE_ENABLED */
+
+#ifdef HAL_CEC_MODULE_ENABLED
+  #include "stm32f7xx_hal_cec.h"
+#endif /* HAL_CEC_MODULE_ENABLED */
+
+#ifdef HAL_CRC_MODULE_ENABLED
+  #include "stm32f7xx_hal_crc.h"
+#endif /* HAL_CRC_MODULE_ENABLED */
+
+#ifdef HAL_CRYP_MODULE_ENABLED
+  #include "stm32f7xx_hal_cryp.h" 
+#endif /* HAL_CRYP_MODULE_ENABLED */
+
+#ifdef HAL_DMA2D_MODULE_ENABLED
+  #include "stm32f7xx_hal_dma2d.h"
+#endif /* HAL_DMA2D_MODULE_ENABLED */
+
+#ifdef HAL_DAC_MODULE_ENABLED
+  #include "stm32f7xx_hal_dac.h"
+#endif /* HAL_DAC_MODULE_ENABLED */
+
+#ifdef HAL_DCMI_MODULE_ENABLED
+  #include "stm32f7xx_hal_dcmi.h"
+#endif /* HAL_DCMI_MODULE_ENABLED */
+
+#ifdef HAL_ETH_MODULE_ENABLED
+  #include "stm32f7xx_hal_eth.h"
+#endif /* HAL_ETH_MODULE_ENABLED */
+
+#ifdef HAL_FLASH_MODULE_ENABLED
+  #include "stm32f7xx_hal_flash.h"
+#endif /* HAL_FLASH_MODULE_ENABLED */
+ 
+#ifdef HAL_SRAM_MODULE_ENABLED
+  #include "stm32f7xx_hal_sram.h"
+#endif /* HAL_SRAM_MODULE_ENABLED */
+
+#ifdef HAL_NOR_MODULE_ENABLED
+  #include "stm32f7xx_hal_nor.h"
+#endif /* HAL_NOR_MODULE_ENABLED */
+
+#ifdef HAL_NAND_MODULE_ENABLED
+  #include "stm32f7xx_hal_nand.h"
+#endif /* HAL_NAND_MODULE_ENABLED */
+
+#ifdef HAL_SDRAM_MODULE_ENABLED
+  #include "stm32f7xx_hal_sdram.h"
+#endif /* HAL_SDRAM_MODULE_ENABLED */      
+
+#ifdef HAL_HASH_MODULE_ENABLED
+ #include "stm32f7xx_hal_hash.h"
+#endif /* HAL_HASH_MODULE_ENABLED */
+
+#ifdef HAL_I2C_MODULE_ENABLED
+ #include "stm32f7xx_hal_i2c.h"
+#endif /* HAL_I2C_MODULE_ENABLED */
+
+#ifdef HAL_I2S_MODULE_ENABLED
+ #include "stm32f7xx_hal_i2s.h"
+#endif /* HAL_I2S_MODULE_ENABLED */
+
+#ifdef HAL_IWDG_MODULE_ENABLED
+ #include "stm32f7xx_hal_iwdg.h"
+#endif /* HAL_IWDG_MODULE_ENABLED */
+
+#ifdef HAL_LPTIM_MODULE_ENABLED
+ #include "stm32f7xx_hal_lptim.h"
+#endif /* HAL_LPTIM_MODULE_ENABLED */
+
+#ifdef HAL_LTDC_MODULE_ENABLED
+ #include "stm32f7xx_hal_ltdc.h"
+#endif /* HAL_LTDC_MODULE_ENABLED */
+
+#ifdef HAL_PWR_MODULE_ENABLED
+ #include "stm32f7xx_hal_pwr.h"
+#endif /* HAL_PWR_MODULE_ENABLED */
+
+#ifdef HAL_QSPI_MODULE_ENABLED
+ #include "stm32f7xx_hal_qspi.h"
+#endif /* HAL_QSPI_MODULE_ENABLED */
+
+#ifdef HAL_RNG_MODULE_ENABLED
+ #include "stm32f7xx_hal_rng.h"
+#endif /* HAL_RNG_MODULE_ENABLED */
+
+#ifdef HAL_RTC_MODULE_ENABLED
+ #include "stm32f7xx_hal_rtc.h"
+#endif /* HAL_RTC_MODULE_ENABLED */
+
+#ifdef HAL_SAI_MODULE_ENABLED
+ #include "stm32f7xx_hal_sai.h"
+#endif /* HAL_SAI_MODULE_ENABLED */
+
+#ifdef HAL_SD_MODULE_ENABLED
+ #include "stm32f7xx_hal_sd.h"
+#endif /* HAL_SD_MODULE_ENABLED */
+
+#ifdef HAL_MMC_MODULE_ENABLED
+ #include "stm32f7xx_hal_mmc.h"
+#endif /* HAL_MMC_MODULE_ENABLED */
+
+#ifdef HAL_SPDIFRX_MODULE_ENABLED
+ #include "stm32f7xx_hal_spdifrx.h"
+#endif /* HAL_SPDIFRX_MODULE_ENABLED */
+
+#ifdef HAL_SPI_MODULE_ENABLED
+ #include "stm32f7xx_hal_spi.h"
+#endif /* HAL_SPI_MODULE_ENABLED */
+
+#ifdef HAL_TIM_MODULE_ENABLED
+ #include "stm32f7xx_hal_tim.h"
+#endif /* HAL_TIM_MODULE_ENABLED */
+
+#ifdef HAL_UART_MODULE_ENABLED
+ #include "stm32f7xx_hal_uart.h"
+#endif /* HAL_UART_MODULE_ENABLED */
+
+#ifdef HAL_USART_MODULE_ENABLED
+ #include "stm32f7xx_hal_usart.h"
+#endif /* HAL_USART_MODULE_ENABLED */
+
+#ifdef HAL_IRDA_MODULE_ENABLED
+ #include "stm32f7xx_hal_irda.h"
+#endif /* HAL_IRDA_MODULE_ENABLED */
+
+#ifdef HAL_SMARTCARD_MODULE_ENABLED
+ #include "stm32f7xx_hal_smartcard.h"
+#endif /* HAL_SMARTCARD_MODULE_ENABLED */
+
+#ifdef HAL_WWDG_MODULE_ENABLED
+ #include "stm32f7xx_hal_wwdg.h"
+#endif /* HAL_WWDG_MODULE_ENABLED */
+
+#ifdef HAL_PCD_MODULE_ENABLED
+ #include "stm32f7xx_hal_pcd.h"
+#endif /* HAL_PCD_MODULE_ENABLED */
+
+#ifdef HAL_HCD_MODULE_ENABLED
+ #include "stm32f7xx_hal_hcd.h"
+#endif /* HAL_HCD_MODULE_ENABLED */
+
+#ifdef HAL_DFSDM_MODULE_ENABLED
+ #include "stm32f7xx_hal_dfsdm.h"
+#endif /* HAL_DFSDM_MODULE_ENABLED */
+
+#ifdef HAL_DSI_MODULE_ENABLED
+ #include "stm32f7xx_hal_dsi.h"
+#endif /* HAL_DSI_MODULE_ENABLED */
+
+#ifdef HAL_JPEG_MODULE_ENABLED
+ #include "stm32f7xx_hal_jpeg.h"
+#endif /* HAL_JPEG_MODULE_ENABLED */
+
+#ifdef HAL_MDIOS_MODULE_ENABLED
+ #include "stm32f7xx_hal_mdios.h"
+#endif /* HAL_MDIOS_MODULE_ENABLED */   
+
+#ifdef HAL_SMBUS_MODULE_ENABLED
+ #include "stm32f7xx_hal_smbus.h"
+#endif /* HAL_SMBUS_MODULE_ENABLED */
+
+/* Exported macro ------------------------------------------------------------*/
+#ifdef  USE_FULL_ASSERT
+/**
+  * @brief  The assert_param macro is used for function's parameters check.
+  * @param  expr: If expr is false, it calls assert_failed function
+  *         which reports the name of the source file and the source
+  *         line number of the call that failed. 
+  *         If expr is true, it returns no value.
+  * @retval None
+  */
+  #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))
+/* Exported functions ------------------------------------------------------- */
+  void assert_failed(uint8_t* file, uint32_t line);
+#else
+  #define assert_param(expr) ((void)0U)
+#endif /* USE_FULL_ASSERT */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32F7xx_HAL_CONF_H */
+ 
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

+ 92 - 0
Inc/stm32f7xx_it.h

@@ -0,0 +1,92 @@
+/* USER CODE BEGIN Header */
+/**
+  ******************************************************************************
+  * @file    stm32f7xx_it.h
+  * @brief   This file contains the headers of the interrupt handlers.
+  ******************************************************************************
+  *
+  * COPYRIGHT(c) 2019 STMicroelectronics
+  *
+  * Redistribution and use in source and binary forms, with or without modification,
+  * are permitted provided that the following conditions are met:
+  *   1. Redistributions of source code must retain the above copyright notice,
+  *      this list of conditions and the following disclaimer.
+  *   2. Redistributions in binary form must reproduce the above copyright notice,
+  *      this list of conditions and the following disclaimer in the documentation
+  *      and/or other materials provided with the distribution.
+  *   3. Neither the name of STMicroelectronics nor the names of its contributors
+  *      may be used to endorse or promote products derived from this software
+  *      without specific prior written permission.
+  *
+  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+  *
+  ******************************************************************************
+  */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32F7xx_IT_H
+#define __STM32F7xx_IT_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif 
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported macro ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions prototypes ---------------------------------------------*/
+void NMI_Handler(void);
+void HardFault_Handler(void);
+void MemManage_Handler(void);
+void BusFault_Handler(void);
+void UsageFault_Handler(void);
+void DebugMon_Handler(void);
+void DMA1_Stream1_IRQHandler(void);
+void DMA1_Stream2_IRQHandler(void);
+void DMA1_Stream5_IRQHandler(void);
+void TIM1_UP_TIM10_IRQHandler(void);
+void TIM2_IRQHandler(void);
+void USART1_IRQHandler(void);
+void USART2_IRQHandler(void);
+void USART3_IRQHandler(void);
+void UART4_IRQHandler(void);
+void TIM6_DAC_IRQHandler(void);
+void DMA2_Stream2_IRQHandler(void);
+/* USER CODE BEGIN EFP */
+
+/* USER CODE END EFP */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32F7xx_IT_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

+ 91 - 0
Inc/tim.h

@@ -0,0 +1,91 @@
+/**
+  ******************************************************************************
+  * File Name          : TIM.h
+  * Description        : This file provides code for the configuration
+  *                      of the TIM instances.
+  ******************************************************************************
+  * This notice applies to any and all portions of this file
+  * that are not between comment pairs USER CODE BEGIN and
+  * USER CODE END. Other portions of this file, whether 
+  * inserted by the user or by software development tools
+  * are owned by their respective copyright owners.
+  *
+  * Copyright (c) 2019 STMicroelectronics International N.V. 
+  * All rights reserved.
+  *
+  * Redistribution and use in source and binary forms, with or without 
+  * modification, are permitted, provided that the following conditions are met:
+  *
+  * 1. Redistribution of source code must retain the above copyright notice, 
+  *    this list of conditions and the following disclaimer.
+  * 2. Redistributions in binary form must reproduce the above copyright notice,
+  *    this list of conditions and the following disclaimer in the documentation
+  *    and/or other materials provided with the distribution.
+  * 3. Neither the name of STMicroelectronics nor the names of other 
+  *    contributors to this software may be used to endorse or promote products 
+  *    derived from this software without specific written permission.
+  * 4. This software, including modifications and/or derivative works of this 
+  *    software, must execute solely and exclusively on microcontroller or
+  *    microprocessor devices manufactured by or for STMicroelectronics.
+  * 5. Redistribution and use of this software other than as permitted under 
+  *    this license is void and will automatically terminate your rights under 
+  *    this license. 
+  *
+  * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" 
+  * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT 
+  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 
+  * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY
+  * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT 
+  * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 
+  * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 
+  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
+  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+  *
+  ******************************************************************************
+  */
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __tim_H
+#define __tim_H
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+
+/* USER CODE BEGIN Includes */
+#include <stdbool.h>
+/* USER CODE END Includes */
+
+extern TIM_HandleTypeDef htim2;
+extern TIM_HandleTypeDef htim6;
+
+/* USER CODE BEGIN Private defines */
+
+/* USER CODE END Private defines */
+
+void MX_TIM2_Init(void);
+void MX_TIM6_Init(void);
+
+/* USER CODE BEGIN Prototypes */
+extern bool Read_Collect485_Flag;
+extern bool StartUpdate_Screen_Flag;//ÆÁʵʱ״̬1S¸üÐÂÒ»´Î
+/* USER CODE END Prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+#endif /*__ tim_H */
+
+/**
+  * @}
+  */
+
+/**
+  * @}
+  */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

+ 131 - 0
Inc/usart.h

@@ -0,0 +1,131 @@
+/**
+  ******************************************************************************
+  * File Name          : USART.h
+  * Description        : This file provides code for the configuration
+  *                      of the USART instances.
+  ******************************************************************************
+  * This notice applies to any and all portions of this file
+  * that are not between comment pairs USER CODE BEGIN and
+  * USER CODE END. Other portions of this file, whether 
+  * inserted by the user or by software development tools
+  * are owned by their respective copyright owners.
+  *
+  * Copyright (c) 2019 STMicroelectronics International N.V. 
+  * All rights reserved.
+  *
+  * Redistribution and use in source and binary forms, with or without 
+  * modification, are permitted, provided that the following conditions are met:
+  *
+  * 1. Redistribution of source code must retain the above copyright notice, 
+  *    this list of conditions and the following disclaimer.
+  * 2. Redistributions in binary form must reproduce the above copyright notice,
+  *    this list of conditions and the following disclaimer in the documentation
+  *    and/or other materials provided with the distribution.
+  * 3. Neither the name of STMicroelectronics nor the names of other 
+  *    contributors to this software may be used to endorse or promote products 
+  *    derived from this software without specific written permission.
+  * 4. This software, including modifications and/or derivative works of this 
+  *    software, must execute solely and exclusively on microcontroller or
+  *    microprocessor devices manufactured by or for STMicroelectronics.
+  * 5. Redistribution and use of this software other than as permitted under 
+  *    this license is void and will automatically terminate your rights under 
+  *    this license. 
+  *
+  * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" 
+  * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT 
+  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 
+  * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY
+  * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT 
+  * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 
+  * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 
+  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
+  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+  *
+  ******************************************************************************
+  */
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __usart_H
+#define __usart_H
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+extern UART_HandleTypeDef huart4;
+extern UART_HandleTypeDef huart1;
+extern UART_HandleTypeDef huart2;
+extern UART_HandleTypeDef huart3;
+
+/* zhuzl 20211220 增加内蒙主动上送
+*/
+extern uint32_t circle_send;
+#define CIRCLE_SEND_TIME   30000 //30s
+
+//zhuzl add end
+
+/* USER CODE BEGIN Private defines */
+#define BUF_SIZE 500u
+#define Uart1_BUF_SIZE  1024u
+#define Uart2_BUF_SIZE  1024u      /*为UART2、3专门开一个DMA接收存储区 2021-4-12 by Daiyf*/
+#define Uart3_BUF_SIZE  256u
+	 
+extern volatile uint8_t usart1_rx_flag;
+extern volatile uint8_t usart2_rx_flag;
+extern volatile uint8_t usart3_rx_flag;
+extern volatile uint8_t usart4_rx_flag;
+extern uint16_t rx1_len;
+extern uint16_t rx2_len;
+extern uint16_t rx3_len;
+extern uint16_t rx3_len;
+extern uint16_t rx4_len;
+
+
+extern uint8_t USART_RX_BUF[Uart1_BUF_SIZE];
+extern uint8_t USART_TX_BUF[Uart1_BUF_SIZE];
+extern uint8_t USART1_RX_BUF[Uart1_BUF_SIZE];
+extern uint8_t USART1_TX_BUF[Uart1_BUF_SIZE];
+extern uint8_t USART2_RX_BUF[Uart2_BUF_SIZE];
+extern uint8_t USART2_TX_BUF[Uart2_BUF_SIZE];
+extern uint8_t USART3_RX_BUF[Uart3_BUF_SIZE];
+extern uint8_t USART3_TX_BUF[Uart3_BUF_SIZE];
+extern uint8_t UART4_RX_BUF[BUF_SIZE];
+extern uint8_t UART4_TX_BUF[BUF_SIZE];
+
+void SendChar2 (uint8_t ch);
+void SendChar4 (uint8_t ch);
+void UartWrite(UART_HandleTypeDef *uartHandle, uint8_t *buf , uint8_t len);
+void Uart_Mode_Init(void);
+/* USER CODE END Private defines */
+
+void MX_UART4_Init(void);
+void MX_USART1_UART_Init(void);
+void MX_USART2_UART_Init(void);
+void MX_USART3_UART_Init(void);
+
+/* USER CODE BEGIN Prototypes */
+void UsartReceive_IDLE(UART_HandleTypeDef *huart);
+/* USER CODE END Prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+#endif /*__ usart_H */
+
+/**
+  * @}
+  */
+
+/**
+  * @}
+  */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

Fichier diff supprimé car celui-ci est trop grand
+ 3437 - 0
Src/CollectMaster485.c


+ 469 - 0
Src/DS1302.c

@@ -0,0 +1,469 @@
+#include "Data_deal.h"
+#include "DS1302.h"
+uint8_t time_buf[7]  = {0x20,0x20,0x05,0x29,0x17,0x20,0x14}; //初始时间2020年5月29号17点41分14秒 星期五
+
+//DS1302初始化
+void ds1302_Init(void)
+{
+
+  GPIO_InitTypeDef GPIO_InitStruct = {0};
+
+	__HAL_RCC_GPIOB_CLK_ENABLE();
+  __HAL_RCC_GPIOE_CLK_ENABLE();
+	
+	GPIO_InitStruct.Pin = DS1302_RST;
+  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
+  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+  HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
+	
+	GPIO_InitStruct.Pin = DS1302_DATA;
+  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
+//  GPIO_InitStruct.Pull = GPIO_NOPULL;
+  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+  HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
+	
+	GPIO_InitStruct.Pin = DS1302_SCK;
+  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
+  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+	
+	HAL_GPIO_WritePin(GPIOE, DS1302_DATA,GPIO_PIN_SET);  //拉高
+	HAL_GPIO_WritePin(GPIOE, DS1302_RST,GPIO_PIN_SET); //置低 
+	HAL_GPIO_WritePin(GPIOB, DS1302_SCK,GPIO_PIN_RESET); //置低
+}
+
+void DS1302_IO_IN(void)
+{
+	GPIO_InitTypeDef GPIO_InitStruct = {0};
+
+  __HAL_RCC_GPIOE_CLK_ENABLE();
+	
+	GPIO_InitStruct.Pin = DS1302_DATA;
+  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
+  GPIO_InitStruct.Pull = GPIO_NOPULL;
+  HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
+	
+}
+void DS1302_IO_OUT(void)
+{
+	GPIO_InitTypeDef GPIO_InitStruct = {0};
+
+  __HAL_RCC_GPIOE_CLK_ENABLE();
+	
+	GPIO_InitStruct.Pin = DS1302_DATA;
+  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
+  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+  HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
+}
+void delay_us(uint32_t us)
+{
+	uint16_t i = 0;
+	i = us*216;
+	while (i--)
+	{
+		__NOP();
+	}
+}
+//void delay_us(uint32_t us)
+//{
+//    uint32_t delay = (HAL_RCC_GetHCLKFreq() / 6000000 * us);
+//    while (delay--)
+//	{
+//		;
+//	}
+//}
+//向DS1302写入一个字节数据
+void ds1302_Write_Byte(uint8_t addr, uint8_t data)
+{
+  uint8_t i;
+	DS1302_RST_0;      //停止DS1302总线
+	delay_us(10);
+	__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
+	__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
+	DS1302_RST_1;      //启动DS1302总线
+	addr = addr & 0xFE;  //最低位置零,写数据
+	DS1302_IO_OUT();
+	for(i = 0; i < 8; i ++)  //写地址
+	{
+	  if (addr & 0x01)
+			DS1302_DATA_OUT_1;
+		else
+			DS1302_DATA_OUT_0;
+		
+		DS1302_SCK_1;    //产生时钟
+		delay_us(10);
+		__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
+		__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
+		DS1302_SCK_0;
+		addr = addr>>1;
+	}
+	for (i = 0; i < 8; i ++) //写数据
+	{
+	  if(data & 0x01)
+			DS1302_DATA_OUT_1;
+		else
+			DS1302_DATA_OUT_0;
+		
+		DS1302_SCK_1;   //产生时钟
+		delay_us(10);
+		__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
+		__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
+		DS1302_SCK_0;
+	  data = data>>1;
+	}
+	DS1302_RST_0;      //停止DS1302总线
+}
+
+//从DS1302读出一个字节数据
+uint8_t ds1302_Read_Byte(uint8_t addr)
+{
+  uint8_t i,temp;
+	DS1302_RST_0;      //停止DS1302总线
+	delay_us(10);
+	__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
+	__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
+	DS1302_RST_1;      //启动DS1302总线
+	addr = addr | 0x01;  //最低位置高,读数据
+	DS1302_IO_OUT();
+	for(i = 0; i < 8; i ++)  //写地址
+	{
+	  if (addr & 0x01)
+			DS1302_DATA_OUT_1;
+		else
+			DS1302_DATA_OUT_0;
+		
+		DS1302_SCK_1;    //产生时钟
+		delay_us(10);
+		__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
+		__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
+		DS1302_SCK_0;
+		addr = addr>>1;
+	}
+	DS1302_IO_IN();
+	for (i = 0; i < 8; i ++) //读数据
+	{
+	  temp = temp >> 1;
+		if(DS1302_DATA_IN())
+			temp |= 0x80;
+		else
+			temp &= 0x7F;
+		
+		DS1302_SCK_1;   //产生时钟
+		delay_us(10);
+		__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
+		__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
+		DS1302_SCK_0;
+	}
+	DS1302_RST_0;      //停止DS1302总线
+	return temp;
+}
+
+//向DS1302写入时间数据
+void ds1302_Write_Time(uint8_t *Time_buf)
+{
+  ds1302_Write_Byte(ds1302_control_add, 0x00);      //关闭写保护
+  ds1302_Write_Byte(ds1302_sec_add, 0x80);          //暂停时钟
+	//DS1302_Write_Byte(ds1302_charger_add, 0xA9);      //涓流充电
+	      
+	ds1302_Write_Byte(ds1302_year_add,HEX2BCD(Time_buf[1]));		//年 
+	  
+	ds1302_Write_Byte(ds1302_month_add,HEX2BCD(Time_buf[2]));	//月 
+	ds1302_Write_Byte(ds1302_date_add,HEX2BCD(Time_buf[3]));		//日 
+	ds1302_Write_Byte(ds1302_hr_add,HEX2BCD(Time_buf[4]));		  //时 
+	ds1302_Write_Byte(ds1302_min_add,HEX2BCD(Time_buf[5]));		//分
+	ds1302_Write_Byte(ds1302_sec_add,HEX2BCD(Time_buf[6]));		//秒
+	//ds1302_Write_Byte(ds1302_day_add,time_buf[7]);		//周 
+	ds1302_Write_Byte(ds1302_control_add,0x80);		    //打开写保护 
+}
+
+//从DS302读出时钟数据
+void ds1302_Read_Time(void)  
+{
+	time_buf[1] = ds1302_Read_Byte(ds1302_year_add);		   //年 
+	time_buf[2] = ds1302_Read_Byte(ds1302_month_add);		   //月 
+	time_buf[3] = ds1302_Read_Byte(ds1302_date_add);		   //日 
+	time_buf[4] = ds1302_Read_Byte(ds1302_hr_add);		     //时 
+	time_buf[5] = ds1302_Read_Byte(ds1302_min_add);		     //分 
+	time_buf[6] = (ds1302_Read_Byte(ds1302_sec_add))&0x7f; //秒,屏蔽秒的第7位,避免超出59
+	//time_buf[7] = ds1302_Read_Byte(ds1302_day_add);		     //周 
+ //Can_Send_Hu_Msg(0xb1,time_buf,8,0x1b,0x00000012);	
+}
+
+void ds1302_SynTime(SDateTime * datetime)
+{
+	ds1302_Read_Time();
+	datetime->year = BCD2HEX(time_buf[1]);
+	datetime->month = BCD2HEX(time_buf[2]);
+	datetime->day = BCD2HEX(time_buf[3]);
+	datetime->hour = BCD2HEX(time_buf[4]);
+	datetime->min = BCD2HEX(time_buf[5]);
+	datetime->sec = BCD2HEX(time_buf[6]);
+	return;
+}
+//DS1302向上层返回时间数据
+void ds1302_Get_Time(uint8_t *time)
+{
+	ds1302_Read_Time();
+	time[0]=(time_buf[0]>>4);   //年   
+  time[1]=(time_buf[0]&0x0f);
+   
+  time[2]=(time_buf[1]>>4);   
+  time[3]=(time_buf[1]&0x0f);
+  
+  time[4]=(time_buf[2]>>4);   //月  
+  time[5]=(time_buf[2]&0x0f);
+
+  time[6]=(time_buf[3]>>4);   //日   
+  time[7]=(time_buf[3]&0x0f);
+   
+  //time[8]=(time_buf[7]&0x07); //星期
+   
+  time[9]=(time_buf[4]>>4);   //时   
+  time[10]=(time_buf[4]&0x0f);   
+
+  time[11]=(time_buf[5]>>4);  //分   
+  time[12]=(time_buf[5]&0x0f);   
+
+  time[13]=(time_buf[6]>>4);  //秒
+  time[14]=(time_buf[6]&0x0f);
+}
+
+
+//////////////////////////////////////--以下李伟添加     李伟修改   20210613
+
+//ds1302------stm32f746vgt6
+
+//pin5   rst--pin98--Pe1
+//pin6  io     pin97--PE0
+
+
+//pin7  sck     pin96--PB9
+
+/*
+1、  初始化IO口。
+void GPIO_Config(void)
+{       
+    GPIO_InitTypeDef GPIO_InitStructure;  
+    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOD, ENABLE);                                                            
+    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_12 | GPIO_Pin_14;          
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   
+    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
+    GPIO_Init(GPIOD, &GPIO_InitStructure);  
+    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOD, ENABLE);                                                                
+    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_13;  
+    GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_IN_FLOATING;  
+    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
+    GPIO_Init(GPIOD, &GPIO_InitStructure);
+}
+2、  ds1302_init();  // 调用ds1302初始化程序 
+3、  get_result() ;  //定时读取ds1302时间  这个函数每隔一段时间调用一次。比如50ms调用一次。
+*/
+
+
+
+ 
+#define RST_1 HAL_GPIO_WritePin(GPIOE, DS1302_RST, GPIO_PIN_SET) //GPIO_SetBits(GPIOE, GPIO_PIN_1);
+#define RST_0 HAL_GPIO_WritePin(GPIOE, DS1302_RST, GPIO_PIN_RESET) //GPIO_ResetBits(GPIOE, GPIO_PIN_1);
+#define IO_1 HAL_GPIO_WritePin(GPIOE, DS1302_DATA, GPIO_PIN_SET)    //GPIO_SetBits(GPIOD, GPIO_Pin_13);
+#define IO_0 HAL_GPIO_WritePin(GPIOE, DS1302_DATA, GPIO_PIN_RESET)    //GPIO_ResetBits(GPIOD, GPIO_Pin_13);
+#define SCLK_1 HAL_GPIO_WritePin(GPIOB, DS1302_SCK, GPIO_PIN_SET)  //GPIO_SetBits(GPIOB, GPIO_Pin_9);
+#define SCLK_0 HAL_GPIO_WritePin(GPIOB, DS1302_SCK, GPIO_PIN_RESET)   //DS1302_SCK_0  //GPIO_ResetBits(GPIOB, GPIO_Pin_9);
+/*定义待设置的时间:     秒、 分、  时、 日、 月、 星期、年、控制字*/
+volatile char time_tab[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
+char tableDS1302[7];
+char date_1302[6];
+char time_1302[6];
+unsigned int year;
+unsigned char month;
+unsigned char date;
+unsigned char hour;
+unsigned char min;
+unsigned char sec;
+/******************************************************************** 
+函 数 ds1302_initV2()DS1302初始化函数
+功    能:DS1302初始化
+入口参数:无
+返 回 值:无
+***********************************************************************/
+void ds1302_initV2(void)
+  {
+     SCLK_0; 
+     RST_0; 
+     RST_1; 
+     ds1302_writeV2(0x8e);
+     ds1302_writeV2(0);
+     RST_0; 
+  }
+/******************************************************************** 
+函 数 名:ds1302_write()写一个字节数据函数
+功    能:DS1302中写入一个字节
+入口参数:time_tx 要写入的一个字节
+返 回 值:无
+***********************************************************************/
+void ds1302_writeV2(unsigned char time_tx)
+ {
+    int j; 
+    Set_IO_OUT();   
+    for(j=0;j<8;j++) 
+      {
+            IO_0; 
+            SCLK_0; 
+            if((time_tx&0x01)!=0) IO_1; 
+            time_tx=time_tx>>1; 
+            SCLK_1;
+       }
+    SCLK_0;
+  } 
+/******************************************************************** 
+函 数 名:ds1302_read()读一个字节函数
+功    能:从DS1302读一个字节
+入口参数:无
+返 回 值:unsigned char :读取的数据
+***********************************************************************/
+unsigned char ds1302_readV2(void)
+    {
+        int j;
+        unsigned char time_rx=0;
+        Set_IO_INPUT();
+        for(j=0;j<8;j++)
+        {
+            SCLK_0;
+            time_rx=time_rx>>1;
+            //if (GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_13)==1) time_rx|=0x80;//把接收到的数据放到接收寄存器的最高位
+						if (DS1302_DATA_IN()==1) time_rx|=0x80;//把接收到的数据放到接收寄存器的最高位
+					
+            SCLK_1;
+        }
+        SCLK_0;
+        return(time_rx); 
+    }
+/******************************************************************** 
+函 数 名:set_time()设置时间函数
+功    能:设置初始时间
+说    明:使用了多字节写方式
+入口参数:无
+返 回 值:无
+***********************************************************************/
+void set_time(void)
+    {
+        int i; 
+        RST_1;
+        ds1302_writeV2(0xbe);
+        for(i=0;i<8;i++) 
+        {
+            ds1302_writeV2(time_tab[i]);
+        }
+        RST_0;
+    }
+/******************************************************************** 
+函 数 名:get_all()读取全部时间信息函数
+功    能:读取DS1302内部的全部时间信息
+入口参数:无
+返 回 值:无。
+***********************************************************************/
+void DS1302_get_all(void)
+    {
+        int i; 
+        RST_1;
+        ds1302_writeV2(0xbf); 
+        for(i=0;i<7;i++) 
+        {
+            tableDS1302[i]=ds1302_readV2();
+        }
+        RST_0;
+    }
+/******************************************************************** 
+函 数 名:get_time()读取时间函数
+功    能:读取DS1302当前时间
+入口参数:无
+返 回 值:无。 
+***********************************************************************/
+void get_timeV2(void)
+ {
+    DS1302_get_all();                     
+    time_1302[0]=tableDS1302[0]&0x0F;//求秒的个位
+    time_1302[1]=tableDS1302[0]&0x70; //求秒的十位
+    time_1302[1]>>=4;//右移4位
+    time_1302[2]=tableDS1302[1]&0x0F; //求分的个位
+    time_1302[3]=tableDS1302[1]&0x70; //求分的十位
+    time_1302[3]>>=4; 
+    time_1302[4]=tableDS1302[2]&0x0F; //求时的个位
+    time_1302[5]=tableDS1302[2]&0x70; //求时的十位
+    time_1302[5]>>=4; 
+ }
+/******************************************************************** 
+函 数 名:get_date()读取日期函数
+功    能:读取DS1302当前日期
+入口参数:无
+返 回 值:无。 
+***********************************************************************/
+void get_date(void)
+ {
+    DS1302_get_all(); 
+    date_1302[0]=tableDS1302[3]&0x0F;//求日的个位
+    date_1302[1]=tableDS1302[3]&0x30; //求日的十位
+    date_1302[1]>>=4;//右移4位
+    date_1302[2]=tableDS1302[4]&0x0F;  //求月的个位
+    date_1302[3]=tableDS1302[4]&0x10; //求月的十位
+    date_1302[3]>>=4; 
+    date_1302[4]=tableDS1302[6]&0x0F; //求年的个位
+    date_1302[5]=tableDS1302[6]&0xF0; //求年的十位
+    date_1302[5]>>=4; 
+ }
+void get_result(void)
+{
+        int i;
+        int j;
+        get_date();
+        i=date_1302[5]; 
+        j=date_1302[4]; 
+        year=i*10+j;
+        i=date_1302[3]; 
+        j=date_1302[2]; 
+        month=i*10+j;       
+        i=date_1302[1]; 
+        j=date_1302[0]; 
+        date=i*10+j;            
+        get_timeV2();
+        i=time_1302[5]; 
+        j=time_1302[4]; 
+        hour=i*10+j;
+        i=time_1302[3]; 
+        j=time_1302[2]; 
+        min=i*10+j;     
+        i=time_1302[1]; 
+        j=time_1302[0]; 
+        sec=i*10+j;
+}
+void Set_IO_OUT(void)
+{       
+ 
+	
+		GPIO_InitTypeDef GPIO_InitStructure; /*定义一个GPIO_InitTypeDef类型的结构体*/
+
+		__HAL_RCC_GPIOE_CLK_ENABLE();
+
+		GPIO_InitStructure.Pin =  DS1302_DATA;   
+		GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;  // /设置引脚模式为输入
+		GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_MEDIUM; 
+		//GPIO_Init(GPIOE, &GPIO_InitStructure);  
+		HAL_GPIO_Init(GPIOE, &GPIO_InitStructure);
+	
+	
+}
+void Set_IO_INPUT(void)
+{       
+		GPIO_InitTypeDef GPIO_InitStructure; /*定义一个GPIO_InitTypeDef类型的结构体*/
+
+		__HAL_RCC_GPIOE_CLK_ENABLE();
+
+		GPIO_InitStructure.Pin =  DS1302_DATA;   
+		GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_OD;//GPIO_MODE_INPUT;  // /设置引脚模式为输入
+		GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_MEDIUM; 
+		//GPIO_Init(GPIOE, &GPIO_InitStructure); 
+		HAL_GPIO_Init(GPIOE, &GPIO_InitStructure);
+		
+}
+
+
+

+ 379 - 0
Src/DS1302Drv.c

@@ -0,0 +1,379 @@
+/*
+ * author: xxJian
+ * date: 2018-9-3 
+ * ported from https://github.com/msparks/arduino-ds1302
+ * 
+ */
+ 
+#include "DS1302Drv.h"
+ 
+ 
+uint8_t time_buf_reg[8] = {0x20,0x10,0x09,0x14,0x23,0x59,0x50,0x02};//3?ê?ê±??
+uint32_t b_date=12, b_month=6, b_year=2021, b_hour=23, b_minute=59, b_second=50, b_day=2;
+ 
+ 
+ 
+// Returns the decoded decimal value from a binary-coded decimal (BCD) byte.
+// Assumes 'bcd' is coded with 4-bits per digit, with the tens place digit in
+// the upper 4 MSBs.
+uint8_t bcdToDec(const uint8_t bcd) 
+{
+  return (10 * ((bcd & 0xF0) >> 4) + (bcd & 0x0F));
+}
+ 
+// Returns the binary-coded decimal of 'dec'. Inverse of bcdToDec.
+uint8_t decToBcd(const uint8_t dec) 
+{  
+  uint8_t tens, ones;
+  
+  tens = dec / 10;
+  ones = dec % 10;
+  return (tens << 4) | ones;
+}
+ 
+// Returns the hour in 24-hour format from the hour register value.
+uint8_t hourFromRegisterValue(const uint8_t value) {
+  uint8_t adj;
+  if (value & 128)  // 12-hour mode
+    adj = 12 * ((value & 32) >> 5);
+  else           // 24-hour mode
+    adj = 10 * ((value & (32 + 16)) >> 4);
+  return (value & 15) + adj;
+}
+ 
+void DS1302_writeOut(const uint8_t value, uint8_t readAfter) 
+{  
+  GPIO_InitTypeDef GPIO_InitStruct;
+  uint32_t i,j;
+  
+  //pinMode(io_pin_, OUTPUT);  
+  GPIO_InitStruct.Pin = DS1302_IO_Pin;
+  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+  GPIO_InitStruct.Pull = GPIO_NOPULL;
+  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+  HAL_GPIO_Init(DS1302_IO_GPIO_Port, &GPIO_InitStruct);    
+  
+  for (i = 0; i < 8; i++) 
+	{  
+    //digitalWrite(io_pin_, (value >> i) & 1);
+    if( (value >> i) & 1 ) {
+      HAL_GPIO_WritePin(DS1302_IO_GPIO_Port, DS1302_IO_Pin, GPIO_PIN_SET);        
+    } else {
+      HAL_GPIO_WritePin(DS1302_IO_GPIO_Port, DS1302_IO_Pin, GPIO_PIN_RESET);    
+    }
+    //HAL_Delay(1);
+    HAL_GPIO_WritePin(DS1302_SCLK_GPIO_Port, DS1302_SCLK_Pin, GPIO_PIN_RESET);    //digitalWrite(sclk_pin_, HIGH);
+    
+		
+		//HAL_Delay(2);
+		j=2000;
+		while(j>1)
+		{
+				j--;
+			__nop();
+		}
+ 
+    if (readAfter && i == 7) {
+      // We're about to read data -- ensure the pin is back in input mode
+      // before the clock is lowered.
+      //pinMode(io_pin_, INPUT);    
+      HAL_GPIO_WritePin(DS1302_SCLK_GPIO_Port, DS1302_SCLK_Pin, GPIO_PIN_SET);
+      //HAL_Delay(1);  
+			
+			j=2000;
+			while(j>1)
+			{
+			j--;
+			__nop();
+			}
+
+		
+      HAL_GPIO_WritePin(DS1302_IO_GPIO_Port, DS1302_IO_Pin, GPIO_PIN_RESET);  
+      GPIO_InitStruct.Pin = DS1302_IO_Pin;
+      GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
+      GPIO_InitStruct.Pull = GPIO_NOPULL;
+      HAL_GPIO_Init(DS1302_IO_GPIO_Port, &GPIO_InitStruct);
+      //HAL_Delay(1);  
+    } else {
+      HAL_GPIO_WritePin(DS1302_SCLK_GPIO_Port, DS1302_SCLK_Pin, GPIO_PIN_SET);  //digitalWrite(sclk_pin_, LOW);
+      //HAL_Delay(2);                                                                //delayMicroseconds(1);
+			j=2000;
+			while(j>1)
+			{
+				j--;
+				__nop();
+			}
+    }
+  }
+}
+ 
+uint8_t DS1302_readIn(void) 
+{
+  uint8_t input_value;
+  uint8_t bit;
+  uint32_t i,j;
+  
+  input_value = 0;
+  bit = 0;
+  
+  GPIO_InitTypeDef GPIO_InitStruct;
+  HAL_GPIO_WritePin(DS1302_IO_GPIO_Port, DS1302_IO_Pin, GPIO_PIN_RESET);    
+  //pinMode(io_pin_, INPUT);
+  GPIO_InitStruct.Pin = DS1302_IO_Pin;
+  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
+  GPIO_InitStruct.Pull = GPIO_NOPULL;
+  HAL_GPIO_Init(DS1302_IO_GPIO_Port, &GPIO_InitStruct);
+ 
+  // Bits from the DS1302 are output on the falling edge of the clock
+  // cycle. This is called after readIn (which will leave the clock low) or
+  // writeOut(..., true) (which will leave it high).
+  for (i = 0; i < 8; i++) {
+    
+    HAL_GPIO_WritePin(DS1302_SCLK_GPIO_Port, DS1302_SCLK_Pin, GPIO_PIN_SET);    //digitalWrite(sclk_pin_, HIGH);
+    //HAL_Delay(2);                                                                //delayMicroseconds(1);
+					while(j>1)
+			{
+				j--;
+				__nop();
+			}
+			
+			
+    HAL_GPIO_WritePin(DS1302_SCLK_GPIO_Port, DS1302_SCLK_Pin, GPIO_PIN_RESET);  //digitalWrite(sclk_pin_, LOW);
+    //HAL_Delay(1);                                                                //delayMicroseconds(1);
+			j=2000;
+						while(j>1)
+			{
+				j--;
+				__nop();
+			}
+    bit = HAL_GPIO_ReadPin(DS1302_IO_GPIO_Port, DS1302_IO_Pin);                  //bit = digitalRead(io_pin_);
+    //HAL_Delay(1);  
+			j=2000;
+					while(j>1)
+			{
+				j--;
+				__nop();
+			}
+			
+    input_value |= (bit << i);  // Bits are read LSB first.
+  }
+ 
+  return input_value;
+}
+ 
+uint8_t DS1302_readRegister(const uint8_t reg) 
+{
+  //const SPISession s(ce_pin_, io_pin_, sclk_pin_);
+ 
+  uint8_t cmd_byte;
+  uint8_t result;  
+  uint32_t j; 
+  HAL_GPIO_WritePin(DS1302_CE_GPIO_Port, DS1302_CE_Pin, GPIO_PIN_SET);
+  
+  
+  cmd_byte = (0x81 | (reg << 1));
+  DS1302_writeOut(cmd_byte, DEF_true);
+  result = DS1302_readIn();
+  
+  
+  //HAL_Delay(1);
+				j=2000;
+					while(j>1)
+			{
+				j--;
+				__nop();
+			}
+			
+  HAL_GPIO_WritePin(DS1302_CE_GPIO_Port, DS1302_CE_Pin, GPIO_PIN_RESET);
+  
+  
+  return result;
+}
+ 
+void DS1302_writeRegister(const uint8_t reg, const uint8_t value) 
+{
+  //const SPISession s(ce_pin_, io_pin_, sclk_pin_);
+  
+  uint8_t cmd_byte;
+  
+  
+  HAL_GPIO_WritePin(DS1302_CE_GPIO_Port, DS1302_CE_Pin, GPIO_PIN_SET);
+  
+  
+  cmd_byte = (0x80 | (reg << 1));
+  DS1302_writeOut(cmd_byte, DEF_false);
+  DS1302_writeOut(value, DEF_false);  
+  
+  HAL_GPIO_WritePin(DS1302_SCLK_GPIO_Port, DS1302_SCLK_Pin, GPIO_PIN_RESET);
+  HAL_GPIO_WritePin(DS1302_CE_GPIO_Port, DS1302_CE_Pin, GPIO_PIN_RESET);
+}
+ 
+void DS1302_writeProtect(const uint8_t enable) 
+{
+  HAL_GPIO_WritePin(DS1302_CE_GPIO_Port, DS1302_CE_Pin, GPIO_PIN_SET);
+  DS1302_writeRegister(kWriteProtectReg, (enable << 7));
+  HAL_GPIO_WritePin(DS1302_CE_GPIO_Port, DS1302_CE_Pin, GPIO_PIN_RESET);
+}
+ 
+void DS1302_halt(const uint8_t enable) 
+{
+  uint8_t sec;
+  HAL_GPIO_WritePin(DS1302_CE_GPIO_Port, DS1302_CE_Pin, GPIO_PIN_SET);
+  sec = DS1302_readRegister(kSecondReg);
+  sec &= ~(1 << 7);
+  sec |= (enable << 7);
+  DS1302_writeRegister(kSecondReg, sec);
+  HAL_GPIO_WritePin(DS1302_CE_GPIO_Port, DS1302_CE_Pin, GPIO_PIN_RESET);
+}
+ 
+ 
+void DS1302_writeRam(const uint8_t address, const uint8_t value) 
+{
+  if (address >= kRamSize) {
+    return;
+  }
+ 
+  DS1302_writeRegister(kRamAddress0 + address, value);
+}
+ 
+uint8_t DS1302_readRam(const uint8_t address) 
+{
+  if (address >= kRamSize) {
+    return 0;
+  }
+ 
+  return DS1302_readRegister(kRamAddress0 + address);
+}
+ 
+void DS1302_writeRamBulk(const uint8_t* const data, int len) 
+{
+  if (len <= 0) {
+    return;
+  }
+  if (len > kRamSize) {
+    len = kRamSize;
+  }
+ 
+  //const SPISession s(ce_pin_, io_pin_, sclk_pin_);
+ 
+  DS1302_writeOut(kRamBurstWrite, DEF_false);
+  for (int i = 0; i < len; ++i) {
+    DS1302_writeOut(data[i], DEF_false);
+  }
+}
+ 
+void DS1302_readRamBulk(uint8_t* const data, int len) 
+{
+  if (len <= 0) {
+    return;
+  }
+  if (len > kRamSize) {
+    len = kRamSize;
+  }
+ 
+  //const SPISession s(ce_pin_, io_pin_, sclk_pin_);
+ 
+  DS1302_writeOut(kRamBurstRead, DEF_true);
+  for (int i = 0; i < len; ++i) {
+    data[i] = DS1302_readIn();
+  }
+}
+ 
+ 
+void DS1302_timeRead() 
+{
+  //const SPISession s(ce_pin_, io_pin_, sclk_pin_);
+  
+  HAL_GPIO_WritePin(DS1302_CE_GPIO_Port, DS1302_CE_Pin, GPIO_PIN_SET);
+  
+  //Time t(2099, 1, 1, 0, 0, 0, Time::kSunday);
+  //DS1302_writeOut(kClockBurstRead, DEF_true);
+  
+  
+  time_buf_reg[7] = DS1302_readRegister(kSecondReg)& 0x7F;  //sec
+  time_buf_reg[6] = DS1302_readRegister(kMinuteReg);  //min
+  time_buf_reg[5] = DS1302_readRegister(kHourReg);    //hr
+  time_buf_reg[4] = DS1302_readRegister(kDateReg);    //date
+  time_buf_reg[3] = DS1302_readRegister(kMonthReg);    //mon
+  time_buf_reg[2] = DS1302_readRegister(kDayReg);      //day
+  time_buf_reg[1] = DS1302_readRegister(kYearReg);    //yr
+  /*
+  time_buf_reg[7] = DS1302_readIn() & 0x7F;  //sec
+  time_buf_reg[6] = DS1302_readIn();          //min
+  time_buf_reg[5] = DS1302_readIn();          //hr
+  time_buf_reg[4] = DS1302_readIn();          //date
+  time_buf_reg[3] = DS1302_readIn();          //mon
+  time_buf_reg[2] = DS1302_readIn();          //day
+  time_buf_reg[1] = DS1302_readIn();          //yr
+    */  
+    
+  b_year  = 2000 + bcdToDec(time_buf_reg[1]);
+  b_day   = bcdToDec(time_buf_reg[2]);
+  b_month = bcdToDec(time_buf_reg[3]);
+  b_date  = bcdToDec(time_buf_reg[4]);
+  b_hour  = hourFromRegisterValue(time_buf_reg[5]);
+  b_minute = bcdToDec(time_buf_reg[6]);
+  b_second = bcdToDec(time_buf_reg[7]);
+  
+  HAL_GPIO_WritePin(DS1302_SCLK_GPIO_Port, DS1302_SCLK_Pin, GPIO_PIN_RESET);
+  HAL_GPIO_WritePin(DS1302_CE_GPIO_Port, DS1302_CE_Pin, GPIO_PIN_RESET);
+  
+}
+ 
+void DS1302_timeWrite(void) 
+{
+  
+  // We want to maintain the Clock Halt flag if it is set.
+  uint8_t ch_value;  
+  
+  HAL_GPIO_WritePin(DS1302_CE_GPIO_Port, DS1302_CE_Pin, GPIO_PIN_SET);
+  
+  ch_value = DS1302_readRegister(kSecondReg) & 0x80;
+ 
+  //const SPISession s(ce_pin_, io_pin_, sclk_pin_);
+ 
+	
+	/*
+	2019年5月11日更新:有一段时间DS1302模块没有安装纽扣电池,重新使用本次代码发现有点问题。
+	经调试发现,DS1302_timeWrite() 函数内,有一行代码是专门判断Clock Halt(时间停止)标志位是否设置的。
+	估计是DS1302初安装纽扣电池上电时,这个时钟是停止计算的。
+	因此,上纽扣电池的第一次执行,需要使用这行:
+
+	DS1302_writeRegister(kSecondReg, decToBcd(b_second));		
+	随后,才可以使用这行:
+
+	DS1302_writeRegister(kSecondReg,ch_value | decToBcd(b_second));
+ 
+	*/
+//DS1302_writeRegister(kSecondReg, decToBcd(b_second));      
+    DS1302_writeRegister(kSecondReg,ch_value | decToBcd(b_second));
+	
+	
+	
+	
+	
+  DS1302_writeRegister(kMinuteReg,decToBcd(b_minute));
+  DS1302_writeRegister(kHourReg,decToBcd(b_hour));
+  DS1302_writeRegister(kDateReg,decToBcd(b_date));
+  DS1302_writeRegister(kMonthReg,decToBcd(b_month));
+  DS1302_writeRegister(kDayReg ,decToBcd(b_day));
+  DS1302_writeRegister(kYearReg,decToBcd(b_year - 2000));
+  /*
+  DS1302_writeOut(kClockBurstWrite, DEF_false);
+  DS1302_writeOut(ch_value | decToBcd(b_second), DEF_false);
+  DS1302_writeOut(decToBcd(b_minute), DEF_false);
+  DS1302_writeOut(decToBcd(b_hour), DEF_false);
+  DS1302_writeOut(decToBcd(b_date), DEF_false);
+  DS1302_writeOut(decToBcd(b_month), DEF_false);
+  DS1302_writeOut(decToBcd(b_day), DEF_false);
+  DS1302_writeOut(decToBcd(b_year - 2000), DEF_false);
+  // All clock registers *and* the WP register have to be written for the time
+  // to be set.
+  DS1302_writeOut(0, DEF_false);  // Write protection register.
+  DS1302_writeOut(0, DEF_false);  // Trickle Charge register.
+  */
+  
+  HAL_GPIO_WritePin(DS1302_SCLK_GPIO_Port, DS1302_SCLK_Pin, GPIO_PIN_RESET);
+  HAL_GPIO_WritePin(DS1302_CE_GPIO_Port, DS1302_CE_Pin, GPIO_PIN_RESET);
+}
+

+ 857 - 0
Src/Data_deal.c

@@ -0,0 +1,857 @@
+#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)
+{
+// int i;
+	 str[0] = data>>24;
+	 str[1] = data>>16;
+	 str[2] = data>>8;
+	 str[3] = data;
+// for(i=3;i>0;i--)
+// {
+//    str[i]=(data>>(i*8))& 0xFF;
+// }
+}
+
+
+/*******************************************************************************
+* 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);
+}
+
+uint8_t MODBUS_GetLrc(uint8_t *pCyAsciiBuf, uint8_t cyLen)
+{
+	uint8_t i;
+	uint8_t cyLrcVal;
+	
+
+	//cyLen /= 2;
+	cyLrcVal = 0;
+	for (i = 0; i < cyLen; i++)
+	{
+		cyLrcVal +=  *(pCyAsciiBuf + i);
+	}
+	
+	cyLrcVal = ~cyLrcVal;
+	cyLrcVal += 1;
+	
+	return (cyLrcVal);
+}
+
+/*******************************************************************************
+* Function Name  : MODBUS_ASCII_GetLrc
+* Description    : LRC校验
+* Input          : pCyAsciiBuf--要校验的数组 cyLen--长度
+* Output         : None
+* Return         : cyLrcVal 校验后的值
+*******************************************************************************/
+uint8_t MODBUS_ASCII_GetLrc(uint8_t *pCyAsciiBuf, uint16_t cyLen)
+{
+	uint16_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_Hex_GetLrc
+* Description    : LRC校验
+* Input          : pCyAsciiBuf--要校验的数组 cyLen--长度
+* Output         : None
+* Return         : cyLrcVal 校验后的值
+*******************************************************************************/
+uint8_t MODBUS_Hex_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 +=  *(pCyAsciiBuf + i * 1);
+	}
+	
+	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;
+		}
+	}
+}
+
+////将一个8位数高低4位交换 
+//static inline unsigned char bswap_8(unsigned char v)
+//{	
+//	return ((v & 0xff) << 4) | (v >> 4) ;   //将参数(v & 0xff) << 4 相当于放到高位, v >> 4 位相当于放在低位
+//}                                               //以下两个代码分析雷同
+////将一个16位数高低8位交换 
+//static inline unsigned short bswap_16(unsigned short v)
+//{
+//	return ((v & 0xff) << 8) | (v >> 8);
+//}
+////将一个32位数高低16位交换 
+//static inline unsigned int bswap_32(unsigned int v)
+//{
+//	return ((v & 0xff) << 24) | ((v & 0xff00) << 8) |
+//		((v & 0xff0000) >> 8) | (v >> 24);
+//}
+
+/*******************************************************************************
+* 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);//高低互换
+//	 return wReturn;
+}
+
+
+
+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;     
+} 
+// crcValue=CRC16(SendBuf,4);
+//    SendBuf[4]=(unsigned char)crcValue;
+//    SendBuf[5]=(unsigned char)(crcValue>>8);
+
+
+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);
+}

+ 971 - 0
Src/Dwin.c

@@ -0,0 +1,971 @@
+#include "Dwin.h"
+#include "usart.h"
+#include <stdio.h>
+#include <string.h>
+#include "CollectMaster485.h"
+#include "TerminalSlave485.h"
+#include "ScreenMaster485.h"
+#include "Elec_Seal.h"
+#include "main.h"
+#include "KeySlave485.h"
+
+#include "cmsis_os.h"
+
+Run_mode_key Run_mode_key_info;
+uint8_t Lcd_sleep_flag =2;//1休眠状态  3 唤醒状态   2执行唤醒
+uint8_t DateDwin[8];
+uint8_t time_Set_Dwin[14]={0x5A, 0xA5, 0x0B ,0x82 ,0x00 ,0x9C ,0x5A ,0xA5 ,0x13 ,0x05 ,0x1B ,0x0b ,0x1b ,0x19};
+
+SemaphoreHandle_t xSemaphore = NULL;
+int Init_Dwin_Signal(void)
+{
+	xSemaphore = xSemaphoreCreateMutex();
+	if(xSemaphore==NULL)
+	{
+		return 0;
+	}
+	usart3_rx_flag=1;
+	return 1;
+}
+
+
+/******************************************************************************
+写8位数据
+输入:写入地址:addr16,  写入数据:data16
+输出返回:无	
+5A A5 04 83 00 10 04
+
+将会收到:            年 月 日 星期;时,分,秒.
+5A A5 0C 83 00 10 04 15 01 06 03 14 28 11 00 
+5A A5 0C 83 00 10 04 15 01 07 04 15 1C 30 00 
+******************************************************************************/
+void GetDateFromDwin(void)
+{ 
+	uint8_t TxDwinDataBuf[7];
+    TxDwinDataBuf[0]=STARTSIGN_H;
+	TxDwinDataBuf[1]=STARTSIGN_L;
+	TxDwinDataBuf[2]=0x04;								
+	TxDwinDataBuf[3]=0x83;
+	TxDwinDataBuf[4]=0x00;
+	TxDwinDataBuf[5]=0x10;
+	TxDwinDataBuf[6]=0x04;
+	if(xSemaphore && xSemaphoreTake( xSemaphore, ( TickType_t ) 5) == pdFALSE)
+	{
+		return;
+	}
+		ScreenMaster485_Send_Data(TxDwinDataBuf,7);
+	if(xSemaphore)
+		xSemaphoreGive( xSemaphore );
+	//HAL_Delay(20);//
+}
+
+
+/******************************************************************************
+写8位数据
+输入:写入地址:addr16,  写入数据:data16
+输出返回:无	
+5A A5       05   82   10 01     00 03
+******************************************************************************/
+void WrDwinCmd8(uint16_t addr16,uint8_t data8)
+{
+	uint8_t TxDwinDataBuf[7];
+  TxDwinDataBuf[0]=STARTSIGN_H;
+	TxDwinDataBuf[1]=STARTSIGN_L;
+	TxDwinDataBuf[2]=0x04;								
+	TxDwinDataBuf[3]=0x82;
+	TxDwinDataBuf[4]=addr16>>8;
+	TxDwinDataBuf[5]=addr16;
+	TxDwinDataBuf[6]=data8;
+	if(xSemaphore && xSemaphoreTake( xSemaphore, ( TickType_t ) 5) == pdFALSE)
+	{
+		return;
+	}
+		ScreenMaster485_Send_Data(TxDwinDataBuf,7);
+	if(xSemaphore)
+		xSemaphoreGive( xSemaphore );
+//	HAL_Delay(10);//
+}
+
+
+
+
+/******************************************************************************
+写16位数据
+输入:写入地址:addr16,  写入数据:data16
+输出返回:无	
+5A A5       05   82   10 01     00 03
+******************************************************************************/
+void WrDwinCmd16(uint16_t addr16,uint16_t data16)
+{
+	uint8_t TxDwinDataBuf[8];
+  	TxDwinDataBuf[0]=STARTSIGN_H;
+	TxDwinDataBuf[1]=STARTSIGN_L;
+	TxDwinDataBuf[2]=0x05;								//数据长度+命令+地址+数据
+	TxDwinDataBuf[3]=0x82;
+	TxDwinDataBuf[4]=addr16>>8;
+	TxDwinDataBuf[5]=addr16;
+	TxDwinDataBuf[6]=data16>>8;
+	TxDwinDataBuf[7]=data16;	
+
+	//taskENTER_CRITICAL();
+	if(xSemaphore && xSemaphoreTake( xSemaphore, ( TickType_t ) 500) == pdFALSE)
+	{
+		return;
+	}
+	ScreenMaster485_Send_Data(TxDwinDataBuf,8);
+	if(xSemaphore)
+		xSemaphoreGive( xSemaphore );
+	//taskEXIT_CRITICAL();
+	//osDelay(10);//HAL_Delay(10);//
+	
+}
+
+/******************************************************************************
+发送命令
+写32位数据
+输入:写入地址:addr16,  写入数据:data32
+输出返回:无	
+5A A5       07   82      00 84      5A 01     00 03
+******************************************************************************/
+void WrDwinCmd32(uint16_t addr16,uint32_t data32)
+{
+	uint8_t TxDwinDataBuf[10];
+    TxDwinDataBuf[0]=STARTSIGN_H;
+	TxDwinDataBuf[1]=STARTSIGN_L;
+	TxDwinDataBuf[2]=0x07;								//数据长度+命令+地址+数据
+	TxDwinDataBuf[3]=0x82;
+	TxDwinDataBuf[4]=addr16>>8;
+	TxDwinDataBuf[5]=addr16;
+	TxDwinDataBuf[6]=data32>>24;
+	TxDwinDataBuf[7]=data32>>16;
+	TxDwinDataBuf[8]=data32>>8;
+	TxDwinDataBuf[9]=data32;	
+	if(xSemaphore && xSemaphoreTake( xSemaphore, ( TickType_t ) 500) == pdFALSE)
+	{
+		return;
+	}																			
+		ScreenMaster485_Send_Data(TxDwinDataBuf,10);
+	if(xSemaphore)
+		xSemaphoreGive( xSemaphore );		
+	//osDelay(15);//HAL_Delay(15);//
+}
+/******************************************************************************
+发送命令
+写16位数据
+输入:写入地址:addr16,  写入数据:*buf
+输出返回:无	
+******************************************************************************/
+void WrDwinBuf16(uint16_t addr16,uint16_t *buf)
+{
+	uint8_t TxDwinDataBuf[8];
+	TxDwinDataBuf[0]=STARTSIGN_H;
+	TxDwinDataBuf[1]=STARTSIGN_L;
+	TxDwinDataBuf[2]=0x05;							
+	TxDwinDataBuf[3]=0x82;
+	TxDwinDataBuf[4]=addr16>>8;
+	TxDwinDataBuf[5]=addr16;
+	TxDwinDataBuf[6]=(*buf)>>8;
+	TxDwinDataBuf[7]=*buf;
+	if(xSemaphore && xSemaphoreTake( xSemaphore, ( TickType_t ) 150) == pdFALSE)
+	{
+		return;
+	}	
+		ScreenMaster485_Send_Data(TxDwinDataBuf,8);
+	if(xSemaphore)
+		xSemaphoreGive( xSemaphore );		
+	//HAL_Delay(10);//
+}
+
+/******************************************************************************
+发送命令
+写16位数据
+输入:写入地址:addr16,  写入数据:*buf
+输出返回:无	
+******************************************************************************/
+void WrDwinBuf32(uint16_t addr16,uint16_t *buf)
+{
+	uint8_t TxDwinDataBuf[10];
+	TxDwinDataBuf[0]=STARTSIGN_H;
+	TxDwinDataBuf[1]=STARTSIGN_L;
+	TxDwinDataBuf[2]=0x07;						
+	TxDwinDataBuf[3]=0x82;
+	TxDwinDataBuf[4]=addr16>>8;
+	TxDwinDataBuf[5]=addr16;
+	TxDwinDataBuf[6]=(*buf)>>8;
+	TxDwinDataBuf[7]=*buf++;
+	TxDwinDataBuf[8]=(*buf)>>8;
+	TxDwinDataBuf[9]=*buf;	
+	if(xSemaphore && xSemaphoreTake( xSemaphore, ( TickType_t ) 5) == pdFALSE)
+	{
+		return;
+	}							
+		ScreenMaster485_Send_Data(TxDwinDataBuf,10);
+	if(xSemaphore)
+		xSemaphoreGive( xSemaphore );		
+	//	HAL_Delay(10);//
+	
+}
+
+
+/******************************************************************************
+发送命令
+写N个数据(字)
+输入:写入地址:addr16,  写入数据:*buf  n: 发送的地址个数
+输出返回:无	
+******************************************************************************/
+//void WrDwinBuf(uint16_t addr16,uint16_t *buf,uint8_t n)
+//{
+//	uint8_t i,num;
+//	uint8_t TxDwinDataBuf[100];
+//	num = (n<<1);
+//	TxDwinDataBuf[0]=STARTSIGN_H;
+//	TxDwinDataBuf[1]=STARTSIGN_L;
+//	TxDwinDataBuf[2]=num+3;						
+//	TxDwinDataBuf[3]=0x82;
+//	TxDwinDataBuf[4]=addr16>>8;
+//	TxDwinDataBuf[5]=addr16;
+//	for(i=0;i<num;i+=2)
+//	{
+//		TxDwinDataBuf[i+6]=(*buf)>>8;
+//		TxDwinDataBuf[i+7]=*buf++;
+//	}	
+//		ScreenMaster485_Send_Data(TxDwinDataBuf,6+num);
+//	HAL_Delay(20);//
+//	
+//}
+
+uint8_t TxDwinDataBuf[512];
+void WrDwinBuf(uint16_t addr16,uint16_t *buf,uint16_t n,uint8_t LSB_Mode)
+{
+	uint16_t i,num;
+	if(xSemaphore && xSemaphoreTake( xSemaphore, ( TickType_t ) 200) == pdFALSE)
+	{
+		return;
+	}
+	num = (n<<1);
+	
+	if(num>255-7)
+	{
+		num = 255-7;//防止溢出错误
+	}
+	
+	
+	TxDwinDataBuf[0]=STARTSIGN_H;
+	TxDwinDataBuf[1]=STARTSIGN_L;
+	TxDwinDataBuf[2]=num+3;						
+	TxDwinDataBuf[3]=0x82;
+	TxDwinDataBuf[4]=addr16>>8;
+	TxDwinDataBuf[5]=addr16;
+	for(i=0;i<num;i+=2)
+	{
+		if(LSB_Mode==1)//先发送低位字节
+		{		
+			TxDwinDataBuf[i+7]=(*buf)>>8;
+			TxDwinDataBuf[i+6]=*buf++;
+		}
+		else //先发送高位字节
+		{//李伟修改 20210531    迪文屏的高低存储跟常规的是反过来的	
+			TxDwinDataBuf[i+6]=(*buf)>>8;
+			TxDwinDataBuf[i+7]=*buf++;
+				
+		}
+
+		
+
+	}	
+	
+	ScreenMaster485_Send_Data(TxDwinDataBuf,6+num);
+//	osDelay(10);
+#if 0	
+	if(num<10)
+	{
+			HAL_Delay(10);
+	}
+	else
+	{
+			//HAL_Delay(num);
+		  ;//HAL_Delay(20);
+		  osDelay(20);
+		
+	}
+#endif	
+	if(xSemaphore)
+		xSemaphoreGive( xSemaphore );
+}
+
+
+
+
+/******************************************************************************
+发送命令
+写N个数据(字)
+输入:写入地址:addr16,  写入数据:*buf  n: 发送的地址个数
+输出返回:无	
+******************************************************************************/
+void WrDwinBuf_u8(uint16_t addr16,uint8_t *buf,uint8_t n)
+{
+	uint8_t i,num;
+	uint8_t TxDwinDataBuf[100];
+	num = (n);
+	TxDwinDataBuf[0]=STARTSIGN_H;
+	TxDwinDataBuf[1]=STARTSIGN_L;
+	TxDwinDataBuf[2]=num+3;						
+	TxDwinDataBuf[3]=0x82;
+	TxDwinDataBuf[4]=addr16>>8;
+	TxDwinDataBuf[5]=addr16;
+	for(i=0;i<num;i+=1)
+	{
+		TxDwinDataBuf[i+6]=(*buf);
+		//TxDwinDataBuf[i+7]=*buf++;
+	}	
+		ScreenMaster485_Send_Data(TxDwinDataBuf,6+num);
+//	HAL_Delay(10);//
+	
+}
+
+
+
+/******************************************************************************
+读取一个字的,读16位数据
+输入:写入地址:addr16,  写入数据:*buf
+输出返回:无			
+******************************************************************************/
+void RdDwinData16(uint16_t addr16,uint8_t len)
+{
+	uint8_t TxDwinDataBuf[8];
+	TxDwinDataBuf[0]=STARTSIGN_H;
+	TxDwinDataBuf[1]=STARTSIGN_L;
+	TxDwinDataBuf[2]=0x04;									
+	TxDwinDataBuf[3]=0x83;
+	TxDwinDataBuf[4]=addr16>>8;
+	TxDwinDataBuf[5]=addr16;
+	TxDwinDataBuf[6]=len;																				
+		ScreenMaster485_Send_Data(TxDwinDataBuf,7);
+//	HAL_Delay(10);//
+	
+}
+
+
+
+/******************************************************************************
+读取一个字的,读16位数据
+输入:写入地址:addr16,  写入数据:*buf
+输出返回:无			
+******************************************************************************/
+void Restart_LCD(void)
+{
+	uint8_t TxDwinDataBuf[10];
+	TxDwinDataBuf[0]=STARTSIGN_H;
+	TxDwinDataBuf[1]=STARTSIGN_L;
+	TxDwinDataBuf[2]=0x07;									
+	TxDwinDataBuf[3]=0x82;
+	TxDwinDataBuf[4]=0x00;//addr16>>8;
+	TxDwinDataBuf[5]=0x04;//addr16;
+ 
+	TxDwinDataBuf[6]=0x55;									
+	TxDwinDataBuf[7]=0xAA;
+	TxDwinDataBuf[8]=0x5a;// 
+	TxDwinDataBuf[9]=0xa5;// 
+	if(xSemaphore && xSemaphoreTake( xSemaphore, ( TickType_t ) 50) == pdFALSE)
+	{
+		return;
+	}
+		ScreenMaster485_Send_Data(TxDwinDataBuf,10);
+	if(xSemaphore)
+		xSemaphoreGive( xSemaphore );
+	HAL_Delay(10);//
+	
+}
+
+
+
+/******************************************************************************
+读取2个字的数据32位
+输入:无
+输出返回:无	
+******************************************************************************/
+void RdDwinData32(uint16_t addr16,uint8_t len)
+{
+	uint8_t TxDwinDataBuf[8];
+	TxDwinDataBuf[0]=STARTSIGN_H;
+	TxDwinDataBuf[1]=STARTSIGN_L;
+	TxDwinDataBuf[2]=0x06;									//êy?Y3¤?è+?üá?+μ??·
+	TxDwinDataBuf[3]=0x83;
+	TxDwinDataBuf[4]=addr16>>8;
+	TxDwinDataBuf[5]=addr16;
+	TxDwinDataBuf[6]=len;
+		ScreenMaster485_Send_Data(TxDwinDataBuf,7);
+	
+//	HAL_Delay(10);//
+	
+	
+}
+
+
+/******************************************************************************
+接收液晶发下来的数据,并存在结构体中
+输入:无
+输出返回:无	
+******************************************************************************/
+//void  RxAddrData (void)
+//{
+//  	u16  i;
+//	DIWEN_com();
+//	for(i = 0; i < CMDBUF_SIZE; i++)
+//	{
+//		if(ADDR_COMM == RxCmdBuf[i].Cmd_Addr)
+//		{
+//			ADDR_COMM=0xff;
+//			RxCmdBuf[i].Cmd_Flag =	1;
+//			RxCmdBuf[i].Cmd_Data = DATA_COMM;
+//		}
+//	}  
+//}
+
+/******************************************************************************
+分析数据并处理数据
+输入:无
+输出返回:无	
+******************************************************************************/
+void Lcd_Cmd_Handle(void)
+{
+//	RxAddrData();
+	
+}
+
+/******************************************************************************
+界面跳转
+输入:ID
+输出返回:无	
+******************************************************************************/
+void Jump_page_id(uint8_t id)
+{
+	WrDwinCmd32(0x0084,0x5A010000|id);
+	Run_mode_key_info.current_page = id;
+}
+
+/******************************************************************************
+首页
+数字:表示页面,在工程中可以看出
+输入:无
+输出返回:无	
+******************************************************************************/
+
+uint8_t Special_Stor;
+void Go_homepage(void)
+{
+	
+	switch (all_Store)
+				{
+					case 1:
+						Jump_page_id(1);//跳到主界面常规1仓
+						Run_mode_key_info.Main_Page_id =1;//状态界面
+						Run_mode_key_info.Full_oil_id = 10;//装油界面
+						Run_mode_key_info.offLoading_oil_id =19;//卸油界面
+						break;
+					case 2:
+//						if((StoreNumber == 1)&&Special_Stor)//跳到1仓2盖((Config_info_all.ManHole_Big_info&0x0f)==0x02)
+//						{
+//							Jump_page_id(2);
+//							Run_mode_key_info.Main_Page_id =2;
+//							Run_mode_key_info.Full_oil_id = 11;
+//							Run_mode_key_info.offLoading_oil_id =20;
+//						}
+//						else //常规2仓
+//						{
+							Jump_page_id(3);
+							Run_mode_key_info.Main_Page_id =3;
+							Run_mode_key_info.Full_oil_id = 12;
+							Run_mode_key_info.offLoading_oil_id =21;
+//						}
+						break;
+					case 3:
+						Jump_page_id(4);
+						Run_mode_key_info.Main_Page_id =4;
+						Run_mode_key_info.Full_oil_id = 13;
+						Run_mode_key_info.offLoading_oil_id =22;
+						break;
+					case 4:
+						Jump_page_id(5);
+						Run_mode_key_info.Main_Page_id =5;
+						Run_mode_key_info.Full_oil_id = 14;
+						Run_mode_key_info.offLoading_oil_id =23;
+						break;
+					case 5:
+						Jump_page_id(6);
+						 Run_mode_key_info.Main_Page_id =6;
+						Run_mode_key_info.Full_oil_id = 15;
+						Run_mode_key_info.offLoading_oil_id =24;
+						break;
+					case 6:
+						Jump_page_id(7);
+						Run_mode_key_info.Main_Page_id =7;
+						Run_mode_key_info.Full_oil_id = 16;
+						Run_mode_key_info.offLoading_oil_id =25;
+						break;
+					case 7:
+						Jump_page_id(8);
+						Run_mode_key_info.Main_Page_id =8;
+						Run_mode_key_info.Full_oil_id = 17;
+						Run_mode_key_info.offLoading_oil_id =26;
+						break;
+					case 8:
+						Jump_page_id(9);
+						Run_mode_key_info.Main_Page_id =9;
+						Run_mode_key_info.Full_oil_id = 18;
+						Run_mode_key_info.offLoading_oil_id =27;
+						break;
+					default:break;
+				}
+				Run_mode_key_info.Liquid_id = 54;
+}
+/******************************************************************************
+屏幕初始化
+输入:无
+输出返回:无	
+******************************************************************************/
+void Lcd_Init(void)
+{
+	//初始化界面
+	
+
+	WrDwinCmd16(ADDR_DWIN_CoverSmall,0x00);//人孔小盖关
+//	HAL_Delay(15);
+	WrDwinCmd16(ADDR_DWIN_CoverBig,0x00);//人孔大盖关
+//	HAL_Delay(15);
+	WrDwinCmd16(ADDR_DWIN_HaiDiFa,0x00);//底阀关
+//	HAL_Delay(15);
+	
+	
+	WrDwinCmd16(ADDR_DWIN_XieYouFa,0x00);//卸油阀关
+//	HAL_Delay(15);
+	
+	WrDwinCmd16(ADDR_DWIN_Seal_Lock,0xff);//锁不显示--
+//	HAL_Delay(15);
+	
+	WrDwinCmd16(ADDR_DWIN_Seal_UnLock,0xff);//锁开不显示
+//	HAL_Delay(15);
+	
+	WrDwinCmd16(ADDR_DWIN_Car_State,0x00);//状态正常
+//	HAL_Delay(15);
+	Go_homepage();//回到首页
+	
+//	//位控制
+//	WrDwinCmd16(0x1000,0xff);//人孔小盖开 位控制
+//	WrDwinCmd16(0x1003,0xff);//人孔大盖开
+//	WrDwinCmd16(0x1006,0xff);//底阀开
+//	WrDwinCmd16(0x1009,0xff);//卸油阀开
+//	WrDwinCmd16(0x100c,0xFF);//锁不显示
+//	WrDwinCmd16(0x100F,0x00);//锁开显示
+//	
+//	WrDwinCmd16(0x1000,0x00);//人孔小盖关
+//	WrDwinCmd16(0x1003,0x00);//人孔大盖关
+//	WrDwinCmd16(0x1006,0x00);//底阀关
+//	WrDwinCmd16(0x1009,0x00);//卸油阀关
+//	
+//	WrDwinCmd16(0x100c,0x00);//锁显示
+//	WrDwinCmd16(0x100F,0xff);//锁开不显示
+//	
+//	WrDwinCmd16(0x100c,0xff);//锁不显示
+//	WrDwinCmd16(0x100F,0xff);//锁开不显示
+//	WrDwinCmd16(0x1022,0x00);//状态正常
+//	
+//	
+//	WrDwinCmd16(0x1012,0x04);//油量 数值控制
+//	WrDwinCmd16(0x1014,0x01);//
+//	WrDwinCmd16(0x1016,0x02);//
+//	WrDwinCmd16(0x1018,0x03);//油量
+//	WrDwinCmd16(0x101a,0x04);//
+//	WrDwinCmd16(0x101c,0x02);//
+//	WrDwinCmd16(0x101e,0x00);//油量
+//	WrDwinCmd16(0x1020,0x01);//
+//	WrDwinCmd16(0x1022,0x01);//状态异常
+//	
+//	//进入装油界面
+//	WrDwinCmd32(0x0084,0x5A010000|18);
+//	
+//	WrDwinCmd16(0x1028,0x01);//装油模式 上装
+//	WrDwinCmd16(0x1026,0x00);//油量仓
+//	WrDwinCmd16(0x1024,0x01);//罐仓状态 装油中
+//	WrDwinCmd16(0x102a,0x01);//装油动画开始 1
+//		WrDwinCmd16(0x102c,0x01);//装油动画开始 2
+//			WrDwinCmd16(0x102e,0x01);//装油动画开始 3
+//				WrDwinCmd16(0x1030,0x01);//装油动画开始 4
+//					WrDwinCmd16(0x1032,0x01);//装油动画开始 5
+//						WrDwinCmd16(0x1034,0x01);//装油动画开始 6
+//							WrDwinCmd16(0x1036,0x01);//装油动画开始 7
+//								WrDwinCmd16(0x1038,0x01);//装油动画开始 8
+//	
+//	
+//	
+//	WrDwinCmd16(0x1028,0x00);//装油模式 下装
+//	WrDwinCmd16(0x1026,0x08);//油量仓
+//	WrDwinCmd16(0x1024,0x00);//罐仓状态 空闲中
+//	WrDwinCmd16(0x102a,0x00);//装油动画停止 1
+//		WrDwinCmd16(0x102c,0x00);//装油动画停止 2
+//			WrDwinCmd16(0x102e,0x00);//装油动画停止 3
+//				WrDwinCmd16(0x1030,0x00);//装油动画停止 4
+//					WrDwinCmd16(0x1032,0x00);//装油动画停止 5
+//						WrDwinCmd16(0x1034,0x00);//装油动画停止 6
+//							WrDwinCmd16(0x1036,0x00);//装油动画停止 7
+//								WrDwinCmd16(0x1038,0x00);//装油动画停止 8
+//								
+//								
+//								
+////进入卸油界面
+//	WrDwinCmd32(0x0084,0x5A010000|27);
+//	WrDwinCmd16(0x1024,0x00);//罐仓状态 空闲中
+//	WrDwinCmd16(0x1026,0x01);//油量仓
+//	WrDwinCmd16(0x1024,0x01);//罐仓状态 卸油中
+//	
+//	WrDwinCmd16(0x1012,0x00);//1仓油量 数值控制
+//	WrDwinCmd16(0x102a,0x01);//卸油动画开始 1
+//	
+//		WrDwinCmd16(0x1014,0x00);//1仓油量 数值控制
+//	WrDwinCmd16(0x102c,0x01);//卸油动画开始 2
+//	
+//		WrDwinCmd16(0x1016,0x00);//1仓油量 数值控制
+//	WrDwinCmd16(0x102e,0x01);//卸油动画开始 3
+//	
+//		WrDwinCmd16(0x1018,0x00);//1仓油量 数值控制
+//	WrDwinCmd16(0x1030,0x01);//卸油动画开始 4
+//	
+//	
+//		WrDwinCmd16(0x101a,0x00);//1仓油量 数值控制
+//	WrDwinCmd16(0x1032,0x01);//卸油动画开始 5
+//	
+//		WrDwinCmd16(0x101c,0x00);//1仓油量 数值控制
+//	WrDwinCmd16(0x1034,0x01);//卸油动画开始 6
+//	
+//		WrDwinCmd16(0x101e,0x00);//1仓油量 数值控制
+//	WrDwinCmd16(0x1036,0x01);//卸油动画开始 7
+//	
+//		WrDwinCmd16(0x1020,0x00);//1仓油量 数值控制
+//	WrDwinCmd16(0x1038,0x01);//卸油动画开始 8
+//	WrDwinCmd16(0x103a,0x01);//仓数显示
+//	WrDwinCmd16(0x103c,0x01);//装油警告,弹窗
+//	WrDwinCmd16(0x103e,0x01);//卸油油警告,弹窗
+//	WrDwinCmd16(0x1040,0x01);//指纹识别,弹窗
+
+//卸油阀异常 1042
+//底阀异常 1044
+//人孔小盖异常 1046
+//人孔大盖异常 1048
+
+//登录用户名 104a
+//登录密码 104c
+//密码错误  104e
+
+//时间设置
+//年 104e
+//月 1050
+//日 1052
+//时 1054
+//分 1056
+//秒 1058
+		
+		
+		
+}
+
+/******************************************************************************
+显示车辆状态与阀门状态
+输入:无
+输出返回:无	
+******************************************************************************/
+uint8_t a=0,b=0,c=0,d=0,i =0;
+uint8_t e1=0,f1=0,g1=0,h1=0;
+void Dispaly_CarAndValveState(void)
+{
+	uint8_t e=0,f=0,g=0,h=0;
+	e=0,f=0,g=0,h=0;
+	for(i=0;i<StoreNumber;i++)
+	{
+		a|= (0x0001&(IO_Date.IO_state[0]>>i*4))<<i;
+		b|= (0x0001&(IO_Date.IO_state[0]>>(i*4+1)))<<i;
+		c|= (0x0001&(IO_Date.IO_state[0]>>(i*4+2)))<<i;
+		d|= (0x0001&(IO_Date.IO_state[0]>>(i*4+3)))<<i;
+		e|= (0x0001&(IO_Date.IO_normalstate[0]>>i*4))<<i;
+		f|= (0x0001&(IO_Date.IO_normalstate[0]>>(i*4+1)))<<i;
+		g|= (0x0001&(IO_Date.IO_normalstate[0]>>(i*4+2)))<<i;
+		h|= (0x0001&(IO_Date.IO_normalstate[0]>>(i*4+3)))<<i;
+		if((((Full_Oil_allinfo.Start_Decrease_flag&(1<<i))==(1<<i))||(Full_Oil_allinfo.Loading_Oil_state&(1<<i))==(1<<i))&&(Run_mode_key_info.current_page !=Run_mode_key_info.Main_Page_id))
+			WrDwinCmd16(ADDR_DWIN_Loading_Oil+(i*2),(((~IO_Date.IO_unload_switch>>i)&0x01)==0x01?0:00));//本仓在卸油或者装油,显示动画,不显示油量Ever_Oil_baseaddr
+		else	
+			WrDwinCmd16(ADDR_DWIN_Loading_Oil+(i*2),(((~IO_Date.IO_unload_switch>>i)&0x01)==0x01?0x00:0x04));
+		
+	}
+//		WrDwinCmd16(0x1000,a);//人孔小盖关
+//		WrDwinCmd16(0x1003,b);//人孔大盖关
+//		WrDwinCmd16(0x1006,d);//底阀关
+//		WrDwinCmd16(0x1009,c);//卸油阀关
+		if(e1!=e)
+		{
+			WrDwinCmd16(ADDR_DWIN_StateYiChang_CoverSmall,e);//人孔小盖异常
+			e1=e;
+		}
+		if(f1!=f)
+		{
+			WrDwinCmd16(ADDR_DWIN_StateYiChang_CoverBig,f);//人孔大盖异常
+			f1=f;
+		}
+		if(h1!=h)
+		{
+			WrDwinCmd16(ADDR_DWIN_StateYiChang_HaiDiFa,h);//底阀异常
+			h1 = h;
+		}
+		if(g1!=g)
+		{
+			WrDwinCmd16(ADDR_DWIN_StateYiChang_XieYouFa,g);//卸油阀异常
+			g1 = g;
+		}
+#if 0		
+		if(Full_Oil_allinfo.Null_ID!=Full_Oil_allinfo.Null_ID_disp)
+		{
+			WrDwinCmd16(0x1012,(((Full_Oil_allinfo.Null_ID>>0)&0x01)==0x01?0:0x04));//油量 数值控制 1  0x04为油量
+			WrDwinCmd16(0x1014,(((Full_Oil_allinfo.Null_ID>>1)&0x01)==0x01?0:0x04));// 2
+			WrDwinCmd16(0x1016,(((Full_Oil_allinfo.Null_ID>>2)&0x01)==0x01?0:0x04));// 3
+			WrDwinCmd16(0x1018,(((Full_Oil_allinfo.Null_ID>>3)&0x01)==0x01?0:0x04));//油量 4
+//	WrDwinCmd16(0x101a,(((Full_Oil_allinfo.Null_ID>>4)&0x01)==0x01?0:0x04));// 5
+//	WrDwinCmd16(0x101c,(((Full_Oil_allinfo.Null_ID>>5)&0x01)==0x01?0:0x04));// 6
+//	WrDwinCmd16(0x101e,(((Full_Oil_allinfo.Null_ID>>6)&0x01)==0x01?0:0x04));//油量 7
+//	WrDwinCmd16(0x1020,(((Full_Oil_allinfo.Null_ID>>7)&0x01)==0x01?0:0x04));// 8
+			Full_Oil_allinfo.Null_ID_disp=Full_Oil_allinfo.Null_ID;
+		}
+#endif		
+  		
+	
+	if((Full_Oil_allinfo.Auto_sealedOK_ID ==0)&&(Full_Oil_allinfo.Break_sealing_Id ==0))// 
+	{//解封状态两把锁均不显示
+		WrDwinCmd16(ADDR_DWIN_Seal_Lock,0xff);//锁不显示
+		WrDwinCmd16(ADDR_DWIN_Seal_UnLock,0xff);//锁开不显示
+	}
+	else
+	{ //显示施封图片--一把锁上的锁;该处逻辑是反的----某一位为0,则显示该位的锁
+		WrDwinCmd16(ADDR_DWIN_Seal_Lock,(~Full_Oil_allinfo.Auto_sealedOK_ID));//锁显示
+	}
+	
+	
+	if((Full_Oil_allinfo.Break_sealing_Id>0)&&(IO_Date.IO_unload_switch>0))
+	{
+		WrDwinCmd16(ADDR_DWIN_Seal_UnLock,(~Full_Oil_allinfo.Break_sealing_Id));//锁开显示
+		
+		//WrDwinCmd16(ADDR_DWIN_Seal_Lock,(~Full_Oil_allinfo.Auto_sealedOK_ID));//锁显示
+		
+		
+//		WrDwinCmd16(ADDR_DWIN_Seal_Lock,(Full_Oil_allinfo.Break_sealing_Id));//锁不显示   李伟添加  20211028 避免图标混乱
+//		
+//		FM25L16B_WriteByte(ADDR_Auto_sealedOK_ID,(uint8_t)Full_Oil_allinfo.Auto_sealedOK_ID);//保存施封状态20200428
+//		FM25L16B_WriteByte(ADDR_Break_sealing_Id,Full_Oil_allinfo.Break_sealing_Id);//保存破封状态20200428
+//		//WrDwinCmd16(ADDR_DWIN_Seal_UnLock,(~Full_Oil_allinfo.Auto_sealedOK_ID));//锁不显示   李伟添加  20211028 避免图标混乱
+	}
+	else
+	{
+		WrDwinCmd16(ADDR_DWIN_Seal_UnLock,(~Full_Oil_allinfo.Break_sealing_Id));//锁开bu显示
+	}
+	
+	
+	
+	if(Full_Oil_allinfo.Car_state!=Full_Oil_allinfo.Car_state_disp)
+	{
+		if (Full_Oil_allinfo.Car_state == 0)		//车辆状态OK
+			WrDwinCmd16(ADDR_DWIN_Car_State, 0x00); //状态正常
+		else if (Full_Oil_allinfo.Car_state == 1)
+			WrDwinCmd16(ADDR_DWIN_Car_State, 0x02); //状态NOK
+		else
+			WrDwinCmd16(ADDR_DWIN_Car_State, 0x01); //状态破封
+		Full_Oil_allinfo.Car_state_disp=Full_Oil_allinfo.Car_state;
+	}
+	
+	
+	
+	if(Lcd_sleep_flag ==1)//屏幕休眠
+	{
+			WrDwinCmd16(0x0082,0x0000);//亮度调节0x0000~0x6464
+	}
+	else if(Lcd_sleep_flag==2)//唤醒休眠
+	{
+			Lcd_sleep_flag =3;
+		//Jump_page_id(Run_mode_key_info.current_page);
+			WrDwinCmd16(0x0082,0x3600);//亮度调节0x0000~0x646
+	}
+}
+/******************************************************************************
+装油动画
+输入:mode 装油模式 sedata  装油的仓
+输出返回:无	
+******************************************************************************/
+void FULL_oil_draw(uint8_t mode,uint8_t se_data)//装油动画
+{
+	uint8_t i=0;
+	if(se_data!=0)
+		WrDwinCmd16(ADDR_DWIN_Operation_State,0x01);//罐仓状态 装油中
+	else
+		WrDwinCmd16(ADDR_DWIN_Operation_State,0x00);//罐仓状态 空闲中
+	
+ 
+	
+	WrDwinCmd16(ADDR_DWIN_Loading_Oil_Mode,mode);//装油模式 上装1 下装0
+ 
+	
+	
+	WrDwinCmd16(ADDR_DWIN_Num_Of_CangId,se_data);//油量仓12345678
+ 
+	
+	for(i=0;i<StoreNumber;i++)
+	{
+		WrDwinCmd16(ADDR_DWIN_UnLoading_Oil_Mode+i*2,(se_data&(0x01<<i))>>i);
+		//HAL_Delay(10);//
+		
+	}
+//	WrDwinCmd16(0x102a,0x01);//装油动画开始 1
+//	WrDwinCmd16(0x102c,0x01);//装油动画开始 2
+//	WrDwinCmd16(0x102e,0x01);//装油动画开始 3
+//	WrDwinCmd16(0x1030,0x01);//装油动画开始 4
+//	WrDwinCmd16(0x1032,0x01);//装油动画开始 5
+//	WrDwinCmd16(0x1034,0x01);//装油动画开始 6
+//	WrDwinCmd16(0x1036,0x01);//装油动画开始 7
+//	WrDwinCmd16(0x1038,0x01);//装油动画开始 8
+}
+/******************************************************************************
+卸油动画
+输入: sedata  装油的仓
+输出返回:无	
+******************************************************************************/
+void Off_loading_draw(uint8_t se_data)
+{
+	uint8_t i=0;
+		if(se_data!=0)
+			WrDwinCmd16(ADDR_DWIN_Operation_State,0x01);//罐仓状态 卸油中
+		else
+			WrDwinCmd16(ADDR_DWIN_Operation_State,0x00);//罐仓状态 空闲中
+		
+ 
+		
+		WrDwinCmd16(ADDR_DWIN_Num_Of_CangId,se_data);//卸量仓12345678
+		
+ 
+		
+	for(i=0;i<StoreNumber;i++)
+	{
+		WrDwinCmd16(ADDR_DWIN_UnLoading_Oil_Mode+i*2,(se_data&(0x01<<i))>>i);
+		//HAL_Delay(10);//
+		
+	}
+		
+//	WrDwinCmd16(0x1024,0x00);//罐仓状态 空闲中
+//	WrDwinCmd16(0x1026,0x01);//油量仓
+//	WrDwinCmd16(0x1024,0x01);//罐仓状态 卸油中
+//	
+//	WrDwinCmd16(0x1012,0x00);//1仓油量 数值控制
+//	WrDwinCmd16(0x102a,0x01);//卸油动画开始 1
+//	
+//		WrDwinCmd16(0x1014,0x00);//1仓油量 数值控制
+//	WrDwinCmd16(0x102c,0x01);//卸油动画开始 2
+//	
+//		WrDwinCmd16(0x1016,0x00);//1仓油量 数值控制
+//	WrDwinCmd16(0x102e,0x01);//卸油动画开始 3
+//	
+//		WrDwinCmd16(0x1018,0x00);//1仓油量 数值控制
+//	WrDwinCmd16(0x1030,0x01);//卸油动画开始 4
+//	
+//	
+//		WrDwinCmd16(0x101a,0x00);//1仓油量 数值控制
+//	WrDwinCmd16(0x1032,0x01);//卸油动画开始 5
+//	
+//		WrDwinCmd16(0x101c,0x00);//1仓油量 数值控制
+//	WrDwinCmd16(0x1034,0x01);//卸油动画开始 6
+//	
+//		WrDwinCmd16(0x101e,0x00);//1仓油量 数值控制
+//	WrDwinCmd16(0x1036,0x01);//卸油动画开始 7
+//	
+//		WrDwinCmd16(0x1020,0x00);//1仓油量 数值控制
+//	WrDwinCmd16(0x1038,0x01);//卸油动画开始 8
+
+/*
+5A A5 07 82 0082 6420 07D0 
+(10秒后进入背光,点击变亮,10000/5=2000 换算成16进制为07D0,范围00-64,100级亮度调节)
+*/
+}
+
+void Read_REAL_Time(void)
+{
+	/*
+	5A A5 0B 82 009C 5A A5 12 06 1B 15 15 15 (18年6月27号21时21分21秒,16进制数据) 读RTC:5A A5 04 83 0010 04
+	*/
+	RdDwinData16(0x0010,4);
+	
+}
+void Wakeup_lcd(void)
+{
+	uint8_t  PopWinCmdBuf[14]={0x5A ,0xA5 ,0x0B ,0x82 ,0x00 ,0xD4 ,0x5A ,0xA5 ,0x00 ,0x04 ,0x00 ,0x00 ,0x00 ,0x00};
+	//5A A5 0B 82 00D4 5AA5 0004 00EE 008F
+		UartWrite(&huart2,PopWinCmdBuf,14);
+}
+void Display_input_time(uint8_t flag,uint8_t *time)
+{
+	uint8_t arr[6]={0};
+	uint8_t i =0;
+	for(i=0;i<6;i++)
+	{
+		//arr[i]=time[i*2]-0x30+time[i*2+1]-0x30;
+		if(time[i*2]!=0x00)
+		{
+			if(time[i*2+1]!=0x00)
+				arr[i] = (time[i*2]-0x30)*10+(time[i*2+1]-0x30);
+			else
+				arr[i] = time[i*2]-0x30;
+		}
+		else
+		{
+			break;
+		}
+	}
+		WrDwinCmd16(0x104e,arr[0]);//年
+	  HAL_Delay(10);//
+		WrDwinCmd16(0x1050,arr[1]);//月
+	  HAL_Delay(10);//
+		WrDwinCmd16(0x1052,arr[2]);//日
+		HAL_Delay(10);//
+		WrDwinCmd16(0x1054,arr[3]);//时
+		HAL_Delay(10);//
+		WrDwinCmd16(0x1056,arr[4]);//分
+	  HAL_Delay(10);//
+		WrDwinCmd16(0x1058,arr[5]);//秒
+	  HAL_Delay(10);//
+	
+	if(flag ==1)//发送时间确认修改
+	{
+		flag =0;
+		Send_Time(arr);
+	}
+}
+//time 要修改的时间
+void Send_Time(uint8_t * time)
+{
+//	u8 i =0;
+	
+	memcpy(time_Set_Dwin+8,time,6);
+	UartWrite(&huart2,time_Set_Dwin,14);
+/*	delay_ms(100);*/
+}
+
+//flag 显示密码错误信息 pawd_num 密码个数
+//登录用户名 104a
+//登录密码 104c
+//密码错误  105a
+void Dispay_login(uint8_t flag,uint8_t pawd_num)
+{
+	WrDwinCmd16(0x104a,0);
+	HAL_Delay(10);//
+	
+	if(pawd_num<7)
+		WrDwinCmd16(0x104c,pawd_num);
+	HAL_Delay(10);//
+	
+	if(flag==1)
+		WrDwinCmd16(0x105a,1);//密码错误提示
+	else
+		WrDwinCmd16(0x105a,0);
+	
+}

Fichier diff supprimé car celui-ci est trop grand
+ 1086 - 0
Src/Elec_Seal.c


Fichier diff supprimé car celui-ci est trop grand
+ 1131 - 0
Src/KeySlave485.c


+ 504 - 0
Src/LTF_sa/leaf_ota.c

@@ -0,0 +1,504 @@
+#include "leaf_ota.h"
+#include "usart.h"
+#include "stdio.h"
+#include "string.h"
+#include "TerminalSlave485.h"
+#include "md5c.h"
+#include "main.h"
+
+/**
+  * @brief  根据输入的地址给出它所在的sector
+  *					例如:
+						uwStartSector = GetSector(FLASH_USER_START_ADDR);
+						uwEndSector = GetSector(FLASH_USER_END_ADDR);	
+  * @param  Address:地址
+  * @retval 地址所在的sector
+  */
+static uint32_t GetSector(uint32_t Address)
+{
+  uint32_t sector = 0;
+  
+  if((Address < ADDR_FLASH_SECTOR_1) && (Address >= ADDR_FLASH_SECTOR_0))
+  {
+    sector = FLASH_SECTOR_0;  
+  }
+  else if((Address < ADDR_FLASH_SECTOR_2) && (Address >= ADDR_FLASH_SECTOR_1))
+  {
+    sector = FLASH_SECTOR_1;  
+  }
+  else if((Address < ADDR_FLASH_SECTOR_3) && (Address >= ADDR_FLASH_SECTOR_2))
+  {
+    sector = FLASH_SECTOR_2;  
+  }
+  else if((Address < ADDR_FLASH_SECTOR_4) && (Address >= ADDR_FLASH_SECTOR_3))
+  {
+    sector = FLASH_SECTOR_3;  
+  }
+  else if((Address < ADDR_FLASH_SECTOR_5) && (Address >= ADDR_FLASH_SECTOR_4))
+  {
+    sector = FLASH_SECTOR_4;  
+  }
+  else if((Address < ADDR_FLASH_SECTOR_6) && (Address >= ADDR_FLASH_SECTOR_5))
+  {
+    sector = FLASH_SECTOR_5;  
+  }
+  else if((Address < ADDR_FLASH_SECTOR_7) && (Address >= ADDR_FLASH_SECTOR_6))
+  {
+    sector = FLASH_SECTOR_6;  
+  }
+  else/*(Address < FLASH_END_ADDR) && (Address >= ADDR_FLASH_SECTOR_23))*/
+  {
+    sector = FLASH_SECTOR_7;  
+  }
+  return sector;
+}
+
+
+//uint8_t Erase_page(uint32_t pageaddr, uint32_t num)
+//{
+//  /*要擦除的起始扇区(包含)及结束扇区(不包含),如8-12,表示擦除8、9、10、11扇区*/
+//	uint32_t FirstSector = 0;
+//	uint32_t NbOfSectors = 0;
+//	uint32_t SECTORError = 0;
+//	static FLASH_EraseInitTypeDef EraseInitStruct;
+//	__disable_irq();
+//	HAL_FLASH_Unlock();
+//	
+//	FirstSector = GetSector(pageaddr);
+//	NbOfSectors = GetSector(num)- FirstSector + 1;
+//	/* 擦除用户区域 (用户区域指程序本身没有使用的空间,可以自定义)**/
+//	/* Fill EraseInit structure*/
+//	EraseInitStruct.TypeErase     = FLASH_TYPEERASE_SECTORS;
+//	EraseInitStruct.VoltageRange  = FLASH_VOLTAGE_RANGE_3;/* 以“字”的大小进行操作 */ 
+//	EraseInitStruct.Sector        = FirstSector;
+//	EraseInitStruct.NbSectors     = 1;
+//	/* 开始擦除操作 */
+//	if (HAL_FLASHEx_Erase(&EraseInitStruct, &SECTORError) != HAL_OK)
+//	{
+//		/*擦除出错,返回,实际应用中可加入处理 */
+//		return -1;
+//	}
+//	
+//	
+//	HAL_FLASH_Lock();
+//	__enable_irq();
+//	return 1;
+//}
+
+
+int App2_MD5_Check(uint32_t addr,unsigned int all_len)
+{
+	unsigned char digest[16];
+//	unsigned char *md5_ptr=(unsigned char *)(StartMode_Addr+72);
+	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(USART1_TX_BUF,(const void *)(addr+i),update_len);
+		MD5Update (&md5c, USART1_TX_BUF, update_len);
+		i += update_len;
+		HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2);//看门狗sp706
+	}
+	MD5Final(digest,&md5c);
+	memcpy(USART1_TX_BUF,(const void *)(addr+all_len),16);
+	for(i=0;i<16;++i)
+	{
+		if(digest[i]!=USART1_TX_BUF[i])
+			break;
+	}
+	if(i>=16)
+		return 1;
+	else
+		return 0;
+}
+
+
+
+/**
+ * @bieaf 擦除页
+ *
+ * @param pageaddr  起始地址	
+ * @param num       擦除的页数
+ * @return 1
+ */
+uint8_t Erase_page(uint32_t pageaddr, uint32_t num)
+{
+	__disable_irq();
+	HAL_FLASH_Unlock();
+	
+	/* 擦除FLASH*/
+	FLASH_EraseInitTypeDef FlashSet;
+	FlashSet.TypeErase = FLASH_TYPEERASE_SECTORS;
+	FlashSet.VoltageRange  = FLASH_VOLTAGE_RANGE_3;
+	FlashSet.Sector = GetSector(pageaddr);
+	//FlashSet.NbSectors =(pageaddr+num-1);
+	FlashSet.NbSectors=1;
+	/*设置PageError,调用擦除函数*/
+	uint32_t PageError = 0;
+	HAL_FLASHEx_Erase(&FlashSet, &PageError);
+	
+	HAL_FLASH_Lock();
+	__enable_irq();
+	return 1;
+}
+
+
+/**
+ * @bieaf 写若干个数据
+ *
+ * @param addr       写入的地址
+ * @param buff       写入数据的起始地址
+ * @param word_size  长度
+ * @return 
+ */
+static void WriteFlash(uint32_t addr, uint32_t * buff, int word_size)
+{	
+	/* 1/4解锁FLASH*/
+	HAL_FLASH_Unlock();
+	
+	for(int i = 0; i < word_size; i++)	
+	{
+		/* 3/4对FLASH烧写*/
+		HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addr + 4 * i, buff[i]);	
+	}
+
+	/* 4/4锁住FLASH*/
+	HAL_FLASH_Lock();
+}
+
+
+
+/**
+ * @bieaf 读若干个数据
+ *
+ * @param addr       读数据的地址
+ * @param buff       读出数据的数组指针
+ * @param word_size  长度
+ * @return 
+ */
+static void ReadFlash(uint32_t addr, uint32_t * buff, uint16_t word_size)
+{
+	//uint32_t get=0;
+	for(int i =0; i < word_size; i++)
+	{
+		buff[i] = *(__IO uint32_t*)(addr + 4 * i);
+		//buff[i] =((get&0x000000ff)<< 24)| ((get&0x0000ff00 ) << 8 )| (( get&0x00ff0000 ) >> 8 ) | ((get&0xff000000 )>> 24 );
+	}
+	return;
+}
+
+
+/* 读取启动模式 */
+unsigned int Read_Start_Mode(void)
+{
+	unsigned int mode = 0;
+	//ReadFlash((Application_2_Addr + Application_Size - 4), &mode, 1);
+	ReadFlash(StartMode_Addr, &mode, 1);
+	
+	return mode;
+}
+
+
+/**
+ * @bieaf 写若干个数据
+ *
+ * @param addr       写入的地址
+ * @param buff       写入数据的起始地址
+ * @param word_size  长度
+ * @return 
+ */
+void WriteFlash2(uint32_t addr, uint32_t *buff, int word_size)
+{
+	/* 1/4解锁FLASH*/
+	HAL_FLASH_Unlock();
+
+	for(int i = 0; i < word_size; i++)
+	{
+		/* 3/4对FLASH烧写*/
+		HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addr + 4 * i, buff[i]);
+	}
+
+	/* 4/4锁住FLASH*/
+	HAL_FLASH_Lock();
+}
+
+
+/* 标记升级完成 */
+void Set_Update_Down(void)
+{
+	unsigned int update_flag = Startup_Update; ///< 对应bootloader的启动步骤
+	memcpy(USART1_TX_BUF,(void *)StartMode_Addr,256);
+	memcpy(USART1_TX_BUF,&update_flag,4);
+	Erase_page(StartMode_Addr, Appear_si);
+	WriteFlash2(StartMode_Addr, (uint32_t *)USART1_TX_BUF, 64);
+}
+
+
+
+
+/**
+ * @bieaf 进行程序的覆盖
+ * @detail 1.擦除目的地址
+ *         2.源地址的代码拷贝到目的地址
+ *         3.擦除源地址
+ *
+ * @param  搬运的源地址
+ * @param  搬运的目的地址
+ * @return 搬运的程序大小
+ */
+void MoveCode(unsigned int src_addr, unsigned int des_addr, unsigned int byte_size)
+{
+	/*1.擦除目的地址*/
+	//printf("> Start erase des flash......\r\n");
+	//Erase_page(des_addr, (byte_size/PageSize));
+	HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2);//看门狗sp706
+	Erase_page(des_addr, Appear_si);
+	HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2);//看门狗sp706
+	//printf("> Erase des flash down......\r\n");
+	
+	/*2.开始拷贝*/	
+	unsigned int temp[128]={0};
+	
+	//printf("> Start copy......\r\n");
+	for(int i = 0; i < (byte_size+511)/512; i++)
+	{
+		HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2);//看门狗sp706
+		ReadFlash((src_addr + i*512), temp, 128);
+		HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2);//看门狗sp706
+		WriteFlash((des_addr + i*512), temp, 128);
+		HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2);//看门狗sp706
+	}
+	//printf("> Copy down......\r\n");
+	
+	/*3.擦除源地址*/
+	//printf("> Start erase src flash......\r\n");
+	//Erase_page(src_addr, (byte_size/PageSize));
+	HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2);//看门狗sp706
+	;//Erase_page(src_addr, Appear_si);
+	HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2);//看门狗sp706
+	
+	//HAL_NVIC_SystemReset();
+	//printf("> Erase src flash down......\r\n");
+  
+
+}
+
+
+
+///* 采用汇编设置栈的值 */
+//__asm void MSR_MSP (uint32_t ulAddr) 
+//{
+//    MSR MSP, r0 			                   //set Main Stack value
+//    BX r14
+//}
+
+
+
+///* 程序跳转函数 */
+//typedef void (*Jump_Fun)(void);
+//void IAP_ExecuteApp (uint32_t App_Addr)
+//{
+//	Jump_Fun JumpToApp; 
+//    
+////	if ( ( ( * ( __IO uint32_t * ) App_Addr ) & 0x2FE00000 ) == 0x20000000 )	//检查栈顶地址是否合法.
+////	{ 
+//		JumpToApp = (Jump_Fun) * ( __IO uint32_t *)(App_Addr + 4);				//用户代码区第二个字为程序开始地址(复位地址)		
+//		MSR_MSP( * ( __IO uint32_t * ) App_Addr );								//初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
+//		__disable_irq();
+//		JumpToApp();															//跳转到APP.
+////	}
+//}
+
+
+
+/*
+*********************************************************************************************************
+*	函 数 名: JumpToBootloader
+*	功能说明: 跳转到系统BootLoader
+*	形    参: 无
+*	返 回 值: 无
+*********************************************************************************************************
+*/
+static void JumpToBootloader(void)
+{
+	uint32_t i=0;
+	GPIO_InitTypeDef GPIO_InitStruct = {0};
+	void (*SysMemBootJump)(void);        /* 声明一个函数指针 */
+	__IO uint32_t BootAddr = Application_1_Addr; /* STM32F4的系统BootLoader地址 */
+	
+	
+	HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2);//看门狗sp706
+
+	/* 关闭全局中断 */
+	DISABLE_INT(); 
+
+	/* 关闭滴答定时器,复位到默认值 */
+	SysTick->CTRL = 0;
+  SysTick->LOAD = 0;
+  SysTick->VAL = 0;
+	
+	HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2);//看门狗sp706
+
+	/* 设置所有时钟到默认状态,使用HSI时钟 */
+	HAL_RCC_DeInit();
+	
+	 __HAL_RCC_GPIOC_CLK_ENABLE();
+	
+	
+	//看门狗配置  初始化
+  /*Configure GPIO pin : PtPin */
+  GPIO_InitStruct.Pin = GPIO_PIN_2;
+	
+	if(0)//看门狗sp706
+	//if(1)//打开看门狗sp706
+	{
+		//
+		GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+	
+	}
+	else
+	{
+		GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
+	
+	}
+  
+	
+	
+  GPIO_InitStruct.Pull = GPIO_NOPULL;
+  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
+  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
+	
+	
+	
+//	HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2);//看门狗sp706
+
+	/* 关闭所有中断,清除所有中断挂起标志 */
+	for (i = 0; i < 8; i++)
+	{
+		NVIC->ICER[i]=0xFFFFFFFF;
+		NVIC->ICPR[i]=0xFFFFFFFF;
+	}	
+	
+//	HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2);//看门狗sp706
+
+	/* 使能全局中断 */
+	ENABLE_INT();
+
+	/* 跳转到系统BootLoader,首地址是MSP,地址+4是复位中断服务程序地址 */
+	SysMemBootJump = (void (*)(void)) (*((uint32_t *) (BootAddr + 4)));
+
+	/* 设置主堆栈指针 */
+	__set_MSP(*(uint32_t *)BootAddr);
+	
+//	/* 在RTOS工程,这条语句很重要,设置为特权级模式,使用MSP指针 */
+	__set_CONTROL(0);
+
+	/* 跳转到系统BootLoader */
+//	HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2);//看门狗sp706
+	SysMemBootJump(); 
+
+	/* 跳转成功的话,不会执行到这里,用户可以在这里添加代码 */
+	while (1)
+	{
+
+	}
+}
+
+
+/**
+ * @bieaf 进行BootLoader的启动
+ *
+ * @param none
+ * @return none
+ */
+void Start_BootLoader(void)
+{
+  	unsigned int update_flag = 0xAAAAAAAA; ///< 对应bootloader的启动步骤
+	unsigned int ModeStart;
+	unsigned int i,all_len;
+//	HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2);//看门狗sp706
+	
+	ModeStart=Read_Start_Mode();
+	switch(ModeStart)									///< 读取是否启动应用程序 */
+	{
+		case Startup_Normal:										///< 正常启动 */   //在APP2中可以设定此标志位   使得下次重启之后进入APP1
+		{
+			;//printf("> Normal start......\r\n");
+			break;
+		}
+		case Startup_Update: ///< 升级再启动 */
+		{
+
+			
+			HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2); //看门狗sp706
+
+			for (i = 0, all_len = 0; i < 4; ++i)
+			{
+				all_len = all_len << 8;
+				all_len |= *(unsigned char *)(StartMode_Addr + 68 + i);
+			}
+			if ((*(unsigned int*)(Application_Buffer_Addr+6144)==Application_2_Addr) && App2_MD5_Check(Application_Buffer_Addr,all_len))
+			{
+				MoveCode(Application_Buffer_Addr, Application_2_Addr, all_len);//假定程序大小为100k
+				HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2);//看门狗sp706
+//			printf("> Update down......\r\n");
+			
+				update_flag = Startup_APP2;
+				memcpy(USART1_TX_BUF,(void *)StartMode_Addr,256);
+				Erase_page(StartMode_Addr, Appear_si);
+				memcpy(USART1_TX_BUF,&update_flag,4);
+				memcpy(USART1_TX_BUF+132,USART1_TX_BUF+68,4);
+				WriteFlash2(StartMode_Addr, (uint32_t *)USART1_TX_BUF, 64);
+				HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2);
+				/*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_2_Addr,all_len))
+					JumpToAPP2();//*/
+			}
+		//	break;
+		}
+
+		case Startup_APP2:										///跳转到APP2
+		{
+			for (i = 0, all_len = 0; i < 4; ++i)
+			{
+				all_len = all_len << 8;
+				all_len |= *(unsigned char *)(StartMode_Addr + 132 + i);
+			}
+			if((*(unsigned int*)(Application_2_Addr+6144)==Application_2_Addr) && App2_MD5_Check(Application_2_Addr,all_len))
+				JumpToAPP2();//
+			break;
+		}	
+		
+		
+		case Startup_Reset:										///< 恢复出厂设置 目前没使用 */
+		{
+//			printf("> Restore to factory program......\r\n");
+			break;			
+		}
+		default:														///< 启动失败
+		{
+//			printf("> Error:%X!!!......\r\n", Read_Start_Mode());
+			return;			
+		}
+	}
+	
+//	/* 跳转到应用程序 */
+////	HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2);//看门狗sp706
+//  printf("> Start up......\r\n\r\n");
+//	//IAP_ExecuteApp(Application_1_Addr);
+//	JumpToBootloader();
+}
+
+
+
+

+ 55 - 0
Src/LTF_sa/leaf_ota.h

@@ -0,0 +1,55 @@
+#ifndef __LEAF_OTA_H_
+#define __LEAF_OTA_H_
+#include "main.h"
+
+
+/* 开关全局中断的宏 */
+#define ENABLE_INT()	__set_PRIMASK(0)	/* 使能全局中断 */
+#define DISABLE_INT()	__set_PRIMASK(1)	/* 禁止全局中断 */
+
+
+#define PageSize		1024			//1K
+#define Appear_si 128
+
+/*=====用户配置(根据自己的分区进行配置)=====*/
+#define BootLoader_Size 		0xA000			///< BootLoader的大小 40K
+#define Appear_Size 		0x6000			///< BootLoader的大小 40K
+#define Application_Size		0x20000			///< 应用程序的大小 128K
+
+//#define Application_1_Addr		0x08010000		///< 应用程序1的首地址
+//#define Application_2_Addr		0x08030000		///< 应用程序2的首地址
+//#define Application_2_Addr		0x08017FFF		///< 应用程序2的首地址
+
+#define Application_1_Addr		ADDR_FLASH_SECTOR_0		///< 应用程序1的首地址
+#define Application_2_Addr		ADDR_FLASH_SECTOR_6		///< 应用程序2的首地址
+
+#define Application_Buffer_Addr		ADDR_FLASH_SECTOR_7		///< 接收到的文件存储区
+/*==========================================*/
+
+#define StartMode_Addr		ADDR_FLASH_SECTOR_4		///< 应用程序2的首地址
+
+
+
+/* 启动选项 */
+#define Startup_Normal 	0xFFFFFFFF	///< 正常启动   跳转到APP1
+#define Startup_Update 	0xAAAAAAAA	///< 升级再启动 
+#define Startup_Reset  	0x5555AAAA	///< ***恢复出厂 目前没使用***
+#define Startup_APP2  	0x5555BBBB	///< ***跳转到APP2***
+
+
+/* Base address of the Flash sectors */ 
+#define ADDR_FLASH_SECTOR_0     ((uint32_t)0x08000000) /* Base address of Sector 0, 32 Kbytes */
+#define ADDR_FLASH_SECTOR_1     ((uint32_t)0x08008000) /* Base address of Sector 1, 32 Kbytes */
+#define ADDR_FLASH_SECTOR_2     ((uint32_t)0x08010000) /* Base address of Sector 2, 32 Kbytes */
+#define ADDR_FLASH_SECTOR_3     ((uint32_t)0x08018000) /* Base address of Sector 3, 32 Kbytes */
+#define ADDR_FLASH_SECTOR_4     ((uint32_t)0x08020000) /* Base address of Sector 4, 128 Kbytes */
+#define ADDR_FLASH_SECTOR_5     ((uint32_t)0x08040000) /* Base address of Sector 5, 256 Kbytes */
+#define ADDR_FLASH_SECTOR_6     ((uint32_t)0x08080000) /* Base address of Sector 6, 256 Kbytes */
+#define ADDR_FLASH_SECTOR_7     ((uint32_t)0x080C0000) /* Base address of Sector 7, 256 Kbytes */
+
+
+void Start_BootLoader(void);
+uint8_t Erase_page(uint32_t pageaddr, uint32_t num);
+void WriteFlash2(uint32_t addr, uint32_t *buff, int word_size);
+#endif
+

+ 25 - 0
Src/Randomcode.c

@@ -0,0 +1,25 @@
+#include "Randomcode.h"
+//临时用法,后续再升级高级算法
+/* * 加密规则如下:每位数字都加上5,相加后除以10的余数代替该数字,
+	 * 再将第一位和第四位交换,第二位和第三位交换
+	 * 固定的四位整数
+*/
+
+uint16_t Four_num_encrypt(uint16_t number)
+{
+	uint16_t temp_ask_code = 0;
+	uint8_t one,two,three,four;
+	uint8_t temp;
+	one = (number / 1000 + 5) % 10;
+	two = ((number % 1000) / 100 + 5) % 10;
+	three = (((number % 1000) % 100) / 10 + 5) % 10;
+	four = (((number % 1000) % 100) % 10 + 5) % 10;
+	temp = one;
+	one = four;
+	four = temp;
+	temp =  three;
+	three = two;
+	two = temp;
+	temp_ask_code = one*1000+two *100+three *10 +four;
+	return temp_ask_code;
+}

+ 50 - 0
Src/ScreenMaster485.c

@@ -0,0 +1,50 @@
+#include "ScreenMaster485.h"
+#include "usart.h"			
+#include "Dwin.h"
+////////////////////////////////////////////////////////////////////////////////// 	
+
+void TestUsart3_Receive(void)
+{
+	if((usart3_rx_flag)&&(USART3_RX_BUF[0]==0x12))
+	{
+		usart3_rx_flag=0;
+		ScreenMaster485_Send_Data(USART3_RX_BUF,rx3_len);
+	}
+	
+	
+	
+}
+//RS485发送len个字节.
+//buf:发送区首地址
+//len:发送的字节数(为了和本代码的接收匹配,这里建议不要超过64个字节)
+uint8_t screen_buf[512];
+volatile uint8_t screen_delay=0;
+void ScreenMaster485_Send_Data(uint8_t *buf,uint8_t len)
+{
+	int retry;
+	
+	do
+	{
+		osDelay(1);
+	}while(huart3.gState != HAL_UART_STATE_READY);
+	do
+	{
+		osDelay(1);
+	}while(screen_delay);	
+	usart3_rx_flag=0;
+	ScreenMaster485_TX_Set(1);			//设置为发送模式
+  //	HAL_UART_Transmit(&huart3,buf,len,200);//串口3发送数据  
+	memcpy(screen_buf,buf,len);
+	if(HAL_UART_Transmit_IT(&huart3,screen_buf,len)!=HAL_OK)
+	{
+		ScreenMaster485_TX_Set(0);			//设置为接收模式	
+	}
+}
+
+//RS485模式控制.
+//en:0,接收;1,发送.
+void ScreenMaster485_TX_Set(uint8_t en)
+{
+	if(en==1)HAL_GPIO_WritePin(GPIOE,GPIO_PIN_15,GPIO_PIN_RESET);
+	else HAL_GPIO_WritePin(GPIOE,GPIO_PIN_15,GPIO_PIN_SET);
+}

Fichier diff supprimé car celui-ci est trop grand
+ 5559 - 0
Src/TerminalSlave485.c


+ 101 - 0
Src/dma.c

@@ -0,0 +1,101 @@
+/**
+  ******************************************************************************
+  * File Name          : dma.c
+  * Description        : This file provides code for the configuration
+  *                      of all the requested memory to memory DMA transfers.
+  ******************************************************************************
+  * This notice applies to any and all portions of this file
+  * that are not between comment pairs USER CODE BEGIN and
+  * USER CODE END. Other portions of this file, whether 
+  * inserted by the user or by software development tools
+  * are owned by their respective copyright owners.
+  *
+  * Copyright (c) 2019 STMicroelectronics International N.V. 
+  * All rights reserved.
+  *
+  * Redistribution and use in source and binary forms, with or without 
+  * modification, are permitted, provided that the following conditions are met:
+  *
+  * 1. Redistribution of source code must retain the above copyright notice, 
+  *    this list of conditions and the following disclaimer.
+  * 2. Redistributions in binary form must reproduce the above copyright notice,
+  *    this list of conditions and the following disclaimer in the documentation
+  *    and/or other materials provided with the distribution.
+  * 3. Neither the name of STMicroelectronics nor the names of other 
+  *    contributors to this software may be used to endorse or promote products 
+  *    derived from this software without specific written permission.
+  * 4. This software, including modifications and/or derivative works of this 
+  *    software, must execute solely and exclusively on microcontroller or
+  *    microprocessor devices manufactured by or for STMicroelectronics.
+  * 5. Redistribution and use of this software other than as permitted under 
+  *    this license is void and will automatically terminate your rights under 
+  *    this license. 
+  *
+  * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" 
+  * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT 
+  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 
+  * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY
+  * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT 
+  * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 
+  * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 
+  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
+  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+  *
+  ******************************************************************************
+  */
+/* Includes ------------------------------------------------------------------*/
+#include "dma.h"
+
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+
+/*----------------------------------------------------------------------------*/
+/* Configure DMA                                                              */
+/*----------------------------------------------------------------------------*/
+
+/* USER CODE BEGIN 1 */
+
+/* USER CODE END 1 */
+
+/** 
+  * Enable DMA controller clock
+  */
+void MX_DMA_Init(void) 
+{
+  /* DMA controller clock enable */
+  __HAL_RCC_DMA1_CLK_ENABLE();
+  __HAL_RCC_DMA2_CLK_ENABLE();
+
+  /* DMA interrupt init */
+  /* DMA1_Stream1_IRQn interrupt configuration */
+  HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 5, 0);
+  HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn);
+  /* DMA1_Stream2_IRQn interrupt configuration */
+//  HAL_NVIC_SetPriority(DMA1_Stream2_IRQn, 5, 0);   //以下两行李伟修改于20210516    删除uart4的DMA接收功能
+//  HAL_NVIC_EnableIRQ(DMA1_Stream2_IRQn);
+  /* DMA1_Stream5_IRQn interrupt configuration */
+  HAL_NVIC_SetPriority(DMA1_Stream5_IRQn, 5, 0);
+  HAL_NVIC_EnableIRQ(DMA1_Stream5_IRQn);
+  /* DMA2_Stream2_IRQn interrupt configuration */
+  HAL_NVIC_SetPriority(DMA2_Stream2_IRQn, 5, 0);
+  HAL_NVIC_EnableIRQ(DMA2_Stream2_IRQn);
+
+}
+
+/* USER CODE BEGIN 2 */
+
+/* USER CODE END 2 */
+
+/**
+  * @}
+  */
+
+/**
+  * @}
+  */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

Fichier diff supprimé car celui-ci est trop grand
+ 3603 - 0
Src/freertos.c


+ 190 - 0
Src/gpio.c

@@ -0,0 +1,190 @@
+/**
+  ******************************************************************************
+  * File Name          : gpio.c
+  * Description        : This file provides code for the configuration
+  *                      of all used GPIO pins.
+  ******************************************************************************
+  * This notice applies to any and all portions of this file
+  * that are not between comment pairs USER CODE BEGIN and
+  * USER CODE END. Other portions of this file, whether 
+  * inserted by the user or by software development tools
+  * are owned by their respective copyright owners.
+  *
+  * Copyright (c) 2019 STMicroelectronics International N.V. 
+  * All rights reserved.
+  *
+  * Redistribution and use in source and binary forms, with or without 
+  * modification, are permitted, provided that the following conditions are met:
+  *
+  * 1. Redistribution of source code must retain the above copyright notice, 
+  *    this list of conditions and the following disclaimer.
+  * 2. Redistributions in binary form must reproduce the above copyright notice,
+  *    this list of conditions and the following disclaimer in the documentation
+  *    and/or other materials provided with the distribution.
+  * 3. Neither the name of STMicroelectronics nor the names of other 
+  *    contributors to this software may be used to endorse or promote products 
+  *    derived from this software without specific written permission.
+  * 4. This software, including modifications and/or derivative works of this 
+  *    software, must execute solely and exclusively on microcontroller or
+  *    microprocessor devices manufactured by or for STMicroelectronics.
+  * 5. Redistribution and use of this software other than as permitted under 
+  *    this license is void and will automatically terminate your rights under 
+  *    this license. 
+  *
+  * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" 
+  * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT 
+  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 
+  * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY
+  * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT 
+  * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 
+  * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 
+  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
+  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+  *
+  ******************************************************************************
+  */
+
+/* Includes ------------------------------------------------------------------*/
+#include "gpio.h"
+#include "KeySlave485.h"
+
+
+//#include "main.h"
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+
+/*----------------------------------------------------------------------------*/
+/* Configure GPIO                                                             */
+/*----------------------------------------------------------------------------*/
+/* USER CODE BEGIN 1 */
+
+/* USER CODE END 1 */
+
+/** Configure pins as 
+        * Analog 
+        * Input 
+        * Output
+        * EVENT_OUT
+        * EXTI
+*/
+void MX_GPIO_Init(void)
+{
+
+  GPIO_InitTypeDef GPIO_InitStruct = {0};
+
+  /* GPIO Ports Clock Enable */
+  __HAL_RCC_GPIOE_CLK_ENABLE();
+  __HAL_RCC_GPIOH_CLK_ENABLE();
+  __HAL_RCC_GPIOC_CLK_ENABLE();
+  __HAL_RCC_GPIOA_CLK_ENABLE();
+  __HAL_RCC_GPIOB_CLK_ENABLE();
+  __HAL_RCC_GPIOD_CLK_ENABLE();
+
+  /*Configure GPIO pin Output Level */
+  HAL_GPIO_WritePin(GPIOE, BEEP_Pin|LED1_Pin|LED2_Pin|LED3_Pin 
+                          |LED4_Pin|LED5_Pin|SPI4_FM25_NSS_Pin, GPIO_PIN_SET);
+
+  /*Configure GPIO pin Output Level */
+  HAL_GPIO_WritePin(GPIOC, DWI_Pin|EN_USART1_Pin, GPIO_PIN_RESET);
+
+  /*Configure GPIO pin Output Level */
+  HAL_GPIO_WritePin(EN_USART2_GPIO_Port, EN_USART2_Pin, GPIO_PIN_SET);
+
+  /*Configure GPIO pin Output Level */
+  HAL_GPIO_WritePin(EN_USART3_GPIO_Port, EN_USART3_Pin, GPIO_PIN_SET);
+
+  /*Configure GPIO pin Output Level */
+  HAL_GPIO_WritePin(EN_USART4_GPIO_Port, EN_USART4_Pin, GPIO_PIN_SET);
+
+  /*Configure GPIO pins : PEPin PEPin PEPin PEPin 
+                           PEPin PEPin PEPin */
+  GPIO_InitStruct.Pin = BEEP_Pin|LED1_Pin|LED2_Pin|LED3_Pin 
+                          |LED4_Pin|LED5_Pin|EN_USART3_Pin;
+  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+  GPIO_InitStruct.Pull = GPIO_NOPULL;
+  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
+  HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
+
+
+  //看门狗配置  初始化
+  /*Configure GPIO pin : PtPin */
+  GPIO_InitStruct.Pin = DWI_Pin;
+	
+	if(WatchDogOn)//打开看门狗sp706
+	//if(1)//打开看门狗sp706
+	{
+		//
+		GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+	
+	}
+	else
+	{
+		GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
+	
+	}
+  
+	
+	
+  GPIO_InitStruct.Pull = GPIO_NOPULL;
+  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
+  HAL_GPIO_Init(DWI_GPIO_Port, &GPIO_InitStruct);
+	
+	
+
+  /*Configure GPIO pin : PtPin */
+  GPIO_InitStruct.Pin = EN_USART2_Pin;
+  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+  GPIO_InitStruct.Pull = GPIO_NOPULL;
+  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
+  HAL_GPIO_Init(EN_USART2_GPIO_Port, &GPIO_InitStruct);
+
+  /*Configure GPIO pin : PtPin */
+  GPIO_InitStruct.Pin = SPI4_FM25_NSS_Pin;
+  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+  GPIO_InitStruct.Pull = GPIO_NOPULL;
+  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+  HAL_GPIO_Init(SPI4_FM25_NSS_GPIO_Port, &GPIO_InitStruct);
+
+  /*Configure GPIO pin : PtPin */
+  GPIO_InitStruct.Pin = EN_USART1_Pin;
+  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+  GPIO_InitStruct.Pull = GPIO_NOPULL;
+  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+  HAL_GPIO_Init(EN_USART1_GPIO_Port, &GPIO_InitStruct);
+
+  /*Configure GPIO pin : PtPin */
+  GPIO_InitStruct.Pin = EN_USART4_Pin;
+  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+  GPIO_InitStruct.Pull = GPIO_NOPULL;
+  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
+  HAL_GPIO_Init(EN_USART4_GPIO_Port, &GPIO_InitStruct);
+
+ /*Configure GPIO pins : PDPin PDPin PDPin PDPin */
+//  GPIO_InitStruct.Pin = Key10_Pin|Key11_Pin|Key12_Pin|Key13_Pin;
+//  GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
+//  GPIO_InitStruct.Pull = GPIO_PULLUP;
+//  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
+	
+  /*Configure GPIO pin : PtPin */
+  GPIO_InitStruct.Pin = Feeler_Lever_Pin;
+  GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
+  GPIO_InitStruct.Pull = GPIO_PULLUP;
+  HAL_GPIO_Init(Feeler_Lever_GPIO_Port, &GPIO_InitStruct);
+	
+	 /* EXTI interrupt init*/
+  HAL_NVIC_SetPriority(EXTI0_IRQn, 5, 0);
+  HAL_NVIC_EnableIRQ(EXTI0_IRQn);
+
+//  HAL_NVIC_SetPriority(EXTI15_10_IRQn, 5, 0);
+//  HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
+}
+
+/* USER CODE BEGIN 2 */
+
+/* USER CODE END 2 */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

+ 358 - 0
Src/main.c

@@ -0,0 +1,358 @@
+/* USER CODE BEGIN Header */
+/**
+  ******************************************************************************
+  * @file           : main.c
+  * @brief          : Main program body
+  ******************************************************************************
+  * This notice applies to any and all portions of this file
+  * that are not between comment pairs USER CODE BEGIN and
+  * USER CODE END. Other portions of this file, whether 
+  * inserted by the user or by software development tools
+  * are owned by their respective copyright owners.
+  *
+  * Copyright (c) 2019 STMicroelectronics International N.V. 
+  * All rights reserved.
+  *
+  * Redistribution and use in source and binary forms, with or without 
+  * modification, are permitted, provided that the following conditions are met:
+  *
+  * 1. Redistribution of source code must retain the above copyright notice, 
+  *    this list of conditions and the following disclaimer.
+  * 2. Redistributions in binary form must reproduce the above copyright notice,
+  *    this list of conditions and the following disclaimer in the documentation
+  *    and/or other materials provided with the distribution.
+  * 3. Neither the name of STMicroelectronics nor the names of other 
+  *    contributors to this software may be used to endorse or promote products 
+  *    derived from this software without specific written permission.
+  * 4. This software, including modifications and/or derivative works of this 
+  *    software, must execute solely and exclusively on microcontroller or
+  *    microprocessor devices manufactured by or for STMicroelectronics.
+  * 5. Redistribution and use of this software other than as permitted under 
+  *    this license is void and will automatically terminate your rights under 
+  *    this license. 
+  *
+  * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" 
+  * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT 
+  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 
+  * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY
+  * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT 
+  * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 
+  * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 
+  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
+  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+  *
+  ******************************************************************************
+  */
+	/*
+	修改记录:
+	 2021-1-26:增了终端与中控板交互的0x64的报文头处理,主要修改在:TerminalSlave485.c,
+可通过查找	:"2021-1-26"来查看相关修改。    ---  modify by Daiyf at 2021-1-26
+   2021-1-30:扩展了91命令IO响应的数据位,固定8仓*4=32字节。
+                                             ---  modify by Daiyf at 2021-1-30
+																						 
+  ******************************************************************************
+  */
+	
+/* USER CODE END Header */
+/*
+更改记录:
+Q2021-1-26: 1、福建装车现场反馈主控LED破封报警显示延时长达8S,经常发现是内部判断次数过长,造成延时过长,经过与相关工程师交流,改为约1.8S后报警显示。
+
+             2、对中控板的LED显示作了定义进行调整,方便观察中控固件运行状态
+						    LED1:中控反与采集板信指示灯:             连接:闪亮,       断开连接:不亮或长亮;          (注:原LED1 与采集板的通信息,保持一致)
+						    LED2:采集板上4卸油阀的的状态状态:        正常:不亮,       异常:长亮或闪亮;              (注:原LED2-4 用于4个卸油阀的的状态在中控板显示,实际意义不大,改用一个LED作指示)
+								LED3:中控板OS中通讯任务运行指示灯:       正常:闪亮,       异常:不亮或长亮;
+								LED4:采中控板OS中数据处理任务运行指示灯:  正常:不亮,       异常:长亮或闪亮;
+								LED5:破封产生指标灯:                    破风成立:长亮,    破风信号产生:闪亮,   无破风:不亮;
+								
+					  3、相关修改通过查找“2021-2-3”和“Daiyf”可获取。
+Note by Daiyf at 2021-2-3  
+      
+*/
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+#include "cmsis_os.h"
+#include "dma.h"
+#include "spi.h"
+#include "tim.h"
+#include "usart.h"
+#include "gpio.h"
+#include "DS1302.h"
+#include "KeySlave485.h"
+#include "usart.h"
+
+
+uint32_t sd000,sd001;//浮点数转换为实时显示的参数,4字节
+uint16_t uart4RxCounter=0; //串口4接收数据计数器
+  
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN PTD */
+
+/* USER CODE END PTD */
+
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+
+/* USER CODE BEGIN PV */
+/* Private variables ---------------------------------------------------------*/
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+void SystemClock_Config(void);
+void MX_FREERTOS_Init(void);
+/* USER CODE BEGIN PFP */
+/* Private function prototypes -----------------------------------------------*/
+
+/* USER CODE END PFP */
+
+/* Private user code ---------------------------------------------------------*/
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+
+/**
+  * @brief  The application entry point.
+  * @retval int
+  */
+int main(void)
+{
+  /* USER CODE BEGIN 1 */
+	extern SemaphoreHandle_t xSemaphore_uart4;
+	extern uint8_t USART_RX_BUF_U2[Uart2_BUF_SIZE];   /*为UART2、3专门开一个DMA接收存储区 2021-4-12 by Daiyf*///static
+	//int LenMain;
+	__set_FAULTMASK(1);//先关闭全局中断
+#if	IR_ROM1 == 0x8000000	
+	Start_BootLoader();
+#else	
+	SCB->VTOR = 0x08080000;
+	//Start_BootLoader();
+	__set_PRIMASK(0);
+#endif	
+  /* USER CODE END 1 */
+
+  /* MCU Configuration--------------------------------------------------------*/
+
+  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
+  HAL_Init();
+
+  /* USER CODE BEGIN Init */
+	
+
+  /* USER CODE END Init */
+
+  /* Configure the system clock */
+  SystemClock_Config();
+
+  /* USER CODE BEGIN SysInit */
+	
+				if(__HAL_RCC_GET_FLAG(RCC_FLAG_PORRST) != RESET)
+        {
+           //这是上电复位
+					PrintCnt=99;
+        }
+        else if (__HAL_RCC_GET_FLAG(RCC_FLAG_PINRST) != RESET)
+        {
+           //这是外部RST管脚复位RCC_GetFlagStatus
+					PrintCnt=88;
+        }
+        else if (__HAL_RCC_GET_FLAG(RCC_FLAG_SFTRST)!= RESET)
+        {
+           ////软件复位
+        }
+				else if(__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST))//独立看门狗复位
+				{
+						;//
+				}
+        //RCC_ClearFlag();//清除RCC中复位标志
+				__HAL_RCC_CLEAR_RESET_FLAGS();//清除所有复位标识,用于复位类型的判断
+  /* USER CODE END SysInit */
+
+  /* Initialize all configured peripherals */
+  MX_GPIO_Init();
+	HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2);//看门狗sp706
+  MX_DMA_Init();
+	HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2);//看门狗sp706
+  MX_TIM6_Init();
+	HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2);//看门狗sp706
+  MX_USART2_UART_Init();  // Collect Board commincation port    采集板   采集器 19200
+	HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2);//看门狗sp706
+  MX_USART3_UART_Init();  // DWIN LCD comminucation port  液晶屏  迪文屏    19200
+	HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2);//看门狗sp706
+  MX_UART4_Init();        // Keyboard comminucation port 按键以及打印机,语音播报器 9600
+	HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2);//看门狗sp706
+  MX_TIM2_Init();
+	HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2);//看门狗sp706
+  MX_USART1_UART_Init();  // Terminal comminucation port终端  9600
+	HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2);//看门狗sp706
+//  MX_SPI4_Init();
+  /* USER CODE BEGIN 2 */
+	FM25L16B_Init();
+	HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2);//看门狗sp706
+	HAL_TIM_Base_Start_IT(&htim2);
+	HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2);//看门狗sp706
+	HAL_TIM_Base_Start_IT(&htim6);
+	HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2);//看门狗sp706
+	Uart_Mode_Init();	
+	HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2);//看门狗sp706
+	
+	
+	//HAL_UART_Receive_DMA(&huart2, USART_RX_BUF_U2,Uart2_BUF_SIZE);
+  /* USER CODE END 2 */
+
+  /* Call init function for freertos objects (in freertos.c) */
+  MX_FREERTOS_Init();
+
+	/* 创建互斥信号量 */
+	xSemaphore_uart4 = xSemaphoreCreateMutex();
+
+  /* Start scheduler */
+  osKernelStart();
+  
+  /* We should never get here as control is now taken by the scheduler */
+
+  /* Infinite loop */
+  /* USER CODE BEGIN WHILE */
+  while (1)
+  {
+    /* USER CODE END WHILE */
+
+    /* USER CODE BEGIN 3 */
+
+  }
+  /* USER CODE END 3 */
+}
+
+/**
+  * @brief System Clock Configuration
+  * @retval None
+  */
+void SystemClock_Config(void)
+{
+  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
+  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
+  RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
+
+  /**Configure the main internal regulator output voltage 
+  */
+  __HAL_RCC_PWR_CLK_ENABLE();
+  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
+  /**Initializes the CPU, AHB and APB busses clocks 
+  */
+  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
+  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
+  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
+  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
+  RCC_OscInitStruct.PLL.PLLM = 25;
+  RCC_OscInitStruct.PLL.PLLN = 432;
+  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
+  RCC_OscInitStruct.PLL.PLLQ = 2;
+  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+  {
+    Error_Handler();
+  }
+  /**Activate the Over-Drive mode 
+  */
+  if (HAL_PWREx_EnableOverDrive() != HAL_OK)
+  {
+    Error_Handler();
+  }
+  /**Initializes the CPU, AHB and APB busses clocks 
+  */
+  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.APB1CLKDivider = RCC_HCLK_DIV4;
+  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
+
+  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_7) != HAL_OK)
+  {
+    Error_Handler();
+  }
+  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_USART2
+                              |RCC_PERIPHCLK_USART3|RCC_PERIPHCLK_UART4;
+  PeriphClkInitStruct.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
+  PeriphClkInitStruct.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;
+  PeriphClkInitStruct.Usart3ClockSelection = RCC_USART3CLKSOURCE_PCLK1;
+  PeriphClkInitStruct.Uart4ClockSelection = RCC_UART4CLKSOURCE_PCLK1;
+  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
+  {
+    Error_Handler();
+  }
+}
+
+/* USER CODE BEGIN 4 */
+
+/* USER CODE END 4 */
+
+/**
+  * @brief  Period elapsed callback in non blocking mode
+  * @note   This function is called  when TIM1 interrupt took place, inside
+  * HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment
+  * a global variable "uwTick" used as application time base.
+  * @param  htim : TIM handle
+  * @retval None
+  */
+void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
+{
+  /* USER CODE BEGIN Callback 0 */
+
+  /* USER CODE END Callback 0 */
+  if (htim->Instance == TIM1) {
+    HAL_IncTick();
+  }
+  /* USER CODE BEGIN Callback 1 */
+
+  /* USER CODE END Callback 1 */
+}
+
+/**
+  * @brief  This function is executed in case of error occurrence.
+  * @retval None
+  */
+void Error_Handler(void)
+{
+  /* USER CODE BEGIN Error_Handler_Debug */
+  /* User can add his own implementation to report the HAL error return state */
+  while(1) 
+  {
+  }
+  /* USER CODE END Error_Handler_Debug */
+}
+
+#ifdef  USE_FULL_ASSERT
+/**
+  * @brief  Reports the name of the source file and the source line number
+  *         where the assert_param error has occurred.
+  * @param  file: pointer to the source file name
+  * @param  line: assert_param error line source number
+  * @retval None
+  */
+void assert_failed(uint8_t *file, uint32_t line)
+{ 
+  /* USER CODE BEGIN 6 */
+  /* User can add his own implementation to report the file name and line number,
+    ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
+  /* USER CODE END 6 */
+}
+#endif /* USE_FULL_ASSERT */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

+ 364 - 0
Src/md5c.c

@@ -0,0 +1,364 @@
+/* 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> 
+ 
+/* Constants for MD5Transform routine. 
+*/ 
+ 
+ 
+#define S11 7 
+#define S12 12 
+#define S13 17 
+#define S14 22 
+#define S21 5 
+#define S22 9 
+#define S23 14 
+#define S24 20 
+#define S31 4 
+#define S32 11 
+#define S33 16 
+#define S34 23 
+#define S41 6 
+#define S42 10 
+#define S43 15 
+#define S44 21 
+ 
+static void MD5_memcpy (POINTER output, POINTER input, unsigned int len); 
+static void MD5Transform (UINT4 state[4], unsigned char block[64]); 
+static void Encode (unsigned char *output, UINT4 *input, unsigned int len); 
+static void MD5_memset (POINTER output, int value, unsigned int len); 
+static void Decode (UINT4 *output, unsigned char *input, unsigned int len); 
+ 
+static unsigned char PADDING[64] = { 
+ 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 
+}; 
+ 
+/* F, G, H and I are basic MD5 functions. 
+*/ 
+#define F(x, y, z) (((x) & (y)) | ((~x) & (z))) 
+#define G(x, y, z) (((x) & (z)) | ((y) & (~z))) 
+#define H(x, y, z) ((x) ^ (y) ^ (z)) 
+#define I(x, y, z) ((y) ^ ((x) | (~z))) 
+ 
+/* ROTATE_LEFT rotates x left n bits. 
+*/ 
+#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) 
+ 
+/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4. 
+Rotation is separate from addition to prevent recomputation. 
+*/ 
+#define FF(a, b, c, d, x, s, ac) { \
+	(a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ (a) += (b); \
+ } 
+#define GG(a, b, c, d, x, s, ac) { \
+ (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ (a) += (b); \
+ } 
+#define HH(a, b, c, d, x, s, ac) { \
+ (a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ (a) += (b); \
+ } 
+#define II(a, b, c, d, x, s, ac) { \
+ (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ (a) += (b); \
+ } 
+ 
+/* MD5 initialization. Begins an MD5 operation, writing a new context. 
+ */ 
+void MD5Init (MD5_CTX *context)          /* context */ 
+{ 
+ context->count[0] = context->count[1] = 0; 
+ /* Load magic initialization constants. 
+ */ 
+ context->state[0] = 0x67452301; 
+ context->state[1] = 0xefcdab89; 
+ context->state[2] = 0x98badcfe; 
+ context->state[3] = 0x10325476; 
+} 
+ 
+/* MD5 block update operation. Continues an MD5 message-digest 
+ operation, processing another message block, and updating the 
+ context. 
+ */ 
+void MD5Update (MD5_CTX *context, unsigned char *input, unsigned int inputLen) 
+ 
+{ 
+ unsigned int i, index, partLen; 
+ 
+ /* Compute number of bytes mod 64 */ 
+ index = (unsigned int)((context->count[0] >> 3) & 0x3F); 
+ 
+ /* Update number of bits */ 
+ if ((context->count[0] += ((UINT4)inputLen << 3)) 
+  < ((UINT4)inputLen << 3)) 
+  context->count[1]++; 
+ context->count[1] += ((UINT4)inputLen >> 29); 
+ 
+ partLen = 64 - index; 
+ 
+ /* Transform as many times as possible. 
+ */ 
+ if (inputLen >= partLen) { 
+  MD5_memcpy((POINTER)&context->buffer[index], (POINTER)input, partLen); 
+  MD5Transform (context->state, context->buffer); 
+ 
+  for (i = partLen; i + 63 < inputLen; i += 64) 
+   MD5Transform (context->state, &input[i]); 
+ 
+  index = 0; 
+ } 
+ else 
+  i = 0; 
+ 
+ /* Buffer remaining input */ 
+ MD5_memcpy((POINTER)&context->buffer[index], (POINTER)&input[i],inputLen-i); 
+} 
+ 
+/* MD5 finalization. Ends an MD5 message-digest operation, writing the 
+ the message digest and zeroizing the context. 
+ */ 
+void MD5Final (unsigned char digest[16], MD5_CTX *context)         
+{ 
+ unsigned char bits[8]; 
+ unsigned int index, padLen; 
+ 
+ /* Save number of bits */ 
+ Encode (bits, context->count, 8); 
+ 
+ /* Pad out to 56 mod 64. 
+ */ 
+ index = (unsigned int)((context->count[0] >> 3) & 0x3f); 
+ padLen = (index < 56) ? (56 - index) : (120 - index); 
+ MD5Update (context, PADDING, padLen); 
+ 
+ /* Append length (before padding) */ 
+ MD5Update (context, bits, 8); 
+ 
+ /* Store state in digest */ 
+ Encode (digest, context->state, 16); 
+ 
+ /* Zeroize sensitive information. 
+ */ 
+ MD5_memset ((POINTER)context, 0, sizeof (*context)); 
+} 
+ 
+/* MD5 basic transformation. Transforms state based on block. 
+ */ 
+static void MD5Transform (UINT4 state[4], unsigned char block[64]) 
+{ 
+ UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16]; 
+ 
+ Decode (x, block, 64); 
+ 
+ /* Round 1 */ 
+ FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */ 
+ FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */ 
+ FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */ 
+ FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */ 
+ FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */ 
+ FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */ 
+ FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */ 
+ FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */ 
+ FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */ 
+ FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */ 
+ FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */ 
+ FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */ 
+ FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */ 
+ FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */ 
+ FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */ 
+ FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */ 
+ 
+ /* Round 2 */ 
+ GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */ 
+ GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */ 
+ GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ 
+ GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */ 
+ GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */ 
+ GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */ 
+ GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */ 
+ GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */ 
+ GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */ 
+ GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */ 
+ GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */ 
+ GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */ 
+ GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ 
+ GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */ 
+ GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */ 
+ GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */ 
+ 
+ /* Round 3 */ 
+ HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */ 
+ HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */ 
+ HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ 
+ HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ 
+ HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */ 
+ HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */ 
+ HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */ 
+ HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ 
+ HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */ 
+ HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */ 
+ HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */ 
+ HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */ 
+ HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */ 
+ HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ 
+ HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ 
+ HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */ 
+ 
+ /* Round 4 */ 
+ II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */ 
+ II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */ 
+ II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */ 
+ II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */ 
+ II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */ 
+ II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */ 
+ II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */ 
+ II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */ 
+ II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */ 
+ II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */ 
+ II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */ 
+ II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */ 
+ II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */ 
+ II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */ 
+ II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */ 
+ II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */ 
+ 
+ state[0] += a; 
+ state[1] += b; 
+ state[2] += c; 
+ state[3] += d; 
+ 
+ /* Zeroize sensitive information. 
+ */ 
+ MD5_memset ((POINTER)x, 0, sizeof (x)); 
+} 
+ 
+/* Encodes input (UINT4) into output (unsigned char). Assumes len is 
+ a multiple of 4. 
+ */ 
+static void Encode (unsigned char *output, UINT4 *input, unsigned int len) 
+{ 
+ unsigned int i, j; 
+ 
+ for (i = 0, j = 0; j < len; i++, j += 4) { 
+  output[j] = (unsigned char)(input[i] & 0xff); 
+  output[j+1] = (unsigned char)((input[i] >> 8) & 0xff); 
+  output[j+2] = (unsigned char)((input[i] >> 16) & 0xff); 
+  output[j+3] = (unsigned char)((input[i] >> 24) & 0xff); 
+ } 
+} 
+ 
+/* Decodes input (unsigned char) into output (UINT4). Assumes len is 
+ a multiple of 4. 
+ */ 
+static void Decode (UINT4 *output, unsigned char *input, unsigned int len) 
+{ 
+ unsigned int i, j; 
+ 
+ for (i = 0, j = 0; j < len; i++, j += 4) 
+  output[i] = ((UINT4)input[j]) | (((UINT4)input[j+1]) << 8) | 
+  (((UINT4)input[j+2]) << 16) | (((UINT4)input[j+3]) << 24); 
+} 
+ 
+/* Note: Replace "for loop" with standard memcpy if possible. 
+ */ 
+ 
+static void MD5_memcpy (POINTER output, POINTER input, unsigned int len) 
+{ 
+ unsigned int i; 
+ 
+ for (i = 0; i < len; i++) 
+  output[i] = input[i]; 
+} 
+ 
+/* Note: Replace "for loop" with standard memset if possible. 
+ */ 
+static void MD5_memset (POINTER output, int value, unsigned int len) 
+{ 
+ unsigned int i; 
+ 
+ for (i = 0; i < len; i++) 
+  ((char *)output)[i] = (char)value; 
+} 
+/* Digests a string and prints the result. 
+ */ 
+void MDString (char *string,unsigned char digest[16]) 
+{ 
+ MD5_CTX context; 
+ unsigned int len = strlen (string); 
+ 
+ MD5Init (&context); 
+ MD5Update (&context, (unsigned char *)string, len); 
+ MD5Final (digest, &context); 
+} 
+/* Digests a file and prints the result. 
+ */ 
+int MD5File (char *filename,unsigned char digest[16]) 
+{ 
+ FILE *file; 
+ MD5_CTX context; 
+ int len; 
+ unsigned char buffer[1024]; 
+ 
+ if ((file = fopen (filename, "rb")) == NULL) 
+  return -1; 
+ else { 
+  MD5Init (&context); 
+  while (len = fread (buffer, 1, 1024, file)) 
+   MD5Update (&context, buffer, len); 
+  MD5Final (digest, &context); 
+ 
+  fclose (file); 
+ } 
+ return 0; 
+} 
+void MD5UpdaterString(MD5_CTX *context,const char *string) 
+{ 
+ unsigned int len = strlen (string); 
+ MD5Update (context, (unsigned char *)string, len); 
+} 
+int MD5FileUpdateFile (MD5_CTX *context,char *filename) 
+{ 
+ FILE *file; 
+ int len; 
+ unsigned char buffer[1024]; 
+ 
+ if ((file = fopen (filename, "rb")) == NULL) 
+  return -1; 
+ else { 
+  while (len = fread (buffer, 1, 1024, file)) 
+   MD5Update (context, buffer, len); 
+  fclose (file); 
+ } 
+ return 0; 
+} 

+ 286 - 0
Src/spi.c

@@ -0,0 +1,286 @@
+/**
+  ******************************************************************************
+  * File Name          : SPI.c
+  * Description        : This file provides code for the configuration
+  *                      of the SPI instances.
+  ******************************************************************************
+  * This notice applies to any and all portions of this file
+  * that are not between comment pairs USER CODE BEGIN and
+  * USER CODE END. Other portions of this file, whether 
+  * inserted by the user or by software development tools
+  * are owned by their respective copyright owners.
+  *
+  * Copyright (c) 2019 STMicroelectronics International N.V. 
+  * All rights reserved.
+  *
+  * Redistribution and use in source and binary forms, with or without 
+  * modification, are permitted, provided that the following conditions are met:
+  *
+  * 1. Redistribution of source code must retain the above copyright notice, 
+  *    this list of conditions and the following disclaimer.
+  * 2. Redistributions in binary form must reproduce the above copyright notice,
+  *    this list of conditions and the following disclaimer in the documentation
+  *    and/or other materials provided with the distribution.
+  * 3. Neither the name of STMicroelectronics nor the names of other 
+  *    contributors to this software may be used to endorse or promote products 
+  *    derived from this software without specific written permission.
+  * 4. This software, including modifications and/or derivative works of this 
+  *    software, must execute solely and exclusively on microcontroller or
+  *    microprocessor devices manufactured by or for STMicroelectronics.
+  * 5. Redistribution and use of this software other than as permitted under 
+  *    this license is void and will automatically terminate your rights under 
+  *    this license. 
+  *
+  * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" 
+  * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT 
+  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 
+  * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY
+  * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT 
+  * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 
+  * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 
+  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
+  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+  *
+  ******************************************************************************
+  */
+
+/* Includes ------------------------------------------------------------------*/
+#include "spi.h"
+
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+
+SPI_HandleTypeDef hspi4;
+
+/* SPI4 init function */
+void MX_SPI4_Init(void)
+{
+
+  hspi4.Instance = SPI4;
+  hspi4.Init.Mode = SPI_MODE_MASTER;//主模式
+  hspi4.Init.Direction = SPI_DIRECTION_2LINES;//全双工
+  hspi4.Init.DataSize = SPI_DATASIZE_8BIT;//数据位为8位
+  hspi4.Init.CLKPolarity = SPI_POLARITY_LOW;//CPOL=0,low
+  hspi4.Init.CLKPhase = SPI_PHASE_1EDGE;//CPHA为数据线的第一个变化沿
+  hspi4.Init.NSS = SPI_NSS_SOFT;//软件控制NSS
+  hspi4.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;//256分频,54M/256=Hz
+  hspi4.Init.FirstBit = SPI_FIRSTBIT_MSB;//最高位先发送
+  hspi4.Init.TIMode = SPI_TIMODE_DISABLE;//TIMODE模式关闭
+  hspi4.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;//CRC关闭
+  hspi4.Init.CRCPolynomial = 7;//CRC值计算的多项式
+  hspi4.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
+  hspi4.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
+  if (HAL_SPI_Init(&hspi4) != HAL_OK)
+  {
+    Error_Handler();
+  }
+
+}
+
+void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle)
+{
+
+  GPIO_InitTypeDef GPIO_InitStruct = {0};
+  if(spiHandle->Instance==SPI4)
+  {
+  /* USER CODE BEGIN SPI4_MspInit 0 */
+
+  /* USER CODE END SPI4_MspInit 0 */
+    /* SPI4 clock enable */
+    __HAL_RCC_SPI4_CLK_ENABLE();//使能SPI4时钟
+  
+    __HAL_RCC_GPIOE_CLK_ENABLE();
+    /**SPI4 GPIO Configuration    
+    PE12     ------> SPI4_SCK
+    PE13     ------> SPI4_MISO
+    PE14     ------> SPI4_MOSI 
+    */
+    GPIO_InitStruct.Pin = SPI4_FM25_SCK_Pin|SPI4_FM25_MISO_Pin|SPI4_FM25_MOSI_Pin;
+    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;//复用推挽输出
+    GPIO_InitStruct.Pull = GPIO_PULLUP;//上拉
+    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;//快速
+    GPIO_InitStruct.Alternate = GPIO_AF5_SPI4;
+    HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);//配置SPI的数据线和时钟线
+
+  /* USER CODE BEGIN SPI4_MspInit 1 */
+
+  /* USER CODE END SPI4_MspInit 1 */
+  }
+}
+
+void HAL_SPI_MspDeInit(SPI_HandleTypeDef* spiHandle)
+{
+
+  if(spiHandle->Instance==SPI4)
+  {
+  /* USER CODE BEGIN SPI4_MspDeInit 0 */
+
+  /* USER CODE END SPI4_MspDeInit 0 */
+    /* Peripheral clock disable */
+    __HAL_RCC_SPI4_CLK_DISABLE();
+  
+    /**SPI4 GPIO Configuration    
+    PE12     ------> SPI4_SCK
+    PE13     ------> SPI4_MISO
+    PE14     ------> SPI4_MOSI 
+    */
+    HAL_GPIO_DeInit(GPIOE, SPI4_FM25_SCK_Pin|SPI4_FM25_MISO_Pin|SPI4_FM25_MOSI_Pin);
+
+  /* USER CODE BEGIN SPI4_MspDeInit 1 */
+
+  /* USER CODE END SPI4_MspDeInit 1 */
+  }
+} 
+
+/* USER CODE BEGIN 1 */
+//SPI4 读写一个字节
+//TxData:要写入的字节
+//返回值:读取到的字节
+uint8_t SPI4_ReadWriteByte(uint8_t TxData)
+{
+    uint8_t Rxdata;
+    HAL_SPI_TransmitReceive(&hspi4,&TxData,&Rxdata,1, 1000);       
+ 	return Rxdata;          		    //返回收到的数据		
+}
+void FM25L16B_Init(void)
+{
+	FM_CS_1;
+	MX_SPI4_Init();
+}
+/****************************************************
+****函数名称:void FM25L16B_WriteByte(uint16_t addr,uint8_t data)
+****函数作用:向指定地址写入一个字节数据
+****输入参数:addr,指定地址   data  要写入的数据
+****输出参数:
+****************************************************/
+void FM25L16B_WriteByte(uint16_t addr,uint8_t data)
+{
+	uint8_t addr_h,addr_l;
+	
+	addr_h=addr>>8;
+	addr_l=addr&0xff;
+	FM_CS_0;
+	
+	SPI4_ReadWriteByte(FM_WREN);	//写使能命令
+	FM_CS_1;
+	FM_CS_0;
+	SPI4_ReadWriteByte(FM_WRITE);	//写数据命令
+	SPI4_ReadWriteByte(addr_h);	//起始地址高8位
+	SPI4_ReadWriteByte(addr_l);	//起始地址低8位
+	SPI4_ReadWriteByte(data);
+	FM_CS_1;
+}
+
+/****************************************************
+****函数名称:uint8_t FM25L16B_ReadByte(uint16_t addr)
+****函数作用:读取指定地址的一个字节数据
+****输入参数:addr 要读取的地址
+****输出返回:当前地址数据值
+****添加说明:没写入的地址数据默认是0x00.
+****************************************************/
+uint8_t FM25L16B_ReadByte(uint16_t addr)
+{
+	uint8_t addr_h,addr_l;
+	uint8_t data=0;
+	
+	addr_h=addr>>8;
+	addr_l=addr&0xff;
+	FM_CS_0;
+	SPI4_ReadWriteByte(FM_READ);	//读数据命令
+	SPI4_ReadWriteByte(addr_h);	//起始地址高8位
+	SPI4_ReadWriteByte(addr_l);	//起始地址低8位
+	data=SPI4_ReadWriteByte(0xff);
+	
+	FM_CS_1;
+	return data;
+}
+
+/****************************************************
+****函数名称:uint8_t FM25L16B_ReadStatus(void)
+****函数作用:读取状态寄存器
+****输入参数:
+****输出参数:状态寄存器值
+****************************************************/
+uint8_t FM25L16B_ReadStatus(void)
+{
+	uint8_t data=0;
+	
+	FM_CS_0;
+	SPI4_ReadWriteByte(FM_RDSR);	//读状态寄存器命令
+	data=SPI4_ReadWriteByte(0xff);
+	
+	FM_CS_1;
+	return data;
+}
+/****************************************************
+****函数名称:void FM25L16B_WriteStatus(uint8_t data)
+****函数作用:写状态寄存器
+****输入参数:要写入的数据
+****输出参数:
+****************************************************/
+void FM25L16B_WriteStatus(uint8_t data)
+{
+	FM_CS_0;
+	
+	SPI4_ReadWriteByte(FM_WREN);	//写使能命令
+	FM_CS_1;
+	FM_CS_0;
+	SPI4_ReadWriteByte(FM_WRSR);	//写状态寄存器命令
+	SPI4_ReadWriteByte(data);	//起始地址高8位
+	
+	FM_CS_1;
+}
+/****************************************************
+****函数名称:void FM25L16B_Write_N_Bytes(uint16_t addr,uint8_t *data,uint16_t num)
+****函数作用:写数据到指定地址
+****输入参数:addr 起始地址;data 要写入的数据;num 数据长度
+****输出参数:
+****************************************************/
+void FM25L16B_Write_N_Bytes(uint16_t addr,uint8_t *data,uint16_t num)
+{
+	uint16_t i=0;
+	
+	FM_CS_0;
+	SPI4_ReadWriteByte(FM_WREN);	//写使能命令
+	FM_CS_1;
+	FM_CS_0;
+	SPI4_ReadWriteByte(FM_WRITE);	//写数据命令
+	SPI4_ReadWriteByte(addr>>8);	//起始地址高8位
+	SPI4_ReadWriteByte(addr&0xff);	//起始地址低8位
+	
+	for(i=0;i<num;i++)
+	{
+		SPI4_ReadWriteByte(data[i]);
+	}
+	FM_CS_1;
+}
+
+/****************************************************
+****函数名称:void FM25L16B_Read_N_Bytes(uint16_t addr,uint8_t *data,uint16_t num)
+****函数作用:从指定地址读取数据
+****输入参数:addr 起始地址;data,数据缓存区; num 数据长度
+****输出参数:
+****************************************************/
+void FM25L16B_Read_N_Bytes(uint16_t addr,uint8_t *data,uint16_t num)
+{
+	uint16_t i=0;
+	
+	FM_CS_0;
+	SPI4_ReadWriteByte(FM_READ);	//读数据命令
+	SPI4_ReadWriteByte(addr>>8);	//起始地址高8位
+	SPI4_ReadWriteByte(addr&0xff);	//起始地址低8位
+	
+	for(i=0;i<num;i++)
+	{
+		data[i]=SPI4_ReadWriteByte(0xff);
+	}
+	FM_CS_1;
+}
+
+/* USER CODE END 1 */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

+ 116 - 0
Src/stm32f7xx_hal_msp.c

@@ -0,0 +1,116 @@
+/* USER CODE BEGIN Header */
+/**
+  ******************************************************************************
+  * File Name          : stm32f7xx_hal_msp.c
+  * Description        : This file provides code for the MSP Initialization 
+  *                      and de-Initialization codes.
+  ******************************************************************************
+  * This notice applies to any and all portions of this file
+  * that are not between comment pairs USER CODE BEGIN and
+  * USER CODE END. Other portions of this file, whether 
+  * inserted by the user or by software development tools
+  * are owned by their respective copyright owners.
+  *
+  * Copyright (c) 2019 STMicroelectronics International N.V. 
+  * All rights reserved.
+  *
+  * Redistribution and use in source and binary forms, with or without 
+  * modification, are permitted, provided that the following conditions are met:
+  *
+  * 1. Redistribution of source code must retain the above copyright notice, 
+  *    this list of conditions and the following disclaimer.
+  * 2. Redistributions in binary form must reproduce the above copyright notice,
+  *    this list of conditions and the following disclaimer in the documentation
+  *    and/or other materials provided with the distribution.
+  * 3. Neither the name of STMicroelectronics nor the names of other 
+  *    contributors to this software may be used to endorse or promote products 
+  *    derived from this software without specific written permission.
+  * 4. This software, including modifications and/or derivative works of this 
+  *    software, must execute solely and exclusively on microcontroller or
+  *    microprocessor devices manufactured by or for STMicroelectronics.
+  * 5. Redistribution and use of this software other than as permitted under 
+  *    this license is void and will automatically terminate your rights under 
+  *    this license. 
+  *
+  * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" 
+  * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT 
+  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 
+  * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY
+  * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT 
+  * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 
+  * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 
+  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
+  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+  *
+  ******************************************************************************
+  */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN TD */
+
+/* USER CODE END TD */
+
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN Define */
+ 
+/* USER CODE END Define */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN Macro */
+
+/* USER CODE END Macro */
+
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* External functions --------------------------------------------------------*/
+/* USER CODE BEGIN ExternalFunctions */
+
+/* USER CODE END ExternalFunctions */
+
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+/**
+  * Initializes the Global MSP.
+  */
+void HAL_MspInit(void)
+{
+  /* USER CODE BEGIN MspInit 0 */
+
+  /* USER CODE END MspInit 0 */
+
+  __HAL_RCC_PWR_CLK_ENABLE();
+  __HAL_RCC_SYSCFG_CLK_ENABLE();
+
+  /* System interrupt init*/
+  /* PendSV_IRQn interrupt configuration */
+  HAL_NVIC_SetPriority(PendSV_IRQn, 15, 0);
+
+  /* USER CODE BEGIN MspInit 1 */
+
+  /* USER CODE END MspInit 1 */
+}
+
+/* USER CODE BEGIN 1 */
+
+/* USER CODE END 1 */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

+ 144 - 0
Src/stm32f7xx_hal_timebase_tim.c

@@ -0,0 +1,144 @@
+/* USER CODE BEGIN Header */
+/**
+  ******************************************************************************
+  * @file    stm32f7xx_hal_timebase_TIM.c 
+  * @brief   HAL time base based on the hardware TIM.
+  ******************************************************************************
+  * This notice applies to any and all portions of this file
+  * that are not between comment pairs USER CODE BEGIN and
+  * USER CODE END. Other portions of this file, whether 
+  * inserted by the user or by software development tools
+  * are owned by their respective copyright owners.
+  *
+  * Copyright (c) 2019 STMicroelectronics International N.V. 
+  * All rights reserved.
+  *
+  * Redistribution and use in source and binary forms, with or without 
+  * modification, are permitted, provided that the following conditions are met:
+  *
+  * 1. Redistribution of source code must retain the above copyright notice, 
+  *    this list of conditions and the following disclaimer.
+  * 2. Redistributions in binary form must reproduce the above copyright notice,
+  *    this list of conditions and the following disclaimer in the documentation
+  *    and/or other materials provided with the distribution.
+  * 3. Neither the name of STMicroelectronics nor the names of other 
+  *    contributors to this software may be used to endorse or promote products 
+  *    derived from this software without specific written permission.
+  * 4. This software, including modifications and/or derivative works of this 
+  *    software, must execute solely and exclusively on microcontroller or
+  *    microprocessor devices manufactured by or for STMicroelectronics.
+  * 5. Redistribution and use of this software other than as permitted under 
+  *    this license is void and will automatically terminate your rights under 
+  *    this license. 
+  *
+  * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" 
+  * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT 
+  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 
+  * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY
+  * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT 
+  * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 
+  * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 
+  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
+  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+  *
+  ******************************************************************************
+  */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32f7xx_hal.h"
+#include "stm32f7xx_hal_tim.h"
+ 
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+TIM_HandleTypeDef        htim1; 
+/* Private function prototypes -----------------------------------------------*/
+/* Private functions ---------------------------------------------------------*/
+
+/**
+  * @brief  This function configures the TIM1 as a time base source. 
+  *         The time source is configured  to have 1ms time base with a dedicated 
+  *         Tick interrupt priority. 
+  * @note   This function is called  automatically at the beginning of program after
+  *         reset by HAL_Init() or at any time when clock is configured, by HAL_RCC_ClockConfig(). 
+  * @param  TickPriority: Tick interrupt priority.
+  * @retval HAL status
+  */
+HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
+{
+  RCC_ClkInitTypeDef    clkconfig;
+  uint32_t              uwTimclock = 0;
+  uint32_t              uwPrescalerValue = 0;
+  uint32_t              pFLatency;
+  
+  /*Configure the TIM1 IRQ priority */
+  HAL_NVIC_SetPriority(TIM1_UP_TIM10_IRQn, TickPriority ,0); 
+  
+  /* Enable the TIM1 global Interrupt */
+  HAL_NVIC_EnableIRQ(TIM1_UP_TIM10_IRQn); 
+  
+  /* Enable TIM1 clock */
+  __HAL_RCC_TIM1_CLK_ENABLE();
+  
+  /* Get clock configuration */
+  HAL_RCC_GetClockConfig(&clkconfig, &pFLatency);
+  
+  /* Compute TIM1 clock */
+  uwTimclock = 2*HAL_RCC_GetPCLK2Freq();
+   
+  /* Compute the prescaler value to have TIM1 counter clock equal to 1MHz */
+  uwPrescalerValue = (uint32_t) ((uwTimclock / 1000000) - 1);
+  
+  /* Initialize TIM1 */
+  htim1.Instance = TIM1;
+  
+  /* Initialize TIMx peripheral as follow:
+  + Period = [(TIM1CLK/1000) - 1]. to have a (1/1000) s time base.
+  + Prescaler = (uwTimclock/1000000 - 1) to have a 1MHz counter clock.
+  + ClockDivision = 0
+  + Counter direction = Up
+  */
+  htim1.Init.Period = (1000000 / 1000) - 1;
+  htim1.Init.Prescaler = uwPrescalerValue;
+  htim1.Init.ClockDivision = 0;
+  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
+  if(HAL_TIM_Base_Init(&htim1) == HAL_OK)
+  {
+    /* Start the TIM time Base generation in interrupt mode */
+    return HAL_TIM_Base_Start_IT(&htim1);
+  }
+  
+  /* Return function status */
+  return HAL_ERROR;
+}
+
+/**
+  * @brief  Suspend Tick increment.
+  * @note   Disable the tick increment by disabling TIM1 update interrupt.
+  * @param  None
+  * @retval None
+  */
+void HAL_SuspendTick(void)
+{
+  /* Disable TIM1 update Interrupt */
+  __HAL_TIM_DISABLE_IT(&htim1, TIM_IT_UPDATE);                                                  
+}
+
+/**
+  * @brief  Resume Tick increment.
+  * @note   Enable the tick increment by Enabling TIM1 update interrupt.
+  * @param  None
+  * @retval None
+  */
+void HAL_ResumeTick(void)
+{
+  /* Enable TIM1 Update interrupt */
+  __HAL_TIM_ENABLE_IT(&htim1, TIM_IT_UPDATE);
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

+ 826 - 0
Src/stm32f7xx_it.c

@@ -0,0 +1,826 @@
+/* USER CODE BEGIN Header */
+/**
+  ******************************************************************************
+  * @file    stm32f7xx_it.c
+  * @brief   Interrupt Service Routines.
+  ******************************************************************************
+  *
+  * COPYRIGHT(c) 2019 STMicroelectronics
+  *
+  * Redistribution and use in source and binary forms, with or without modification,
+  * are permitted provided that the following conditions are met:
+  *   1. Redistributions of source code must retain the above copyright notice,
+  *      this list of conditions and the following disclaimer.
+  *   2. Redistributions in binary form must reproduce the above copyright notice,
+  *      this list of conditions and the following disclaimer in the documentation
+  *      and/or other materials provided with the distribution.
+  *   3. Neither the name of STMicroelectronics nor the names of its contributors
+  *      may be used to endorse or promote products derived from this software
+  *      without specific prior written permission.
+  *
+  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+  *
+  ******************************************************************************
+  */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+#include "Data_deal.h"
+#include "stm32f7xx_it.h"
+#include "cmsis_os.h"
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN TD */
+
+/* USER CODE END TD */
+
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN PD */
+ 
+/* USER CODE END PD */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* Private user code ---------------------------------------------------------*/
+/* USER CODE BEGIN 0 */
+#include "usart.h"
+#include "tim.h"
+#include "KeySlave485.h"
+#include "Dwin.h"
+#include "Elec_Seal.h"
+#define Screen_SleepTime  1800  //3600// 60分钟 3600S/60=10min
+#define RE_Sealloading_Time 60//自动施封时间,单位秒
+uint16_t Sleep_Count=0;
+uint16_t Count_LED5=0;
+uint16_t Read_Collect485_Count;
+uint16_t Auto_unload_clear_cnt=0;
+uint8_t  Auto_Seal_Exti_cnt = 0;
+uint32_t overflow_cnt=0;//静电控制器脉冲输入溢出次数
+uint32_t Pro_overflow_cnt =0;
+uint16_t Auto_Seal_cnt_Time = 0;
+extern volatile uint8_t screen_delay;
+
+/* USER CODE END 0 */
+
+/* External variables --------------------------------------------------------*/
+extern TIM_HandleTypeDef htim2;
+extern TIM_HandleTypeDef htim6;
+extern DMA_HandleTypeDef hdma_uart4_rx;
+extern DMA_HandleTypeDef hdma_usart1_rx;
+extern DMA_HandleTypeDef hdma_usart2_rx;
+extern DMA_HandleTypeDef hdma_usart3_rx;
+extern UART_HandleTypeDef huart4;
+extern UART_HandleTypeDef huart1;
+extern UART_HandleTypeDef huart2;
+extern UART_HandleTypeDef huart3;
+extern TIM_HandleTypeDef htim1;
+
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/******************************************************************************/
+/*           Cortex-M7 Processor Interruption and Exception Handlers          */ 
+/******************************************************************************/
+/**
+  * @brief This function handles Non maskable interrupt.
+  */
+void NMI_Handler(void)
+{
+  /* USER CODE BEGIN NonMaskableInt_IRQn 0 */
+
+  /* USER CODE END NonMaskableInt_IRQn 0 */
+  /* USER CODE BEGIN NonMaskableInt_IRQn 1 */
+
+  /* USER CODE END NonMaskableInt_IRQn 1 */
+}
+
+/**
+  * @brief This function handles Hard fault interrupt.
+  */
+void HardFault_Handler(void)
+{
+  /* USER CODE BEGIN HardFault_IRQn 0 */
+	if (CoreDebug->DHCSR & 1) {  //check C_DEBUGEN == 1 -> Debugger Connected  
+      __breakpoint(0);  // halt program execution here         
+  }  
+  /* USER CODE END HardFault_IRQn 0 */
+  while (1)
+  {
+    /* USER CODE BEGIN W1_HardFault_IRQn 0 */
+		
+    /* USER CODE END W1_HardFault_IRQn 0 */
+  }
+}
+
+/**
+  * @brief This function handles Memory management fault.
+  */
+void MemManage_Handler(void)
+{
+  /* USER CODE BEGIN MemoryManagement_IRQn 0 */
+
+  /* USER CODE END MemoryManagement_IRQn 0 */
+  while (1)
+  {
+    /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */
+    /* USER CODE END W1_MemoryManagement_IRQn 0 */
+  }
+}
+
+/**
+  * @brief This function handles Pre-fetch fault, memory access fault.
+  */
+void BusFault_Handler(void)
+{
+  /* USER CODE BEGIN BusFault_IRQn 0 */
+
+  /* USER CODE END BusFault_IRQn 0 */
+  while (1)
+  {
+    /* USER CODE BEGIN W1_BusFault_IRQn 0 */
+    /* USER CODE END W1_BusFault_IRQn 0 */
+  }
+}
+
+/**
+  * @brief This function handles Undefined instruction or illegal state.
+  */
+void UsageFault_Handler(void)
+{
+  /* USER CODE BEGIN UsageFault_IRQn 0 */
+
+  /* USER CODE END UsageFault_IRQn 0 */
+  while (1)
+  {
+    /* USER CODE BEGIN W1_UsageFault_IRQn 0 */
+    /* USER CODE END W1_UsageFault_IRQn 0 */
+  }
+}
+
+/**
+  * @brief This function handles Debug monitor.
+  */
+void DebugMon_Handler(void)
+{
+  /* USER CODE BEGIN DebugMonitor_IRQn 0 */
+
+  /* USER CODE END DebugMonitor_IRQn 0 */
+  /* USER CODE BEGIN DebugMonitor_IRQn 1 */
+
+  /* USER CODE END DebugMonitor_IRQn 1 */
+}
+
+/******************************************************************************/
+/* STM32F7xx Peripheral Interrupt Handlers                                    */
+/* Add here the Interrupt Handlers for the used peripherals.                  */
+/* For the available peripheral interrupt handler names,                      */
+/* please refer to the startup file (startup_stm32f7xx.s).                    */
+/******************************************************************************/
+
+/**
+  * @brief This function handles DMA1 stream1 global interrupt.
+  */
+void DMA1_Stream1_IRQHandler(void)
+{
+  /* USER CODE BEGIN DMA1_Stream1_IRQn 0 */
+
+  /* USER CODE END DMA1_Stream1_IRQn 0 */
+  HAL_DMA_IRQHandler(&hdma_usart3_rx);
+  /* USER CODE BEGIN DMA1_Stream1_IRQn 1 */
+
+  /* USER CODE END DMA1_Stream1_IRQn 1 */
+}
+
+/**
+  * @brief This function handles DMA1 stream2 global interrupt.
+  */
+void DMA1_Stream2_IRQHandler(void)
+{
+  /* USER CODE BEGIN DMA1_Stream2_IRQn 0 */
+
+  /* USER CODE END DMA1_Stream2_IRQn 0 */
+;//  HAL_DMA_IRQHandler(&hdma_uart4_rx);
+  /* USER CODE BEGIN DMA1_Stream2_IRQn 1 */
+
+  /* USER CODE END DMA1_Stream2_IRQn 1 */
+}
+
+/**
+  * @brief This function handles DMA1 stream5 global interrupt.
+  */
+void DMA1_Stream5_IRQHandler(void)
+{
+  /* USER CODE BEGIN DMA1_Stream5_IRQn 0 */
+
+  /* USER CODE END DMA1_Stream5_IRQn 0 */
+  HAL_DMA_IRQHandler(&hdma_usart2_rx);
+  /* USER CODE BEGIN DMA1_Stream5_IRQn 1 */
+
+  /* USER CODE END DMA1_Stream5_IRQn 1 */
+}
+
+/**
+  * @brief This function handles TIM1 update interrupt and TIM10 global interrupt.
+  */
+int usart_rx_len;
+int delay_ti;
+int delay_usart1;
+int rs485_rts_delay;
+int rs455_1rts_delay;
+void TIM1_UP_TIM10_IRQHandler(void)
+{
+  /* USER CODE BEGIN TIM1_UP_TIM10_IRQn 0 */
+
+  /* USER CODE END TIM1_UP_TIM10_IRQn 0 */
+  HAL_TIM_IRQHandler(&htim1);
+  if(screen_delay)
+  {
+    --screen_delay;
+  }
+	if(delay_ti)
+	{
+		--delay_ti;
+		if(delay_ti==0)
+		{
+			usart2_rx_flag = 1;
+			rx2_len = usart_rx_len;
+			usart_rx_len=0;
+		}
+	}
+	
+	if(delay_usart1)
+	{
+		--delay_usart1;
+		if(delay_usart1==0)
+		{
+			if(rx1_len)
+        usart1_rx_flag = 1; 
+		}
+	}
+#if 0  
+	if(rs485_rts_delay)
+	{
+		--rs485_rts_delay;
+		if(rs485_rts_delay==0)
+			TerminalSlave485_TX_Set(0);
+	}
+	
+	if(rs455_1rts_delay)
+	{
+		--rs455_1rts_delay;
+		if(rs455_1rts_delay==0)
+			CollectMaster485_TX_Set(0);			//设置为接收模式	
+	}
+#endif	
+	
+  ++circle_send;
+  /* USER CODE BEGIN TIM1_UP_TIM10_IRQn 1 */
+
+  /* USER CODE END TIM1_UP_TIM10_IRQn 1 */
+}
+
+/**
+  * @brief This function handles TIM2 global interrupt.
+  */
+extern SDateTime m_datetime;
+void TIM2_IRQHandler(void)
+{
+  /* USER CODE BEGIN TIM2_IRQn 0 */
+	Sleep_Count++;
+	Read_Collect485_Count++;
+	
+	++m_datetime.msec;
+	if(m_datetime.msec>=1000)
+	{
+		m_datetime.msec=0;
+		++m_datetime.sec;
+		if(m_datetime.sec>=60)
+		{
+			m_datetime.sec=0;
+			++m_datetime.min;
+			if(m_datetime.min>=60)
+			{
+				m_datetime.min=0;
+				++m_datetime.hour;
+				if(m_datetime.hour>=24)
+				{
+					m_datetime.hour=0;
+					++m_datetime.day;
+				}
+			}
+		}
+	}
+	
+	//打印机定时器
+	if(tmrForPrinter>0)
+	tmrForPrinter--;
+	
+	//任何按键按下定时器
+	if(tmrForKeyPad>0)
+	tmrForKeyPad--;
+	
+		//远程标定模式定时器
+	if(tmrForRemoteCali>0)
+	tmrForRemoteCali--;
+	
+	
+	//手工输入温度之后的定时器
+	if(tmrForTemp_ManualInput>0)
+	tmrForTemp_ManualInput--;
+	
+	
+	if(Sleep_Count>=1000)
+	{
+		Sleep_Count=0;
+		Sleep_Timer_cnt3++;
+		Auto_Seal_Exti_cnt++;
+    StartUpdate_Screen_Flag=True;
+    if(usart_timeout)
+		{
+			++usart_timesec;
+		}
+		if(Sleep_Timer_cnt3>=Screen_SleepTime)
+		{
+			if(Lcd_sleep_flag!=1)
+				Lcd_sleep_flag=1;
+			Sleep_Timer_cnt3=0;
+		}
+		
+		
+		if(Auto_Seal_Exti_cnt>=5)//5S
+		{
+			Auto_Seal_Exti_cnt = 0;
+			if(Pro_overflow_cnt!=overflow_cnt)
+			{
+				Auto_Seal_cnt_Time =0;
+				Pro_overflow_cnt = overflow_cnt;//防溢流静电控制器连接中
+				Full_Oil_allinfo.Start_Full_flag =1;//静电控制器插入,开始装油
+				Full_Oil_allinfo.Start_Decrease_flag =0;
+				Full_Oil_allinfo.Auto_full_oil_mode =1;//自动模式
+			}
+			else
+			{
+				overflow_cnt = 0;//防溢流静电控制器断开中
+				Pro_overflow_cnt = 0;
+			}
+		}
+		if((Config_info_all.Config_fun_id&0x01)==0x01)//开启自动施封功能
+		{		
+			if((overflow_cnt == 0)&&(Full_Oil_allinfo.Start_Full_flag ==1))
+			{
+				Auto_Seal_cnt_Time++;
+				if(Auto_Seal_cnt_Time>Config_info_all.Auto_Seal_Time)//自动施封
+				{
+					Auto_Seal_cnt_Time =0;
+					Full_Oil_allinfo.Start_Seal_flag =1;//开始施封
+				}
+			}
+		}
+	}
+	if(Read_Collect485_Count>=READ_COLLECT_INTERVAL)//500
+	{
+		Read_Collect485_Count=0;
+		Read_Collect485_Flag=True;
+	}
+	
+	
+	if(Auto_unload_clear_info_flag == 1)//计数10S
+	{
+		Auto_unload_clear_cnt++;
+		if(Auto_unload_clear_cnt>=10000)//5000  =5s
+		{
+			Auto_unload_clear_info_flag = 0;
+			Auto_unload_clear_cnt = 0;
+			Auto_unload_clear_start_flag = 1;
+		}
+	}
+		
+  /* USER CODE END TIM2_IRQn 0 */
+  HAL_TIM_IRQHandler(&htim2);
+  /* USER CODE BEGIN TIM2_IRQn 1 */
+
+  /* USER CODE END TIM2_IRQn 1 */
+}
+
+/**
+  * @brief This function handles USART1 global interrupt.
+  */
+void USART1_IRQHandler(void)
+{
+  /* USER CODE BEGIN USART1_IRQn 0 */
+	//HAL_UART_IRQHandler(&huart1);
+	uint32_t isrflags   = huart1.Instance->ISR;
+  uint32_t cr1its     = READ_REG(huart1.Instance->CR1);
+	
+	if(__HAL_UART_GET_IT(&huart1,UART_IT_RXNE) && __HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE))
+	{
+		__HAL_UART_CLEAR_IT(&huart1,UART_FLAG_RXNE);
+      rx1_len %= 1024;
+		  USART1_RX_BUF[rx1_len] = huart1.Instance->RDR;
+		  rx1_len++;
+		  delay_usart1=3;
+	}
+	
+  if (((cr1its & USART_CR1_TXEIE) != RESET)  &&  __HAL_UART_GET_FLAG(&huart1, UART_FLAG_TXE))
+  {
+		__HAL_UART_CLEAR_IT(&huart1,UART_FLAG_TXE);
+    if (huart1.pTxBuffPtr)
+    {
+			huart1.Instance->TDR = (huart1.pTxBuffPtr[huart1.TxXferCount++] & (uint8_t)0xFFU);
+      if (huart1.TxXferCount >= huart1.TxXferSize)
+      {
+         /* Disable the UART Transmit Data Register Empty Interrupt */
+        CLEAR_BIT(huart1.Instance->CR1, USART_CR1_TXEIE);
+				//__HAL_UART_DISABLE_IT(&huart1,UART_IT_TXE);
+
+        /* Enable the UART Transmit Complete Interrupt */
+        SET_BIT(huart1.Instance->CR1, USART_CR1_TCIE);
+				//__HAL_UART_ENABLE_IT(&huart1,UART_IT_TC);	
+      }
+			//else
+        
+    }
+  }
+  else if(((isrflags & UART_FLAG_TC)) && ((cr1its & USART_CR1_TCIE) != RESET))
+  {
+    TerminalSlave485_TX_Set(0);
+    __HAL_UART_DISABLE_IT(&huart1,UART_IT_TC);
+    huart1.gState = HAL_UART_STATE_READY;
+  }
+
+/*	if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE))
+  {
+		UsartReceive_IDLE(&huart1);
+	}*/
+  /* USER CODE END USART1_IRQn 0 */
+ // HAL_UART_IRQHandler(&huart1);
+  /* USER CODE BEGIN USART1_IRQn 1 */
+  if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_ORE))
+  {
+        __HAL_UART_CLEAR_OREFLAG(&huart1);
+				//taskENTER_CRITICAL();
+       // HAL_UART_MspDeInit(&huart1);
+				//HAL_UART_MspInit(&huart1);
+				//taskEXIT_CRITICAL();
+		}
+   
+		__HAL_UART_CLEAR_IT(&huart1,isrflags);
+  /* USER CODE END USART1_IRQn 1 */
+}
+
+/**
+  * @brief This function handles USART2 global interrupt.
+  */
+
+void USART2_IRQHandler(void)
+{
+  /* USER CODE BEGIN USART2_IRQn 0 */
+	uint32_t isrflags   = huart2.Instance->ISR;
+	uint32_t cr1its     = READ_REG(huart2.Instance->CR1);
+/*	HAL_UART_IRQHandler(&huart2);
+	if(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE))
+  {
+		UsartReceive_IDLE(&huart2);
+	}*/
+	if(__HAL_UART_GET_IT(&huart2,UART_IT_RXNE) && __HAL_UART_GET_FLAG(&huart2, UART_FLAG_RXNE))
+	{
+		__HAL_UART_CLEAR_IT(&huart2,UART_FLAG_RXNE);
+		usart_rx_len %= Uart2_BUF_SIZE;
+		USART2_RX_BUF[usart_rx_len] = huart2.Instance->RDR;
+		usart_rx_len++;
+		delay_ti=3;
+	}
+
+  /*
+    中断发送
+    zhuzl 20211215 add 
+  */
+  if (((cr1its & USART_CR1_TXEIE) != RESET) &&  __HAL_UART_GET_FLAG(&huart2, UART_FLAG_TXE))
+  {
+		__HAL_UART_CLEAR_IT(&huart2,UART_FLAG_TXE);
+    if (huart2.pTxBuffPtr)
+    {
+      huart2.Instance->TDR = (huart2.pTxBuffPtr[huart2.TxXferCount++] & (uint8_t)0xFFU);
+      if (huart2.TxXferCount >= huart2.TxXferSize)
+      {
+        /* Disable the UART Transmit Data Register Empty Interrupt */
+        CLEAR_BIT(huart2.Instance->CR1, USART_CR1_TXEIE);
+
+        /* Enable the UART Transmit Complete Interrupt */
+        SET_BIT(huart2.Instance->CR1, USART_CR1_TCIE);
+		
+      }        
+    }
+  }
+  else if(((isrflags & UART_FLAG_TC)) && ((cr1its & USART_CR1_TCIE) != RESET))
+  {
+    CollectMaster485_TX_Set(0); //设置为接收模式	
+    huart2.gState = HAL_UART_STATE_READY;
+    __HAL_UART_DISABLE_IT(&huart2,UART_IT_TC);
+  } 
+	
+	//20210107李伟添加 
+	//if(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_ORE))
+  {
+  //      __HAL_UART_CLEAR_OREFLAG(&huart2);
+	}
+
+  if((__HAL_UART_GET_FLAG(&huart2, UART_FLAG_ORE) != RESET))
+				{
+					//i = UART2->ISR; //清除状态寄存器SR,读取SR寄存器可以实现清除SR寄存器的功能
+					//i = UART2->RDR; //读取数据寄存器中的数据
+					//i = hdma_uart4_rx.Instance->NDTR;
+					__HAL_UART_CLEAR_OREFLAG(&huart2);
+					//HAL_DMA_DeInit(&hdma_uart4_rx);
+				//	HAL_UART_MspInit(&huart2);
+					//HAL_UART_Receive_DMA(&huart4, USART_RX_BUF,BUF_SIZE);
+
+				}
+	__HAL_UART_CLEAR_IT(&huart2,isrflags);
+  /* USER CODE END USART2_IRQn 0 */
+	//	HAL_UART_IRQHandler(&huart2);
+  /* USER CODE BEGIN USART2_IRQn 1 */
+	
+	
+
+  /* USER CODE END USART2_IRQn 1 */
+}
+
+/**
+  * @brief This function handles USART3 global interrupt.
+  */
+ int usart3_rx_len;
+void USART3_IRQHandler(void)
+{
+	uint32_t isrflags   = huart3.Instance->ISR;
+  uint32_t cr1its     = READ_REG(huart3.Instance->CR1);
+  /* USER CODE BEGIN USART3_IRQn 0 */
+	 //HAL_UART_IRQHandler(&huart3);
+/*	if(__HAL_UART_GET_FLAG(&huart3,UART_FLAG_IDLE))
+  {
+		UsartReceive_IDLE(&huart3);
+	}*/
+  if(__HAL_UART_GET_IT(&huart3,UART_IT_RXNE) && __HAL_UART_GET_FLAG(&huart3, UART_FLAG_RXNE))
+	{
+		__HAL_UART_CLEAR_IT(&huart3,UART_FLAG_RXNE);
+		usart3_rx_len %= 128;
+		USART3_RX_BUF[usart3_rx_len] = huart3.Instance->RDR;
+		usart3_rx_len++;
+	//	delay_ti=5;
+	}
+  /*
+    中断发送
+    zhuzl 20211215 add 
+  */
+  if (((cr1its & USART_CR1_TXEIE) != RESET) &&  __HAL_UART_GET_FLAG(&huart3, UART_FLAG_TXE))
+  {
+    if (huart3.pTxBuffPtr)
+    {
+      huart3.Instance->TDR = (huart3.pTxBuffPtr[huart3.TxXferCount++] & (uint8_t)0xFFU);
+      if (huart3.TxXferCount >= huart3.TxXferSize)
+      {
+				//__HAL_UART_CLEAR_IT(&huart3,UART_FLAG_TXE);
+        CLEAR_BIT(huart3.Instance->CR1, USART_CR1_TXEIE);
+				/* Enable the UART Transmit Complete Interrupt */
+        SET_BIT(huart3.Instance->CR1, USART_CR1_TCIE);
+      }    
+    }
+  }
+  else if(((isrflags & UART_FLAG_TC)) && ((cr1its & USART_CR1_TCIE) != RESET))
+  {
+    ScreenMaster485_TX_Set(0);
+    CLEAR_BIT(huart3.Instance->CR1, USART_CR1_TCIE);
+    huart3.gState = HAL_UART_STATE_READY;
+    screen_delay=40;
+  }
+
+    //20210107李伟添加 
+	if(__HAL_UART_GET_FLAG(&huart3,UART_FLAG_ORE))
+  {
+        __HAL_UART_CLEAR_OREFLAG(&huart3);
+				HAL_UART_MspInit(&huart3);
+	}
+	__HAL_UART_CLEAR_IT(&huart3,isrflags);
+	
+  /* USER CODE END USART3_IRQn 0 */
+ // HAL_UART_IRQHandler(&huart3);
+  /* USER CODE BEGIN USART3_IRQn 1 */
+
+  /* USER CODE END USART3_IRQn 1 */
+}
+
+/**
+  * @brief This function handles UART4 global interrupt.
+  */
+void UART4_IRQHandler(void)
+{
+  /* USER CODE BEGIN UART4_IRQn 0 */
+	uint32_t i = 0;
+  uint32_t isrflags   = huart4.Instance->ISR;
+  uint32_t cr1its     = READ_REG(huart4.Instance->CR1);
+	//HAL_UART_IRQHandler(&huart4);
+  if (__HAL_UART_GET_FLAG(&huart4, UART_FLAG_IDLE))
+  {
+    // UsartReceive_IDLE(&huart4);
+    __HAL_UART_CLEAR_IDLEFLAG(&huart4);
+    //__HAL_UART_CLEAR_IDLEFLAG(UART4);
+    //						i = huart4->Instance->ISR;
+    //            i = huart4->Instance->RDR;
+    //            i = hdma_uart4_rx.Instance->NDTR;
+    // HAL_UART_DMAStop(huart);
+    // HAL_UART_Receive_DMA(&huart4, USART_RX_BUF,BUF_SIZE);
+    //此处处理数据,主要是拷贝和置位标志位 //
+    // memcpy(UART4_RX_BUF, USART_RX_BUF, (BUF_SIZE - i));
+    usart4_rx_flag = 1;
+    rx4_len = uart4RxCounter - 0;
+    uart4RxCounter = 0;
+    //	__nop();
+    // rx4_len = BUF_SIZE - i;//实际接收到的有用数据
+    // memset(USART_RX_BUF, 0x00, BUF_SIZE);
+  }
+
+  if ((__HAL_UART_GET_FLAG(&huart4, UART_FLAG_ORE) != RESET))
+  {
+    i = UART4->ISR; //清除状态寄存器SR,读取SR寄存器可以实现清除SR寄存器的功能
+    i = UART4->RDR; //读取数据寄存器中的数据
+    // i = hdma_uart4_rx.Instance->NDTR;
+    __HAL_UART_CLEAR_OREFLAG(&huart4);
+    // HAL_DMA_DeInit(&hdma_uart4_rx);
+    HAL_UART_MspInit(&huart4);
+    // HAL_UART_Receive_DMA(&huart4, USART_RX_BUF,BUF_SIZE);
+  }
+
+  if (__HAL_UART_GET_FLAG(&huart4, UART_FLAG_RXNE)) //接收中断
+  {
+    i = UART4->RDR;
+
+    // sMyUart4.rxBuf[sMyUart4.rxTotal++] = i;
+    UART4_RX_BUF[uart4RxCounter++] = i;
+
+    //__nop();
+
+    if (uart4RxCounter >= Uart1_BUF_SIZE - 1)
+    {
+      uart4RxCounter = 0; //避免溢出错误
+    }
+
+    //__HAL_UART_CLEAR_OREFLAG(UART4, UART_IT_RXNE);读取DR自动清零    不需要手动清零
+  }
+
+  if (((cr1its & USART_CR1_TXEIE) != RESET) && __HAL_UART_GET_FLAG(&huart4, UART_FLAG_TXE))
+  {
+    if (huart4.pTxBuffPtr)
+    {
+      huart4.Instance->TDR = (huart4.pTxBuffPtr[huart4.TxXferCount++] & (uint8_t)0xFFU);
+      if (huart4.TxXferCount >= huart4.TxXferSize)
+      {
+        //__HAL_UART_CLEAR_IT(&huart3,UART_FLAG_TXE);
+        CLEAR_BIT(huart4.Instance->CR1, USART_CR1_TXEIE);
+        /* Enable the UART Transmit Complete Interrupt */
+        SET_BIT(huart4.Instance->CR1, USART_CR1_TCIE);
+      }
+    }
+  }
+  else if (((isrflags & UART_FLAG_TC)) && ((cr1its & USART_CR1_TCIE) != RESET))
+  {
+    KeySlave485_TX_Set(0);
+    CLEAR_BIT(huart4.Instance->CR1, USART_CR1_TCIE);
+    huart4.gState = HAL_UART_STATE_READY;
+  }
+
+  /* USER CODE END UART4_IRQn 0 */
+//  HAL_UART_IRQHandler(&huart4);
+  /* USER CODE BEGIN UART4_IRQn 1 */
+	
+//	
+//	__HAL_UART_CLEAR_PEFLAG(&huart4);
+//	
+//	__HAL_UART_CLEAR_FEFLAG(&huart4);
+//	
+//	__HAL_UART_CLEAR_OREFLAG(&huart4);
+	
+	//20210107李伟添加 
+	/*if(__HAL_UART_GET_FLAG(&huart4,UART_FLAG_ORE))
+  {
+        __HAL_UART_CLEAR_OREFLAG(&huart4);
+	}*/
+	__HAL_UART_CLEAR_IT(&huart4,isrflags);
+ 
+	
+
+  /* USER CODE END UART4_IRQn 1 */
+}
+
+/**
+  * @brief This function handles TIM6 global interrupt, DAC1 and DAC2 underrun error interrupts.
+  */
+void TIM6_DAC_IRQHandler(void)
+{
+  /* USER CODE BEGIN TIM6_DAC_IRQn 0 */
+//	Count_LED4++;
+//	if(Count_LED4>=500)
+//	{
+//		Count_LED4=0;
+//		HAL_GPIO_TogglePin(GPIOE,LED4_Pin);
+//	}
+  /* USER CODE END TIM6_DAC_IRQn 0 */
+  HAL_TIM_IRQHandler(&htim6);
+  /* USER CODE BEGIN TIM6_DAC_IRQn 1 */
+	
+  /* USER CODE END TIM6_DAC_IRQn 1 */
+}
+
+/**
+  * @brief This function handles DMA2 stream2 global interrupt.
+  */
+void DMA2_Stream2_IRQHandler(void)
+{
+  /* USER CODE BEGIN DMA2_Stream2_IRQn 0 */
+
+  /* USER CODE END DMA2_Stream2_IRQn 0 */
+  HAL_DMA_IRQHandler(&hdma_usart1_rx);
+  /* USER CODE BEGIN DMA2_Stream2_IRQn 1 */
+
+  /* USER CODE END DMA2_Stream2_IRQn 1 */
+}
+
+/* USER CODE BEGIN 1 */
+/**
+  * @brief This function handles EXTI line0 interrupt.
+  */
+void EXTI0_IRQHandler(void)
+{
+  /* USER CODE BEGIN EXTI0_IRQn 0 */
+
+  /* USER CODE END EXTI0_IRQn 0 */
+  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
+  /* USER CODE BEGIN EXTI0_IRQn 1 */
+
+  /* USER CODE END EXTI0_IRQn 1 */
+}
+
+/**
+  * @brief This function handles EXTI line[15:10] interrupts.
+  */
+//void EXTI15_10_IRQHandler(void)
+//{
+//  /* USER CODE BEGIN EXTI15_10_IRQn 0 */
+
+//  /* USER CODE END EXTI15_10_IRQn 0 */
+//  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_10);
+//  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_11);
+//  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12);
+//  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);
+//  /* USER CODE BEGIN EXTI15_10_IRQn 1 */
+
+//  /* USER CODE END EXTI15_10_IRQn 1 */
+//}
+//void EXTI15_10_IRQHandler(void)
+//{
+//    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);  //调用中断处理公用函数
+//}
+
+void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)  
+{  
+  /* NOTE: This function Should not be modified, when the callback is needed, 
+           the HAL_GPIO_EXTI_Callback could be implemented in the user file 
+   */  
+    switch(GPIO_Pin)  
+    {  
+        case GPIO_PIN_0: overflow_cnt++;break;  
+//        case GPIO_PIN_10:LED1_Toggle();break;  
+//        case GPIO_PIN_11:LED2_Toggle();break;  
+//        case GPIO_PIN_12:LED3_Toggle();break; 
+//				case GPIO_PIN_13:LED3_Toggle();break;
+        default:break;  
+    }  
+}       
+/* USER CODE END 1 */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

+ 278 - 0
Src/system_stm32f7xx.c

@@ -0,0 +1,278 @@
+/**
+  ******************************************************************************
+  * @file    system_stm32f7xx.c
+  * @author  MCD Application Team
+  * @brief   CMSIS Cortex-M7 Device Peripheral Access Layer System Source File.
+  *
+  *   This file provides two functions and one global variable to be called from 
+  *   user application:
+  *      - SystemInit(): This function is called at startup just after reset and 
+  *                      before branch to main program. This call is made inside
+  *                      the "startup_stm32f7xx.s" file.
+  *
+  *      - SystemCoreClock variable: Contains the core clock (HCLK), it can be used
+  *                                  by the user application to setup the SysTick 
+  *                                  timer or configure other parameters.
+  *                                     
+  *      - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must
+  *                                 be called whenever the core clock is changed
+  *                                 during program execution.
+  *
+  *
+  ******************************************************************************
+  * @attention
+  *
+  * <h2><center>&copy; COPYRIGHT 2016 STMicroelectronics</center></h2>
+  *
+  * Redistribution and use in source and binary forms, with or without modification,
+  * are permitted provided that the following conditions are met:
+  *   1. Redistributions of source code must retain the above copyright notice,
+  *      this list of conditions and the following disclaimer.
+  *   2. Redistributions in binary form must reproduce the above copyright notice,
+  *      this list of conditions and the following disclaimer in the documentation
+  *      and/or other materials provided with the distribution.
+  *   3. Neither the name of STMicroelectronics nor the names of its contributors
+  *      may be used to endorse or promote products derived from this software
+  *      without specific prior written permission.
+  *
+  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+  *
+  ******************************************************************************
+  */
+
+/** @addtogroup CMSIS
+  * @{
+  */
+
+/** @addtogroup stm32f7xx_system
+  * @{
+  */  
+  
+/** @addtogroup STM32F7xx_System_Private_Includes
+  * @{
+  */
+
+#include "stm32f7xx.h"
+
+#if !defined  (HSE_VALUE) 
+  #define HSE_VALUE    ((uint32_t)25000000) /*!< Default value of the External oscillator in Hz */
+#endif /* HSE_VALUE */
+
+#if !defined  (HSI_VALUE)
+  #define HSI_VALUE    ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+/**
+  * @}
+  */
+
+/** @addtogroup STM32F7xx_System_Private_TypesDefinitions
+  * @{
+  */
+
+/**
+  * @}
+  */
+
+/** @addtogroup STM32F7xx_System_Private_Defines
+  * @{
+  */
+
+/************************* Miscellaneous Configuration ************************/
+
+/*!< Uncomment the following line if you need to relocate your vector Table in
+     Internal SRAM. */
+/* #define VECT_TAB_SRAM */
+#define VECT_TAB_OFFSET  0x00 /*!< Vector Table base offset field. 
+                                   This value must be a multiple of 0x200. */
+/******************************************************************************/
+
+/**
+  * @}
+  */
+
+/** @addtogroup STM32F7xx_System_Private_Macros
+  * @{
+  */
+
+/**
+  * @}
+  */
+
+/** @addtogroup STM32F7xx_System_Private_Variables
+  * @{
+  */
+
+  /* This variable is updated in three ways:
+      1) by calling CMSIS function SystemCoreClockUpdate()
+      2) by calling HAL API function HAL_RCC_GetHCLKFreq()
+      3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency 
+         Note: If you use this function to configure the system clock; then there
+               is no need to call the 2 first functions listed above, since SystemCoreClock
+               variable is updated automatically.
+  */
+  uint32_t SystemCoreClock = 16000000;
+  const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9};
+  const uint8_t APBPrescTable[8] = {0, 0, 0, 0, 1, 2, 3, 4};
+
+/**
+  * @}
+  */
+
+/** @addtogroup STM32F7xx_System_Private_FunctionPrototypes
+  * @{
+  */
+
+/**
+  * @}
+  */
+
+/** @addtogroup STM32F7xx_System_Private_Functions
+  * @{
+  */
+
+/**
+  * @brief  Setup the microcontroller system
+  *         Initialize the Embedded Flash Interface, the PLL and update the 
+  *         SystemFrequency variable.
+  * @param  None
+  * @retval None
+  */
+void SystemInit(void)
+{
+  /* FPU settings ------------------------------------------------------------*/
+  #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
+    SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */
+  #endif
+  /* Reset the RCC clock configuration to the default reset state ------------*/
+  /* Set HSION bit */
+  RCC->CR |= (uint32_t)0x00000001;
+
+  /* Reset CFGR register */
+  RCC->CFGR = 0x00000000;
+
+  /* Reset HSEON, CSSON and PLLON bits */
+  RCC->CR &= (uint32_t)0xFEF6FFFF;
+
+  /* Reset PLLCFGR register */
+  RCC->PLLCFGR = 0x24003010;
+
+  /* Reset HSEBYP bit */
+  RCC->CR &= (uint32_t)0xFFFBFFFF;
+
+  /* Disable all interrupts */
+  RCC->CIR = 0x00000000;
+
+  /* Configure the Vector Table location add offset address ------------------*/
+#ifdef VECT_TAB_SRAM
+  SCB->VTOR = RAMDTCM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
+#else
+  SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
+#endif
+}
+
+/**
+   * @brief  Update SystemCoreClock variable according to Clock Register Values.
+  *         The SystemCoreClock variable contains the core clock (HCLK), it can
+  *         be used by the user application to setup the SysTick timer or configure
+  *         other parameters.
+  *           
+  * @note   Each time the core clock (HCLK) changes, this function must be called
+  *         to update SystemCoreClock variable value. Otherwise, any configuration
+  *         based on this variable will be incorrect.         
+  *     
+  * @note   - The system frequency computed by this function is not the real 
+  *           frequency in the chip. It is calculated based on the predefined 
+  *           constant and the selected clock source:
+  *             
+  *           - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*)
+  *                                              
+  *           - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**)
+  *                          
+  *           - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) 
+  *             or HSI_VALUE(*) multiplied/divided by the PLL factors.
+  *         
+  *         (*) HSI_VALUE is a constant defined in stm32f7xx_hal_conf.h file (default value
+  *             16 MHz) but the real value may vary depending on the variations
+  *             in voltage and temperature.   
+  *    
+  *         (**) HSE_VALUE is a constant defined in stm32f7xx_hal_conf.h file (default value
+  *              25 MHz), user has to ensure that HSE_VALUE is same as the real
+  *              frequency of the crystal used. Otherwise, this function may
+  *              have wrong result.
+  *                
+  *         - The result of this function could be not correct when using fractional
+  *           value for HSE crystal.
+  *     
+  * @param  None
+  * @retval None
+  */
+void SystemCoreClockUpdate(void)
+{
+  uint32_t tmp = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2;
+  
+  /* Get SYSCLK source -------------------------------------------------------*/
+  tmp = RCC->CFGR & RCC_CFGR_SWS;
+
+  switch (tmp)
+  {
+    case 0x00:  /* HSI used as system clock source */
+      SystemCoreClock = HSI_VALUE;
+      break;
+    case 0x04:  /* HSE used as system clock source */
+      SystemCoreClock = HSE_VALUE;
+      break;
+    case 0x08:  /* PLL used as system clock source */
+
+      /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N
+         SYSCLK = PLL_VCO / PLL_P
+         */    
+      pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22;
+      pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM;
+      
+      if (pllsource != 0)
+      {
+        /* HSE used as PLL clock source */
+        pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
+      }
+      else
+      {
+        /* HSI used as PLL clock source */
+        pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);      
+      }
+
+      pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2;
+      SystemCoreClock = pllvco/pllp;
+      break;
+    default:
+      SystemCoreClock = HSI_VALUE;
+      break;
+  }
+  /* Compute HCLK frequency --------------------------------------------------*/
+  /* Get HCLK prescaler */
+  tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)];
+  /* HCLK frequency */
+  SystemCoreClock >>= tmp;
+}
+
+/**
+  * @}
+  */
+
+/**
+  * @}
+  */
+  
+/**
+  * @}
+  */    
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

+ 185 - 0
Src/tim.c

@@ -0,0 +1,185 @@
+/**
+  ******************************************************************************
+  * File Name          : TIM.c
+  * Description        : This file provides code for the configuration
+  *                      of the TIM instances.
+  ******************************************************************************
+  * This notice applies to any and all portions of this file
+  * that are not between comment pairs USER CODE BEGIN and
+  * USER CODE END. Other portions of this file, whether 
+  * inserted by the user or by software development tools
+  * are owned by their respective copyright owners.
+  *
+  * Copyright (c) 2019 STMicroelectronics International N.V. 
+  * All rights reserved.
+  *
+  * Redistribution and use in source and binary forms, with or without 
+  * modification, are permitted, provided that the following conditions are met:
+  *
+  * 1. Redistribution of source code must retain the above copyright notice, 
+  *    this list of conditions and the following disclaimer.
+  * 2. Redistributions in binary form must reproduce the above copyright notice,
+  *    this list of conditions and the following disclaimer in the documentation
+  *    and/or other materials provided with the distribution.
+  * 3. Neither the name of STMicroelectronics nor the names of other 
+  *    contributors to this software may be used to endorse or promote products 
+  *    derived from this software without specific written permission.
+  * 4. This software, including modifications and/or derivative works of this 
+  *    software, must execute solely and exclusively on microcontroller or
+  *    microprocessor devices manufactured by or for STMicroelectronics.
+  * 5. Redistribution and use of this software other than as permitted under 
+  *    this license is void and will automatically terminate your rights under 
+  *    this license. 
+  *
+  * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" 
+  * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT 
+  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 
+  * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY
+  * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT 
+  * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 
+  * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 
+  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
+  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+  *
+  ******************************************************************************
+  */
+
+/* Includes ------------------------------------------------------------------*/
+#include "tim.h"
+
+/* USER CODE BEGIN 0 */
+bool Read_Collect485_Flag;
+bool StartUpdate_Screen_Flag;
+/* USER CODE END 0 */
+
+TIM_HandleTypeDef htim2;
+TIM_HandleTypeDef htim6;
+
+/* TIM2 init function */
+void MX_TIM2_Init(void)
+{
+  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
+  TIM_MasterConfigTypeDef sMasterConfig = {0};
+
+  htim2.Instance = TIM2;
+  htim2.Init.Prescaler = (108-1);
+  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
+  htim2.Init.Period = (1000-1);
+  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
+  htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
+  if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
+  {
+    Error_Handler();
+  }
+  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
+  if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
+  {
+    Error_Handler();
+  }
+  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
+  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
+  if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
+  {
+    Error_Handler();
+  }
+
+}
+/* TIM6 init function */
+void MX_TIM6_Init(void)
+{
+  TIM_MasterConfigTypeDef sMasterConfig = {0};
+
+  htim6.Instance = TIM6;
+  htim6.Init.Prescaler = (108-1);
+  htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
+  htim6.Init.Period = (1000-1);
+  htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
+  if (HAL_TIM_Base_Init(&htim6) != HAL_OK)
+  {
+    Error_Handler();
+  }
+  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
+  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
+  if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK)
+  {
+    Error_Handler();
+  }
+
+}
+
+void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
+{
+
+  if(tim_baseHandle->Instance==TIM2)
+  {
+  /* USER CODE BEGIN TIM2_MspInit 0 */
+
+  /* USER CODE END TIM2_MspInit 0 */
+    /* TIM2 clock enable */
+    __HAL_RCC_TIM2_CLK_ENABLE();
+
+    /* TIM2 interrupt Init */
+    HAL_NVIC_SetPriority(TIM2_IRQn, 7, 0);
+    HAL_NVIC_EnableIRQ(TIM2_IRQn);
+  /* USER CODE BEGIN TIM2_MspInit 1 */
+
+  /* USER CODE END TIM2_MspInit 1 */
+  }
+  else if(tim_baseHandle->Instance==TIM6)
+  {
+  /* USER CODE BEGIN TIM6_MspInit 0 */
+
+  /* USER CODE END TIM6_MspInit 0 */
+    /* TIM6 clock enable */
+    __HAL_RCC_TIM6_CLK_ENABLE();
+
+    /* TIM6 interrupt Init */
+    HAL_NVIC_SetPriority(TIM6_DAC_IRQn, 7, 0);
+    HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn);
+  /* USER CODE BEGIN TIM6_MspInit 1 */
+
+  /* USER CODE END TIM6_MspInit 1 */
+  }
+}
+
+void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
+{
+
+  if(tim_baseHandle->Instance==TIM2)
+  {
+  /* USER CODE BEGIN TIM2_MspDeInit 0 */
+
+  /* USER CODE END TIM2_MspDeInit 0 */
+    /* Peripheral clock disable */
+    __HAL_RCC_TIM2_CLK_DISABLE();
+
+    /* TIM2 interrupt Deinit */
+    HAL_NVIC_DisableIRQ(TIM2_IRQn);
+  /* USER CODE BEGIN TIM2_MspDeInit 1 */
+
+  /* USER CODE END TIM2_MspDeInit 1 */
+  }
+  else if(tim_baseHandle->Instance==TIM6)
+  {
+  /* USER CODE BEGIN TIM6_MspDeInit 0 */
+
+  /* USER CODE END TIM6_MspDeInit 0 */
+    /* Peripheral clock disable */
+    __HAL_RCC_TIM6_CLK_DISABLE();
+
+    /* TIM6 interrupt Deinit */
+    HAL_NVIC_DisableIRQ(TIM6_DAC_IRQn);
+  /* USER CODE BEGIN TIM6_MspDeInit 1 */
+
+  /* USER CODE END TIM6_MspDeInit 1 */
+  }
+} 
+
+/* USER CODE BEGIN 1 */
+
+/* USER CODE END 1 */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

+ 682 - 0
Src/usart.c

@@ -0,0 +1,682 @@
+/**
+  ******************************************************************************
+  * File Name          : USART.c
+  * Description        : This file provides code for the configuration
+  *                      of the USART instances.
+  ******************************************************************************
+  * This notice applies to any and all portions of this file
+  * that are not between comment pairs USER CODE BEGIN and
+  * USER CODE END. Other portions of this file, whether 
+  * inserted by the user or by software development tools
+  * are owned by their respective copyright owners.
+  *
+  * Copyright (c) 2019 STMicroelectronics International N.V. 
+  * All rights reserved.
+  *
+  * Redistribution and use in source and binary forms, with or without 
+  * modification, are permitted, provided that the following conditions are met:
+  *
+  * 1. Redistribution of source code must retain the above copyright notice, 
+  *    this list of conditions and the following disclaimer.
+  * 2. Redistributions in binary form must reproduce the above copyright notice,
+  *    this list of conditions and the following disclaimer in the documentation
+  *    and/or other materials provided with the distribution.
+  * 3. Neither the name of STMicroelectronics nor the names of other 
+  *    contributors to this software may be used to endorse or promote products 
+  *    derived from this software without specific written permission.
+  * 4. This software, including modifications and/or derivative works of this 
+  *    software, must execute solely and exclusively on microcontroller or
+  *    microprocessor devices manufactured by or for STMicroelectronics.
+  * 5. Redistribution and use of this software other than as permitted under 
+  *    this license is void and will automatically terminate your rights under 
+  *    this license. 
+  *
+  * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" 
+  * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT 
+  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 
+  * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY
+  * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT 
+  * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 
+  * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 
+  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
+  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+  *
+  ******************************************************************************
+  */
+
+/* Includes ------------------------------------------------------------------*/
+#include "usart.h"
+#include "Dwin.h"
+
+/* USER CODE BEGIN 0 */
+#include <stdio.h>
+#include <string.h>
+#include "TerminalSlave485.h"
+#include "KeySlave485.h"
+#include "CollectMaster485.h"
+#include "ScreenMaster485.h"
+
+
+
+volatile uint8_t usart1_rx_flag;
+volatile uint8_t usart2_rx_flag;
+volatile uint8_t usart3_rx_flag;
+volatile uint8_t usart4_rx_flag;
+uint16_t rx1_len;
+uint16_t rx2_len;
+uint16_t rx3_len;
+uint16_t rx3_len;
+uint16_t rx4_len;
+
+static uint8_t USART_RX_BUF_U1[Uart1_BUF_SIZE];   /*为UART专门开一个DMA接收存储区 2021-2-23 by Daiyf*/
+uint8_t USART_RX_BUF_U2[Uart2_BUF_SIZE];   /*为UART2、3专门开一个DMA接收存储区 2021-4-12 by Daiyf*///static
+static uint8_t USART_RX_BUF_U3[Uart3_BUF_SIZE];   
+
+uint8_t USART_RX_BUF[Uart1_BUF_SIZE];
+uint8_t USART_TX_BUF[Uart1_BUF_SIZE];
+uint8_t USART1_RX_BUF[Uart1_BUF_SIZE];
+uint8_t USART1_TX_BUF[Uart1_BUF_SIZE];
+uint8_t USART2_RX_BUF[Uart2_BUF_SIZE];
+uint8_t USART2_TX_BUF[Uart2_BUF_SIZE];
+uint8_t USART3_RX_BUF[Uart3_BUF_SIZE];
+uint8_t USART3_TX_BUF[Uart3_BUF_SIZE];
+uint8_t UART4_RX_BUF[BUF_SIZE];
+uint8_t UART4_TX_BUF[BUF_SIZE];
+/* USER CODE END 0 */
+
+UART_HandleTypeDef huart4;
+UART_HandleTypeDef huart1;
+UART_HandleTypeDef huart2;
+UART_HandleTypeDef huart3;
+//DMA_HandleTypeDef hdma_uart4_rx;
+DMA_HandleTypeDef hdma_usart1_rx;
+DMA_HandleTypeDef hdma_usart2_rx;
+DMA_HandleTypeDef hdma_usart3_rx;
+
+/* UART4 init function */
+void MX_UART4_Init(void)
+{
+
+  huart4.Instance = UART4;
+  huart4.Init.BaudRate = 9600;
+  huart4.Init.WordLength = UART_WORDLENGTH_8B;
+  huart4.Init.StopBits = UART_STOPBITS_1;
+  huart4.Init.Parity = UART_PARITY_NONE;
+  huart4.Init.Mode = UART_MODE_TX_RX;
+  huart4.Init.HwFlowCtl = UART_HWCONTROL_NONE;
+  huart4.Init.OverSampling = UART_OVERSAMPLING_16;
+  huart4.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
+  huart4.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
+  if (HAL_UART_Init(&huart4) != HAL_OK)
+  {
+    Error_Handler();
+  }
+	
+	
+	
+
+}
+/* USART1 init function */
+
+void MX_USART1_UART_Init(void)
+{
+
+  huart1.Instance = USART1;
+  huart1.Init.BaudRate = 9600; ////38400;//
+  huart1.Init.WordLength = UART_WORDLENGTH_8B;
+  huart1.Init.StopBits = UART_STOPBITS_1;
+  huart1.Init.Parity = UART_PARITY_NONE;
+  huart1.Init.Mode = UART_MODE_TX_RX;
+  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
+  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
+  huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
+  huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
+  if (HAL_UART_Init(&huart1) != HAL_OK)
+  {
+    Error_Handler();
+  }
+
+}
+/* USART2 init function */
+
+void MX_USART2_UART_Init(void)
+{
+
+  huart2.Instance = USART2;
+  huart2.Init.BaudRate = 38400;//19200;
+  huart2.Init.WordLength = UART_WORDLENGTH_8B;
+  huart2.Init.StopBits = UART_STOPBITS_1;
+  huart2.Init.Parity = UART_PARITY_NONE;
+  huart2.Init.Mode = UART_MODE_TX_RX;
+  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
+  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
+  huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
+  huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
+  if (HAL_UART_Init(&huart2) != HAL_OK)
+  {
+    Error_Handler();
+  }
+
+}
+/* USART3 init function */
+
+void MX_USART3_UART_Init(void)
+{
+
+  huart3.Instance = USART3;
+  huart3.Init.BaudRate = 19200;
+  huart3.Init.WordLength = UART_WORDLENGTH_8B;
+  huart3.Init.StopBits = UART_STOPBITS_1;
+  huart3.Init.Parity = UART_PARITY_NONE;
+  huart3.Init.Mode = UART_MODE_TX_RX;
+  huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
+  huart3.Init.OverSampling = UART_OVERSAMPLING_16;
+  huart3.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
+  huart3.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
+  if (HAL_UART_Init(&huart3) != HAL_OK)
+  {
+    Error_Handler();
+  }
+
+}
+
+void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
+{
+
+  GPIO_InitTypeDef GPIO_InitStruct = {0};
+  if(uartHandle->Instance==UART4)
+  {
+  /* USER CODE BEGIN UART4_MspInit 0 */
+
+  /* USER CODE END UART4_MspInit 0 */
+    /* UART4 clock enable */
+    __HAL_RCC_UART4_CLK_ENABLE();
+  
+    __HAL_RCC_GPIOC_CLK_ENABLE();
+    /**UART4 GPIO Configuration    
+    PC10     ------> UART4_TX
+    PC11     ------> UART4_RX 
+    */
+    GPIO_InitStruct.Pin = Key_TX_Pin|Key_RX_Pin;
+    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+    GPIO_InitStruct.Pull = GPIO_PULLUP;
+    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
+    GPIO_InitStruct.Alternate = GPIO_AF8_UART4;
+    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
+
+    /* UART4 DMA Init */
+    /* UART4_RX Init */
+		/*     //李伟修改于20210516
+    hdma_uart4_rx.Instance = DMA1_Stream2;
+    hdma_uart4_rx.Init.Channel = DMA_CHANNEL_4;
+    hdma_uart4_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
+    hdma_uart4_rx.Init.PeriphInc = DMA_PINC_DISABLE;
+    hdma_uart4_rx.Init.MemInc = DMA_MINC_ENABLE;
+    hdma_uart4_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
+    hdma_uart4_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
+    hdma_uart4_rx.Init.Mode = DMA_CIRCULAR;
+    hdma_uart4_rx.Init.Priority = DMA_PRIORITY_HIGH;
+    hdma_uart4_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
+    if (HAL_DMA_Init(&hdma_uart4_rx) != HAL_OK)
+    {
+      Error_Handler();
+    }
+
+    __HAL_LINKDMA(uartHandle,hdmarx,hdma_uart4_rx);
+		*/
+
+    /* UART4 interrupt Init */
+    HAL_NVIC_SetPriority(UART4_IRQn, 0, 4);
+    HAL_NVIC_EnableIRQ(UART4_IRQn);
+  /* USER CODE BEGIN UART4_MspInit 1 */
+
+  /* USER CODE END UART4_MspInit 1 */
+  }
+  else if(uartHandle->Instance==USART1)
+  {
+  /* USER CODE BEGIN USART1_MspInit 0 */
+
+  /* USER CODE END USART1_MspInit 0 */
+    /* USART1 clock enable */
+    __HAL_RCC_USART1_CLK_ENABLE();
+  
+    __HAL_RCC_GPIOA_CLK_ENABLE();
+    /**USART1 GPIO Configuration    
+    PA9     ------> USART1_TX
+    PA10     ------> USART1_RX 
+    */
+    GPIO_InitStruct.Pin = Terminal_TX_Pin|Terminal_RX_Pin;
+    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+    GPIO_InitStruct.Pull = GPIO_NOPULL;
+    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
+    GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
+    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+#if 0
+    /* USART1 DMA Init */
+    /* USART1_RX Init */
+    hdma_usart1_rx.Instance = DMA2_Stream2;
+    hdma_usart1_rx.Init.Channel = DMA_CHANNEL_4;
+    hdma_usart1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
+    hdma_usart1_rx.Init.PeriphInc = DMA_PINC_DISABLE;
+    hdma_usart1_rx.Init.MemInc = DMA_MINC_ENABLE;
+    hdma_usart1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
+    hdma_usart1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
+    hdma_usart1_rx.Init.Mode = DMA_CIRCULAR;
+    hdma_usart1_rx.Init.Priority = DMA_PRIORITY_VERY_HIGH;
+    hdma_usart1_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
+    if (HAL_DMA_Init(&hdma_usart1_rx) != HAL_OK)
+    {
+      Error_Handler();
+    }
+
+    __HAL_LINKDMA(uartHandle,hdmarx,hdma_usart1_rx);
+		
+//		__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);          //使能IDLE中断
+#endif    
+		/* USART1 interrupt Init */
+    HAL_NVIC_SetPriority(USART1_IRQn, 0, 2);
+    HAL_NVIC_EnableIRQ(USART1_IRQn);
+  /* USER CODE BEGIN USART1_MspInit 1 */
+
+  /* USER CODE END USART1_MspInit 1 */
+  }
+  else if(uartHandle->Instance==USART2)
+  {
+  /* USER CODE BEGIN USART2_MspInit 0 */
+
+  /* USER CODE END USART2_MspInit 0 */
+    /* USART2 clock enable */
+    __HAL_RCC_USART2_CLK_ENABLE();
+  
+    __HAL_RCC_GPIOA_CLK_ENABLE();
+    /**USART2 GPIO Configuration    
+    PA2     ------> USART2_TX
+    PA3     ------> USART2_RX 
+    */
+    GPIO_InitStruct.Pin = Collect_TX_Pin|Collect_RX_Pin;
+    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+    GPIO_InitStruct.Pull = GPIO_PULLUP;
+    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
+    GPIO_InitStruct.Alternate = GPIO_AF7_USART2;
+    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+#if 0
+    /* USART2 DMA Init */
+    /* USART2_RX Init */
+    hdma_usart2_rx.Instance = DMA1_Stream5;
+    hdma_usart2_rx.Init.Channel = DMA_CHANNEL_4;
+    hdma_usart2_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
+    hdma_usart2_rx.Init.PeriphInc = DMA_PINC_DISABLE;
+    hdma_usart2_rx.Init.MemInc = DMA_MINC_ENABLE;
+    hdma_usart2_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
+    hdma_usart2_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
+    hdma_usart2_rx.Init.Mode = DMA_CIRCULAR;
+    hdma_usart2_rx.Init.Priority = DMA_PRIORITY_MEDIUM;
+    hdma_usart2_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
+    if (HAL_DMA_Init(&hdma_usart2_rx) != HAL_OK)
+    {
+      Error_Handler();
+    }
+
+    __HAL_LINKDMA(uartHandle,hdmarx,hdma_usart2_rx);
+#endif
+    /* USART2 interrupt Init */
+    HAL_NVIC_SetPriority(USART2_IRQn, 0, 2);
+    HAL_NVIC_EnableIRQ(USART2_IRQn);
+  /* USER CODE BEGIN USART2_MspInit 1 */
+
+  /* USER CODE END USART2_MspInit 1 */
+  }
+  else if(uartHandle->Instance==USART3)
+  {
+  /* USER CODE BEGIN USART3_MspInit 0 */
+
+  /* USER CODE END USART3_MspInit 0 */
+    /* USART3 clock enable */
+    __HAL_RCC_USART3_CLK_ENABLE();
+  
+    __HAL_RCC_GPIOB_CLK_ENABLE();
+    /**USART3 GPIO Configuration    
+    PB10     ------> USART3_TX
+    PB11     ------> USART3_RX 
+    */
+    GPIO_InitStruct.Pin = Screen_TX_Pin|Screen_RX_Pin;
+    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+    GPIO_InitStruct.Pull = GPIO_PULLUP;
+    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
+    GPIO_InitStruct.Alternate = GPIO_AF7_USART3;
+    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+#if 0
+    /* USART3 DMA Init */
+    /* USART3_RX Init */
+    hdma_usart3_rx.Instance = DMA1_Stream1;
+    hdma_usart3_rx.Init.Channel = DMA_CHANNEL_4;
+    hdma_usart3_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
+    hdma_usart3_rx.Init.PeriphInc = DMA_PINC_DISABLE;
+    hdma_usart3_rx.Init.MemInc = DMA_MINC_ENABLE;
+    hdma_usart3_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
+    hdma_usart3_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
+    hdma_usart3_rx.Init.Mode = DMA_CIRCULAR;
+    hdma_usart3_rx.Init.Priority = DMA_PRIORITY_LOW;
+    hdma_usart3_rx.Init.FIFOMode = DMA_FIFOMODE_ENABLE;
+    hdma_usart3_rx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
+    hdma_usart3_rx.Init.MemBurst = DMA_MBURST_SINGLE;
+    hdma_usart3_rx.Init.PeriphBurst = DMA_PBURST_SINGLE;
+    if (HAL_DMA_Init(&hdma_usart3_rx) != HAL_OK)
+    {
+      Error_Handler();
+    }
+
+    __HAL_LINKDMA(uartHandle,hdmarx,hdma_usart3_rx);
+#endif
+    /* USART3 interrupt Init */
+    HAL_NVIC_SetPriority(USART3_IRQn, 0, 3);
+    HAL_NVIC_EnableIRQ(USART3_IRQn);
+  /* USER CODE BEGIN USART3_MspInit 1 */
+
+  /* USER CODE END USART3_MspInit 1 */
+  }
+}
+
+void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
+{
+
+  if(uartHandle->Instance==UART4)
+  {
+  /* USER CODE BEGIN UART4_MspDeInit 0 */
+
+  /* USER CODE END UART4_MspDeInit 0 */
+    /* Peripheral clock disable */
+    __HAL_RCC_UART4_CLK_DISABLE();
+  
+    /**UART4 GPIO Configuration    
+    PC10     ------> UART4_TX
+    PC11     ------> UART4_RX 
+    */
+    HAL_GPIO_DeInit(GPIOC, Key_TX_Pin|Key_RX_Pin);
+
+    /* UART4 DMA DeInit */
+    HAL_DMA_DeInit(uartHandle->hdmarx);
+
+    /* UART4 interrupt Deinit */
+    HAL_NVIC_DisableIRQ(UART4_IRQn);
+  /* USER CODE BEGIN UART4_MspDeInit 1 */
+
+  /* USER CODE END UART4_MspDeInit 1 */
+  }
+  else if(uartHandle->Instance==USART1)
+  {
+  /* USER CODE BEGIN USART1_MspDeInit 0 */
+
+  /* USER CODE END USART1_MspDeInit 0 */
+    /* Peripheral clock disable */
+    __HAL_RCC_USART1_CLK_DISABLE();
+  
+    /**USART1 GPIO Configuration    
+    PA9     ------> USART1_TX
+    PA10     ------> USART1_RX 
+    */
+    HAL_GPIO_DeInit(GPIOA, Terminal_TX_Pin|Terminal_RX_Pin);
+
+    /* USART1 DMA DeInit */
+    HAL_DMA_DeInit(uartHandle->hdmarx);
+
+    /* USART1 interrupt Deinit */
+    HAL_NVIC_DisableIRQ(USART1_IRQn);
+  /* USER CODE BEGIN USART1_MspDeInit 1 */
+
+  /* USER CODE END USART1_MspDeInit 1 */
+  }
+  else if(uartHandle->Instance==USART2)
+  {
+  /* USER CODE BEGIN USART2_MspDeInit 0 */
+
+  /* USER CODE END USART2_MspDeInit 0 */
+    /* Peripheral clock disable */
+    __HAL_RCC_USART2_CLK_DISABLE();
+  
+    /**USART2 GPIO Configuration    
+    PA2     ------> USART2_TX
+    PA3     ------> USART2_RX 
+    */
+    HAL_GPIO_DeInit(GPIOA, Collect_TX_Pin|Collect_RX_Pin);
+
+    /* USART2 DMA DeInit */
+    HAL_DMA_DeInit(uartHandle->hdmarx);
+
+    /* USART2 interrupt Deinit */
+    HAL_NVIC_DisableIRQ(USART2_IRQn);
+  /* USER CODE BEGIN USART2_MspDeInit 1 */
+
+  /* USER CODE END USART2_MspDeInit 1 */
+  }
+  else if(uartHandle->Instance==USART3)
+  {
+  /* USER CODE BEGIN USART3_MspDeInit 0 */
+
+  /* USER CODE END USART3_MspDeInit 0 */
+    /* Peripheral clock disable */
+    __HAL_RCC_USART3_CLK_DISABLE();
+  
+    /**USART3 GPIO Configuration    
+    PB10     ------> USART3_TX
+    PB11     ------> USART3_RX 
+    */
+    HAL_GPIO_DeInit(GPIOB, Screen_TX_Pin|Screen_RX_Pin);
+
+    /* USART3 DMA DeInit */
+    HAL_DMA_DeInit(uartHandle->hdmarx);
+
+    /* USART3 interrupt Deinit */
+    HAL_NVIC_DisableIRQ(USART3_IRQn);
+  /* USER CODE BEGIN USART3_MspDeInit 1 */
+
+  /* USER CODE END USART3_MspDeInit 1 */
+  }
+} 
+/* USER CODE BEGIN 1 */
+uint16_t ErrorLength;
+uint32_t iUart1,iUart2,iUart3,iUart4;//siUart_ALL = 0,
+void UsartReceive_IDLE(UART_HandleTypeDef *huart)
+{
+    
+    if((__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE) != RESET))
+    {
+        if(huart->Instance == USART1)
+        {
+            __HAL_UART_CLEAR_IDLEFLAG(huart);
+					//	i = huart->Instance->ISR; //清除状态寄存器SR,读取SR寄存器可以实现清除SR寄存器的功能  /*这三行不要。 2021-2-23 by Daiyf*/
+          //  i = huart->Instance->RDR; //读取数据寄存器中的数据
+          //  i = hdma_usart1_rx.Instance->NDTR;
+//						__HAL_UART_DISABLE_IT(&huart1, UART_IT_RXNE);
+            HAL_UART_DMAStop(huart);
+						iUart1 =  __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);// 获取DMA中未传输的数据个数 
+//						HAL_UART_Receive_DMA(&huart1, USART_RX_BUF,Uart1_BUF_SIZE);//重新打开DMA接收
+            /* 此处处理数据,主要是拷贝和置位标志位 */
+            memcpy(USART1_RX_BUF, USART_RX_BUF_U1, (Uart1_BUF_SIZE - iUart1));  /*为UART专门开一个DMA接收存储区 2021-2-23 by Daiyf*/
+            usart1_rx_flag = 1; 
+            rx1_len = Uart1_BUF_SIZE - iUart1;//-2;//实际接收到的有用数据,总计数减去未传输的数据个数,得到已经接收的数据个数(0x0D,0x0A)
+            /* 清空缓存,重新接收 */
+						ErrorLength=Uart1_BUF_SIZE;//DMA缺陷处理不定长数据时,连续数据太快导致长度异常,处理方法不用RTOS,或者不用DMA.
+//						printf("%d:%s\r\n",rx1_len,USART_RX_BUF);
+//						KeySlave485_Send_Data(USART_RX_BUF,rx1_len);
+//						SendChar4(rx1_len);
+            //memset(USART_RX_BUF_U1, 0x00, Uart1_BUF_SIZE);                                        /*这二行不要。 2021-2-23 by Daiyf*/
+						//__HAL_DMA_SET_COUNTER(&hdma_usart1_rx, 0); //清除DMA 计数
+
+						HAL_UART_Receive_DMA(&huart1, USART_RX_BUF_U1,Uart1_BUF_SIZE);//重新打开DMA接收
+						if((__HAL_UART_GET_FLAG(&huart1, UART_FLAG_ORE) != RESET))
+						{
+							iUart1 = huart->Instance->ISR; //清除状态寄存器SR,读取SR寄存器可以实现清除SR寄存器的功能
+							iUart1 = huart->Instance->RDR; //读取数据寄存器中的数据
+							iUart1 = hdma_usart1_rx.Instance->NDTR;
+							__HAL_UART_CLEAR_OREFLAG(&huart1);
+							HAL_DMA_DeInit(&hdma_usart1_rx);
+						}
+			}
+        else if(huart->Instance == USART2)
+        {
+            __HAL_UART_CLEAR_IDLEFLAG(huart);
+						HAL_UART_DMAStop(huart);
+						iUart2 = huart->Instance->ISR;
+            iUart2 = huart->Instance->RDR;
+            iUart2 =__HAL_DMA_GET_COUNTER(&hdma_usart2_rx);// 获取DMA中未传输的数据个数 
+					  iUart2 =hdma_usart2_rx.Instance->NDTR;
+					
+								
+						//memcpy(USART2_RX_BUF, USART_RX_BUF, rx2_len);
+						memcpy(USART2_RX_BUF, USART_RX_BUF_U2, Uart2_BUF_SIZE - iUart2);  //这里原来可能有点问题,改了一下与其他串口方式相同处理
+						__nop();
+						//memcpy(USART2_RX_BUF, USART_RX_BUF_U2, 64);
+						__nop();
+
+						usart2_rx_flag = 1;
+						rx2_len = Uart2_BUF_SIZE - iUart2;//实际接收到的有用数据
+						// memset(USART_RX_BUF_U2, 0x00, Uart2_BUF_SIZE);          /*这二行不要。 2021-4-12 by Daiyf*/
+
+					
+
+						HAL_UART_Receive_DMA(&huart2, USART_RX_BUF_U2,Uart2_BUF_SIZE); /*为UART2专门开一个DMA接收存储区 2021-4-12 by Daiyf*/
+            /* 此处处理数据,主要是拷贝和置位标志位 */
+			
+			
+
+        }
+        else if(huart->Instance == USART3)
+        {
+            __HAL_UART_CLEAR_IDLEFLAG(huart);
+					#if 1
+						HAL_UART_DMAStop(huart);
+						iUart3 =  __HAL_DMA_GET_COUNTER(&hdma_usart3_rx);// 获取DMA中未传输的数据个数 
+						memcpy(USART3_RX_BUF, USART_RX_BUF_U3, (Uart3_BUF_SIZE - iUart3));
+						usart3_rx_flag = 1; 
+						rx3_len = Uart3_BUF_SIZE - iUart3;
+						ErrorLength=Uart3_BUF_SIZE;
+						
+					  HAL_UART_Receive_DMA(&huart3, USART_RX_BUF_U3,Uart3_BUF_SIZE);//重新打开DMA接收
+						if((__HAL_UART_GET_FLAG(&huart3, UART_FLAG_ORE) != RESET))
+						{
+							iUart3 = huart->Instance->ISR; //清除状态寄存器SR,读取SR寄存器可以实现清除SR寄存器的功能
+							iUart3 = huart->Instance->RDR; //读取数据寄存器中的数据
+							iUart3 = hdma_usart3_rx.Instance->NDTR;
+							__HAL_UART_CLEAR_OREFLAG(&huart3);
+							HAL_DMA_DeInit(&hdma_usart3_rx);
+						}
+						
+					#else
+						i = huart->Instance->ISR;
+			            i = huart->Instance->RDR;
+			            i = hdma_usart3_rx.Instance->NDTR;
+			            HAL_UART_DMAStop(huart);
+									HAL_UART_Receive_DMA(&huart3, USART_RX_BUF_U3,Uart3_BUF_SIZE);  /*为UART3专门开一个DMA接收存储区 2021-4-12 by Daiyf*/
+     
+								 /* 此处处理数据,主要是拷贝和置位标志位 */
+			            memcpy(USART3_RX_BUF, USART_RX_BUF_U3, (Uart3_BUF_SIZE - i));
+			            usart3_rx_flag = 1;
+			            rx3_len = Uart3_BUF_SIZE - i;//实际接收到的有用数据
+					 #endif  
+
+					
+					
+					
+					
+					
+						DateDwin[0]=USART3_RX_BUF[7];//年月日
+						DateDwin[1]=USART3_RX_BUF[8];
+						DateDwin[2]=USART3_RX_BUF[9];
+						DateDwin[3]=USART3_RX_BUF[10];//星期
+						DateDwin[4]=USART3_RX_BUF[11];//时分秒
+						DateDwin[5]=USART3_RX_BUF[12];
+						DateDwin[6]=USART3_RX_BUF[13];
+					
+            memset(USART_RX_BUF, 0x00, BUF_SIZE);
+        }
+				
+				/*
+				else if(huart->Instance == UART4)
+        {
+            __HAL_UART_CLEAR_IDLEFLAG(huart);
+						i = huart->Instance->ISR;
+            i = huart->Instance->RDR;
+            i = hdma_uart4_rx.Instance->NDTR;
+            HAL_UART_DMAStop(huart);
+						HAL_UART_Receive_DMA(&huart4, USART_RX_BUF,BUF_SIZE);
+            //此处处理数据,主要是拷贝和置位标志位 //
+            memcpy(UART4_RX_BUF, USART_RX_BUF, (BUF_SIZE - i));
+            usart4_rx_flag = 1;
+            rx4_len = BUF_SIZE - i;//实际接收到的有用数据
+            memset(USART_RX_BUF, 0x00, BUF_SIZE);
+					
+						if((__HAL_UART_GET_FLAG(&huart4, UART_FLAG_ORE) != RESET))
+						{
+							i = huart->Instance->ISR; //清除状态寄存器SR,读取SR寄存器可以实现清除SR寄存器的功能
+							i = huart->Instance->RDR; //读取数据寄存器中的数据
+							i = hdma_uart4_rx.Instance->NDTR;
+							__HAL_UART_CLEAR_OREFLAG(&huart4);
+							HAL_DMA_DeInit(&hdma_uart4_rx);
+							HAL_UART_MspInit(&huart4);
+							HAL_UART_Receive_DMA(&huart4, USART_RX_BUF,BUF_SIZE);
+						}
+						
+        }
+				
+				*/
+    }
+//		HAL_DMA_DeInit(&hdma_usart1_rx);
+}
+void Uart_Mode_Init(void)
+{
+	//__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
+//	__HAL_UART_ENABLE_IT(&huart1, UART_IT_ORE);
+	__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);
+  //__HAL_UART_ENABLE_IT(&huart1, UART_IT_ERR);
+  
+	//__HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);
+	__HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE);
+	//__HAL_UART_ENABLE_IT(&huart3, UART_IT_IDLE);
+	__HAL_UART_ENABLE_IT(&huart3, UART_IT_RXNE);
+	__HAL_UART_ENABLE_IT(&huart4, UART_IT_IDLE);
+	__HAL_UART_ENABLE_IT(&huart4, UART_IT_RXNE);
+	KeySlave485_TX_Set(0);			//设置为接收模式	
+	TerminalSlave485_TX_Set(0);			//设置为接收模式
+	CollectMaster485_TX_Set(0);			//设置为接收模式	
+	ScreenMaster485_TX_Set(0);			//设置为接收模式
+}
+
+
+/*****************************************************************
+* 串口2发送函数KeySlave485_Send_Data(uint8_t *buf,uint8_t len)
+******************************************************************/
+void SendChar2 (uint8_t ch)
+{
+    HAL_UART_Transmit(&huart2, &ch, 1, 0xffff);
+}
+void SendChar4 (uint8_t ch)
+{
+		KeySlave485_TX_Set(1);
+		HAL_UART_Transmit(&huart4, &ch, 1, 1000);
+		KeySlave485_TX_Set(0);
+}
+/*****************************************************************
+* 串口发送数组函数
+******************************************************************/
+void UartWrite(UART_HandleTypeDef *uartHandle, uint8_t *buf , uint8_t len)
+{
+    uint8_t i;
+    for(i = 0; i < len; i++)
+    {
+        HAL_UART_Transmit(uartHandle, &buf[i], 1, 0xFFFF);
+    }
+}
+// 重定向函数1
+int fputc(int ch,FILE *f)
+{
+    uint8_t temp[1]={ch};
+    HAL_UART_Transmit(&huart4,temp,1,2);        //
+		return 0;
+}
+/* USER CODE END 1 */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/