zzw пре 1 година
комит
99e25df3a8
100 измењених фајлова са 206393 додато и 0 уклоњено
  1. BIN
      Document/1386基于涂鸦OTA升级.pdf
  2. BIN
      Document/DS-TM52eF1386_85_SV091.pdf
  3. BIN
      Document/OTA-FLASH.png
  4. BIN
      Document/PCBLayout.png
  5. BIN
      Document/TM52系列开发说明_Rev90.pdf
  6. BIN
      Document/TM52系列开发说明_Rev91.pdf
  7. BIN
      Document/protocol_rereby5a_20240301.pdf
  8. BIN
      Document/zigbee三位开关.pdf
  9. BIN
      Document/串口协议_涂鸦 IoT 开发平台_涂鸦 IoT 开发平台.pdf
  10. 43 0
      Document/人感智能面板正式样机功能定义_0223(1).txt
  11. BIN
      Document/小家电应用典型电路介绍_v01.pdf
  12. 118 0
      Drivers/TM52F1386_bsp.c
  13. 21 0
      Drivers/TM52F1386_bsp.h
  14. 107 0
      Drivers/TM52F1386_calc_bsp.c
  15. 23 0
      Drivers/TM52F1386_calc_bsp.h
  16. 990 0
      Drivers/TM52F1386_sfr_config.h
  17. 90 0
      Projects/OTA_boot/OTA指令从启动开始.txt
  18. BIN
      Projects/OTA_boot/TM52串口IAP方案V1.0(1).doc
  19. 51 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Listings/CRC.lst
  20. 281 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Listings/STARTUP_TENX52.lst
  21. 366 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Listings/iap.lst
  22. 1365 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Listings/main.ls1
  23. 550 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Listings/main.lst
  24. 378 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Listings/uart.lst
  25. 1328 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Listings/uboot.m51
  26. BIN
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/CRC.obj
  27. 2 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/ExtDll.iex
  28. BIN
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/STARTUP_TENX52.obj
  29. BIN
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/iap.obj
  30. 1032 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/main.SRC
  31. BIN
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/main.obj
  32. BIN
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/uart.obj
  33. BIN
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/uboot
  34. 17 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/uboot.ORC
  35. 44 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/uboot.build_log.htm
  36. 485 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/uboot.hex
  37. 9 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/uboot.lnp
  38. 0 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/uboot.log
  39. 4386 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/uboot.tenx
  40. 1 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/uboot.tenx.bin
  41. 32769 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/uboot.tenx.crc
  42. 6888 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/uboot.tenx.crc16_WriterVerify
  43. 64512 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/uboot.tenx.crc16verify
  44. 32801 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/uboot.tenx.crc2
  45. 39 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/uboot_.tin
  46. 2 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/uboot_.tin.bak
  47. 58 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/uboot_CFG.xml
  48. 6 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/uboot_CFGWText.txt
  49. 0 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/uboot_Driver.log
  50. 3 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/uboot_bin.bin
  51. 223 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/STARTUP_TENX52.A51
  52. BIN
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/_MakeTenx_uboot/01.bmp
  53. BIN
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/_MakeTenx_uboot/CallKeilDll.exe
  54. 57 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/_MakeTenx_uboot/CallKeilDll.tic
  55. 9 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/_MakeTenx_uboot/CallKeilDll.xml
  56. 1 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/_MakeTenx_uboot/run.bat
  57. 27 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/src/CRC.c
  58. 7 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/src/CRC.h
  59. 332 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/src/iap.c
  60. 49 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/src/iap.h
  61. 501 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/src/main.c
  62. 17 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/src/main.h
  63. 341 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/src/uart.c
  64. 26 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/src/uart.h
  65. 2626 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/uboot.uvgui.16951
  66. 2680 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/uboot.uvgui.BCXX
  67. 2635 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/uboot.uvgui.CHENSIR
  68. 3645 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/uboot.uvgui.dl.zhou
  69. 3591 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/uboot.uvgui.zdl
  70. 2626 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/uboot.uvgui_16951.bak
  71. 2680 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/uboot.uvgui_BCXX.bak
  72. 2635 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/uboot.uvgui_CHENSIR.bak
  73. 272 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/uboot.uvopt
  74. 401 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/uboot.uvproj
  75. 289 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/uboot_uvopt.bak
  76. 401 0
      Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/uboot_uvproj.bak
  77. BIN
      Projects/OTA_boot/project - uboot_v1.1_0328.zip
  78. BIN
      Projects/OTA_boot/project - uboot_v1.1_20240327.zip
  79. 22 0
      Projects/OTA_boot/版本说明.txt
  80. BIN
      Projects/TM52串口IAP方案V1.0.doc
  81. BIN
      Projects/macro/switch_ota_V1.0_20240319_完整样机版本.zip
  82. 196 0
      Projects/macro/switch_ota_V1.0_P30P31/EEPROM.c
  83. 29 0
      Projects/macro/switch_ota_V1.0_P30P31/EEPROM.h
  84. 154 0
      Projects/macro/switch_ota_V1.0_P30P31/GLOBAL.c
  85. 169 0
      Projects/macro/switch_ota_V1.0_P30P31/GLOBAL.h
  86. 243 0
      Projects/macro/switch_ota_V1.0_P30P31/Listings/EEPROM.lst
  87. 182 0
      Projects/macro/switch_ota_V1.0_P30P31/Listings/GLOBAL.lst
  88. 4851 0
      Projects/macro/switch_ota_V1.0_P30P31/Listings/HSW_1KEY.m51
  89. 5239 0
      Projects/macro/switch_ota_V1.0_P30P31/Listings/HSW_2KEY.m51
  90. 4851 0
      Projects/macro/switch_ota_V1.0_P30P31/Listings/HSW_3KEY.m51
  91. 5239 0
      Projects/macro/switch_ota_V1.0_P30P31/Listings/HSW_6KEY.m51
  92. 281 0
      Projects/macro/switch_ota_V1.0_P30P31/Listings/STARTUP_TENX52.lst
  93. 156 0
      Projects/macro/switch_ota_V1.0_P30P31/Listings/TM52F1386_bsp.lst
  94. 1233 0
      Projects/macro/switch_ota_V1.0_P30P31/Listings/gpio_ctrl.lst
  95. 1062 0
      Projects/macro/switch_ota_V1.0_P30P31/Listings/main.lst
  96. 4851 0
      Projects/macro/switch_ota_V1.0_P30P31/Listings/main.m51
  97. 650 0
      Projects/macro/switch_ota_V1.0_P30P31/Listings/mcu_api.lst
  98. 2087 0
      Projects/macro/switch_ota_V1.0_P30P31/Listings/protocol.lst
  99. 62 0
      Projects/macro/switch_ota_V1.0_P30P31/Listings/sTimeout.lst
  100. 0 0
      Projects/macro/switch_ota_V1.0_P30P31/Listings/system.lst

BIN
Document/1386基于涂鸦OTA升级.pdf


BIN
Document/DS-TM52eF1386_85_SV091.pdf


BIN
Document/OTA-FLASH.png


BIN
Document/PCBLayout.png


BIN
Document/TM52系列开发说明_Rev90.pdf


BIN
Document/TM52系列开发说明_Rev91.pdf


BIN
Document/protocol_rereby5a_20240301.pdf


BIN
Document/zigbee三位开关.pdf


BIN
Document/串口协议_涂鸦 IoT 开发平台_涂鸦 IoT 开发平台.pdf


+ 43 - 0
Document/人感智能面板正式样机功能定义_0223(1).txt

@@ -0,0 +1,43 @@
+
+1、app上删除设备后不会自动进入配网模式
+答:工程样机模式未开启自动入网闪烁,下版软件开启。-OK,自动发送入网指令,快速闪烁180秒
+
+
+2、配网方式与脱网报警
+->未连接网关,长按5秒触发入网启动(1Hz闪烁,占空比50%),10秒内短按确认触发入网(8Hz闪烁,周期125ms,占空比50%),倒计时180S退出入网(或者配网阶段长按5秒也可退出配网);
+       
+->已连接网关,按照重新入网的模式做(涂鸦APP本身因已二次入网未更新ID,导致不能控制忽略,可在APP删除再添加解决该问题)
+
+
+->脱网报警,慢闪60S,3S闪烁(占空比50%);
+新增,未联网状态下操作设备开关,指示灯闪三下,2Hz,50%
+
+3、雷达开启时,开启或关闭继电器,闪烁3下,2Hz,50%
+-> 3挡调节,通过APP设置
+
+
+4、倒计时、循环定时 --APP做云端定时
+
+5、点动开关 --APP设置,本地支持倒计时通断
+
+
+
+
+
+更换芯片型号:TM52-eF1385,DIP28引脚
+28SOP价格1.8RMB,32LQFP价格1.9RMB,44LQFP价格2.0RMB 
+考虑六键开关PWM控制,选择44LQFP封装芯片
+
+
+
+涂鸦免开发的设置方式:
+1、首次入网
+组合配网方式: 仅第一路开关按键用于配网,长按3秒,网络指示灯闪烁3次后等待2~6秒,再长按3秒,进入配网模式,长按配网3min超时有防误删
+2、复位方式
+所有开关按键均可触发配网 (组合配网方式除外),复位长按秒数:5秒
+3、指示灯状态
+适用于继电器指示灯
+指示开关:开关开则指示灯亮,开关关则指示灯灭
+指示位置:开关开则指示灯灭,开关关则指示灯亮
+
+

BIN
Document/小家电应用典型电路介绍_v01.pdf


+ 118 - 0
Drivers/TM52F1386_bsp.c

@@ -0,0 +1,118 @@
+#include <REGtenxTM52F1386.h>
+#include <intrins.h>
+#include "TM52F1386_bsp.h"
+
+/**********************************************************************************************************
+**函数名称  bsp_clock_init()
+**函数描述 :设置内部FRC/2为系统时钟
+**输    入 :无
+**输    出 :无
+**说    明 :快时钟系统主频为 18.432/2M   默认二分频
+**********************************************************************************************************/
+void bsp_clock_init()	     
+{
+	SELFCK = 0;	         //切换到慢时钟
+		
+	CLKCON = 0x02;       //时钟二分频
+//	CLKCON = 0x03;       //时钟一分频
+	
+	STPPCK = 0;			 //开启部分模块使用快时钟
+	STPFCK = 0;			 //开启快时钟
+	SELFCK = 1;			 //切换到快时钟
+}
+
+/**********************************************************************************************************
+**函数名称  bsp_FXT_clock_init()
+**函数描述 :设置FXT外部快速晶体振荡器/2为系统时钟
+**输    入 :无
+**输    出 :无
+**说    明 :注意 P20 P21需要配置为接外部快速晶振
+**********************************************************************************************************/
+void bsp_FXT_clock_init()	     
+{
+	SELFCK = 0;	         //切换到慢时钟
+
+	CLKCON = 0x02;       //时钟二分频
+//	CLKCON = 0x03;       //时钟一分频
+
+	FCKTYPE = 1;     //FXT
+	STPPCK = 0;			 //开启快时钟
+	STPFCK = 0;			 //开启部分模块使用快时钟
+	//延时2ms等待晶体振荡器稳定
+	bsp_delay_ms(2);
+	SELFCK = 1;			 //切换到快时钟
+}
+
+/**********************************************************************************************************
+**函数名称  bsp_SXT_clock_init()
+**函数描述 :设置SXT外部慢速晶体振荡器/2为系统时钟
+**输    入 :无
+**输    出 :无
+**说    明 :注意 P20 P21需要配置为接外部快速晶振
+**********************************************************************************************************/
+void bsp_SXT_clock_init()	     
+{
+	SELFCK = 0;	     //切换到慢时钟
+	
+	CLKCON = 0x02;   //时钟二分频 
+//	CLKCON = 0x03;       //时钟一分频
+	STPPCK = 0;			 //开启快时钟
+	STPFCK = 0;			 //开启部分模块使用快时钟
+	SELFCK = 1;			 //切换到快时钟
+  SCKTYPE = 1;     //SXT
+	SELFCK = 0;	     //切换到慢时钟
+}
+
+/**********************************************************************************************************
+**函数名称  bsp_delay_100us()
+**函数描述 :100us单位延时函数
+**输    入 :
+**输    出 :无
+**说    明 :基于内部时钟二分频计算,非精确延时 
+**********************************************************************************************************/
+void bsp_delay_100us(unsigned int cnt)   //该函数不是精确延时,根据内部时钟FRC二分频计算得来的
+{
+	unsigned int i;
+	unsigned char delay_cnt;
+	for(i = 0;i<cnt;i++)
+	{
+		delay_cnt = 23;
+		while(delay_cnt--)
+		{
+			delay_10nop();
+		}
+	}
+}
+
+/**********************************************************************************************************
+**函数名称  bsp_delay_100us()
+**函数描述 :100us单位延时函数
+**输    入 :
+**输    出 :无
+**说    明 :基于内部时钟二分频计算,非精确延时 
+**********************************************************************************************************/
+void bsp_delay_ms(unsigned int ms)      //该函数不是精确延时,根据内部时钟FRC二分频计算得来的
+{
+	unsigned int i;
+	unsigned char delay_cnt;
+	for(i = 0;i<ms;i++)
+	{
+		delay_cnt =95;
+		while(delay_cnt--)
+		{
+			delay_10nop();
+			delay_10nop();
+			delay_10nop();
+			delay_10nop();
+		}
+	}
+}
+
+
+
+
+
+
+
+
+

+ 21 - 0
Drivers/TM52F1386_bsp.h

@@ -0,0 +1,21 @@
+#ifndef __TM52F1386_BSP_H__
+#define __TM52F1386_BSP_H__
+
+#include "TM52F1386_sfr_config.h"
+
+#define delay_10nop() \
+	do{												\
+		_nop_();_nop_();_nop_();_nop_();_nop_();	 \
+		_nop_();_nop_();_nop_();_nop_();_nop_();	\
+	}while(0)
+
+	
+/* 系统时钟使用快时钟,频率为2分频 8.294M  */
+void bsp_clock_init();
+void bsp_FXT_clock_init();
+void bsp_SXT_clock_init();
+void bsp_SXT_clock_init();	     
+void bsp_delay_ms(unsigned int ms);
+void bsp_delay_100us(unsigned int cnt);	
+	
+#endif

+ 107 - 0
Drivers/TM52F1386_calc_bsp.c

@@ -0,0 +1,107 @@
+#include <REGtenxTM52F1386.h>
+#include <intrins.h>
+#include "TM52F1386_calc_bsp.h"
+
+
+/* 中间值定义成全局变量,不用定义局部变量节省时间 
+ * 使用时,该函数是不可重载函数,需要特别注意不能在中断和主函数中同时使用
+ * 建议使用该函数前关闭中断 
+ */
+calc_mid_t clac_mid;
+unsigned char mid_1,mid_2;
+
+/* 16bit无符号数  乘以 16bit 无符号数
+ * 返回结果为32bit 无符号数
+ */
+ /******************************************************************************************
+** 函数名称: mul_32
+** 函数描述: 乘法模式   
+** 输入参数: 无
+** 输出参数: 无 
+*******************************************************************************************/
+unsigned long mul_32(unsigned int a,unsigned int b)
+{
+	clac_mid.us16[0] = a;			   
+	mid_1 = clac_mid.us8[1];	  
+	EXA = clac_mid.us8[0];
+	clac_mid.us16[0] = b;			   
+	mid_2 = clac_mid.us8[1];	  
+	EXB = clac_mid.us8[0];
+	AUX2 = (AUX2&0xf6)|0x1;
+
+	clac_mid.tt.us12 = mid_1*mid_2;
+	clac_mid.tt.us3 = EXA;
+	clac_mid.tt.us0 = EXB;
+	AUX2 = (AUX2&0xf6);
+	return clac_mid.us32;
+}
+ /******************************************************************************************
+** 函数名称: div_32
+** 函数描述: 除法模式   
+** 输入参数: 无
+** 输出参数: 无   
+*******************************************************************************************/
+unsigned long div_32(unsigned long a,unsigned int b)
+{
+//	calc_mid_t clac_mid;
+//	unsigned char mid_1,mid_2;
+
+	clac_mid.us32 = a;		   
+ 	mid_1 = clac_mid.us8[3];		   
+	EXA = clac_mid.us8[2];		   		   
+	EXA2 = clac_mid.us8[1];		   	   
+	EXA3 = clac_mid.us8[0];		   	
+	clac_mid.us16[0] = b;	   			   
+	mid_2 = clac_mid.us8[1];		   	  
+	EXB = clac_mid.us8[0];		   
+	AUX2 = (AUX2&0xf6)|0x9;	
+		   			   
+	clac_mid.us8[0] = mid_1/mid_2;
+  
+	clac_mid.us8[1] = EXA;		   
+	clac_mid.us8[2] = EXA2;		   
+	clac_mid.us8[3] = EXA3;		   		   
+	AUX2 = (AUX2&0xf6);	
+	return clac_mid.us32;		   
+}
+/******************************************************************************************
+** 函数名称: mod_32
+** 函数描述: mod模式   
+** 输入参数: 无
+** 输出参数: 无 
+*******************************************************************************************/
+unsigned int mod_32(unsigned long a,unsigned int b)
+{
+	clac_mid.us32 = a;		   
+ 	mid_1 = clac_mid.us8[3];		   
+	EXA = clac_mid.us8[2];		   		   
+	EXA2 = clac_mid.us8[1];		   	   
+	EXA3 = clac_mid.us8[0];		   	
+	clac_mid.us16[0] = b;	   			   
+	mid_2 = clac_mid.us8[1];		   	  
+	EXB = clac_mid.us8[0];		   
+	AUX2 = (AUX2&0xf6)|0x9;	
+		   			   
+	clac_mid.us8[0] = mid_1%mid_2;  
+	clac_mid.us8[1] = EXB;		   
+//	clac_mid.us8[2] = EXA2;		   
+//	clac_mid.us8[3] = EXA3;		   		   
+	AUX2 = (AUX2&0xf6);	
+	return clac_mid.us16[0];		   
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 23 - 0
Drivers/TM52F1386_calc_bsp.h

@@ -0,0 +1,23 @@
+#ifndef __TM52F1386_CALC_BSP_H__
+#define __TM52F1386_CALC_BSP_H__
+
+
+typedef union
+{
+	unsigned long int us32;
+	unsigned int us16[2];
+	unsigned char us8[4];
+	struct{
+		unsigned char us0;
+		unsigned int us12;
+		unsigned char us3;
+	}tt;
+}calc_mid_t;
+
+
+unsigned long mul_32(unsigned int a,unsigned int b);
+//unsigned int div_16(unsigned int a, unsigned int b);
+unsigned long div_32(unsigned long a,unsigned int b);
+unsigned int mod_32(unsigned long a,unsigned int b);
+
+#endif

+ 990 - 0
Drivers/TM52F1386_sfr_config.h

@@ -0,0 +1,990 @@
+#ifndef __TM52F1386_SFR_CONFIG_H__
+#define __TM52F1386_SFR_CONFIG_H__
+
+
+#define P0_MASK				       (0xff)
+
+
+/*--------INTPORT---------------*/
+#define INTPORT_MASK			   (0xff)
+#define INTPORT_P0IF_MASK  		   (0x01)    
+#define INTPORT_P0IF_POS		   (0)
+#define INTPORT_P1IF_MASK  		   (0x02)    
+#define INTPORT_P1IF_POS		   (1)
+#define INTPORT_P2IF_MASK  		   (0x04)    
+#define INTPORT_P2IF_POS		   (2)
+#define INTPORT_P3IF_MASK  		   (0x08)    
+#define INTPORT_P3IF_POS	       (3)
+#define INTPORT_P4IF_MASK  		   (0x10)    
+#define INTPORT_P4IF_POS	       (4)
+#define INTPORT_P5IF_MASK  		   (0x20)    
+#define INTPORT_P5IF_POS	       (5)
+
+/*--------INTPWM---------------*/
+#define INTPWM_MASK                (0XFF)
+#define INTPWM_PWM0IF_MASK         (0X01)
+#define INTPWM_PWM0IF_POS          (0)
+#define INTPWM_PWM1IF_MASK         (0X02)
+#define INTPWM_PWM1IF_POS          (1)
+#define INTPWM_PWM2IF_MASK         (0X04)
+#define INTPWM_PWM2IF_POS          (2)
+#define INTPWM_PWM3IF_MASK         (0X08)
+#define INTPWM_PWM3IF_POS          (3)
+
+/*-------PCON*******/
+#define PCON_MASK                  (0XFF)
+
+#define PCON_IDL_MASK              (0X01)
+#define PCON_IDL_POS	           (0)
+#define PCON_PD_MASK               (0X02)
+#define PCON_PD_POS                (1)
+#define PCON_GF0_MASK		       (0x04)
+#define PCON_GF0_POS		       (2)
+#define PCON_GF1_MASK		       (0x08)
+#define PCON_GF1_POS		       (3)
+#define PCON_SMOD_MASK             (0x80)
+#define PCON_SMOD_POS		       (7)
+
+/*--------TCON---------------*/
+#define TCON_MASK			       (0xff)
+#define TCON_IT0_MASK		       (0x01)
+#define TCON_IT0_POS			   (0)
+#define TCON_IE0_MASK			   (0x02)
+#define TCON_IE0_POS			   (1)
+#define TCON_IT1_MASK			   (0x04)
+#define TCON_IT1_POS			   (2)
+#define TCON_IE1_MASK			   (0x08)
+#define TCON_IE1_POS			   (3)
+#define TCON_TR0_MASK			   (0x10)
+#define TCON_TR0_POS			   (4)
+#define TCON_TF0_MASK			   (0x20)
+#define TCON_TF0_POS			   (5)
+#define TCON_TR1_MASK			   (0x40)
+#define TCON_TR1_POS			   (6)
+#define TCON_TF1_MASK			   (0x80)
+#define TCON_TF1_POS		       (7)
+
+/*--------TMOD---------------*/
+#define TMOD_MASK				   (0xff)
+#define TMOD_TMOD0_MASK		       (0x03)
+#define TMOD_TMOD0_POS			   (0)
+#define TMOD_CT0N_MASK		       (0x04)
+#define TMOD_CT0N_POS			   (2)
+#define TMOD_GATE0_MASK			   (0x08)
+#define TMOD_GATE0_POS			   (3)
+#define TMOD_TMOD1_MASK			   (0x30)
+#define TMOD_TMOD1_POS			   (4)
+#define TMOD_CT1N_MASK			   (0x40)
+#define TMOD_CT1N_POS			   (6)
+#define TMOD_GATE1_MASK			   (0x80)
+#define TMOD_GATE1_POS			   (7)
+
+//TL0
+#define TL0_MASK			       (0xff)
+#define TL0_TL0_MASK		       (0xff)
+#define TL0_TL0_POS				   (0)
+
+#define TL1_MASK				   (0xff)
+#define TL1_TL1_MASK			   (0xff)
+#define TL1_TL1_POS				   (0)
+
+#define TH0_MASK				   (0xff)
+#define TH0_TH0_MASK			   (0xff)
+#define TH0_TH0_POS				   (0)
+
+#define TH1_MASK				   (0xff)
+#define TH1_TH1_MASK			   (0xff)
+#define TH1_TH1_POS				   (0)
+
+/*--------SCON2---------------*/
+#define SCON2_MASK				   (0xff)
+#define SCON2_RI2_MASK			   (0x01)
+#define SCON2_RI2_POS			   (0)
+#define SCON2_TI2_MASK			   (0x02)
+#define SCON2_TI2_POS			   (1)
+#define SCON2_RB82_MASK			   (0x04)
+#define SCON2_RB82_POS			   (2)
+#define SCON2_TB82_MASK			   (0x08)
+#define SCON2_TB82_POS			   (3)
+#define SCON2_REN2_MASK			   (0x10)
+#define SCON2_REN2_POS			   (4)
+#define SCON2_SM2S_MASK			   (0x80)
+#define SCON2_SM2S_POS			   (7)
+
+/*--------SBUF2---------------*/
+#define SBUF2_MASK				   (0xff)
+#define SBUF2_SBUF2_MASK		   (0xff)
+#define SBUF2_SBUF2_POS			   (0)
+
+
+/*--------OPTION--------------*/
+#define OPTION_MASK				   (0xff)
+#define OPTION_TM3PSC_MASK		   (0X03)
+#define OPTION_TM3PSC_POS		   (0)
+#define OPTION_ADCKS_MASK	       (0x0C)
+#define OPTION_ADCKS_POS		   (2)
+#define OPTION_WDTPSC_MASK         (0X30)
+#define OPTION_WDTPSC_POS          (4)
+#define OPTION_TM3CKS_MASK         (0XC0)
+#define OPTION_TM3CKS_POS          (6)
+
+/*--------INTFLG--------------*/
+#define INTFLG_MASK				   (0xff)
+#define INTFLG_TF3_MASK			   (0x01)
+#define INTFLG_TF3_POS			   (0)
+#define INTFLG_PCIF_MASK		   (0x02)
+#define INTFLG_PCIF_POS			   (1)
+#define INTFLG_ADIF_MASK		   (0x10)
+#define INTFLG_ADIF_POS			   (4)
+#define INTFLG_TKIFA_MASK		   (0x20)
+#define INTFLG_TKIFA_POS		   (5)
+#define INTFLG_LVDIF_MASK		   (0x80)
+#define INTFLG_LVDIF_POS		   (7)
+
+
+/*--------INTFLN--------------*/
+#define INTPIN_MASK				   (0xff)
+#define INTPIN_PIN0IF_MASK		   (0x01)
+#define INTPIN_PIN0IF_POS		   (0)
+#define INTPIN_PIN1IF_MASK		   (0x02)
+#define INTPIN_PIN1IF_POS		   (1)
+#define INTPIN_PIN2IF_MASK		   (0x04)
+#define INTPIN_PIN2IF_POS		   (2)
+#define INTPIN_PIN3IF_MASK		   (0x08)
+#define INTPIN_PIN3IF_POS		   (3)
+#define INTPIN_PIN4IF_MASK		   (0x10)
+#define INTPIN_PIN4IF_POS		   (4)
+#define INTPIN_PIN5IF_MASK		   (0x20)
+#define INTPIN_PIN5IF_POS		   (5)
+#define INTPIN_PIN6IF_MASK		   (0x40)
+#define INTPIN_PIN6IF_POS		   (6)
+#define INTPIN_PIN7IF_MASK		   (0x80)
+#define INTPIN_PIN7IF_POS		   (7)
+
+
+/*--------SWCMD---------------*/
+#define SWCMD_MASK				   (0xff)
+#define SWCMD_IAPEN_MASK		   (0x01)
+#define SWCMD_IAPEN_POS			   (0)
+#define SWCMD_WDTO_MASK		       (0x02)
+#define SWCMD_WDTO_POS			   (1)
+#define SWCMD_IAPEN_MASK		   (0x01)
+#define SWCMD_IAPEN_POS			   (0)
+#define SWCMD_SWRST_MASK		   (0x01)
+#define SWCMD_SWRST_POS			   (0)
+
+
+/*--------SCON---------------*/
+#define SCON_MASK				   (0xff)
+#define SCON_RI_MASK			   (0x01)
+#define SCON_RI_POS			       (0)
+#define SCON_TI_MASK			   (0x02)
+#define SCON_TI_POS			       (1)
+#define SCON_RB8_MASK			   (0x04)
+#define SCON_RB8_POS		       (2)
+#define SCON_TB8_MASK			   (0x08)
+#define SCON_TB8_POS		       (3)
+#define SCON_REN_MASK			   (0x10)
+#define SCON_REN_POS		       (4)
+#define SCON_SM2_MASK			   (0x20)
+#define SCON_SM2_POS		       (5)
+#define SCON_SM1_MASK              (0X40)
+#define SCON_SM1_POS               (6)
+#define SCON_SM0_MASK              (0X80)
+#define SCON_SM0_POS               (7)
+
+/*--------SCON1---------------*/
+#define SCON1_MASK				   (0xff)
+#define SCON1_RI1_MASK			   (0x01)
+#define SCON1_RI1_POS			       (0)
+#define SCON1_TI1_MASK			   (0x02)
+#define SCON1_TI1_POS			       (1)
+#define SCON1_RB81_MASK			   (0x04)
+#define SCON1_RB81_POS		       (2)
+#define SCON1_TB81_MASK			   (0x08)
+#define SCON1_TB81_POS		       (3)
+#define SCON1_REN1_MASK			   (0x10)
+#define SCON1_REN1_POS		       (4)
+#define SCON1_SM1S_MASK			   (0x80)
+#define SCON1_SM1S_POS		       (7)
+
+/*--------SBUF1---------------*/
+#define SBUF_MASK				   (0xff)
+#define SBUF_SBUF_MASK			   (0xff)
+#define SBUF_SBUF_POS			   (0)
+
+/*--------TKCON3---------------*/
+#define TKCON3_MASK				   (0xff)
+#define TKCON3_SPREAD_MASK			   (0x01)
+#define TKCON3_SPREAD_POS			   (0)
+#define TKCON3_JMPVALB_MASK			   (0x0E)
+#define TKCON3_JMPVALB_POS			   (1)
+#define TKCON3_TKXCAPB_MASK			   (0x10)
+#define TKCON3_TKXCAPB_POS			   (4)
+#define TKCON3_TKIFB_MASK			   (0x20)
+#define TKCON3_TKIFB_POS			   (5)
+#define TKCON3_TKEOCB_MASK			   (0x30)
+#define TKCON3_TKEOCB_POS			   (6)
+#define TKCON3_TKPDB_MASK			   (0x40)
+#define TKCON3_TKPDB_POS			   (7)
+
+/*--------PWM2CON---------------*/
+#define PWMCON2_MASK 			   (0XFF)
+#define PWMCON2_PWM2DZ_MASK  	   (0X3F)
+#define PWMCON2_PWM2DZ_POS   	   (0)
+#define PWMCON2_PWM2OM_MASK        (0XC0)
+#define PWMCON2_PWM2OM_POS         (6)
+
+/*--------PWMIDX---------------*/
+#define PWMIDX_MASK 			   (0XFF)
+#define PWMIDX_PWMIDX_MASK  	   (0XFF)
+#define PWMIDX_PWMIDX_POS   	   (0)
+
+/*--------PWMEN--------------*/
+#define PWMEN_MASK				   (0xff)
+#define PWMEN_PWM0EN_MASK		   (0x01)
+#define PWMEN_PWM0EN_POS		   (0)
+#define PWMEN_PWM1EN_MASK		   (0x02)
+#define PWMEN_PWM1EN_POS		   (1)
+#define PWMEN_PWM2EN_MASK		   (0x04)
+#define PWMEN_PWM2EN_POS		   (2)
+#define PWMEN_PWM3EN_MASK		   (0x08)
+#define PWMEN_PWM3EN_POS		   (3)
+#define PWMEN_PWM0IE_MASK		   (0x10)
+#define PWMEN_PWM0IE_POS		   (4)
+#define PWMEN_PWM1IE_MASK		   (0x20)
+#define PWMEN_PWM1IE_POS		   (5)
+#define PWMEN_PWM2IE_MASK		   (0x40)
+#define PWMEN_PWM2IE_POS		   (6)
+#define PWMEN_PWM3IE_MASK		   (0x80)
+#define PWMEN_PWM3IE_POS		   (7)
+
+
+/*--------PWMCON---------------*/
+#define PWMCON_MASK 			   (0XFF)
+#define PWMCON_PWM0CKS_MASK  	   (0X03)
+#define PWMCON_PWM0CKS_POS   	   (0)
+#define PWMCON_PWM1CKS_MASK        (0X0C)
+#define PWMCON_PWM1CKS_POS         (2)
+#define PWMCON_PWM2CKS_MASK        (0X30)
+#define	PWMCON_PWM2CKS_POS         (4)
+#define PWMCON_PWM3CKS_MASK        (0XC0)
+#define	PWMCON_PWM3CKS_POS         (6)
+
+/*--------PINMOD10---------------*/
+#define PINMOD10_MASK 		       (0XFF)
+#define PINMOD10_PINMOD0_MASK  	   (0X0F)
+#define PINMOD10_PINMOD0_POS   	   (0)
+#define PINMOD10_PINMOD1_MASK      (0XF0)
+#define PINMOD10_PINMOD1_POS       (4)
+
+
+/*--------PINMOD32---------------*/
+#define PINMOD32_MASK 			   (0XFF)
+#define PINMOD32_PINMOD2_MASK  	   (0X0F)
+#define PINMOD32_PINMOD2_POS   	   (0)
+#define PINMOD32_PINMOD3_MASK      (0XF0)
+#define PINMOD32_PINMOD3_POS       (4)
+
+
+/*--------PINMOD54---------------*/
+#define PINMOD54_MASK 			   (0XFF)
+#define PINMOD54_PINMOD4_MASK  	   (0X0F)
+#define PINMOD54_PINMOD4_POS   	   (0)
+#define PINMOD54_PINMOD5_MASK      (0XF0)
+#define PINMOD54_PINMOD5_POS       (4)
+
+
+/*--------PINMOD76---------------*/
+#define PINMOD76_MASK 			   (0XFF)
+#define PINMOD76_PINMOD6_MASK  	   (0X0F)
+#define PINMOD76_PINMOD6_POS   	   (0)
+#define PINMOD76_PINMOD7_MASK      (0XF0)
+#define PINMOD76_PINMOD7_POS       (4)
+
+/*--------PINMODE---------------*/
+#define PINMODE_MASK 			   (0XFF)
+#define PINMODE_UART0PS_MASK  	   (0X03)
+#define PINMODE_UART0PS_POS   	   (0)
+#define PINMODE_I2CPS_MASK        (0X0C)
+#define PINMODE_I2CPS_POS         (2)
+#define PINMODE_PSEUDOEN_MASK          (0X10)
+#define PINMODE_PSEUDOEN_POS           (4)
+#define PINMODE_UART1PS_MASK        (0X20)
+#define PINMODE_UART1PS_POS         (5)
+#define PINMODE_VBGEN_MASK        (0X80)
+#define PINMODE_VBGEN_POS         (7)
+
+/*--------TKCHSA---------------*/
+#define TKCHSA_MASK				   (0x1F)
+#define TKCHSA_TKCHSA_MASK			   (0x1f)
+#define TKCHSA_TKCHSA_POS			   (0)
+
+/*--------IE---------------*/
+#define IE_MASK					   (0xff)
+#define IE_EX0_MASK  		       (0x01)    
+#define IE_EX0_POS			       (0)
+#define IE_ET0_MASK  		       (0x02)    
+#define IE_ET0_POS			       (1)
+#define IE_EX1_MASK  		       (0x04)    
+#define IE_EX1_POS			       (2)
+#define IE_ET1_MASK  		       (0x08)    
+#define IE_ET1_POS			       (3)
+#define IE_ES_MASK  		       (0x10)    
+#define IE_ES_POS			       (4)
+#define IE_ET2_MASK  		       (0x20)    
+#define IE_ET2_POS			       (5)
+#define IE_EA_MASK  		       (0x80)    
+#define IE_EA_POS			       (7)
+
+/*--------INTE1---------------*/
+#define INTE1_MASK                 (0XFF)
+#define INTE1_TM3IE_MASK           (0X01)
+#define INTE1_TM3IE_POS            (0)
+#define INTE1_PCIE_MASK            (0X02)
+#define INTE1_PCIE_POS             (1)
+#define INTE1_LVDIE_MASK           (0X04)
+#define INTE1_LVDIE_POS            (2)
+#define INTE1_ADTKIE_MASK            (0X08)
+#define INTE1_ADTKIE_POS             (3)
+#define INTE1_SPIE_MASK            (0X10)
+#define INTE1_SPIE_POS             (4)
+#define INTE1_ES2_MASK             (0X20)
+#define INTE1_ES2_POS              (5)
+#define INTE1_I2CE_MASK            (0X40)
+#define INTE1_I2CE_POS             (6)
+#define INTE1_PWMIE_MASK           (0X80)
+#define INTE1_PWMIE_POS            (7)
+
+
+/*--------ADCDL   ADCDH---------------*/
+#define ADCDL_MASK                 (0XFF)
+#define ADCDL_ADCDL_MASK           (0XF0)
+#define ADCDL_ADCDL_POS            (0)
+
+#define ADCDH_MASK                 (0XFF)
+#define ADCDH_ADCDH_MASK           (     0XFF)
+#define ADCDH_ADCDH_POS            (0)
+
+
+/*--------TKCHSB---------------*/
+#define TKCHSB_MASK                 (0X1F)
+#define TKCHSB_TKCHSB_MASK           (0X1F)
+#define TKCHSB_TKCHSB_POS            (0)
+
+
+/*--------TKCON---------------*/
+#define TKCON_MASK                 (0XFF)
+#define TKCON_ATKMODE_MASK           (0X03)
+#define TKCON_ATKMODE_POS            (0)
+#define TKCON_TKOFFSET_MASK            (0X04)
+#define TKCON_TKOFFSET_POS             (2)
+#define TKCON_TKXCAPA_MASK           (0X08)
+#define TKCON_TKXCAPA_POS            (3)
+#define TKCON_TKIVCS_MASK            (0X10)
+#define TKCON_TKIVCS_POS             (4)
+#define TKCON_TKRERUN_MASK            (0X20)
+#define TKCON_TKRERUN_POS             (5)
+#define TKCON_TKEOCA_MASK             (0X40)
+#define TKCON_TKEOCA_POS              (6)
+#define TKCON_TKPDA_MASK            (0X80)
+#define TKCON_TKPDA_POS             (7)
+
+/*--------CHSEL---------------*/
+#define CHSEL_MASK                 (0XfF)
+#define CHSEL_ADCHS_MASK           (0X3F)
+#define CHSEL_ADCHS_POS            (0)
+#define CHSEL_ADCVREFS_MASK           (0XC0)
+#define CHSEL_ADCVREFS_POS            (6)
+
+/*--------ATKCHB2---------------*/
+#define ATKCHB2_MASK                 (0XFF)
+#define ATKCHB2_ATKCHB2_MASK           (0XFF)
+#define ATKCHB2_ATKCHB2_POS            (0)
+
+/*--------LXDCON---------------*/
+#define LXDCON_MASK                 (0XFF)
+#define LXDCON_LXDBRIT_MASK           (0X07)
+#define LXDCON_LXDBRIT_POS            (0)
+#define LXDCON_LEDBRITM_MASK            (0X08)
+#define LXDCON_LEDBRITM_POS             (3)
+#define LXDCON_LXDDUTY_MASK           (0X70)
+#define LXDCON_LXDDUTY_POS            (4)
+#define LXDCON_LXDON_MASK            (0X80)
+#define LXDCON_LXDON_POS             (7)
+
+/*--------LXDCON2---------------*/
+#define LXDCON2_MASK                 (0XFF)
+#define LXDCON2_LEDMODE_MASK           (0X03)
+#define LXDCON2_LEDMODE_POS            (0)
+#define LXDCON2_LEDHOLD_MASK            (0X08)
+#define LXDCON2_LEDHOLD_POS             (3)
+#define LXDCON2_SELLED_MASK           (0X10)
+#define LXDCON2_SELLED_POS            (4)
+#define LXDCON2_LXDPSC_MASK           (0X60)
+#define LXDCON2_LXDPSC_POS            (5)
+#define LXDCON2_LCDCKS_MASK            (0X80)
+#define LXDCON2_LCDCKS_POS             (7)
+
+/*--------TKTMRL---------------*/
+#define TKTMRL_MASK                 (0XFF)
+#define TKTMRL_TKTMRL_MASK           (0XFF)
+#define TKTMRL_TKTMRL_POS            (0)
+
+/*--------TKCON2---------------*/
+#define TKCON2_MASK                 (0XFF)
+#define TKCON2_TKTMRH_MASK           (0X0F)
+#define TKCON2_TKTMRH_POS            (0)
+#define TKCON2_JMPVALA_MASK            (0X70)
+#define TKCON2_JMPVALA_POS             (4)
+#define TKCON2_TKFJMP_MASK           (0X80)
+#define TKCON2_TKFJMP_POS            (7)
+
+
+/*--------ATKCHB1   ATKCHB0---------------*/
+#define ATKCHB1_MASK                 (0XFF)
+#define AATKCHB1_ATKCHB1_MASK           (0XFF)
+#define ATKCHB1_ATKCHB1_POS            (0)
+
+#define ATKCHB0_MASK                 (0XFF)
+#define ATKCHB0_ATKCHB0_MASK           (0XFF)
+#define ATKCHB0_ATKCHB0_POS            (0)
+
+/*--------IP---------------*/
+#define IP_MASK                    (0XFF)
+#define IP_PX0_MASK                (0X01)
+#define IP_PX0_POS                 (0)
+#define IP_PT0_MASK                (0X02)
+#define IP_PT0_POS                 (1)
+#define IP_PX1_MASK                (0X04)
+#define IP_PX1_POS                 (2)
+#define IP_PT1_MASK                (0X08)
+#define IP_PT1_POS                 (3)
+#define IP_PS_MASK                 (0X10)
+#define IP_PS_POS                  (4)
+#define IP_PT2_MASK                (0X20)
+#define IP_PT2_POS                 (5)
+
+
+
+/*--------IPH---------------*/
+#define IPH_MASK                   (0XFF)
+#define IPH_PX0H_MASK              (0X01)
+#define IPH_PX0H_POS               (0)
+#define IPH_PT0H_MASK              (0X02)
+#define IPH_PT0H_POS               (1)
+#define IPH_PX1H_MASK              (0X04)
+#define IPH_PX1H_POS               (2)
+#define IPH_PT1H_MASK              (0X08)
+#define IPH_PT1H_POS               (3)
+#define IPH_PSH_MASK               (0X10)
+#define IPH_PSH_POS                (4)
+#define IPH_PT2H_MASK              (0X20)
+#define IPH_PT2H_POS               (5)
+
+
+#define IP1_MASK                   (0XFF)
+#define IP1_PT3_MASK               (0X01)
+#define IP1_PT3_POS                (0)
+#define IP1_PPC_MASK               (0X02)
+#define IP1_PPC_POS                (1)
+#define IP1_PLVD_MASK              (0X04)
+#define IP1_PLVD_POS               (2)
+#define IP1_PADTKI_MASK              (0X08)
+#define IP1_PADTKI_POS               (3)
+#define IP1_PSPI_MASK              (0X10)
+#define IP1_PSPI_POS               (4)
+#define IP1_PS2_MASK               (0X20)
+#define IP1_PS2_POS                (5)
+#define IP1_PI2C_MASK              (0X40)
+#define IP1_PI2C_POS               (6)
+#define IP1_PPWM_MASK              (0X80)
+#define IP1_PPWM_POS               (7)
+
+/*--------IP1H---------------*/
+#define IP1H_MASK                  (0XFF)
+#define IP1H_PT3H_MASK             (0X01)
+#define IP1H_PT3H_POS              (0)
+#define IP1H_PPCH_MASK             (0X02)
+#define IP1H_PPCH_POS              (1)
+#define IP1H_PLVDH_MASK            (0X04)
+#define IP1H_PLVDH_POS             (2)
+#define IP1H_PADTKIH_MASK            (0X08)
+#define IP1H_PADTKIH_POS             (3)
+#define IP1H_PSPIH_MASK              (0X10)
+#define IP1H_PSPIH_POS               (4)
+#define IP1H_PS2H_MASK             (0X20)
+#define IP1H_PS2H_POS              (5)
+#define IP1H_PI2CH_MASK            (0X40)
+#define IP1H_PI2CH_POS             (6)
+#define IP1H_PPWMH_MASK            (0X80)
+#define IP1H_PPWMH_POS             (7)
+
+/*--------SPCON---------------*/
+#define SPCON_MASK                  (0XFF)
+#define SPCON_SPCR_MASK             (0X03)
+#define SPCON_SPCR_POS              (0)
+#define SPCON_LSBF_MASK             (0X04)
+#define SPCON_LSBF_POS              (2)
+#define SPCON_SSDIS_MASK            (0X08)
+#define SPCON_SSDIS_POS             (3)
+#define SPCON_CPHA_MASK            (0X10)
+#define SPCON_CPHA_POS             (4)
+#define SPCON_CPOL_MASK              (0X20)
+#define SPCON_CPOL_POS               (5)
+#define SPCON_MSTR_MASK             (0X40)
+#define SPCON_MSTR_POS              (6)
+#define SPCON_SPEN_MASK            (0X80)
+#define SPCON_SPEN_POS             (7)
+
+/*--------SPSTA---------------*/
+#define SPSTA_MASK                  (0XFF)
+#define SPSTA_SPBSY_MASK             (0X04)
+#define SPSTA_SPBSY_POS              (2)
+#define SPSTA_RCVBF_MASK             (0X08)
+#define SPSTA_RCVBF_POS              (3)
+#define SPSTA_RCVOVF_MASK            (0X10)
+#define SPSTA_RCVOVF_POS             (4)
+#define SPSTA_MODF_MASK            (0X20)
+#define SPSTA_MODF_POS             (5)
+#define SPSTA_WCOL_MASK              (0X40)
+#define SPSTA_WCOL_POS               (6)
+#define SPSTA_SPIF_MASK             (0X80)
+#define SPSTA_SPIF_POS              (7)
+
+/*--------SPDAT---------------*/
+#define SPDAT_MASK                 (0XFF)
+#define SPDAT_SPDAT_MASK           (0XFF)
+#define SPDAT_SPDAT_POS            (0)
+
+/*--------LVDCON---------------*/
+#define LVDCON_MASK                  (0XFF)
+#define LVDCON_LVDS_MASK             (0X0f)
+#define LVDCON_LVDS_POS              (0)
+#define LVDCON_LVDPD_MASK             (0X10)
+#define LVDCON_LVDPD_POS              (4)
+#define LVDCON_LVDDBS_MASK            (0X20)
+#define LVDCON_LVDDBS_POS             (5)
+#define LVDCON_LVDO_MASK            (0X40)
+#define LVDCON_LVDO_POS             (6)
+#define LVDCON_LVDM_MASK              (0X80)
+#define LVDCON_LVDM_POS               (7)
+
+/*--------TKPINSA0---------------*/
+#define TKPINSA0_MASK                 (0XFF)
+#define TKPINSA0_TKPINSA0_MASK           (0XFF)
+#define TKPINSA0_TKPINSA0_POS            (0)
+
+/*--------TKPINSA1---------------*/
+#define TKPINSA1_MASK                 (0XFF)
+#define TKPINSA1_TKPINSA1_MASK           (0XFF)
+#define TKPINSA1_TKPINSA1_POS            (0)
+
+/*--------TKPINSA2---------------*/
+#define TKPINSA2_MASK                 (0XFF)
+#define TKPINSA2_TKPINSA2_MASK           (0XFF)
+#define TKPINSA2_TKPINSA2_POS            (0)
+
+/*--------TKPINSB0---------------*/
+#define TKPINSB0_MASK                 (0XFF)
+#define TKPINSB0_TKPINSB0_MASK           (0XFF)
+#define TKPINSB0_TKPINSB0_POS            (0)
+
+/*--------ATKCHA0---------------*/
+#define ATKCHA0_MASK                 (0XFF)
+#define ATKCHA0_ATKCHA0_MASK           (0XFF)
+#define ATKCHA0_ATKCHA0_POS            (0)
+
+/*--------ATKCHA1---------------*/
+#define ATKCHA1_MASK                 (0XFF)
+#define ATKCHA1_ATKCHA1_MASK           (0XFF)
+#define ATKCHA1_ATKCHA1_POS            (0)
+
+/*--------ATKCHA2---------------*/
+#define ATKCHA2_MASK                 (0XFF)
+#define ATKCHA2_ATKCHA2_MASK           (0XFF)
+#define ATKCHA2_ATKCHA2_POS            (0)
+      
+/*--------T2CON---------------*/
+#define T2CON_MASK                  (0XFF)
+#define T2CON_CPRL2N_MASK             (0X01)
+#define T2CON_CPRL2N_POS              (0)
+#define T2CON_CT2N_MASK             (0X02)
+#define T2CON_CT2N_POS              (1)
+#define T2CON_TR2_MASK            (0X04)
+#define T2CON_TR2_POS             (2)
+#define T2CON_EXEN2_MASK            (0X08)
+#define T2CON_EXEN2_POS             (3)
+#define T2CON_TCLK_MASK              (0X10)
+#define T2CON_TCLK_POS               (4)
+#define T2CON_RCLK_MASK             (0X20)
+#define T2CON_RCLK_POS              (5)
+#define T2CON_EXF2_MASK            (0X40)
+#define T2CON_EXF2_POS             (6)
+#define T2CON_TF2_MASK            (0X80)
+#define T2CON_TF2_POS             (7)
+
+
+/*--------IAPWE---------------*/
+#define IAPWE_MASK                  (0XFF)
+
+/*--------RCP2L---------------*/
+#define RCP2L_MASK                 (0XFF)
+#define RCP2L_RCP2L_MASK           (0XFF)
+#define RCP2L_RCP2L_POS            (0)
+
+/*--------RCP2H---------------*/
+#define RCP2H_MASK                 (0XFF)
+#define RCP2H_RCP2H_MASK           (0XFF)
+#define RCP2H_RCP2H_POS            (0)
+
+/*--------TL2---------------*/
+#define TL2_MASK                 (0XFF)
+#define TL2_TL2_MASK           (0XFF)
+#define TL2_TL2_POS            (0)
+
+/*--------TH2---------------*/
+#define TH2_MASK                 (0XFF)
+#define TH2_TH2_MASK           (0XFF)
+#define TH2_TH2_POS            (0)
+
+/*--------EXA2---------------*/
+#define EXA2_MASK                 (0XFF)
+#define EXA2_EXA2_MASK           (0XFF)
+#define EXA2_EXA2_POS            (0)
+
+/*--------EXA3---------------*/
+#define EXA3_MASK                 (0XFF)
+#define EXA3_EXA3_MASK           (0XFF)
+#define EXA3_EXA3_POS            (0)
+
+/*--------PSW---------------*/
+#define PSW_MASK                  (0XFF)
+#define PSW_P_MASK             (0X01)
+#define PSW_P_POS              (0)
+#define PSW_F1_MASK             (0X02)
+#define PSW_F1_POS              (1)
+#define PSW_OV_MASK            (0X04)
+#define PSW_OV_POS             (2)
+#define PSW_RS0_MASK            (0X08)
+#define PSW_RS0_POS             (3)
+#define PSW_RS1_MASK              (0X10)
+#define PSW_RS1_POS               (4)
+#define PSW_F0_MASK             (0X20)
+#define PSW_F0_POS              (5)
+#define PSW_AC_MASK            (0X40)
+#define PSW_AC_POS             (6)
+#define PSW_CY_MASK            (0X80)
+#define PSW_CY_POS             (7)
+
+/*--------PWMDH---------------*/
+#define PWMDH_MASK                 (0XFF)
+#define PWMDH_PWMDH_MASK           (0XFF)
+#define PWMDH_PWMDH_POS            (0)
+
+/*--------PWMDL---------------*/
+#define PWMDL_MASK                 (0XFF)
+#define PWMDL_PWMDL_MASK           (0XFF)
+#define PWMDL_PWMDL_POS            (0)
+
+/*--------LVRCON---------------*/
+#define LVRCON_MASK                  (0XFF)
+#define LVRCON_LVRS_MASK             (0X07)
+#define LVRCON_LVRS_POS              (0)
+#define LVRCON_LVRPD_MASK             (0X10)
+#define LVRCON_LVRPD_POS              (4)
+#define LVRCON_SXTGAIN_MASK            (0XC0)
+#define LVRCON_SXTGAIN_POS             (6)
+
+/*--------TKPINSB1---------------*/
+#define TKPINSB1_MASK                 (0XFF)
+#define TKPINSB1_TKPINSB1_MASK           (0XFF)
+#define TKPINSB1_TKPINSB1_POS            (0)
+
+/*--------CLKCON---------------*/
+#define CLKCON_MASK                (0XFF)
+#define CLKCON_CLKPSC_MASK         (0X03)
+#define CLKCON_CLKPSC_POS          (0)
+#define CLKCON_SELFCK_MASK         (0X04)
+#define CLKCON_SELFCK_POS          (2)
+#define CLKCON_STPFCK_MASK         (0X08)
+#define CLKCON_STPFCK_POS          (3)
+#define CLKCON_STPPCK_MASK         (0X10)
+#define CLKCON_STPPCK_POS          (4)
+#define CLKCON_STPSCK_MASK         (0X20)
+#define CLKCON_STPSCK_POS          (5)
+#define CLKCON_FCKTYPE_MASK        (0X40)
+#define CLKCON_FCKTYPE_POS         (6)
+#define CLKCON_SCKTYPE_MASK        (0X80)
+#define CLKCON_SCKTYPE_POS         (7)
+
+/*--------PWMPRDH---------------*/
+#define PWMPRDH_MASK                 (0XFF)
+#define PWMPRDH_PPWMPRDH_MASK           (0XFF)
+#define PWMPRDH_PWMPRDH_POS            (0)
+
+/*--------PWMPRDL---------------*/
+#define PWMPRDL_MASK                 (0XFF)
+#define PWMPRDL_PWMPRDL_MASK           (0XFF)
+#define PWMPRDL_PWMPRDL_POS            (0)
+
+/*--------UART2CON---------------*/
+#define UART2CON_MASK                 (0X7F)
+#define UART2CON_UART2BRP_MASK           (0X7F)
+#define UART2CON_UART2BRP_POS            (0)
+
+/*--------UART1CON---------------*/
+#define UART1CON_MASK                 (0X7F)
+#define UART1CON_UART1BRP_MASK           (0X7F)
+#define UART1CON_UART1BRP_POS            (0)
+
+/*--------UART0CON---------------*/
+#define UART0CON_MASK                  (0XFF)
+#define UART0CON_UART0BRP_MASK             (0X7F)
+#define UART0CON_UART0BRP_POS              (0)
+#define UART0CON_UART0BRS_MASK             (0X80)
+#define UART0CON_UART0BRS_POS              (7)
+
+/*--------TKPINSB2---------------*/
+#define TKPINSB2_MASK                 (0XFF)
+#define TKPINSB2_TKPINSB2_MASK           (0XFF)
+#define TKPINSB2_TKPINSB2_POS            (0)
+
+
+/*--------ACC---------------*/
+
+/*--------MICON---------------*/
+#define MICON_MASK                 (0XFF)
+#define MICON_MICR_MASK            (0X03)
+#define MICON_MICR_POS             (0)
+#define MICON_MISTOP_MASK          (0X04)
+#define MICON_MISTOP_POS           (2)
+#define MICON_MISTART_MASK         (0X08)
+#define MICON_MISTART_POS          (3)
+#define MICON_MIACKI_MASK          (0X10)
+#define MICON_MIACKI_POS           (4)
+#define MICON_MIIF_MASK            (0X20)
+#define MICON_MIIF_POS             (5)
+#define MICON_MIACKO_MASK          (0X40)
+#define MICON_MIACKO_POS           (6)
+#define MICON_MIEN_MASK            (0X80)
+#define MICON_MIEN_POS             (7)
+
+/*--------MIDAT---------------*/
+#define MIDAT_MASK                 (0XFF)
+#define MIDAT_MIDAT_MASK           (0XFF)
+#define MIDAT_MIDAT_POS            (0)
+
+
+/*--------EFTCON---------------*/
+#define EFTCON_MASK                 (0XFF)
+#define EFTCON_CKHLDE_MASK            (0X01)
+#define EFTCON_CKHLDE_POS             (0)
+#define EFTCON_EFTWOUT_MASK          (0X02)
+#define EFTCON_EFTWOUT_POS           (1)
+#define EFTCON_EFTWCPU_MASK         (0X04)
+#define EFTCON_EFTWCPU_POS          (2)
+#define EFTCON_EFTSLOW_MASK          (0X08)
+#define EFTCON_EFTSLOW_POS           (3)
+#define EFTCON_EFT1S_MASK            (0X30)
+#define EFTCON_EFT1S_POS             (4)
+#define EFTCON_EFT1CS_MASK          (0X40)
+#define EFTCON_EFT1CS_POS           (6)
+#define EFTCON_EFT2CS_MASK            (0X80)
+#define EFTCON_EFT2CS_POS             (7)
+
+
+/*--------EXA---------------*/
+#define EXA_MASK                 (0XFF)
+#define EXA_EXA_MASK           (0XFF)
+#define EXA_EXA_POS            (0)
+
+/*--------EXA---------------*/
+#define EXA_MASK                 (0XFF)
+#define EXA_EXA_MASK           (0XFF)
+#define EXA_EXA_POS            (0)
+
+/*--------SIADR---------------*/
+#define SIADR_MASK                 (0XFF)
+#define SIADR_SIEN_MASK           (0X01)
+#define SIADR_SIEN_POS            (0)
+#define SIADR_SA_MASK           (0XFE)
+#define SIADR_SA_POS            (1)
+
+/*--------SICON---------------*/
+#define SICON_MASK                  (0XFF)
+#define SICON_RCD1F_MASK             (0X01)
+#define SICON_RCD1F_POS              (0)
+#define SICON_RCD2F_MASK             (0X02)
+#define SICON_RCD2F_POS              (1)
+#define SICON_TXDF_MASK            (0X04)
+#define SICON_TXDF_POS             (2)
+#define SICON_RCD1IE_MASK              (0X10)
+#define SICON_RCD1IE_POS               (4)
+#define SICON_RCD2IE_MASK             (0X20)
+#define SICON_RCD2IE_POS              (5)
+#define SICON_TXDIE_MASK            (0X40)
+#define SICON_TXDIE_POS             (6)
+#define SICON_MIIE_MASK            (0X80)
+#define SICON_MIIE_POS             (7)
+
+/*--------SIRCD1---------------*/
+#define SIRCD1_MASK                 (0XFF)
+#define SIRCD1_SIRCD1_MASK           (0XFF)
+#define SIRCD1_SIRCD1_POS            (0)
+
+/*--------SITXRCD2---------------*/
+#define SITXRCD2_MASK                 (0XFF)
+#define SITXRCD2_SITXRCD2_MASK           (0XFF)
+#define SITXRCD2_SITXRCD2_POS            (0)
+
+/*--------BOOTV---------------*/
+#define BOOTV_MASK                  (0XFF)
+#define BOOTV_BOOTVVR_MASK             (0X03)
+#define BOOTV_BOOTVR_POS              (0)
+#define BOOTV_RSTV_MASK             (0X04)
+#define BOOTV_RSTV_POS              (2)
+
+
+/*--------PWRCON---------------*/
+#define PWRCON_MASK                  (0XFF)
+#define PWRCON_PWRSLOW_MASK             (0X01)
+#define PWRCON_PWRSLOW_POS              (0)
+#define PWRCON_PWRIDLE_MASK             (0X02)
+#define PWRCON_PWRIDLE_POS              (1)
+#define PWRCON_ENVPULL_MASK            (0X04)
+#define PWRCON_ENVPULL_POS             (2)
+#define PWRCON_WARMTIME_MASK            (0X08)
+#define PWRCON_WARMTIME_POS             (3)
+#define PWRCON_AVPULL_MASK              (0X10)
+#define PWRCON_AVPULL_POS               (4)
+
+
+/*--------CRCDL---------------*/
+#define CRCDL_MASK                 (0XFF)
+#define CRCDL_CRCDL_MASK           (0XFF)
+#define CRCDL_CRCDL_POS            (0)
+
+/*--------CRCDH---------------*/
+#define CRCDH_MASK                 (0XFF)
+#define CRCDH_CRCDH_MASK           (0XFF)
+#define CRCDH_CRCDH_POS            (0)
+
+/*--------CRCIN---------------*/
+#define CRCIN_MASK                 (0XFF)
+#define CRCIN_CRCIN_MASK           (0XFF)
+#define CRCIN_CRCIN_POS            (0)
+
+/*--------CFGBG---------------*/
+#define CFGBG_MASK                 (0X1F)
+#define CFGBG_CFGBG_MASK           (0X1F)
+#define CFGBG_CFGBG_POS            (0)
+
+/*--------CFGWL---------------*/
+#define CFGWL_MASK                 (0X7F)
+#define CFGWL_CFGWL_MASK           (0X7F)
+#define CFGWL_CFGWL_POS            (0)
+
+
+/*--------AUX2---------------*/
+#define AUX2_MASK                  (0XFF)
+#define AUX2_MULDIV16_MASK         (0X01)
+#define AUX2_MULDIV16_POS          (0)
+#define AUX2_IAPTE_MASK            (0X06)
+#define AUX2_IAPTE_POS             (1)
+#define AUX2_DIV32_MASK            (0X08)
+#define AUX2_DIV32_POS             (3)
+#define AUX2_VBGOUT_MASK           (0X10)
+#define AUX2_VBGOUT_POS            (4)
+#define AUX2_PWRSAV_MASK           (0X20)
+#define AUX2_PWRSAV_POS            (5)
+#define AUX2_WDTE_MASK             (0XC0)
+#define AUX2_WDTE_POS              (6)
+
+/*--------AUX1---------------*/
+#define AUX1_MASK            	   (0XFF)
+#define AUX1_DPSEL_MASK            (0X01)
+#define AUX1_DPSEL_POS             (0)
+#define AUX1_T1SEL_MASK            (0X02)
+#define AUX1_T1SEL_POS             (1)
+#define AUX1_TKSOCB_MASK            (0X04)
+#define AUX1_TKSOCB_POS             (2)
+#define AUX1_ADSOC_MASK            (0X10)
+#define AUX1_ADSOC_POS             (4)
+#define AUX1_TKSOCA_MASK            (0X20)
+#define AUX1_TKSOCA_POS             (4)
+#define AUX1_CLRTM3_MASK           (0X40)
+#define AUX1_CLRTM3_POS            (6)
+#define AUX1_CLRWDT_MASK           (0X80)
+#define AUX1_CLRWDT_POS            (7)
+
+/*--------GPIO---------------*/
+//配合PORTIDX使用,指明要配置的PORT口
+#define  PORT0   0
+#define  PORT1   1
+#define  PORT2   2
+#define  PORT3   3
+#define  PORT4   4
+#define  PORT5   5
+ 
+#define		PIN_MODE_OD 	  	            0x01    //开漏
+#define		PIN_MODE_OD_IPU	              0x00    //开漏带上拉
+#define		PIN_MODE_OD_IPD	              0x04    //开漏带下拉
+
+#define		PIN_MODE_PP		                0x06    //推挽输出
+#define		PIN_MODE_ADC		              0x03    //ADC
+#define		PIN_MODE_LED		              0x07    //LED
+#define		PIN_MODE_AF 	                0x0B    //PWM TxO CKO
+#define		PIN_MODE_COM		              0x0F    //LCD 1/2BIAS
+
+#define		PIN_MODE_OD_WAKEUP 	  	      0x09    //开漏+唤醒
+#define		PIN_MODE_OD_IPU_WAKEUP	      0x08    //开漏带上拉+唤醒
+#define		PIN_MODE_OD_IPD_WAKEUP	      0x0C    //开漏带下拉+唤醒
+
+
+
+
+//连续4个bit配置一个IO口
+#define		PIN_L_MODE_OD 	  	        0x01    //开漏
+#define		PIN_L_MODE_OD_IPU	          0x00    //开漏带上拉
+#define		PIN_L_MODE_OD_IPD	          0x04    //开漏带下拉
+
+#define		PIN_L_MODE_PP		            0x06    //推挽输出
+#define		PIN_L_MODE_ADC		          0x03    //ADC
+#define		PIN_L_MODE_LED		          0x07    //LED
+#define		PIN_L_MODE_AF 		          0x0B    //PWM TxO CKO
+#define		PIN_L_MODE_COM		          0x0F    //LCD 1/2BIAS
+
+#define		PIN_L_MODE_OD_WAKEUP 	  	  0x09    //开漏+唤醒
+#define		PIN_L_MODE_OD_IPU_WAKEUP	  0x08    //开漏带上拉+唤醒
+#define		PIN_L_MODE_OD_IPD_WAKEUP	  0x0C    //开漏带下拉+唤醒
+
+#define		PIN_H_MODE_OD 		          0x10    //开漏
+#define		PIN_H_MODE_OD_IPU	          0x00    //开漏带上拉
+#define		PIN_H_MODE_OD_IPD	          0x40    //开漏带下拉
+
+#define		PIN_H_MODE_PP		  	        0x60    //推挽输出
+#define		PIN_H_MODE_ADC		          0x30    //ADC
+#define		PIN_H_MODE_LED		          0x70    //LED
+#define		PIN_H_MODE_AF 		          0xB0    //PWM TxO CKO
+#define		PIN_H_MODE_COM		          0xF0    //LCD 1/2BIAS
+
+#define		PIN_H_MODE_OD_WAKEUP 		    0x90    //开漏+唤醒
+#define		PIN_H_MODE_OD_IPU_WAKEUP	  0x80    //开漏带上拉+唤醒
+#define		PIN_H_MODE_OD_IPD_WAKEUP	  0xC0    //开漏带下拉+唤醒
+
+
+#define SET_REG_BITS(reg,regbit,value) ((reg) = (reg)&~(reg##_##regbit##_##MASK) | ((value) << (reg##_##regbit##_##POS)))               //设置多位寄存器
+
+
+#define	CLEAR_REG_BITS(reg,regbit) ((reg) = (reg)&~(reg##_##regbit##_##MASK))                                                           //清除寄存器当前状态
+
+#define SET_REG(reg,value)	((reg) = (value))                                                                                           //设置一位寄存器
+#define GET_REG(reg)		(reg)
+
+#endif
+
+
+
+
+

+ 90 - 0
Projects/OTA_boot/OTA指令从启动开始.txt

@@ -0,0 +1,90 @@
+模组发送数据           [2024-03-26 13:20:33.07]
+55 AA 02 00 0F 01 00 00 11
+
+接收MCU发送的产品信息           [2024-03-26 13:20:33.21]
+PID: gulwpbcg, Version: 1.0.2
+55 AA 02 00 0F 01 00 1C 7B 22 70 22 3A 22 67 75 6C 77 70 62 63 67 22 2C 22 76 22 3A 22 31 2E 30 2E 32 22 7D 05
+
+模组发送数据           [2024-03-26 13:20:33.23]
+55 AA 02 00 10 02 00 01 00 14
+
+接收MCU发送的报告设备联网状态回复           [2024-03-26 13:20:33.34]
+55 AA 02 00 10 02 00 00 13
+
+模组发送数据           [2024-03-26 13:20:35.94]
+55 AA 02 00 11 0B 00 00 1D
+
+接收MCU发送的OTA版本请求回复           [2024-03-26 13:20:36.05]
+Version: 66(1.0.2)
+55 AA 02 00 11 0B 00 01 42 60
+
+模组发送数据           [2024-03-26 13:20:36.06]
+55 AA 02 00 11 0C 00 11 67 75 6C 77 70 62 63 67 43 00 00 39 7B 00 00 00 0B 8C
+
+接收MCU发送的OTA升级请求回复           [2024-03-26 13:20:36.21]
+Result: 0(成功)
+55 AA 02 00 11 0C 00 01 00 1F
+
+接收MCU发送的OTA固件内容请求           [2024-03-26 13:20:36.23]
+PID: gulwpbcg, UpgradeVersion: 1.0.3, Offset: 0, EveryPackageLen: 50
+55 AA 02 00 00 0D 00 0E 67 75 6C 77 70 62 63 67 43 00 00 00 00 32 EC
+
+模组发送数据           [2024-03-26 13:20:36.25]
+55 AA 02 00 00 0D 00 40 00 67 75 6C 77 70 62 63 67 43 00 00 00 00 3A 30 33 45 30 30 30 30 30 30 32 46 30 41 33 38 38 0D 0A 3A 30 43 46 30 41 33 30 30 37 38 37 46 45 34 46 36 44 38 46 44 37 35 38 31 32 30 30 32 46 30 7E
+
+接收MCU发送的OTA固件内容请求           [2024-03-26 13:20:36.45]
+PID: gulwpbcg, UpgradeVersion: 1.0.3, Offset: 50, EveryPackageLen: 50
+55 AA 02 00 00 0D 00 0E 67 75 6C 77 70 62 63 67 43 00 00 00 32 32 1E
+
+模组发送数据           [2024-03-26 13:20:36.47]
+55 AA 02 00 00 0D 00 40 00 67 75 6C 77 70 62 63 67 43 00 00 00 32 45 41 43 39 0D 0A 3A 31 30 45 30 33 42 30 30 34 31 45 42 42 38 30 30 34 31 45 43 32 36 30 30 34 33 45 42 42 35 30 30 30 30 30 30 34 31 45 43 38 45 0D 93
+
+接收MCU发送的OTA固件内容请求           [2024-03-26 13:20:36.67]
+PID: gulwpbcg, UpgradeVersion: 1.0.3, Offset: 100, EveryPackageLen: 50
+55 AA 02 00 00 0D 00 0E 67 75 6C 77 70 62 63 67 43 00 00 00 64 32 50
+
+模组发送数据           [2024-03-26 13:20:36.69]
+55 AA 02 00 00 0D 00 40 00 67 75 6C 77 70 62 63 67 43 00 00 00 64 0A 3A 31 30 45 30 34 42 30 30 32 32 30 30 34 34 45 43 31 45 30 30 30 30 30 30 30 30 34 32 45 43 32 34 30 30 30 30 34 31 45 43 44 36 0D 0A 3A 31 30 45 5C
+
+接收MCU发送的OTA固件内容请求           [2024-03-26 13:20:36.89]
+PID: gulwpbcg, UpgradeVersion: 1.0.3, Offset: 150, EveryPackageLen: 50
+55 AA 02 00 00 0D 00 0E 67 75 6C 77 70 62 63 67 43 00 00 00 96 32 82
+
+模组发送数据           [2024-03-26 13:20:36.90]
+55 AA 02 00 00 0D 00 40 00 67 75 6C 77 70 62 63 67 43 00 00 00 96 30 35 42 30 30 32 33 30 30 34 31 45 43 32 37 30 30 34 31 45 43 30 39 30 30 35 34 45 43 30 41 30 30 30 30 30 30 42 45 0D 0A 3A 31 30 45 30 36 42 30 30 C2
+
+接收MCU发送的OTA固件内容请求           [2024-03-26 13:20:37.10]
+PID: gulwpbcg, UpgradeVersion: 1.0.3, Offset: 200, EveryPackageLen: 50
+55 AA 02 00 00 0D 00 0E 67 75 6C 77 70 62 63 67 43 00 00 00 C8 32 B4
+
+模组发送数据           [2024-03-26 13:20:37.12]
+55 AA 02 00 00 0D 00 40 00 67 75 6C 77 70 62 63 67 43 00 00 00 C8 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 41 35 0D 0A 3A 31 30 45 30 37 42 30 30 30 30 36 30 35 25
+
+接收MCU发送的OTA固件内容请求           [2024-03-26 13:20:37.30]
+PID: gulwpbcg, UpgradeVersion: 1.0.3, Offset: 250, EveryPackageLen: 50
+55 AA 02 00 00 0D 00 0E 67 75 6C 77 70 62 63 67 43 00 00 00 FA 32 E6
+
+模组发送数据           [2024-03-26 13:20:37.31]
+55 AA 02 00 00 0D 00 40 00 67 75 6C 77 70 62 63 67 43 00 00 00 FA 30 45 42 42 39 37 42 32 32 37 30 32 32 33 41 32 32 36 34 36 33 33 34 37 33 36 43 44 43 0D 0A 3A 31 30 45 30 38 42 30 30 36 37 36 34 36 35 36 34 33 36 52
+
+接收MCU发送的OTA固件内容请求           [2024-03-26 13:20:37.48]
+PID: gulwpbcg, UpgradeVersion: 1.0.3, Offset: 300, EveryPackageLen: 50
+55 AA 02 00 00 0D 00 0E 67 75 6C 77 70 62 63 67 43 00 00 01 2C 32 19
+
+模组发送数据           [2024-03-26 13:20:37.49]
+55 AA 02 00 00 0D 00 40 00 67 75 6C 77 70 62 63 67 43 00 00 01 2C 36 44 33 36 33 39 36 33 37 32 36 38 32 32 32 43 32 30 32 32 37 36 39 43 0D 0A 3A 31 30 45 30 39 42 30 30 32 32 33 41 32 32 33 31 32 45 33 30 32 45 33 56
+
+接收MCU发送的OTA固件内容请求           [2024-03-26 13:20:37.70]
+PID: gulwpbcg, UpgradeVersion: 1.0.3, Offset: 350, EveryPackageLen: 50
+55 AA 02 00 00 0D 00 0E 67 75 6C 77 70 62 63 67 43 00 00 01 5E 32 4B
+
+模组发送数据           [2024-03-26 13:20:37.71]
+55 AA 02 00 00 0D 00 40 00 67 75 6C 77 70 62 63 67 43 00 00 01 5E 31 32 32 32 43 32 30 32 32 36 44 32 32 33 41 33 32 37 45 0D 0A 3A 31 30 45 30 41 42 30 30 32 43 32 32 36 44 37 34 32 32 33 41 33 31 33 30 32 43 32 32 8E
+
+接收MCU发送的OTA固件内容请求           [2024-03-26 13:20:37.91]
+PID: gulwpbcg, UpgradeVersion: 1.0.3, Offset: 400, EveryPackageLen: 50
+55 AA 02 00 00 0D 00 0E 67 75 6C 77 70 62 63 67 43 00 00 01 90 32 7D
+
+模组发送数据           [2024-03-26 13:20:37.93]
+55 AA 02 00 00 0D 00 40 00 67 75 6C 77 70 62 63 67 43 00 00 01 90 36 45 32 32 33 41 33 30 32 43 32 32 45 33 0D 0A 3A 31 30 45 30 42 42 30 30 36 39 37 32 32 32 33 41 32 32 33 35 32 45 33 31 33 32 32 32 32 43 32 30 32 B8
+

BIN
Projects/OTA_boot/TM52串口IAP方案V1.0(1).doc


+ 51 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Listings/CRC.lst

@@ -0,0 +1,51 @@
+C51 COMPILER V9.53.0.0   CRC                                                               04/10/2024 17:08:13 PAGE 1   
+
+
+C51 COMPILER V9.53.0.0, COMPILATION OF MODULE CRC
+OBJECT MODULE PLACED IN .\Objects\CRC.obj
+COMPILER INVOKED BY: C:\Keil_v5_51\C51\BIN\C51.EXE src\CRC.c LARGE OPTIMIZE(6,SPEED) REGFILE(.\Objects\uboot.ORC) BROWSE
+                    - INTVECTOR(0XE000) INCDIR(.\src) DEBUG OBJECTEXTEND PRINT(.\Listings\CRC.lst) TABS(2) OBJECT(.\Objects\CRC.obj)
+
+line level    source
+
+   1          #include <REGtenxTM52F1386.H>
+   2          #include <intrins.h>
+   3          
+   4          /*******************************************************************
+   5          ** 函数名称: crc_calcu
+   6          ** 函数描述: 数据CRC校验
+   7          ** 输入参数: 无
+   8          ** 输出参数: ret   CRC的校验值
+   9          *******************************************************************/
+  10          unsigned int crc_calcu(unsigned char *p,unsigned int len)
+  11          {
+  12   1        unsigned int ret=0;
+  13   1        unsigned int i=0;
+  14   1        CRCIN = 0;
+  15   1        CRCDH = 0xff;
+  16   1        CRCDL = 0xff;
+  17   1        for(i = 0;i<len;i++)
+  18   1        {
+  19   2          CRCIN = p[i];   //将要检验的数据送入到CRCIN寄存器里
+  20   2        }
+  21   1      
+  22   1        ret = CRCDH;
+  23   1        ret = ret<<8;
+  24   1        ret = ret|CRCDL;
+  25   1        return ret;    //返回校验值
+  26   1      }
+  27          
+
+
+MODULE INFORMATION:   STATIC OVERLAYABLE
+   CODE SIZE        =    115    ----
+   CONSTANT SIZE    =   ----    ----
+   XDATA SIZE       =   ----       7
+   PDATA SIZE       =   ----    ----
+   DATA SIZE        =   ----    ----
+   IDATA SIZE       =   ----    ----
+   BIT SIZE         =   ----    ----
+END OF MODULE INFORMATION.
+
+
+C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

+ 281 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Listings/STARTUP_TENX52.lst

@@ -0,0 +1,281 @@
+A51 MACRO ASSEMBLER  STARTUP_TENX52                                                       04/10/2024 17:08:12 PAGE     1
+
+
+MACRO ASSEMBLER A51 V8.02b
+OBJECT MODULE PLACED IN .\Objects\STARTUP_TENX52.obj
+ASSEMBLER INVOKED BY: C:\Keil_v5_51\C51\BIN\A51.EXE STARTUP_TENX52.A51 SET(LARGE) DEBUG PRINT(.\Listings\STARTUP_TENX52.
+                      lst) OBJECT(.\Objects\STARTUP_TENX52.obj) EP
+
+LOC  OBJ            LINE     SOURCE
+
+                       1     $nomod51 
+                       2     ;------------------------------------------------------------------------------
+                       3     ;Description:
+                       4     ;  This code is executed after a reset.  Besides the usual C51 startup 
+                       5     ;  settings, Some specific TM52FXXXX  initializations are done here such as the
+                       6     ;  LCD RAM clear. When the startup code execution is complete, this code jumps to ?C_START 
+                             that 
+                       7     ;  is typically the main() function in the C code.
+                       8     ;  
+                       9     ;
+                      10     ;  This example demo code is provided as is and has no warranty,
+                      11     ;  implied or otherwise.  You are free to use/modify any of the provided
+                      12     ;  code at your own risk in your applications with the expressed limitation
+                      13     ;  of liability  so long as your product using the code contains
+                      14     ;  at least one TM52FXXXX product (device).
+                      15     ;------------------------------------------------------------------------------
+                      16     ;  User-defined <h> Power-On Initialization of Memory 
+                      17     ;
+                      18     ;  With the following EQU statements the initialization of memory
+                      19     ;  at processor reset can be defined:
+                      20     ;
+                      21     ; <o> IDATALEN: IDATA memory size <0x0-0x100>
+                      22     ;     <i> Note: The absolute start-address of IDATA memory is always 0
+                      23     ;     <i>       The IDATA space overlaps physically the DATA and BIT areas.
+  0080                24     IDATALEN        EQU     80H   ; the length of IDATA memory in bytes to clear
+                      25     ;
+                      26     ; <o> XDATASTART: XDATA memory start address <0x0-0xFFFF> 
+                      27     ;     <i> The absolute start address of XDATA memory
+                      28     ;     <i> TM52FXXXX users need to fill this in based on where SRAM memory mapped.
+  FFFF                29     XDATAEND        EQU     0FFFFH ; the absolute end-address of XDATA memory
+                      30     ;
+                      31     ; <o> XDATALEN: XDATA memory size <0x0-0xFFFF> 
+                      32     ;     <i> The length of XDATA memory in bytes.
+                      33     ;     <i> NOTE: The length equates for XDATALEN  should be changed to 
+                      34     ;     <i>       non-zero values indicating the amount of XDATA 
+                      35     ;     <i>       memory to be initialized to 0x00.  The start address equates 
+                      36     ;     <i>       (XDATASTART ) must be set to the respective starting
+                      37     ;     <i>       addresses as mapped in TM52FXXXX if the memory is to be initialized.
+  0000                38     XDATALEN        EQU     0H      ; the length of XDATA memory in bytes to clear.
+                      39     ;
+                      40     ; <o> LCDDATASTART: LCD DATA memory start address <0x0-0xFFFF> 
+                      41     ;     <i> The absolute start address of LCD DATA memory
+                      42     ;     <i> TM52XX users need to fill this in based on where LCD DATA memory mapped.
+  F000                43     LCDDATASTART    EQU     0F000H  ; the absolute start-address of LCD DATA memory
+                      44     ;
+                      45     ; <o> LCDDATALEN: XDATA memory size <0x0-0xFF> 
+                      46     ;     <i> The length of LCD DATA memory in bytes.
+                      47     ;     <i> NOTE: The length equates for LCDDATALEN should be changed to 
+                      48     ;     <i>       non-zero values indicating the amount of LCD DATA 
+                      49     ;     <i>       memory to be initialized to 0x00.  The start address equates 
+                      50     ;     <i>       (LCDDATASTART) must be set to the respective starting
+                      51     ;     <i>       addresses as mapped in TM52FXXXX if the memory is to be initialized.
+  0000                52     LCDDATALEN      EQU     0H      ; the length of XDATA memory in bytes to clear.
+                      53     ;
+                      54     ; <o> PDATASTART: PDATA memory start address <0x0-0xFFFF> 
+                      55     ;     <i> The absolute start address of PDATA memory
+  0000                56     PDATASTART      EQU     0H              ; the absolute start-address of PDATA memory
+A51 MACRO ASSEMBLER  STARTUP_TENX52                                                       04/10/2024 17:08:12 PAGE     2
+
+                      57     ;
+                      58     ; <o> PDATALEN: PDATA memory size <0x0-0xFF> 
+                      59     ;     <i> The length of PDATA memory in bytes.
+  0000                60     PDATALEN        EQU     0H              ; the length of PDATA memory in bytes to clear.
+                      61     ;
+                      62     ;</h>
+                      63     ;------------------------------------------------------------------------------
+                      64     ;
+                      65     ;<h> Reentrant Stack Initialization
+                      66     ;
+                      67     ;  The following EQU statements define the stack pointer for reentrant
+                      68     ;  functions and initialized it:
+                      69     ;
+                      70     ; <h> Stack Space for reentrant functions in the SMALL model.
+                      71     ;  <q> IBPSTACK: Enable SMALL model reentrant stack
+                      72     ;     <i> Stack space for reentrant functions in the SMALL model.
+  0000                73     IBPSTACK        EQU     0           ; set to 1 if small reentrant is used.
+                      74     ;  <o> IBPSTACKTOP: End address of SMALL model stack <0x0-0xFF>
+                      75     ;     <i> Set the top of the stack to the highest location.
+  0100                76     IBPSTACKTOP     EQU     0xFF +1     ; default 0FFH+1  
+                      77     ; </h>
+                      78     ;
+                      79     ; <h> Stack Space for reentrant functions in the LARGE model.      
+                      80     ;  <q> XBPSTACK: Enable LARGE model reentrant stack
+                      81     ;     <i> Stack space for reentrant functions in the LARGE model.
+  0000                82     XBPSTACK        EQU     0           ; set to 1 if large reentrant is used.
+                      83     ;  <o> XBPSTACKTOP: End address of LARGE model stack <0x0-0xFFFF>
+                      84     ;     <i> Set the top of the stack to the highest location.
+  0000                85     XBPSTACKTOP     EQU     0xFFFF +1   ; default 0FFFFH+1 
+                      86     ; </h>
+                      87     ;
+                      88     ; <h> Stack Space for reentrant functions in the COMPACT model.    
+                      89     ;  <q> PBPSTACK: Enable COMPACT model reentrant stack
+                      90     ;     <i> Stack space for reentrant functions in the COMPACT model.
+  0000                91     PBPSTACK        EQU     0           ; set to 1 if compact reentrant is used.
+                      92     ;
+                      93     ;   <o> PBPSTACKTOP: End address of COMPACT model stack <0x0-0xFFFF>
+                      94     ;     <i> Set the top of the stack to the highest location.
+  0100                95     PBPSTACKTOP     EQU     0xFF +1     ; default 0FFH+1  
+                      96     ;</h>
+                      97     ;</h>
+                      98     ;------------------------------------------------------------------------------
+                      99     ;
+                     100     ;  Memory Page for Using the Compact Model with 64 KByte xdata RAM
+                     101     ;  <e>Compact Model Page Definition
+                     102     ;
+                     103     ;  <i>Define the XDATA page used for PDATA variables. 
+                     104     ;  <i>PPAGE must conform with the PPAGE set in the linker invocation.
+                     105     ;
+                     106     ; Enable pdata memory page initalization
+  0000               107     PPAGEENABLE     EQU     0           ; set to 1 if pdata object are used.
+                     108     ;
+                     109     ; <o> PPAGE number <0x0-0xFF> 
+                     110     ; <i> uppermost 256-byte address of the page used for PDATA variables.
+  0000               111     PPAGE           EQU     0
+                     112     ;
+                     113     ; <o> SFR address which supplies uppermost address byte <0x0-0xFF> 
+                     114     ; <i> most 8051 variants use P2 as uppermost address byte
+  00A0               115     PPAGE_SFR       DATA    0A0H
+                     116     ;
+                     117     ; </e>
+                     118     ;; </e>
+                     119     ;;------------------------------------------------------------------------------
+                     120     
+                     121     ; Standard SFR Symbols 
+  00E0               122     ACC     DATA    0E0H
+A51 MACRO ASSEMBLER  STARTUP_TENX52                                                       04/10/2024 17:08:12 PAGE     3
+
+  00F0               123     B       DATA    0F0H
+  0081               124     SP      DATA    81H
+  0082               125     DPL     DATA    82H
+  0083               126     DPH     DATA    83H
+                     127     
+                     128                     NAME    ?C_STARTUP
+                     129     
+                     130     
+                     131     ?C_C51STARTUP   SEGMENT   CODE
+                     132     ?STACK          SEGMENT   IDATA
+                     133     
+----                 134                     RSEG    ?STACK
+0000                 135                     DS      1
+                     136     
+                     137                     EXTRN CODE (?C_START)
+                     138                     PUBLIC  ?C_STARTUP
+                     139     
+----                 140                     CSEG    AT      0E000H
+E000 020000   F      141     ?C_STARTUP:     LJMP    STARTUP1
+                     142     
+----                 143                     RSEG    ?C_C51STARTUP
+                     144     
+0000                 145     STARTUP1:
+                     146     
+                     147     IF IDATALEN <> 0
+0000 787F            148                     MOV     R0,#IDATALEN - 1
+0002 E4              149                     CLR     A
+0003 F6              150     IDATALOOP:      MOV     @R0,A
+0004 D8FD            151                     DJNZ    R0,IDATALOOP
+                     152     ENDIF
+                     153     
+                     154     IF XDATALEN <> 0
+                                             MOV     DPTR,#(XDATAEND-XDATALEN)+1
+                                             MOV     R7,#LOW (XDATALEN)
+                               IF (LOW (XDATALEN)) <> 0
+                                             MOV     R6,#(HIGH (XDATALEN)) +1
+                               ELSE
+                                             MOV     R6,#HIGH (XDATALEN)
+                               ENDIF
+                                             CLR     A
+                             XDATALOOP:      MOVX    @DPTR,A
+                                             INC     DPTR
+                                             DJNZ    R7,XDATALOOP
+                                             DJNZ    R6,XDATALOOP
+                             ENDIF
+                     168     
+                     169     IF LCDDATALEN <> 0
+                                             MOV     DPTR,#LCDDATASTART
+                                             MOV     R7,#LCDDATALEN
+                                             CLR     A
+                             LCDDATALOOP:    MOVX    @DPTR,A
+                                             INC     DPTR
+                                             DJNZ    R7,LCDDATALOOP
+                             ENDIF
+                     177     
+                     178     
+                     179     IF PPAGEENABLE <> 0
+                                             MOV     PPAGE_SFR,#PPAGE
+                             ENDIF
+                     182     
+                     183     IF PDATALEN <> 0
+                                             MOV     R0,#LOW (PDATASTART)
+                                             MOV     R7,#LOW (PDATALEN)
+                                             CLR     A
+                             PDATALOOP:      MOVX    @R0,A
+                                             INC     R0
+A51 MACRO ASSEMBLER  STARTUP_TENX52                                                       04/10/2024 17:08:12 PAGE     4
+
+                                             DJNZ    R7,PDATALOOP
+                             ENDIF
+                     191     
+                     192     IF IBPSTACK <> 0
+                             EXTRN DATA (?C_IBP)
+                             
+                                             MOV     ?C_IBP,#LOW IBPSTACKTOP
+                             ENDIF
+                     197     
+                     198     IF XBPSTACK <> 0
+                             EXTRN DATA (?C_XBP)
+                             
+                                             MOV     ?C_XBP,#HIGH XBPSTACKTOP
+                                             MOV     ?C_XBP+1,#LOW XBPSTACKTOP
+                             ENDIF
+                     204     
+                     205     IF PBPSTACK <> 0
+                             EXTRN DATA (?C_PBP)
+                                             MOV     ?C_PBP,#LOW PBPSTACKTOP
+                             ENDIF
+                     209     
+0006 758100   F      210                     MOV     SP,#?STACK-1  ; init SP for hardware stack 
+                     211     
+                     212     ; This code is required if you use L51_BANK.A51 with Banking Mode 4
+                     213     ;<h> Code Banking
+                     214     ; <q> Select Bank 0 for L51_BANK.A51 Mode 4
+                     215     
+                             
+                             
+                                             
+                             
+                     220     ;</h>
+0009 020000   F      221                     LJMP    ?C_START    ;call main() function in the C code
+                     222     
+                     223                     END
+A51 MACRO ASSEMBLER  STARTUP_TENX52                                                       04/10/2024 17:08:12 PAGE     5
+
+SYMBOL TABLE LISTING
+------ ----- -------
+
+
+N A M E             T Y P E  V A L U E   ATTRIBUTES
+
+?C_C51STARTUP. . .  C SEG    000CH       REL=UNIT
+?C_START . . . . .  C ADDR   -----       EXT
+?C_STARTUP . . . .  C ADDR   E000H   A   
+?STACK . . . . . .  I SEG    0001H       REL=UNIT
+ACC. . . . . . . .  D ADDR   00E0H   A   
+B. . . . . . . . .  D ADDR   00F0H   A   
+DPH. . . . . . . .  D ADDR   0083H   A   
+DPL. . . . . . . .  D ADDR   0082H   A   
+IBPSTACK . . . . .  N NUMB   0000H   A   
+IBPSTACKTOP. . . .  N NUMB   0100H   A   
+IDATALEN . . . . .  N NUMB   0080H   A   
+IDATALOOP. . . . .  C ADDR   0003H   R   SEG=?C_C51STARTUP
+LCDDATALEN . . . .  N NUMB   0000H   A   
+LCDDATASTART . . .  N NUMB   F000H   A   
+PBPSTACK . . . . .  N NUMB   0000H   A   
+PBPSTACKTOP. . . .  N NUMB   0100H   A   
+PDATALEN . . . . .  N NUMB   0000H   A   
+PDATASTART . . . .  N NUMB   0000H   A   
+PPAGE. . . . . . .  N NUMB   0000H   A   
+PPAGEENABLE. . . .  N NUMB   0000H   A   
+PPAGE_SFR. . . . .  D ADDR   00A0H   A   
+SP . . . . . . . .  D ADDR   0081H   A   
+STARTUP1 . . . . .  C ADDR   0000H   R   SEG=?C_C51STARTUP
+XBPSTACK . . . . .  N NUMB   0000H   A   
+XBPSTACKTOP. . . .  N NUMB   0000H   A   
+XDATAEND . . . . .  N NUMB   FFFFH   A   
+XDATALEN . . . . .  N NUMB   0000H   A   
+
+
+REGISTER BANK(S) USED: 0 
+
+
+ASSEMBLY COMPLETE.  0 WARNING(S), 0 ERROR(S)

+ 366 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Listings/iap.lst

@@ -0,0 +1,366 @@
+C51 COMPILER V9.53.0.0   IAP                                                               04/10/2024 17:08:13 PAGE 1   
+
+
+C51 COMPILER V9.53.0.0, COMPILATION OF MODULE IAP
+OBJECT MODULE PLACED IN .\Objects\iap.obj
+COMPILER INVOKED BY: C:\Keil_v5_51\C51\BIN\C51.EXE src\iap.c LARGE OPTIMIZE(6,SPEED) REGFILE(.\Objects\uboot.ORC) BROWSE
+                    - INTVECTOR(0XE000) INCDIR(.\src) DEBUG OBJECTEXTEND PRINT(.\Listings\iap.lst) TABS(2) OBJECT(.\Objects\iap.obj)
+
+line level    source
+
+   1          #include <REGtenxTM52F1386.H>
+   2          #include "CRC.h" 
+   3          #include "iap.h"
+   4          
+   5          //以下两个指针必须是xdata类型
+   6          unsigned char xdata *p_info_addr;          //指向信息存储器区域 - 读写
+   7          unsigned char xdata *p_write_app_addr;     //指向app区域 - 写
+   8          unsigned char code  *p_read_app_addr;      //指向app区域 - 读
+   9          
+  10          static  bit iap_flag=0;     //0:正常   1:异常
+  11          
+  12          _ota_mcu_fw ota_fw_info;
+  13          
+  14          /******************************************************************************************
+  15          ** 函数名称: erasure_INFO_page
+  16          ** 函数描述: 擦除信息存储器区域的一页数据
+  17          ** 输入参数: 地址
+  18          ** 输出参数: 状态:0 正常, 1 异常
+  19          *******************************************************************************************/
+  20          static bit erasure_INFO_page(unsigned int addr)
+  21          {
+  22   1        unsigned char temp_ea;
+  23   1        
+  24   1        if(addr < 0x800)       //INFO区 5~8,用户可写
+  25   1        {
+  26   2          return 1;            //返回异常值
+  27   2        }
+  28   1        
+  29   1        iap_flag = 0;          //iap_flag标志清零
+  30   1        
+  31   1        temp_ea = EA;
+  32   1        EA = 0;
+  33   1        
+  34   1        LVRCON = LVRCON|0x10;  //关闭LVR
+  35   1        
+  36   1        p_info_addr = (unsigned char *)addr;
+  37   1        
+  38   1        AUX2 = AUX2&0xF9|0x06; //设置IAP超时时间
+  39   1        
+  40   1        //写入0XA1和0xBA, 开启 INFO 区域擦除  
+  41   1        IAPWE_SFR=0XA1;
+  42   1        IAPWE_SFR=0XBA; 
+  43   1        
+  44   1        //INFO区域不需要设置 SWCMD 寄存器
+  45   1        
+  46   1        *p_info_addr = 0;      //触发页擦除
+  47   1        
+  48   1        if(IAPWE_SFR & IAPTO)  //置位表示超时
+  49   1        {
+  50   2          iap_flag = 1;        //iap_flag标志置位
+  51   2        }
+  52   1        
+  53   1        AUX2 = AUX2&0xF9;      //关闭IAP看门狗
+  54   1        IAPWE_SFR = 0x00;      //禁止IAP擦除
+C51 COMPILER V9.53.0.0   IAP                                                               04/10/2024 17:08:13 PAGE 2   
+
+  55   1        SWCMD = 0x00;          //关闭IAP权限
+  56   1        
+  57   1        LVRCON = LVRCON&~0x10; //开启LVR
+  58   1        
+  59   1        EA = temp_ea; 
+  60   1        
+  61   1        return  iap_flag;
+  62   1      }
+  63          
+  64          /******************************************************************************************
+  65          ** 函数名称: read_INFO_byte
+  66          ** 函数描述: 读取信息存储器区域的数据
+  67          ** 输入参数: 地址 数组的首地址、长度 
+  68          ** 输出参数: 无
+  69          *******************************************************************************************/
+  70          static void read_INFO_byte(unsigned int addr, unsigned char *buf, unsigned int len)
+  71          {
+  72   1        unsigned int i;
+  73   1        
+  74   1        p_info_addr =(unsigned char*)addr;
+  75   1        
+  76   1        for(i = 0; i<len; i++)
+  77   1        {
+  78   2          buf[i] = *p_info_addr;
+  79   2          p_info_addr++;  
+  80   2        }
+  81   1      }
+  82          
+  83          /******************************************************************************************
+  84          ** 函数名称: write_INFO_byte
+  85          ** 函数描述: 写入信息存储器区域的数据
+  86          ** 输入参数: 地址 数组的首地址、长度 
+  87          ** 输出参数: 状态:0 正常, 1 异常
+  88          *******************************************************************************************/
+  89          static bit write_INFO_byte(unsigned int addr, unsigned char *buf, unsigned int len)
+  90          {
+  91   1        unsigned char temp_ea;
+  92   1        unsigned int i;
+  93   1        
+  94   1        iap_flag = 0;           //iap_flag标志清零
+  95   1        
+  96   1        temp_ea = EA;
+  97   1        EA = 0;
+  98   1        
+  99   1        LVRCON = LVRCON|0x10;   //关闭LVR
+ 100   1        
+ 101   1        p_info_addr = (unsigned char *)addr;
+ 102   1        
+ 103   1        AUX2 = AUX2&0xF9|0x06;  //设置IAP超时时间
+ 104   1        
+ 105   1        //写入0XA1和0X4C, 开启 INFO 区域擦除  
+ 106   1        IAPWE_SFR=0XA1;
+ 107   1        IAPWE_SFR=0X4C; 
+ 108   1        
+ 109   1        //INFO区域不需要设置 SWCMD 寄存器
+ 110   1        for(i = 0; i<len; i++)
+ 111   1        {
+ 112   2          *p_info_addr = buf[i];//触发写
+ 113   2          p_info_addr++;
+ 114   2        }
+ 115   1        
+ 116   1        if(IAPWE_SFR & IAPTO)   //置位表示超时
+C51 COMPILER V9.53.0.0   IAP                                                               04/10/2024 17:08:13 PAGE 3   
+
+ 117   1        {
+ 118   2          iap_flag = 1;         //iap_flag标志置位
+ 119   2        }
+ 120   1        
+ 121   1        AUX2 = AUX2&0xF9;       //关闭IAP看门狗
+ 122   1        IAPWE_SFR = 0x00;       //禁止IAP擦除
+ 123   1        SWCMD = 0x00;           //关闭IAP权限
+ 124   1        
+ 125   1        LVRCON = LVRCON&~0x10;  //开启LVR
+ 126   1        
+ 127   1        EA = temp_ea; 
+ 128   1        
+ 129   1        return  iap_flag; 
+ 130   1      }
+ 131          
+ 132          /******************************************************************************************
+ 133          ** 函数名称: user_write_INFO_byte
+ 134          ** 函数描述: 存储INFO数据的函数,供用户使用
+ 135          ** 输入参数: 地址 数组的首地址、长度 
+ 136          ** 输出参数: 状态:0 正常, 1 异常
+ 137          *******************************************************************************************/
+ 138          bit user_write_INFO_byte(unsigned int addr, unsigned char *buf, unsigned int len)
+ 139          {
+ 140   1        bit flag=0;
+ 141   1        unsigned int crc_write=0,crc_read=0;
+ 142   1        
+ 143   1        //页首地址才会执行页擦除,一页512byte
+ 144   1        if(addr==0 || ((addr%0x200)==0))    
+ 145   1        {
+ 146   2          flag = erasure_INFO_page(addr);    
+ 147   2          if(flag)  return  flag;         //异常就返回
+ 148   2        }
+ 149   1        
+ 150   1        //先擦除页,再写入数据
+ 151   1        flag = write_INFO_byte(addr,buf,len);
+ 152   1        if(flag)  return  flag;           //异常就返回
+ 153   1        crc_write = crc_calcu(buf,len);   //计算写之前的CRC值
+ 154   1        
+ 155   1        //读出比较CRC值
+ 156   1        read_INFO_byte(addr,buf,len);
+ 157   1        crc_read = crc_calcu(buf,len);    //从flash里读出数据,在计算CRC值
+ 158   1        
+ 159   1        if(crc_write != crc_read)         //判断读写的数据是否一致
+ 160   1        {
+ 161   2          flag = 1; 
+ 162   2        }
+ 163   1        
+ 164   1        return  flag;
+ 165   1      }
+ 166          
+ 167          /******************************************************************************************
+ 168          ** 函数名称: user_read_INFO_byte
+ 169          ** 函数描述: 读INFO数据的函数,供用户使用
+ 170          ** 输入参数: 地址 数组的首地址、长度 
+ 171          ** 输出参数: 无
+ 172          *******************************************************************************************/
+ 173          void user_read_INFO_byte(unsigned int addr, unsigned char *buf, unsigned int len)
+ 174          {
+ 175   1        read_INFO_byte(addr, buf,len);  
+ 176   1      }
+ 177          
+ 178          /******************************************************************************************
+C51 COMPILER V9.53.0.0   IAP                                                               04/10/2024 17:08:13 PAGE 4   
+
+ 179          ** 函数名称: erasure_APP_page
+ 180          ** 函数描述: 擦除信app区域的一页数据
+ 181          ** 输入参数: 地址
+ 182          ** 输出参数: 状态:0 正常, 1 异常
+ 183          *******************************************************************************************/
+ 184          static bit erasure_APP_page(unsigned int addr)
+ 185          {
+ 186   1        unsigned char temp_ea;
+ 187   1        
+ 188   1        iap_flag = 0;           //iap_flag标志清零
+ 189   1        
+ 190   1        temp_ea = EA;
+ 191   1        EA = 0;
+ 192   1        
+ 193   1        LVRCON = LVRCON|0x10;   //关闭LVR
+ 194   1        
+ 195   1        p_write_app_addr = (unsigned char *)addr;
+ 196   1        
+ 197   1        AUX2 = AUX2&0xF9|0x06;  //设置IAP超时时间
+ 198   1        
+ 199   1        //写入0xE2和0xBA, 开启APP 区域擦除  
+ 200   1        IAPWE_SFR=0XE2;
+ 201   1        IAPWE_SFR=0XBA; 
+ 202   1        
+ 203   1        //写入0x65和0xA7,开启APP区域擦除和写入权限
+ 204   1        SWCMD=0x65;   
+ 205   1        SWCMD=0xA7;
+ 206   1        
+ 207   1        *p_write_app_addr = 0;  //触发页擦除
+ 208   1        
+ 209   1        if(IAPWE_SFR & IAPTO)   //置位表示超时
+ 210   1        {
+ 211   2          iap_flag = 1;         //iap_flag标志置位
+ 212   2        }
+ 213   1        
+ 214   1        AUX2 = AUX2&0xF9;       //关闭IAP看门狗
+ 215   1        IAPWE_SFR = 0x00;       //禁止IAP擦除
+ 216   1        SWCMD = 0x00;           //关闭IAP权限
+ 217   1        
+ 218   1        LVRCON = LVRCON&~0x10;  //开启LVR
+ 219   1        
+ 220   1        EA = temp_ea; 
+ 221   1        
+ 222   1        return  iap_flag;
+ 223   1      }
+ 224          
+ 225          /******************************************************************************************
+ 226          ** 函数名称: read_APP_byte
+ 227          ** 函数描述: 读取APP区域的数据
+ 228          ** 输入参数: 地址 数组的首地址、长度 
+ 229          ** 输出参数: 无
+ 230          *******************************************************************************************/
+ 231          void read_APP_byte(unsigned int addr, unsigned char *buf, unsigned int len)
+ 232          {
+ 233   1        unsigned int i;
+ 234   1        
+ 235   1        p_read_app_addr =(unsigned char*)addr;
+ 236   1        
+ 237   1        for(i = 0; i<len; i++)
+ 238   1        {
+ 239   2          buf[i] = *p_read_app_addr;
+ 240   2          p_read_app_addr++;  
+C51 COMPILER V9.53.0.0   IAP                                                               04/10/2024 17:08:13 PAGE 5   
+
+ 241   2        }
+ 242   1      }
+ 243          
+ 244          /******************************************************************************************
+ 245          ** 函数名称: write_APP_byte
+ 246          ** 函数描述: 写入APP的数据
+ 247          ** 输入参数: 地址 数组的首地址、长度 
+ 248          ** 输出参数: 状态:0 正常, 1 异常
+ 249          *******************************************************************************************/
+ 250          static bit write_APP_byte(unsigned int addr, unsigned char *buf, unsigned int len)
+ 251          {
+ 252   1        unsigned char temp_ea;
+ 253   1        unsigned int i;
+ 254   1        
+ 255   1        iap_flag = 0;           //iap_flag标志清零
+ 256   1        
+ 257   1        temp_ea = EA;
+ 258   1        EA = 0;
+ 259   1        
+ 260   1        LVRCON = LVRCON|0x10;   //关闭LVR
+ 261   1        
+ 262   1        p_write_app_addr = (unsigned char *)addr;
+ 263   1        
+ 264   1        AUX2 = AUX2&0xF9|0x06;  //设置IAP超时时间
+ 265   1        
+ 266   1        //写入0xE2和0X4C, 开启APP 区域擦除  
+ 267   1        IAPWE_SFR=0XE2;
+ 268   1        IAPWE_SFR=0X4C; 
+ 269   1        
+ 270   1        //写入0x65和0xA7,开启APP区域擦除和写入权限
+ 271   1        SWCMD=0x65;   
+ 272   1        SWCMD=0xA7;
+ 273   1        
+ 274   1        for(i = 0; i<len; i++)
+ 275   1        {
+ 276   2          *p_write_app_addr = buf[i];     //触发写
+ 277   2          p_write_app_addr++;
+ 278   2        }
+ 279   1        
+ 280   1        if(IAPWE_SFR & IAPTO)   //置位表示超时
+ 281   1        {
+ 282   2          iap_flag = 1;         //iap_flag标志置位
+ 283   2        }
+ 284   1        
+ 285   1        AUX2 = AUX2&0xF9;       //关闭IAP看门狗
+ 286   1        IAPWE_SFR = 0x00;       //禁止IAP擦除
+ 287   1        SWCMD = 0x00;           //关闭IAP权限
+ 288   1        
+ 289   1        LVRCON = LVRCON&~0x10;  //开启LVR
+ 290   1        
+ 291   1        EA = temp_ea; 
+ 292   1        
+ 293   1        return  iap_flag; 
+ 294   1      }
+ 295          
+ 296          /******************************************************************************************
+ 297          ** 函数名称: user_write_APP_byte
+ 298          ** 函数描述: 存储APP数据的函数,供用户使用
+ 299          ** 输入参数: 地址 数组的首地址、长度 
+ 300          ** 输出参数: 状态:0 正常, 1 异常
+ 301          *******************************************************************************************/
+ 302          bit user_write_APP_byte(unsigned int addr, unsigned char *buf, unsigned int len)
+C51 COMPILER V9.53.0.0   IAP                                                               04/10/2024 17:08:13 PAGE 6   
+
+ 303          {
+ 304   1        bit flag=0;
+ 305   1        unsigned int crc_write=0,crc_read=0;
+ 306   1        
+ 307   1        //页首地址才会执行页擦除
+ 308   1        if(addr==0 || ((addr%0x200)==0))    
+ 309   1        {
+ 310   2          flag = erasure_APP_page(addr);    
+ 311   2          if(flag)  return  flag;         //异常就返回
+ 312   2        }
+ 313   1        
+ 314   1        //先擦除页,再写入数据
+ 315   1        flag = write_APP_byte(addr,buf,len);
+ 316   1        if(flag)  return  flag;           //异常就返回
+ 317   1        crc_write = crc_calcu(buf,len);   //计算写之前的CRC值
+ 318   1        
+ 319   1        //读出比较CRC值
+ 320   1        read_APP_byte(addr,buf,len);
+ 321   1        crc_read = crc_calcu(buf,len);    //从flash里读出数据,在计算CRC值
+ 322   1        
+ 323   1        if(crc_write != crc_read)
+ 324   1        {
+ 325   2          flag = 1; 
+ 326   2        }
+ 327   1        
+ 328   1        return  flag;
+ 329   1      }
+ 330          
+ 331          
+ 332          
+
+
+MODULE INFORMATION:   STATIC OVERLAYABLE
+   CODE SIZE        =   1117    ----
+   CONSTANT SIZE    =   ----    ----
+   XDATA SIZE       =     27      63
+   PDATA SIZE       =   ----    ----
+   DATA SIZE        =   ----    ----
+   IDATA SIZE       =   ----    ----
+   BIT SIZE         =      1       2
+END OF MODULE INFORMATION.
+
+
+C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

Разлика између датотеке није приказан због своје велике величине
+ 1365 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Listings/main.ls1


+ 550 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Listings/main.lst

@@ -0,0 +1,550 @@
+C51 COMPILER V9.53.0.0   MAIN                                                              04/10/2024 17:08:13 PAGE 1   
+
+
+C51 COMPILER V9.53.0.0, COMPILATION OF MODULE MAIN
+OBJECT MODULE PLACED IN .\Objects\main.obj
+COMPILER INVOKED BY: C:\Keil_v5_51\C51\BIN\C51.EXE src\main.c LARGE OPTIMIZE(6,SPEED) REGFILE(.\Objects\uboot.ORC) BROWS
+                    -E INTVECTOR(0XE000) INCDIR(.\src) DEBUG OBJECTEXTEND PRINT(.\Listings\main.lst) TABS(2) OBJECT(.\Objects\main.obj)
+
+line level    source
+
+   1          #include <REGtenxTM52F1386.h>
+   2          #include "TM52F1386_bsp.h"
+*** WARNING C318 IN LINE 2 OF src\main.c: can't open file 'TM52F1386_bsp.h'
+   3          #include <intrins.h>
+   4          #include "iap.h"
+   5          #include "uart.h"
+   6          #include "main.h"
+   7          
+   8          /*********************   全局变量    *******************************/
+   9          unsigned char flag_1ms = 0;        // 1ms时基
+  10          unsigned char up_flag = 0;         // 升级标志 1:升级成功
+  11          unsigned char up_flag_delay = 0;         // 升级标志 1:升级成功延时50ms启动切换
+  12          unsigned char CheckBuf[24] = {0};  // 读取升级标记的数组
+  13          unsigned char FlashBuf[256] = {0}; // flash搬迁
+  14          unsigned char download_flag = 0;   // 下载固件标志,默认为1,如果开机去读到参数区升级参数,则置1,表示升级
+             -中
+  15          
+  16          unsigned char flag_err = 0; // OTA异常标识
+  17          
+  18          union_u32_t file_len = {0}; // 升级文件总长度
+  19          long int rec_len = 0;       // 已接收的长度
+  20          
+  21          unsigned char unprocessed_cnt = 0;            // 接收到的帧未处理的次数
+  22          unsigned char processed_cnt = 0;              // 接收到的帧已处理的次数
+  23          unsigned char first_addr = 0;                 // 帧首下标
+  24          unsigned int unprocessed_frame_len[10] = {0}; // 最多一次接收十帧
+  25          
+  26          // 产品信息,需要根据客户自己的产品调整,这里只做演示效果
+  27          unsigned char product_inof[] = {"{\"p\":\"dc4slgded6m69crh\", \"v\":\"1.0.1\", \"m\":2,\"mt\":10,\"n\":0,\
+             -"ir\":\"5.12\", \"low\":0}"};
+  28          /**********************   宏定义    ********************************/
+  29          #define INFO5_ADDR 0X800 // 信息存储器INFO5地址
+  30          
+  31          #define delay_10nop() \
+  32            do                  \
+  33            {                   \
+  34              _nop_();          \
+  35              _nop_();          \
+  36              _nop_();          \
+  37              _nop_();          \
+  38              _nop_();          \
+  39              _nop_();          \
+  40              _nop_();          \
+  41              _nop_();          \
+  42              _nop_();          \
+  43              _nop_();          \
+  44            } while (0)
+  45          
+  46          /*******************************************************************
+  47          ** 函数名称: bsp_clock_init
+  48          ** 函数描述: 时钟初始化
+  49          ** 输入参数: 无
+  50          ** 输出参数: 无
+  51          *******************************************************************/
+C51 COMPILER V9.53.0.0   MAIN                                                              04/10/2024 17:08:13 PAGE 2   
+
+  52          void bsp_clock_init()
+  53          {
+  54   1        SELFCK = 0; // 切换到慢时钟
+  55   1      
+  56   1        CLKCON = 0x03; // 时钟一分频
+  57   1      
+  58   1        delay_10nop();
+  59   1        STPPCK = 0; // 开启部分模块使用快时钟
+  60   1        delay_10nop();
+  61   1        STPFCK = 0; // 开启快时钟
+  62   1        delay_10nop();
+  63   1        SELFCK = 1; // 切换到快时钟
+  64   1        delay_10nop();
+  65   1      }
+  66          
+  67          /*******************************************************************
+  68          ** 函数名称: Timer0_Init
+  69          ** 函数描述: tim0初始化函数
+  70          ** 输入参数: 无
+  71          ** 输出参数: 无
+  72          **  说 明  : 定时1ms
+  73          *******************************************************************/
+  74          void Timer0_Init(void)
+  75          {
+  76   1        TMOD = (TMOD & ~0x03) | 0x01;
+  77   1      
+  78   1        TH0 = (65536 - 9216) / 256; // timer0 高字节数据
+  79   1        TL0 = (65536 - 9216) % 256; // timer0 低字节数据
+  80   1        ET0 = 1;                    // timer0 中断使能
+  81   1        TR0 = 1;                    // timer0 运行控制
+  82   1      }
+  83          
+  84          /*******************************************************************
+  85          ** 函数名称: LVR_Init
+  86          ** 函数描述: LVR初始化函数
+  87          ** 输入参数: 无
+  88          ** 输出参数: 无
+  89          **  说 明  : 电压低于设定值,MCU即复位
+  90          *******************************************************************/
+  91          void LVR_Init(void)
+  92          {
+  93   1        LVRCON = LVRCON & ~0X07 | 0X04; // LVR设置为3.2V
+  94   1      }
+  95          
+  96          /*******************************************************************
+  97          ** 函数名称: gpio_init
+  98          ** 函数描述: 引脚初始化
+  99          ** 输入参数: 无
+ 100          ** 输出参数: 无
+ 101          *******************************************************************/
+ 102          void gpio_init()
+ 103          {
+ 104   1        PORTIDX = 1;
+ 105   1        PINMOD76 = PINMOD76 & 0x0f | 0x60; //
+ 106   1        P1_7 = 1;
+ 107   1        //
+ 108   1      
+ 109   1        PORTIDX = 3;
+ 110   1        PINMOD76 = PINMOD76 & 0x0f | 0x00; // P3.7配置为上拉输入
+ 111   1        P3_7 = 1;                          // 低有效
+ 112   1      }
+ 113          
+C51 COMPILER V9.53.0.0   MAIN                                                              04/10/2024 17:08:13 PAGE 3   
+
+ 114          /*******************************************************************
+ 115          ** 函数名称: uart_process
+ 116          ** 函数描述: 串口接收到数据进程处理
+ 117          ** 输入参数: 无
+ 118          ** 输出参数: 无
+ 119          *******************************************************************/
+ 120          void uart_process(unsigned char *P_recv, unsigned int frame_len)
+ 121          {
+ 122   1        unsigned char command = 0;      // 命令字
+ 123   1        unsigned char verify_value = 0; // 检验值
+ 124   1        unsigned char str_len = 0;      // 字符串长度
+ 125   1        unsigned int i = 0, len = 0;
+ 126   1        long int fw_offset = 0;
+ 127   1        static long int current_checksum = 0;
+ 128   1        char fw_data[FW_SINGLE_PACKET_SIZE] = {-1}; //
+ 129   1        unsigned char last_package_len = 0;
+ 130   1      
+ 131   1        // 校验值,字节和校验
+ 132   1        for (i = 0; i < (frame_len - 1); i++)
+ 133   1        {
+ 134   2          verify_value += *(P_recv + i);
+ 135   2        }
+ 136   1      
+ 137   1        if (verify_value != *(P_recv + frame_len - 1))
+ 138   1          return; // 校验不对,返回
+ 139   1        if ((*(P_recv + 0) != 0x55) || (*(P_recv + 1) != 0xaa))
+ 140   1          return;                                   // 帧头不对,返回
+ 141   1        len = (*(P_recv + 6) << 8) + *(P_recv + 7); // 帧里的数据长度
+ 142   1        if (frame_len != (6 + len + 1 + 2))
+ 143   1          return; // 长度不对,返回
+ 144   1      
+ 145   1        command = *(P_recv + 5); // 命令字
+ 146   1        switch (command)
+ 147   1        {
+ 148   2        case 0x00: // WIFI心跳包-取消
+ 149   2          //    if(first_poweron_falg)
+ 150   2          //    {
+ 151   2          //     first_poweron_falg = 0;
+ 152   2          //     uart_send_data(0x03,command,1,0x00);     //MCU重启后首次回复心跳包,必须回复0x00
+ 153   2          //    }
+ 154   2          //    else
+ 155   2          { // del by zzw 20240328
+ 156   3            // uart_send_data(0x03, command, 1, 0x01); // 除首次外,必须回复0x01
+ 157   3          }
+ 158   2      
+ 159   2          break;
+ 160   2      
+ 161   2        case 0x01: // 查询产品信息--后期添加
+ 162   2          //    str_len = sizeof(product_inof);
+ 163   2          //    uart_send_product(0x03,command,str_len,product_inof);
+ 164   2          break;
+ 165   2        case 0x02: // 获取设备联网状态信息--后期添加
+ 166   2      
+ 167   2          break;
+ 168   2        case 0x0B: // OTA版本请求指令--后期添加
+ 169   2      
+ 170   2          break;
+ 171   2        case 0x0C: // OTA升级请求--后期添加
+ 172   2      
+ 173   2          break;
+ 174   2      
+ 175   2        case 0x0d: // 固件包传输
+C51 COMPILER V9.53.0.0   MAIN                                                              04/10/2024 17:08:13 PAGE 4   
+
+ 176   2          // user_write_APP_byte(unsigned int addr, unsigned char *buf, unsigned int len);
+ 177   2          //  ota_fw_info.mcu_ota_fw_size 为数据包总长度,即OTA文件大小
+ 178   2          if (rec_len < ota_fw_info.mcu_ota_fw_size)
+ 179   2          {
+ 180   3            /*******************增加数据处理部分 add qys start *****************************************/
+ 181   3            if (*(P_recv + 8) == 0x01) // status check
+ 182   3              return;
+ 183   3            i = 0;
+ 184   3            while (i < 8)
+ 185   3            {
+ 186   4              if (ota_fw_info.mcu_ota_pid[i] != *(P_recv + 9 + i)) // pid check
+ 187   4                return;
+ 188   4              i++;
+ 189   4            }
+ 190   3            if (ota_fw_info.mcu_ota_ver != *(P_recv + 17)) // version check
+ 191   3              return;
+ 192   3      
+ 193   3            i = 0;
+ 194   3            while (i < 4)
+ 195   3            {
+ 196   4              fw_offset |= (*(P_recv + 18 + i) << (24 - i * 8)); // offset
+ 197   4              i++;
+ 198   4            }
+ 199   3      
+ 200   3            i = 0;
+ 201   3            if (ota_fw_info.mcu_current_offset == fw_offset)
+ 202   3            {
+ 203   4              if (((ota_fw_info.mcu_ota_fw_size - fw_offset) / FW_SINGLE_PACKET_SIZE != 0) && (ota_fw_info.mcu_o
+             -ta_fw_size != (fw_offset + FW_SINGLE_PACKET_SIZE)))
+ 204   4              {
+ 205   5                if (ota_fw_info.mcu_current_offset == 0)
+ 206   5                {
+ 207   6                  current_checksum = 0;
+ 208   6                }
+ 209   5                while (i < FW_SINGLE_PACKET_SIZE)
+ 210   5                {
+ 211   6                  fw_data[i] = *(P_recv + 22 + i); // fw data
+ 212   6                  current_checksum += fw_data[i];
+ 213   6                  i++;
+ 214   6                }
+ 215   5                ota_fw_info.mcu_current_offset += FW_SINGLE_PACKET_SIZE;
+ 216   5                //      ota_fw_data_handle(fw_offset, &fw_data[0], FW_SINGLE_PACKET_SIZE); // OTA paket data handle
+ 217   5              }
+ 218   4              else
+ 219   4              {
+ 220   5                i = 0;
+ 221   5                if ((ota_fw_info.mcu_ota_fw_size - fw_offset) % FW_SINGLE_PACKET_SIZE != 0)
+ 222   5                {
+ 223   6                  last_package_len = ota_fw_info.mcu_ota_fw_size - fw_offset;
+ 224   6                }
+ 225   5                else
+ 226   5                {
+ 227   6                  last_package_len = FW_SINGLE_PACKET_SIZE;
+ 228   6                }
+ 229   5                while (i < last_package_len)
+ 230   5                {
+ 231   6                  fw_data[i] = *(P_recv + 22 + i); // fw data
+ 232   6                  current_checksum += fw_data[i];
+ 233   6                  i++;
+ 234   6                }
+ 235   5                ota_fw_info.mcu_current_offset += last_package_len;
+ 236   5                if (ota_fw_info.mcu_ota_checksum != current_checksum)
+C51 COMPILER V9.53.0.0   MAIN                                                              04/10/2024 17:08:13 PAGE 5   
+
+ 237   5                {
+ 238   6                  // ota failure report ota failure and clear ota struct
+ 239   6                  mcu_ota_result_report(1); // failed
+ 240   6                }
+ 241   5                else
+ 242   5                {
+ 243   6                  // ota sucess
+ 244   6                  mcu_ota_result_report(0); // seccess
+ 245   6                }
+ 246   5                //  ota_fw_data_handle(fw_offset, &fw_data[0], last_package_len); // OTA paket data handle
+ 247   5                current_checksum = 0;
+ 248   5              }
+ 249   4            }
+ 250   3      
+ 251   3            flag_err = user_write_APP_byte(rec_len + BACKUP_ADDR, &fw_data[0], len - 14); // modified by zzw 202
+             -40328
+ 252   3            /*******************增加数据处理部分 add qys end *****************************************/
+ 253   3            rec_len += (len - 14);
+ 254   3            mcu_ota_fw_request();
+*** WARNING C206 IN LINE 254 OF src\main.c: 'mcu_ota_fw_request': missing function-prototype
+ 255   3          }
+ 256   2          if (rec_len == ota_fw_info.mcu_ota_fw_size) // 长度相等,说明接收结束
+ 257   2          {
+ 258   3            /*CheckBuf[0] = 0x00;
+ 259   3            CheckBuf[1] = 0x00;
+ 260   3            CheckBuf[2] = 0x00;
+ 261   3            flag_err = user_write_INFO_byte(INFO5_ADDR, CheckBuf, 3); // 擦除升级标志*/
+ 262   3            
+ 263   3            up_flag = 1; // 升级成功
+ 264   3          }
+ 265   2      
+ 266   2          break;
+ 267   2        case 0x0e:     // 升级成功
+ 268   2          up_flag = 1; // 升级成功
+ 269   2          break;
+ 270   2      
+ 271   2        default:
+ 272   2          break;
+ 273   2        }
+ 274   1      }
+ 275          
+ 276          /*******************************************************************
+ 277          ** 函数名称: frame_splitting
+ 278          ** 函数描述: 一段帧数据分割
+ 279          ** 输入参数: 无
+ 280          ** 输出参数: 无
+ 281          *******************************************************************/
+ 282          void frame_splitting()
+ 283          {
+ 284   1        unsigned char cur_addr = 0, cur_addr_old = 0xff; // 匹配帧头的下标地址
+ 285   1        unsigned int i = 0;
+ 286   1      
+ 287   1        first_addr = 0;                            // 帧首下标清零
+ 288   1        processed_cnt = 0;                         // 已处理次数清零
+ 289   1        unprocessed_cnt = 0;                       // 未处理次数清零
+ 290   1        for (i = 0; i < (com0recv_index - 1); i++) // 查询是否多条一起发
+ 291   1        {
+ 292   2          if ((com0recv[i] == 0x55) && (com0recv[i + 1] == 0xaa))
+ 293   2          {
+ 294   3            unprocessed_cnt++;
+ 295   3            cur_addr = i;
+ 296   3            if (cur_addr_old != cur_addr) // 第一次不算,其他次发现帧头计算上一帧长度
+C51 COMPILER V9.53.0.0   MAIN                                                              04/10/2024 17:08:13 PAGE 6   
+
+ 297   3            {
+ 298   4              if (unprocessed_cnt > 1)
+ 299   4              {
+ 300   5                unprocessed_frame_len[unprocessed_cnt - 2] = cur_addr - cur_addr_old;   // 更新上一帧的长度
+ 301   5                unprocessed_frame_len[unprocessed_cnt - 1] = com0recv_index - cur_addr; // 记录本帧的长度
+ 302   5              }
+ 303   4              else
+ 304   4              {
+ 305   5                first_addr = cur_addr;                                                  // 记录帧首下标
+ 306   5                unprocessed_frame_len[unprocessed_cnt - 1] = com0recv_index - cur_addr; // ¼֡ijȣ
+             -һ֡´θóȻ¼
+ 307   5              }
+ 308   4      
+ 309   4              cur_addr_old = cur_addr;
+ 310   4            }
+ 311   3          }
+ 312   2        }
+ 313   1      }
+ 314          
+ 315          /*******************************************************************
+ 316          ** 函数名称: main
+ 317          ** 函数描述: main函数
+ 318          ** 输入参数: 无
+ 319          ** 输出参数: 无
+ 320          ********************************************************************/
+ 321          void main()
+ 322          {
+ 323   1        unsigned char cnt = 0;
+ 324   1        unsigned int tim_3s = 0;
+ 325   1        unsigned int timout_300s = 0; // 5*60,5分钟超时
+ 326   1        unsigned char i;
+ 327   1        unsigned char str_len = 0;
+ 328   1      
+ 329   1        bsp_clock_init(); // 时钟初始化
+ 330   1        LVR_Init();       // 设置LVR的复位电压 - 3.2V
+ 331   1        Timer0_Init();    // 定时器0初始化,1ms中断
+ 332   1        gpio_init();      // 引脚初始化
+ 333   1        uart0_init();     // uart初始化,默认115200
+ 334   1      
+ 335   1        EA = 1;
+ 336   1      
+ 337   1        user_read_INFO_byte(INFO5_ADDR, CheckBuf, 20); // 读取INFO5地址存储的数据
+ 338   1        // 增加读取产品信息 add qys
+ 339   1        for (i = 0; i < 8; i++)
+ 340   1        {
+ 341   2          ota_fw_info.mcu_ota_pid[i] = CheckBuf[i + 3];
+ 342   2        }
+ 343   1      
+ 344   1        ota_fw_info.mcu_ota_ver = CheckBuf[11];
+ 345   1      
+ 346   1        ota_fw_info.mcu_ota_fw_size = CheckBuf[12];
+ 347   1        ota_fw_info.mcu_ota_fw_size = (ota_fw_info.mcu_ota_fw_size << 8) + CheckBuf[13];
+ 348   1        ota_fw_info.mcu_ota_fw_size = (ota_fw_info.mcu_ota_fw_size << 8) + CheckBuf[14];
+ 349   1        ota_fw_info.mcu_ota_fw_size = (ota_fw_info.mcu_ota_fw_size << 8) + CheckBuf[15];
+ 350   1      
+ 351   1        ota_fw_info.mcu_ota_checksum = CheckBuf[16];
+ 352   1        ota_fw_info.mcu_ota_checksum = (ota_fw_info.mcu_ota_checksum << 8) + CheckBuf[17];
+ 353   1        ota_fw_info.mcu_ota_checksum = (ota_fw_info.mcu_ota_checksum << 8) + CheckBuf[18];
+ 354   1        ota_fw_info.mcu_ota_checksum = (ota_fw_info.mcu_ota_checksum << 8) + CheckBuf[19];
+ 355   1      
+ 356   1        // add by zzw 20240328 增加异常断电,不影响APP运行
+ 357   1        if (CheckBuf[0] == 0x55 && CheckBuf[1] == 0xaa && CheckBuf[2] == 0x5a) // 表示要升级
+C51 COMPILER V9.53.0.0   MAIN                                                              04/10/2024 17:08:13 PAGE 7   
+
+ 358   1        {
+ 359   2          download_flag = 0x01; // 启动升级开始
+ 360   2          CheckBuf[0] = 0x00;
+ 361   2          CheckBuf[1] = 0x00;
+ 362   2          CheckBuf[2] = 0x00;
+ 363   2          flag_err = user_write_INFO_byte(INFO5_ADDR, CheckBuf, 20); // 擦除升级标志,如果现在升级文件中途断电,
+             -重启后直接加载到APP
+ 364   2        }
+ 365   1        // 开机后流程
+ 366   1        if (download_flag == 0x01) // 启动升级
+ 367   1        {
+ 368   2          // 增加发送请求数据包指令:0x0d指令
+ 369   2          ota_fw_info.mcu_current_offset = 0;
+ 370   2          mcu_ota_fw_request();
+ 371   2          timout_300s = 0;
+ 372   2          while (1)
+ 373   2          {
+ 374   3            if (flag_1ms) // 1ms时基
+ 375   3            {
+ 376   4              flag_1ms = 0;
+ 377   4      
+ 378   4              // 接收完成,处理数据
+ 379   4              if (com0recv_state == 2)
+ 380   4              {
+ 381   5                com0recv_state = 0xff;
+ 382   5                frame_splitting(); // 帧分析,如果是多条帧就分割开
+ 383   5              }
+ 384   4      
+ 385   4              if (processed_cnt < unprocessed_cnt)
+ 386   4              {
+ 387   5                if (processed_cnt == 0)
+ 388   5                  uart_process(&com0recv[first_addr], unprocessed_frame_len[processed_cnt]); // 数据处理
+ 389   5                else
+ 390   5                  uart_process(&com0recv[first_addr + unprocessed_frame_len[processed_cnt - 1]], unprocessed_fra
+             -me_len[processed_cnt]);
+ 391   5                processed_cnt++;                      // 已处理计数
+ 392   5                if (processed_cnt == unprocessed_cnt) // 数据处理结束,清除接收状态,重新接收
+ 393   5                {
+ 394   6                  processed_cnt = 0;   // 已处理次数清零
+ 395   6                  unprocessed_cnt = 0; // 未处理次数清零
+ 396   6                  com0recv_index = 0;  // 置0
+ 397   6                  com0recv_state = 0;  // 设置接收为空闲
+ 398   6                  OPEN_COM0RECV();     // 使能接收
+ 399   6                }
+ 400   5              }
+ 401   4      
+ 402   4              if (up_flag) // 升级成功,调转到APP
+ 403   4              {
+ 404   5                while (!com0send_over)
+ 405   5                  ; // 等待uart回复帧发送结束再执行跳转指令
+ 406   5                com0send_over = 0;
+ 407   5      
+ 408   5                up_flag_delay = 0x01; // 升级启动后等待50ms进行数据搬迁以及重启APP
+ 409   5                cnt = 0;
+ 410   5                up_flag=0;
+ 411   5              }
+ 412   4      
+ 413   4              if (cnt++ >= 50) // 50ms
+ 414   4              {
+ 415   5                cnt = 0;
+ 416   5                P1_7 = ~P1_7; // LED灯爆闪,调试用
+ 417   5                timout_300s++;
+C51 COMPILER V9.53.0.0   MAIN                                                              04/10/2024 17:08:13 PAGE 8   
+
+ 418   5      
+ 419   5                if (up_flag_delay == 0x01)
+ 420   5                {
+ 421   6                  // add by zzw  app数据搬迁
+ 422   6                  for (i = 0; i < 100; i++)
+ 423   6                  {
+ 424   7                    read_APP_byte(BACKUP_ADDR + i * 256, FlashBuf, 256); // 读取256字节
+ 425   7                    user_write_APP_byte(i * 256, FlashBuf, 256);         // 写入256字节
+ 426   7      
+ 427   7                  } // modified by zzw 20240328
+ 428   6      
+ 429   6                  // add by zzw  app数据搬迁
+ 430   6      
+ 431   6                  EA = 0;       // 关闭中断
+ 432   6                  BOOTV = 0x00; // 设置热复位后跳转到app
+ 433   6                  SWCMD = 0x56; // 软件复位
+ 434   6                }
+ 435   5              }
+ 436   4              if (timout_300s >= 6000) // 300*20,5分钟超时退出
+ 437   4              {
+ 438   5                EA = 0;       // 关闭中断
+ 439   5                BOOTV = 0x00; // 设置热复位后跳转到app
+ 440   5                SWCMD = 0x56; // 软件复位
+ 441   5              }
+ 442   4            }
+ 443   3          }
+ 444   2        }
+ 445   1        else // 不需要升级,跳转到APP
+ 446   1        {
+ 447   2          while (1)
+ 448   2          {
+ 449   3            if (flag_1ms) // 1ms时基
+ 450   3            {
+ 451   4              flag_1ms = 0;
+ 452   4      
+ 453   4              if (cnt++ >= 250) // 250ms
+ 454   4              {
+ 455   5                cnt = 0;
+ 456   5                P1_7 = ~P1_7; // LED灯中闪,调试用
+ 457   5                tim_3s++;
+ 458   5              }
+ 459   4            }
+ 460   3      
+ 461   3            if (tim_3s >= 0) // 修改为实际生产时,可立即跳转, 调试3秒(tim_3s=12)后跳转,调试用。
+ 462   3            {
+ 463   4              tim_3s = 0;
+ 464   4              EA = 0;       // 关闭中断
+ 465   4              BOOTV = 0x00; // 设置热复位后跳转到app
+ 466   4              SWCMD = 0x56; // 软件复位
+ 467   4            }
+ 468   3          }
+ 469   2        }
+ 470   1      }
+ 471          
+ 472          /*******************************************************************
+ 473          ** 函数名称: timer0_irq
+ 474          ** 函数描述: timer0中断处理函数
+ 475          ** 输入参数: 无
+ 476          ** 输出参数: 无
+ 477          ********************************************************************/
+ 478          void timer0_irq() interrupt 1
+ 479          {
+C51 COMPILER V9.53.0.0   MAIN                                                              04/10/2024 17:08:13 PAGE 9   
+
+ 480   1        TF0 = 0; // 清标志位
+ 481   1        TH0 = (65536 - 9216) / 256;
+ 482   1        TL0 = (65536 - 9216) % 256;
+ 483   1      
+ 484   1        flag_1ms = 1;
+ 485   1      
+ 486   1        // COM0接收空闲处理
+ 487   1        {
+ 488   2          if (com0recv_state == 1) // 接收中
+ 489   2          {
+ 490   3            com0recv_tim++;
+ 491   3      
+ 492   3            if (com0recv_tim > 50) // 判定超时时间
+ 493   3            {
+ 494   4              com0recv_state = 2; // 置2:接收完成
+ 495   4              com0recv_tim = 0;   // 清0
+ 496   4      
+ 497   4              CLOSE_COM0RECV(); // 停止接收
+ 498   4            }
+ 499   3          }
+ 500   2        }
+ 501   1      }
+
+
+MODULE INFORMATION:   STATIC OVERLAYABLE
+   CODE SIZE        =   2841    ----
+   CONSTANT SIZE    =     32    ----
+   XDATA SIZE       =    400      57
+   PDATA SIZE       =   ----    ----
+   DATA SIZE        =   ----    ----
+   IDATA SIZE       =   ----    ----
+   BIT SIZE         =   ----    ----
+END OF MODULE INFORMATION.
+
+
+C51 COMPILATION COMPLETE.  2 WARNING(S),  0 ERROR(S)

+ 378 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Listings/uart.lst

@@ -0,0 +1,378 @@
+C51 COMPILER V9.53.0.0   UART                                                              04/10/2024 17:08:13 PAGE 1   
+
+
+C51 COMPILER V9.53.0.0, COMPILATION OF MODULE UART
+OBJECT MODULE PLACED IN .\Objects\uart.obj
+COMPILER INVOKED BY: C:\Keil_v5_51\C51\BIN\C51.EXE src\uart.c LARGE OPTIMIZE(6,SPEED) REGFILE(.\Objects\uboot.ORC) BROWS
+                    -E INTVECTOR(0XE000) INCDIR(.\src) DEBUG OBJECTEXTEND PRINT(.\Listings\uart.lst) TABS(2) OBJECT(.\Objects\uart.obj)
+
+line level    source
+
+   1          #include <REGtenxTM52F1386.H>
+   2          #include "CRC.h" 
+   3          #include "uart.h"
+   4          #include "string.h"
+   5          #include "iap.h"
+   6          
+   7          unsigned char com0recv_state=0;    //0:接收空闲 1:正在接收 2:接收完成
+   8          unsigned int  com0recv_index=0;    //接收索引 用于确定接收数据长度
+   9          unsigned int  com0recv_over=0;
+  10          unsigned char com0recv_tim=0;      //用于确定数据有没有接收成功
+  11          unsigned char com0recv[512]={0};       //COM0接收缓冲区
+  12          
+  13          unsigned char com0send_over=1;     //1:发送完成
+  14          unsigned char com0send_index=0;    //发送索引 用于确定发送数据长度
+  15          unsigned char com0send_len=0;      //
+  16          unsigned char com0send[64]={0};      //COM0发送缓冲区
+  17          
+  18          static unsigned short global_seq_num;
+  19          
+  20          /******************************************************************************************
+  21          ** 函数名称: uart0_init
+  22          ** 函数描述: uart0初始化
+  23          ** 输入参数: 无
+  24          ** 输出参数: 无 
+  25          *******************************************************************************************/
+  26          void uart0_init()
+  27          {
+  28   1      //  //设置UART的引脚   
+  29   1      //  PINMODE = PINMODE&~0x03;  //选择P30/P31
+  30   1      //  //uart引脚初始化
+  31   1      //  PORTIDX = 3;
+  32   1      //  PINMOD10 = (PINMOD10&0x00)|(0x02<<4);       
+  33   1      //  P3_0=1;        //RXD  P30   开漏上拉
+  34   1      //  P3_1=1;        //TXD  P31   推挽输出
+  35   1        
+  36   1        //设置UART的引脚  
+  37   1        PINMODE = PINMODE&~0x03 | 0x02;    //选择 P44/P45
+  38   1        //uart引脚初始化
+  39   1        PORTIDX = 4;
+  40   1        PINMOD54 = (PINMOD54&0x00)|(0x02<<4);       
+  41   1        P4_4=1;        //RXD  P44   开漏上拉
+  42   1        P4_5=1;        //TXD  P45   推挽输出
+  43   1        
+  44   1        UART0CON = UART0CON&~0x80;      //UART0BRS清零,波特率设置同标准 8051 
+  45   1        
+  46   1        SM0 = 0;
+  47   1        SM1 = 1;           //SM0\SM1=01   UART mode=1;8位数据传送  
+  48   1        SM2 = 0;           //Mode 1, 3    波特率采用9600 = (SMOD+1) x Fsysclk / (32 x 2 x (256-TH1)) --- 若使用Tim
+             -er1 自动重载模式
+  49   1        PCON = (PCON & 0x7F) | 0x80;//SMOD=1允许UART双波特率控制  
+  50   1        
+  51   1        TMOD = TMOD & ~0X30 | 0x20;
+  52   1      //  TL1 = 256-5;
+  53   1      //  TH1 = 256-5;      //115200
+C51 COMPILER V9.53.0.0   UART                                                              04/10/2024 17:08:13 PAGE 2   
+
+  54   1        TL1 = 256-60;
+  55   1        TH1 = 256-60;     //9600
+  56   1        //Fsysclk = 波特率 * 32 * (256 - TH1)
+  57   1        //TH1 = 256-Fsysclk/(波特率*32)
+  58   1         //115200:TH1 =256- 18432000/115200/32=256-5
+  59   1         //9600: TH1 =256- 18432000/9600/32=256- 60 
+  60   1        
+  61   1        TCLK = 0;  //UART1模式1&3发送时钟源:0-timer1   1-timer2
+  62   1        RCLK = 0;  //UART1模式1&3接收时钟源:0-timer1   1-timer2
+  63   1        
+  64   1        
+  65   1        ES = 1;    //允许串口Uart中断
+  66   1        TI = 0;    //先清发送中断 标志
+  67   1        RI = 0;    //先清接收中断 标志
+  68   1        TR1 = 1;   //TIMER1 运行
+  69   1        REN = 1;   //UART接收使能
+  70   1        
+  71   1      }
+  72          
+  73          /******************************************************************************************
+  74          ** 函数名称: uart_send_data
+  75          ** 函数描述:  mcu回复指令函数
+  76          ** 输入参数: 无
+  77          ** 输出参数: 无 
+  78          *******************************************************************************************/
+  79          /*void uart_send_data(unsigned char version,unsigned char command,unsigned int len,unsigned int tx_data)
+  80          {
+  81            unsigned char i=0,verify_value=0;
+  82            
+  83            com0send[0]=0x55;
+  84            com0send[1]=0xaa;     
+  85            com0send[2]=version;  
+  86            com0send[3]=command;     
+  87            com0send[4]=(len>>8)&0xff; 
+  88            com0send[5]=len;  
+  89            if(len == 0)
+  90            {
+  91            com0send_len = 7; 
+  92            }
+  93            else if(len == 1)
+  94            {
+  95            com0send[6]=tx_data;  
+  96              com0send_len = 8;     
+  97            }
+  98            else if(len == 2)
+  99            {
+ 100            com0send[6]=(tx_data>>8)&0xff; 
+ 101              com0send[7]=tx_data; 
+ 102              com0send_len = 9;     
+ 103            }
+ 104            
+ 105            for(i=0;i<(com0send_len-1);i++)
+ 106            {
+ 107             verify_value += com0send[i];
+ 108            }
+ 109            com0send[com0send_len-1] = verify_value;
+ 110              
+ 111            com0send_index = 0;
+ 112            while (!com0send_over);        //读忙
+ 113            com0send_over = 0;
+ 114            com0send_index = 1; 
+ 115            SBUF = com0send[0];   //先发首数据       
+C51 COMPILER V9.53.0.0   UART                                                              04/10/2024 17:08:13 PAGE 3   
+
+ 116          }*/
+ 117          
+ 118          /******************************************************************************************
+ 119          ** 函数名称: uart_send_product
+ 120          ** 函数描述:  mcu回复产品信息函数
+ 121          ** 输入参数: 无
+ 122          ** 输出参数: 无 
+ 123          *******************************************************************************************/
+ 124          /*void uart_send_product(unsigned char version,unsigned char command,unsigned int len,unsigned char *p_dat
+             -a)
+ 125          {
+ 126            unsigned char verify_value=0;
+ 127            unsigned int i=0;
+ 128            
+ 129            com0send[0]=0x55;
+ 130            com0send[1]=0xaa;     
+ 131            com0send[2]=version;  
+ 132            com0send[3]=command;     
+ 133            com0send[4]=(len>>8)&0xff; 
+ 134            com0send[5]=len;  
+ 135            
+ 136            memcpy(&com0send[6],p_data,len);
+ 137            com0send_len = 7+len;
+ 138            
+ 139            for(i=0;i<(com0send_len-1);i++)
+ 140            {
+ 141             verify_value += com0send[i];
+ 142            }
+ 143            com0send[com0send_len-1] = verify_value;
+ 144              
+ 145            com0send_index = 0;
+ 146            while (!com0send_over);        //读忙
+ 147            com0send_over = 0;
+ 148            com0send_index = 1; 
+ 149            SBUF = com0send[0];   //先发首数据       
+ 150          }*/
+ 151          /******************************************************************************************
+ 152          ** 函数名称: uart0_irq
+ 153          ** 函数描述: uart0中断处理函数
+ 154          ** 输入参数: 无
+ 155          ** 输出参数: 无
+ 156          *******************************************************************************************/
+ 157          void uart0_irq()   interrupt  4
+ 158          {
+ 159   1        unsigned char temp_data;
+ 160   1        unsigned int tmp_index;
+ 161   1        //static int tmp_i=0;
+ 162   1        
+ 163   1        //1. 接收中断
+ 164   1        if(RI)
+ 165   1        {
+ 166   2          RI = 0;  //清零
+ 167   2          
+ 168   2          //从接收寄存器读一个字节
+ 169   2          temp_data = SBUF;  
+ 170   2          
+ 171   2          //接收空闲时间清0
+ 172   2          com0recv_tim = 0; 
+ 173   2          
+ 174   2          //存入缓冲区
+ 175   2          tmp_index = com0recv_index;
+ 176   2          com0recv[tmp_index] = temp_data;
+C51 COMPILER V9.53.0.0   UART                                                              04/10/2024 17:08:13 PAGE 4   
+
+ 177   2          
+ 178   2        //tmp_i++;  
+ 179   2          
+ 180   2          if(com0recv_state == 0)       //接收空闲(帧头状态)
+ 181   2          {
+ 182   3            com0recv_state = 1;         //置1:接收中
+ 183   3          }
+ 184   2          else if(com0recv_state == 1)  //接收中
+ 185   2          {
+ 186   3            ;
+ 187   3          } 
+ 188   2          else  //接收完成                        
+ 189   2          {
+ 190   3            //CLOSE_COM0RECV();  //停止接收
+ 191   3          }
+ 192   2          
+ 193   2          tmp_index++;
+ 194   2          if(tmp_index >= 512)  //缓冲溢出判断
+ 195   2          {
+ 196   3            tmp_index = 0;
+ 197   3          }
+ 198   2          
+ 199   2          com0recv_index = tmp_index;
+ 200   2        }
+ 201   1        
+ 202   1        //2. 发送中断
+ 203   1        if(TI)
+ 204   1        {
+ 205   2          TI = 0;  //清零
+ 206   2          
+ 207   2          //发送一个字节
+ 208   2          if(com0send_index >= com0send_len)  //判断已发送的字节数
+ 209   2          {
+ 210   3            com0send_over = 1;  //发送完成标志
+ 211   3          }
+ 212   2          else  //继续发送
+ 213   2          {
+ 214   3            tmp_index = com0send_index;
+ 215   3            SBUF = com0send[tmp_index];
+ 216   3            tmp_index++;
+ 217   3            com0send_index=tmp_index;
+ 218   3          }
+ 219   2        }
+ 220   1      }
+ 221          
+ 222          
+ 223          
+ 224          unsigned char get_check_sum(unsigned char *pack, unsigned short pack_len)
+ 225          {
+ 226   1        unsigned short i;
+ 227   1        unsigned char check_sum = 0;
+ 228   1        
+ 229   1        for(i = 0; i < pack_len; i ++){
+ 230   2          check_sum += *pack ++;
+ 231   2        }
+ 232   1        
+ 233   1        return check_sum;
+ 234   1      }
+ 235          
+ 236          static unsigned short seq_num_get(void)
+ 237          {
+ 238   1        global_seq_num ++;
+C51 COMPILER V9.53.0.0   UART                                                              04/10/2024 17:08:13 PAGE 5   
+
+ 239   1        if(global_seq_num > 0xfff0){
+ 240   2          global_seq_num = 1;
+ 241   2        }
+ 242   1        return global_seq_num;
+ 243   1      }
+ 244          
+ 245          /**
+ 246          * @brief send a frame data 
+ 247          * @param[in] {fr_cmd} frame cmd id
+ 248          * @param[in] {len}    len of frame data 
+ 249          * @return  void
+ 250          */
+ 251          void zigbee_uart_write_frame(unsigned char fr_cmd, unsigned short len)
+ 252          {
+ 253   1        unsigned char check_sum = 0;  
+ 254   1        unsigned short  seq;
+ 255   1        
+ 256   1        com0send[HEAD_FIRST] = FIRST_FRAME_HEAD;
+ 257   1        com0send[HEAD_SECOND] = SECOND_FRAME_HEAD;
+ 258   1        com0send[PROTOCOL_VERSION] = SERIAL_PROTOCOL_VER;
+ 259   1        
+ 260   1       
+ 261   1        seq = seq_num_get();
+ 262   1        com0send[SEQ_HIGH] = (seq << 8);
+ 263   1        com0send[SEQ_LOW] = (seq & 0xff); 
+ 264   1      
+ 265   1        
+ 266   1        com0send[FRAME_TYPE] = fr_cmd;
+ 267   1        com0send[LENGTH_HIGH] = len >> 8;
+ 268   1        com0send[LENGTH_LOW] = len & 0xff;
+ 269   1        
+ 270   1        len += PROTOCOL_HEAD;
+ 271   1        
+ 272   1        check_sum = get_check_sum((unsigned char *)com0send, len-1);
+ 273   1        com0send[len -1] = check_sum;
+ 274   1        
+ 275   1        //zigbee_uart_write_data((unsigned char *)com0send, len);
+ 276   1        com0send_len = len;
+ 277   1        com0send_index = 0;
+ 278   1        while (!com0send_over);        //读忙
+ 279   1        com0send_over = 0;
+ 280   1        com0send_index = 1; 
+ 281   1        SBUF = com0send[0];   //先发首数据       
+ 282   1      }
+ 283          
+ 284          unsigned short set_zigbee_uart_byte(unsigned short dest, unsigned char byte)
+ 285          {
+ 286   1        unsigned char *obj = (unsigned char *)com0send + DATA_START + dest;
+ 287   1        
+ 288   1        *obj = byte;
+ 289   1        dest += 1;
+ 290   1        
+ 291   1        return dest;
+ 292   1      }
+ 293          
+ 294          /**
+ 295          * @brief mcu ota offset requset 
+ 296          * @param[in] {packet_offset}  packet offset 
+ 297          * @return  viod
+ 298          */
+ 299          //when call this function, should set timeout event, if not received zigbee send response should res
+ 300          void mcu_ota_fw_request(void)
+C51 COMPILER V9.53.0.0   UART                                                              04/10/2024 17:08:13 PAGE 6   
+
+ 301          {
+ 302   1        unsigned char i = 0;
+ 303   1        unsigned short length = 0;
+ 304   1      
+ 305   1        if(ota_fw_info.mcu_current_offset >= ota_fw_info.mcu_ota_fw_size)   //outside
+ 306   1          return;
+ 307   1        while(i < 8){
+ 308   2          length = set_zigbee_uart_byte(length,ota_fw_info.mcu_ota_pid[i]); //ota fw pid
+ 309   2          i++;
+ 310   2        }
+ 311   1        length = set_zigbee_uart_byte(length,ota_fw_info.mcu_ota_ver);    //ota fw version
+ 312   1        i = 0;
+ 313   1        while(i < 4){
+ 314   2          length = set_zigbee_uart_byte(length , ota_fw_info.mcu_current_offset >> (24 - i * 8)); //pakage offset 
+             -request
+ 315   2          i++;
+ 316   2        }
+ 317   1        length = set_zigbee_uart_byte(length ,FW_SINGLE_PACKET_SIZE); // packet size request
+ 318   1        
+ 319   1        zigbee_uart_write_frame(MCU_OTA_DATA_REQUEST_CMD,length);
+ 320   1      }
+ 321          
+ 322          void mcu_ota_result_report(unsigned char status)
+ 323          {
+ 324   1        unsigned short length = 0;
+ 325   1        unsigned char i = 0;
+ 326   1        
+ 327   1        length = set_zigbee_uart_byte(length,status); //upgrade result status(0x00:ota success;0x01:ota failed)
+ 328   1        while(i < 8){
+ 329   2          length = set_zigbee_uart_byte(length,ota_fw_info.mcu_ota_pid[i]); //PID
+ 330   2          i++;
+ 331   2        }
+ 332   1        length = set_zigbee_uart_byte(length,ota_fw_info.mcu_ota_ver);  //ota fw version
+ 333   1        
+ 334   1        zigbee_uart_write_frame(MCU_OTA_RESULT_CMD,length); //response 
+ 335   1      }
+ 336          
+ 337          
+ 338          
+ 339          
+ 340          
+ 341          
+
+
+MODULE INFORMATION:   STATIC OVERLAYABLE
+   CODE SIZE        =    839    ----
+   CONSTANT SIZE    =   ----    ----
+   XDATA SIZE       =    587      16
+   PDATA SIZE       =   ----    ----
+   DATA SIZE        =   ----    ----
+   IDATA SIZE       =   ----    ----
+   BIT SIZE         =   ----    ----
+END OF MODULE INFORMATION.
+
+
+C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

Разлика између датотеке није приказан због своје велике величине
+ 1328 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Listings/uboot.m51


BIN
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/CRC.obj


+ 2 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/ExtDll.iex

@@ -0,0 +1,2 @@
+[EXTDLL]
+Count=0

BIN
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/STARTUP_TENX52.obj


BIN
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/iap.obj


Разлика између датотеке није приказан због своје велике величине
+ 1032 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/main.SRC


BIN
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/main.obj


BIN
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/uart.obj


BIN
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/uboot


+ 17 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/uboot.ORC

@@ -0,0 +1,17 @@
+C000  BSP_CLOCK_INIT
+F34F  FRAME_SPLITTING
+E000  GPIO_INIT
+E000  LVR_INIT
+E000  TIMER0_INIT
+F300  TIMER0_IRQ
+E000  UART0_INIT
+F30F  UART0_IRQ
+F3F7  _CRC_CALCU
+F7F7  _GET_CHECK_SUM
+F7FF  _MCU_OTA_RESULT_REPORT
+F3FF  _READ_APP_BYTE
+F373  _SET_ZIGBEE_UART_BYTE
+F3FF  _USER_READ_INFO_BYTE
+F3FF  _USER_WRITE_APP_BYTE
+F3FF  _USER_WRITE_INFO_BYTE
+F7FF  _ZIGBEE_UART_WRITE_FRAME

+ 44 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/uboot.build_log.htm

@@ -0,0 +1,44 @@
+<html>
+<body>
+<pre>
+<h1>µVision Build Log</h1>
+<h2>Tool Versions:</h2>
+IDE-Version: ¦ÌVision V5.11.2.0
+Copyright (C) 2014 ARM Ltd and ARM Germany GmbH. All rights reserved.
+License Information: LUXCON 273380647@qq.com, LUXCON, LIC=ZBD7S-LJL1L-D8FFM-XR6G3-B2KW1-M4LPX
+ 
+Tool Versions:
+Toolchain:       PK51 Prof. Developers Kit  Version: 9.53.0.0
+Toolchain Path:  C:\Keil_v5_51\C51\BIN
+C Compiler:      C51.exe V9.53.0.0
+Assembler:       A51.exe V8.02b
+Linker/Locator:  BL51.exe V6.22
+Library Manager: LIB51.exe V4.30.0.2
+Hex Converter:   OH51.exe V2.7.0.0
+CPU DLL:         S8051.DLL V3.95.0.0
+Dialog DLL:      DP51.DLL V2.62.0.1
+Target DLL:      C:\Keil_v5_51\SampTarg.DLL V1.06.44.75.R
+Dialog DLL:      TP51.DLL V2.58
+ 
+<h2>Project:</h2>
+D:\Work\GIT\TM52eF1386_OTA\TM52F1386_SDK_v0_0_1\Projects\OTA_boot\project - uboot_v1.1\project - uboot_v1.1\uboot.uvproj
+Project File Date:  03/27/2024
+
+<h2>Output:</h2>
+Rebuild target 'Target 1'
+assembling STARTUP_TENX52.A51...
+compiling main.c...
+src\main.c(2): warning C318: can't open file 'TM52F1386_bsp.h'
+src\main.c(254): warning C206: 'mcu_ota_fw_request': missing function-prototype
+compiling CRC.c...
+compiling iap.c...
+compiling uart.c...
+linking...
+Program Size: data=9.2 xdata=1091 code=6943
+creating hex file from ".\Objects\uboot"...
+User command #1: .\_MakeTenx_uboot\run.bat
+D:\Work\GIT\TM52eF1386_OTA\TM52F1386_SDK_v0_0_1\Projects\OTA_boot\project - uboot_v1.1\project - uboot_v1.1>".\_MakeTenx_uboot\CallKeilDll.exe"
+".\Objects\uboot" - 0 Error(s), 2 Warning(s).
+</pre>
+</body>
+</html>

+ 485 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/uboot.hex

@@ -0,0 +1,485 @@
+:03E0000002F6AE77
+:0CF6AE00787FE4F6D8FD75812002F6F5A7
+:10FAEC00FF0000000000000000000000000000000B
+:10FAFC0000000000000000000000000000000000FA
+:10E5FE0041EA670041EBD90041EBD20058EA4F00E7
+:10E60E0000000000000000000000000000000000FC
+:10E61E00000000000000006100EA68000000000039
+:10E62E0000000000000000000000000000000000DC
+:10E63E0000000000000000000000000000000000CC
+:10E64E0000000000000000000000000000000000BC
+:10E65E0000000000000000000000000000000000AC
+:10E66E00000000000000000000000000000000009C
+:10E67E00000000000000000000000000000000008C
+:10E68E00000000000000000000000000000000007C
+:10E69E00000000000000000000000000000000006C
+:10E6AE00000000000000000000000000000000005C
+:10E6BE00000000000000000000000000000000004C
+:10E6CE00000000000000000000000000000000003C
+:10E6DE00000000000000000000000000000000002C
+:10E6EE00000000000000000000000000000000001C
+:10E6FE00000000000000000000000000000000000C
+:10E70E0000000000000000000000000000000000FB
+:10E71E00000000000000000000000041EBD40041AA
+:10E72E00EBD10044EBCD0000000044EBD50000001F
+:10E73E000041EBD30041EBDA0041EBB80054EBB9EA
+:10E74E0000000000000000000000000000000000BB
+:10E75E00000000006050EB687B2270223A22646356
+:10E76E0034736C67646564366D3639637268222C57
+:10E77E00202276223A22312E302E31222C20226D6A
+:10E78E00223A322C226D74223A31302C226E223AE9
+:10E79E00302C226972223A22352E3132222C20223E
+:0FE7AE006C6F77223A307D0044EA4B0000000088
+:10FA6100C2DA75D80300000000000000000000C2E7
+:10FA7100DC00000000000000000000C2DB0000000C
+:10FA810000000000000000D2DA00000000000000C9
+:04FA9100000000224F
+:10E00E00E58954FC4401F589758CDCE4F58AD2A9C6
+:03E01E00D28C227F
+:09E02600E5D654F84404F5D622B5
+:10FB0C00759101E5A5540F4460F5A5D29775910345
+:06FB1C0053A50FD2B72231
+:10E03B0090EBE2EBF0A3EAF0A3E9F0A3ECF0A3ED95
+:01E04B00F0E4
+:10E04C00E4A3F0A3F0A3F0A3F0A3F0A3F0A3F0A338
+:10E05C0012EFC60000000078F27CEB7D017BFF7AAA
+:10E06C00FA79EC7E007F2012EEC7E490EC12F0906F
+:10E07C00EBEAF0A3F090EBE6E024FFFF90EBE5E099
+:10E08C0034FFFE90EBEAE0FCA3E0FDC39FEC9E5056
+:10E09C002990EBE2E0FBA3E0FAA3E0F98D828C83FC
+:10E0AC0012EF06FF90EBE8E02FF090EBEBE004F0C2
+:10E0BC00700690EBEAE004F080BB90EBE2E0FBA38F
+:10E0CC00E0FAA3E0F9A3E0FEA3E0FFE92FF9EA3EB2
+:10E0DC00FA90FFFF12EF06FF90EBE8E06F6003028F
+:10E0EC00E5FD90EBE2E0FBA3E0FAA3E0F912EEED24
+:10E0FC006455600302E5FD90000112EF0664AA600E
+:10E10C000302E5FD90000612EF06FE90000712EFE9
+:10E11C00067C002400FFEC3EFE90EBECF0A3EFF04D
+:10E12C002409FFE43EFE90EBE5E06E7003A3E06F84
+:10E13C00600302E5FD90EBE2E0FBA3E0FAA3E0F95B
+:10E14C0090000512EF0690EBE7F024F3600B1470CF
+:10E15C000302E5F702E5FD222290EC33E0FCA3E09C
+:10E16C00FDA3E0FEA3E0FF90EBD5E0F8A3E0F9A35C
+:10E17C00E0FAA3E0FBC312EF7D400302E5CF90EB86
+:10E18C00E2E0FBA3E0FAA3E0F990000812EF0664CA
+:10E19C0001700302E5FDE490EBEAF0A3F090EBE2F2
+:10E1AC00E0FBA3E0FAA3E02409F9E43AFA90EBEAE5
+:10E1BC00E0FEA3E0FF29F9EA3EFA12EEEDFD742A27
+:10E1CC002FF58274EC3EF583E06D600302E5FD9063
+:10E1DC00EBEBE004F0700690EBEAE004F090EBEA75
+:10E1EC00E07004A3E0640870B490EBE2E0FBA3E001
+:10E1FC00FAA3E0F990001112EF06FF90EC32E06FF9
+:10E20C00600302E5FDE490EBEAF0A3F090EBEEE0A6
+:10E21C00F8A3E0F9A3E0FAA3E0FBC000C001C00240
+:10E22C00C00390EBE2E0FBA3E0FAA3E02412F9E4D4
+:10E23C003AFA90EBEAE0FEA3E0FF29F9EA3EFA1283
+:10E24C00EEEDFDEF75F008A4FFC374189FFFED7E93
+:10E25C0000A807088005C333CE33CED8F9FFEE33C0
+:10E26C0095E0FDFCD003D002D001D000EB4FFFEACB
+:10E27C004EFEE94DFDE84CFC90EBEE12EFBA90EB44
+:10E28C00EBE004F0700690EBEAE004F090EBEAE0CF
+:10E29C007004A3E06404600302E218E490EBEAF07B
+:10E2AC00A3F090EBEEE0FCA3E0FDA3E0FEA3E0FF07
+:10E2BC0090EC37E0F8A3E0F9A3E0FAA3E0FBC3127B
+:10E2CC00EF7D600302E56290EBEEE0F8A3E0F9A3CA
+:10E2DC00E0FAA3E0FB90EC33E0FCA3E0FDA3E0FE4E
+:10E2EC00A3E0C39BFFEE9AFEED99FDEC98FCE47B5A
+:10E2FC0020FAF9F812F99EE4FBFAF9F8C312EF7D53
+:10E30C00700302E40B90EBEEE0FCA3E0FDA3E0FE57
+:10E31C00A3E02420FFE43EFEE43DFDE43CFC90EC55
+:10E32C0033E0F8A3E0F9A3E0FAA3E0FBC312EF7D1E
+:10E33C00700302E40BE4FFFEFDFC90EC37E0F8A365
+:10E34C00E0F9A3E0FAA3E0FBC312EF7D700A90EAB8
+:10E35C004B12EFC600000000C390EBEBE094209052
+:10E36C00EBEAE09400507690EBE2E0FBA3E0FAA33A
+:10E37C00E02416F9E43AFA90EBEAE0FEA3E0FF2978
+:10E38C00F9EA3EFA12EEEDFD74F22FF58274EB3ED3
+:10E39C00F583EDF090EA4BE0F8A3E0F9A3E0FAA3E3
+:10E3AC00E0FB90EBEAE0FEA3E024F2F58274EB3E96
+:10E3BC00F583E0FF3395E0FEFDFCEB2FFFEA3EFE1C
+:10E3CC00E93DFDE83CFC90EA4B12EFBA90EBEBE038
+:10E3DC0004F0700690EBEAE004F002E36490EC3792
+:10E3EC00E0FCA3E0FDA3E0FEA3E02420FFE43EFE5E
+:10E3FC00E43DFDE43CFC90EC3712EFBA02E562E43C
+:10E40C0090EBEAF0A3F090EBEEE0F8A3E0F9A3E0D8
+:10E41C00FAA3E0FB90EC33E0FCA3E0FDA3E0FEA349
+:10E42C00E0C39BFFEE9AFEED99FDEC98FCE47B209B
+:10E43C00FAF9F812F99EAC00AD01AE02AF03E4FBA1
+:10E44C00FAF9F8C312EF7D601D90EBEEE0A3E0A3A8
+:10E45C00E0A3E0FB90EC33E0A3E0A3E0A3E0C39BDC
+:10E46C0090EC12F0800690EC127420F090EC12E01C
+:10E47C00FFC390EBEBE09F90EBEAE09400507690BA
+:10E48C00EBE2E0FBA3E0FAA3E02416F9E43AFA90FD
+:10E49C00EBEAE0FEA3E0FF29F9EA3EFA12EEEDFD0D
+:10E4AC0074F22FF58274EB3EF583EDF090EA4BE0BD
+:10E4BC00F8A3E0F9A3E0FAA3E0FB90EBEAE0FEA3FB
+:10E4CC00E024F2F58274EB3EF583E0FF3395E0FE39
+:10E4DC00FDFCEB2FFFEA3EFEE93DFDE83CFC90EA3B
+:10E4EC004B12EFBA90EBEBE004F0700690EBEAE025
+:10E4FC0004F002E47890EC37E0F8A3E0F9A3E0FA3A
+:10E50C00A3E0FB90EC12E0FFE4FCFDFEEB2FFFEE32
+:10E51C003AFEED39FDEC38FC90EC3712EFBA90EA8C
+:10E52C004BE0FCA3E0FDA3E0FEA3E0FF90EC3BE09E
+:10E53C00F8A3E0F9A3E0FAA3E0FBC312EF7D6007B8
+:10E54C007F0112F7AD8005E4FF12F7AD90EA4B1294
+:10E55C00EFC60000000090EBD5E0A3E0A3E0FEA323
+:10E56C00E02400FFEE3470FEC0067B017AEB79F2FA
+:10E57C0090EBEDE024F2FE90EBECE034FF90EC1825
+:10E58C00F0A3CEF0D00612F354E43390EBD1F0901C
+:10E59C00EBD5E0F8A3E0F9A3E0FAA3E0FB90EBEDF8
+:10E5AC00E024F2FF90EBECE034FFFEE4FCFDEB2FFB
+:10E5BC00FFEA3EFEED39FDEC38FC90EBD512EFBADC
+:10E5CC0012F1A590EC33E0FCA3E0FDA3E0FEA3E088
+:10E5DC00FF90EBD5E0F8A3E0F9A3E0FAA3E0FBC3CE
+:10E5EC0012EF7D700C90EBD904F02290EBD97401F2
+:01E5FC00F02E
+:01E5FD0022FB
+:10F0C500E4F990EBE274FFF0E4FFFE90EBB8F0900A
+:10F0D500EBDAF090EBD3F090E842E024FFFD90E806
+:10F0E50041E034FFFCC3EF9DEE9C400302F1A474A4
+:10F0F500432FF58274E83EF583E06455600302F121
+:10F105009C74442FF58274E83EF583E064AA60039D
+:10F1150002F19C90EBD3E004F0A90790EBE2E0FD4F
+:10F1250069607490EBD3E0D39401403EE99DFDE422
+:10F135009400FCE025E024B5F582E434EBF583EC9E
+:10F14500F0A3EDF0E9FDC390E842E09DFD90E841B4
+:10F15500E09400FC90EBD3E025E024B7F582E4349D
+:10F16500EBF583ECF0A3EDF0802890EBB8E9F0FD2A
+:10F17500C390E842E09DFD90E841E09400FC90EBEF
+:10F18500D3E025E024B7F582E434EBF583ECF0A376
+:0FF19500EDF090EBE2E9F00FBF00010E02F0DCAD
+:01F1A4002248
+:10EA2600E490EBDBF0A3F0A3F0A3F0A3F090EBE10E
+:10EA3600F012FA6112E02612E00E12FB0C12F9E255
+:10EA4600D2AF7B017AEA794F90EBE7E4F0A3741436
+:10EA5600F07F007E0812FB22E490EBE0F090EBE002
+:10EA6600E0FF2452F582E434EAF583E0FE742A2FAF
+:10EA7600F582E434ECF583EEF090EBE0E004F0E0B0
+:10EA8600B408DA90EA5AE090EC32F090EA5BE0FFE4
+:10EA9600E4FCFDFE90EC3312EFBA90EC33E0FCA3FD
+:10EAA600E0FDA3E0FEA3E0FF780812EFA7A804A903
+:10EAB60005AA06AB0790EA5CE0FFE4FCFDFEEB2F3F
+:10EAC600FFEE3AFEED39FDEC38FC90EC3312EFBA6E
+:10EAD60090EC33E0FCA3E0FDA3E0FEA3E0FF7808A2
+:10EAE60012EFA7A804A905AA06AB0790EA5DE0FF06
+:10EAF600E4FCFDFEEB2FFFEE3AFEED39FDEC38FCB3
+:10EB060090EC3312EFBA90EC33E0FCA3E0FDA3E007
+:10EB1600FEA3E0FF780812EFA7A804A905AA06AB92
+:10EB26000790EA5EE0FFE4FCFDFEEB2FFFEE3AFE07
+:10EB3600ED39FDEC38FC90EC3312EFBA90EA5FE069
+:10EB4600FFE4FCFDFE90EC3B12EFBA90EC3BE0FCE0
+:10EB5600A3E0FDA3E0FEA3E0FF780812EFA7A80458
+:10EB6600A905AA06AB0790EA60E0FFE4FCFDFEEB10
+:10EB76002FFFEE3AFEED39FDEC38FC90EC3B12EF40
+:10EB8600BA90EC3BE0FCA3E0FDA3E0FEA3E0FF7837
+:10EB96000812EFA7A804A905AA06AB0790EA61E048
+:10EBA600FFE4FCFDFEEB2FFFEE3AFEED39FDEC38FF
+:10EBB600FC90EC3B12EFBA90EC3BE0FCA3E0FDA32B
+:10EBC600E0FEA3E0FF780812EFA7A804A905AA06AD
+:10EBD600AB0790EA62E0FFE4FCFDFEEB2FFFEE3AA6
+:10EBE600FEED39FDEC38FC90EC3B12EFBA90EA4FA3
+:10EBF600E064557035A3E064AA702FA3E0B45A2AE6
+:10EC060090EBD47401F0E490EA4FF0A3F0A3F07B0C
+:10EC1600017AEA794F90EBE7F0A37414F07F007E57
+:10EC26000812F27EE43390EBD1F090EBD4E064016D
+:10EC3600600302EDB990EC3712EFC6000000001237
+:10EC4600F1A5E490EBDEF0A3F090EA67E060FAE469
+:10EC5600F090EA43E0B4020674FFF012F0C590EBC0
+:10EC6600D3E0FF90EBDAE0FEC39F400302ED03EE34
+:10EC76007025EE25E024B9F582E434EBF583E0FC5B
+:10EC8600A3E0FD90EBB8E07E002443F9EE34E8FA09
+:10EC96007B0112E03B804290EBDAE025E024B7F5F9
+:10ECA60082E434EBF583E0FEA3E0FF90EBB8E0FDF1
+:10ECB6007C00EF2DFFEC3EFE74432FF974E83EFA1C
+:10ECC6007B0190EBDAE025E024B9F582E434EBF53C
+:10ECD60083E0FCA3E0FD12E03B90EBDAE004F09069
+:10ECE600EBD3E0FF90EBDAE0B50712E4F090EBD35C
+:10ECF600F090E841F0A3F090EA43F0D29C90EBD973
+:10ED0600E0601990EA44E060FAE490EA44F090EB9F
+:10ED1600D204F0E490EBDBF090EBD9F090EBDBE083
+:10ED2600FF04F0EFC39432406DE4F0B29790EBDF4E
+:10ED3600E004F0700690EBDEE004F090EBD2E064C5
+:10ED460001705390EBE0F090EBE0E0FFC394645069
+:10ED56003DEFFEE42400FFEE3470FE7B017AEA7993
+:10ED66006890EC237401F0A3E4F012F80C90EBE049
+:10ED7600E07F00FE7B017AEA796890EC187401F076
+:10ED8600A3E4F012F35490EBE0E004F080B9C2AFD4
+:10ED9600E4F5EE759756C390EBDFE0947090EBDEEA
+:10EDA600E09417500302EC4FC2AFE4F5EE759756A8
+:10EDB60002EC4F90EA67E06021E4F090EBDBE0FFC5
+:10EDC60004F0EFC394FA4012E4F0B29790EBDDE062
+:10EDD60004F0700690EBDCE004F0C390EBDCE0940A
+:10EDE6000040D0E4F0A3F0C2AFF5EE75975680C3AD
+:01EDF60022FA
+:03E00B0002FA22F4
+:10FA2200C0E0C083C082C0D0C28D758CDC758A00F4
+:10FA320090EA677401F090EA43E0B4011990EA4851
+:10FA4200E004F0E0D39432400D90EA437402F09067
+:0FFA5200EA48E4F0C29CD0D0D082D083D0E0321A
+:10F73A0090EC1EEBF0A3EAF0A3E9F0A3ECF0A3ED42
+:01F74A00F0CE
+:10F74B00E4A3F0A3F0FFFEF5F375F2FF75F1FFD321
+:10F75B0090EC22E09F90EC21E09E401B90EC1EE091
+:10F76B00FBA3E0FAA3E0F98F828E8312EF06F5F389
+:10F77B000FBF00010E80D8AFF290EC23E4F0A3EFA3
+:10F78B00F0E07F00FE90EC23F0A3EFF0ADF1EEED97
+:10F79B00FF90EC23EEF0A3EFF090EC23E0FEA3E060
+:01F7AB00FF5E
+:01F7AC00223A
+:02E7BD00C10099
+:10F8BF00C3EE9408500122C200A2AFE433FDC2AFE1
+:10F8CF0043D61090EC41EEF0A3EFF0E5F754F94476
+:10F8DF0006F5F775C9A175C9BA8F828E83E4F0E575
+:10F8EF00C930E602D20053F7F9E4F5C9F59753D6BC
+:0AF8FF00EFAF05ED24FF92AFA20069
+:01F9090022DB
+:0BF8660090EBEFEBF0A3EAF0A3E9F059
+:10F8710090EC41EEF0A3EFF0E4FFFED390EBF3E068
+:10F881009F90EBF2E09E403590EC41E0FCA3E0F567
+:10F89100828C83E0FD90EBEFE0FBA3E0FAA3E0F9BB
+:10F8A1008F828E83ED12EF4590EC42E004F07006FA
+:0DF8B10090EC41E004F00FBF00010E80BE9E
+:01F8BE002227
+:0BF4D80090EBEFEBF0A3EAF0A3E9F0EB
+:10F4E300C200A2AFE43390EBF4F0C2AF43D6109066
+:10F4F300EC41EEF0A3EFF0E5F754F94406F5F775A8
+:10F50300C9A175C94CE490EBF5F0A3F090EBF2E0E0
+:10F51300FEA3E0FF90EBF5E0FCA3E0FDC39FEC9EB0
+:10F52300503E90EBEFE0FBA3E0FAA3E0F98D828C71
+:10F533008312EF06FF90EC41E0FCA3E0F5828C839D
+:10F54300EFF090EC42E004F0700690EC41E004F040
+:10F5530090EBF6E004F0700690EBF5E004F080AC7D
+:10F56300E5C930E602D20053F7F9E4F5C9F597533C
+:0CF57300D6EF90EBF4E024FF92AFA20072
+:01F57F002269
+:10F27E0090EBE4EBF0A3EAF0A3E9F090EBE2EEF012
+:03F28E00A3EFF0FB
+:10F29100C201E490EBE9F0A3F0A3F0A3F0EF4E601C
+:10F2A1000C90EBE2E05401FEA3E04E701390EBE210
+:10F2B100E0FEA3E0FF12F8BF9201300103A2012298
+:10F2C10090EBE2E0FEA3E0FFA3E0FBA3E0FAA3E002
+:10F2D100F9A3E0FDA3E090EBF2CDF0A3EDF012F481
+:10F2E100D89201300103A2012290EBE4E0FBA3E0FC
+:10F2F100FAA3E0F9A3E0FCA3E0FD12F73A90EBE9F1
+:10F30100EEF0A3EFF090EBE2E0FEA3E0FFA3E0FB61
+:10F31100A3E0FAA3E0F9A3E0FDA3E090EBF2CDF0C6
+:10F32100A3EDF012F86690EBE4E0FBA3E0FAA3E0B2
+:10F33100F9A3E0FCA3E0FD12F73A90EBEBEEF0A3AA
+:10F34100EFF090EBE9E06E7003A3E06F6002D20191
+:02F35100A20117
+:01F353002297
+:10FB220090EBE7E0FDA3E090EBF2CDF0A3EDF01255
+:03FB3200F8662250
+:10F90A00C200A2AFE433FDC2AF43D61090EC3FEE83
+:10F91A00F0A3EFF0E5F754F94406F5F775C9E27577
+:10F92A00C9BA7597657597A78F828E83E4F0E5C982
+:10F93A0030E602D20053F7F9E4F5C9F59753D6EF4A
+:09F94A00AF05ED24FF92AFA2000D
+:01F953002291
+:0BF80C0090EC20EBF0A3EAF0A3E9F081
+:10F8170090EC28EEF0A3EFF0E4FFFED390EC24E0A9
+:10F827009F90EC23E09E403690EC28E0FCA3E0F5A7
+:10F83700828C83E493FD90EC20E0FBA3E0FAA3E045
+:10F84700F98F828E83ED12EF4590EC29E004F0707A
+:0EF857000690EC28E004F00FBF00010E80BD0B
+:01F865002280
+:0BF42A0090EC20EBF0A3EAF0A3E9F067
+:10F43500C200A2AFE43390EC25F0C2AF43D61090E2
+:10F44500EC3FEEF0A3EFF0E5F754F94406F5F77558
+:10F45500C9E275C94C7597657597A7E490EC26F0D8
+:10F46500A3F090EC23E0FEA3E0FF90EC26E0FCA3E4
+:10F47500E0FDC39FEC9E503E90EC20E0FBA3E0FA3C
+:10F48500A3E0F98D828C8312EF06FF90EC3FE0FC40
+:10F49500A3E0F5828C83EFF090EC40E004F0700679
+:10F4A50090EC3FE004F090EC27E004F0700690EC5F
+:10F4B50026E004F080ACE5C930E602D20053F7F946
+:10F4C500E4F5C9F59753D6EF90EC25E024FF92AF0C
+:02F4D500A20093
+:01F4D7002212
+:10F3540090EC15EBF0A3EAF0A3E9F090EC13EEF0D7
+:03F36400A3EFF024
+:10F36700C201E490EC1AF0A3F0A3F0A3F0EF4E6013
+:10F377000C90EC13E05401FEA3E04E701390EC13D5
+:10F38700E0FEA3E0FF12F90A9201300103A2012275
+:10F3970090EC13E0FEA3E0FFA3E0FBA3E0FAA3E0F9
+:10F3A700F9A3E0FDA3E090EC23CDF0A3EDF012F478
+:10F3B7002A9201300103A2012290EC15E0FBA3E0A1
+:10F3C700FAA3E0F9A3E0FCA3E0FD12F73A90EC1AE8
+:10F3D700EEF0A3EFF090EC13E0FEA3E0FFA3E0FB59
+:10F3E700A3E0FAA3E0F9A3E0FDA3E090EC23CDF0BE
+:10F3F700A3EDF012F80C90EC15E0FBA3E0FAA3E004
+:10F40700F9A3E0FCA3E0FD12F73A90EC1CEEF0A3A1
+:10F41700EFF090EC1AE06E7003A3E06F6002D20188
+:02F42700A20140
+:01F4290022C0
+:10E7BF0041EA430042E841000042EA46000041EAD4
+:10E7CF0048006200E8430000000000000000000065
+:10E7DF00000000000000000000000000000000002A
+:10E7EF00000000000000000000000000000000001A
+:10E7FF00000000000000000000000000000000000A
+:10E80F0000000000000000000000000000000000F9
+:10E81F0000000000000000000000000000000000E9
+:10E82F0000000000000000000000000000000000D9
+:10E83F0000000000000000000000000000000000C9
+:10E84F0000000000000000000000000000000000B9
+:10E85F0000000000000000000000000000000000A9
+:10E86F000000000000000000000000000000000099
+:10E87F000000000000000000000000000000000089
+:10E88F000000000000000000000000000000000079
+:10E89F000000000000000000000000000000000069
+:10E8AF000000000000000000000000000000000059
+:10E8BF000000000000000000000000000000000049
+:10E8CF000000000000000000000000000000000039
+:10E8DF000000000000000000000000000000000029
+:10E8EF000000000000000000000000000000000019
+:10E8FF000000000000000000000000000000000009
+:10E90F0000000000000000000000000000000000F8
+:10E91F0000000000000000000000000000000000E8
+:10E92F0000000000000000000000000000000000D8
+:10E93F0000000000000000000000000000000000C8
+:10E94F0000000000000000000000000000000000B8
+:10E95F0000000000000000000000000000000000A8
+:10E96F000000000000000000000000000000000098
+:10E97F000000000000000000000000000000000088
+:10E98F000000000000000000000000000000000078
+:10E99F000000000000000000000000000000000068
+:10E9AF000000000000000000000000000000000058
+:10E9BF000000000000000000000000000000000048
+:10E9CF0000000000000041EA440141E8000041EA74
+:10E9DF0045006040E801000000000000000000005A
+:10E9EF000000000000000000000000000000000018
+:10E9FF000000000000000000000000000000000008
+:10EA0F0000000000000000000000000000000000F7
+:06EA1F00000000000000F1
+:10F9E200E5A654FC4402F5A675910475A420D2EC58
+:10F9F200D2ED53DE7FC29FD29EC29DE587547F44E3
+:10FA020080F587E58954CF4420F589758BC4758DBF
+:10FA1200C4C2CCC2CDD2ACC299C298D28ED29C22E0
+:03E0230002F58083
+:10F58000C0E0C083C082C0D075D000C004C005C038
+:03F5900006C007AB
+:10F5930030983BC298AD9990EA48E4F090E841E096
+:10F5A300FEA3E0FF2443F58274E83EF583EDF0907B
+:10F5B300EA43E0700204F00FBF00010EC3EE9402B1
+:10F5C30040047E007F0090E841EEF0A3EFF0309915
+:10F5D30032C29990EA45E0FD90E800E0FCC39D400B
+:10F5E3000890EA447401F0801AEC7E00FF2401F5D0
+:10F5F30082EE34E8F583E0F5990FBF00010E90E841
+:03F6030000EFF025
+:10F60600D007D006D005D004D0D0D082D083D0E0A9
+:01F6160032C1
+:10F9540090EC19EBF0A3EAF0A3E9F0A3ECF0A3ED2B
+:01F96400F0B2
+:10F96500E4A3F0FFFED390EC1DE09F90EC1CE09E1D
+:10F97500402190EC19E0FBA3E475F00112EF67A9B3
+:10F98500F0FA12EEEDFD90EC1EE02DF00FBF000138
+:08F995000E80D290EC1EE0FF91
+:01F99D002247
+:10FAC10090EA4AE004F0700690EA49E004F0D3902D
+:10FAD100EA4AE094F090EA49E094FF4005E4F0A39B
+:0BFAE10004F090EA49E0FEA3E0FF22E1
+:0AF6170090EC16ECF0A3EDF0AB0749
+:10F62100E4A3F090E8017455F0A374AAF0A3740266
+:10F63100F012FAC1AD07AC06ED90E804E4F0EFA3D7
+:10F64100F0A3EBF090EC16E0FCA3E0FDEC90E807F2
+:10F65100F0EDA3F090EC172409F090EC16E03400E3
+:10F66100F07B017AE87901A3E024FFFD90EC16E03C
+:10F6710034FFFC12F95490EC18EFF090EC16E0FC1A
+:10F68100A3E0FD2400F58274E83CF583EFF090EAF5
+:10F6910045EDF0E490E800F090EA44E060FAE4908F
+:0CF6A100EA44F090E80004F0A3E0F599C2
+:01F6AD00223A
+:08FA950090EC16EEF0A3EFF077
+:10FA9D002409F974E83EFA7B01ED12EF3390EC176F
+:10FAAD00E004F0700690EC16E004F090EC16E0FE29
+:03FABD00A3E0FFC4
+:01FAC0002223
+:10F1A500E490EC13F0A3F0A3F090EC33E0FCA3E0C3
+:10F1B500FDA3E0FEA3E0FFA3E0F8A3E0F9A3E0FAD6
+:10F1C500A3E0FBC312EF7D400302F27D90EC13E058
+:10F1D500FDC394085025A3E0FEA3E0FF742A2DF596
+:10F1E50082E434ECF583E0FD12FA9590EC14EEF030
+:10F1F500A3EFF090EC13E004F080D190EC14E0FE66
+:10F20500A3E0FF90EC32E0FD12FA9590EC14EEF0DD
+:10F21500A3EFF0E490EC13F090EC13E0FBC394043F
+:10F22500503A90EC37E0FCA3E0FDA3E0FEA3E0FF3D
+:10F23500EB75F008A4FBC374189BF9F812EF93ADB6
+:10F245000790EC14E0FEA3E0FF12FA9590EC14EEA3
+:10F25500F0A3EFF090EC13E004F080BC90EC14E028
+:10F26500FEA3E0FF7D2012FA9590EC14EEF0FCA3CE
+:08F27500EFF0FD7F0D12F6170A
+:01F27D00226E
+:10F7AD00E490EC13F0A3F0FCAD07FFFE12FA959078
+:10F7BD00EC13EEF0A3EFF0ECC39408502290EC1391
+:10F7CD00E0FEA3E0FF742A2CF582E434ECF583E02F
+:10F7DD00FD12FA9590EC13EEF0A3EFF00C80D8909B
+:10F7ED00EC13E0FEA3E0FF90EC32E0FD12FA9590F1
+:0EF7FD00EC13EEF0FCA3EFF0FD7F0E12F617FA
+:01F80B0022DA
+:10F6BA0002EA26E493A3F8E493A34003F68001F256
+:10F6CA0008DFF48029E493A3F85407240CC8C33351
+:10F6DA00C4540F4420C8834004F456800146F6DF20
+:10F6EA00E4800B010204081020408090E5FEE47ECD
+:10F6FA00019360BCA3FF543F30E509541FFEE49315
+:10F70A00A360010ECF54C025E060A840B8E493A3DB
+:10F71A00FAE493A3F8E493A3C8C582C8CAC583CA06
+:10F72A00F0A3C8C582C8CAC583CADFE9DEE780BEBE
+:01EA250000F0
+:10EDF700E709F608DFFA8046E709F208DFFA803EFE
+:10EE070088828C83E709F0A3DFFA8032E309F608EA
+:10EE1700DFFA8078E309F208DFFA807088828C8352
+:10EE2700E309F0A3DFFA806489828A83E0A3F60806
+:10EE3700DFFA805889828A83E0A3F208DFFA804CE0
+:10EE470080D280FA80C680D4806980F280338010B7
+:10EE570080A680EA809A80A880DA80E280CA803320
+:10EE670089828A83ECFAE493A3C8C582C8CCC58398
+:10EE7700CCF0A3C8C582C8CCC583CCDFE9DEE78068
+:10EE87000D89828A83E493A3F608DFF9ECFAA9F0E7
+:10EE9700EDFB2289828A83ECFAE0A3C8C582C8CC3D
+:10EEA700C583CCF0A3C8C582C8CCC583CCDFEADE56
+:10EEB700E880DB89828A83E493A3F208DFF980CCB8
+:10EEC70088F0EF60010E4E60C388F0ED2402B404B1
+:10EED7000050B9F582EB2402B4040050AF23234558
+:06EEE700822390EE477348
+:10EEED00BB010689828A83E0225002E722BBFE0223
+:09EEFD00E32289828A83E4932256
+:10EF0600BB010CE58229F582E5833AF583E02250C0
+:10EF160006E92582F8E622BBFE06E92582F8E2220A
+:0DEF2600E58229F582E5833AF583E4932224
+:10EF3300BB010689828A83F0225002F722BBFE01BD
+:02EF4300F322B7
+:10EF4500F8BB010DE58229F582E5833AF583E8F002
+:10EF5500225006E92582C8F622BBFE05E92582C8AE
+:02EF6500F22296
+:10EF6700A3F8E0C5F025F0F0E5821582700215835D
+:06EF7700E0C838F0E822BA
+:10F99E00C2D5E830E70FB2D5E4C39BFBE49AFAE494
+:10F9AE0099F9E498F8EC30E717B2D512F9D412F0C1
+:10F9BE0033E4C39BFBE49AFAE499F9E498F88003E4
+:10F9CE0012F03330D50DE4C39FFFE49EFEE49DFD9F
+:04F9DE00E49CFC2287
+:10EF7D00EB9FF5F0EA9E42F0E99D42F0EC6480C80B
+:06EF8D0064809845F022AB
+:10EF9300E86010ECA2E713FCED13FDEE13FEEF1394
+:04EFA300FFD8F02281
+:10EFA700E8600FEFC333FFEE33FEED33FDEC33FCC8
+:03EFB700D8F1226C
+:0CEFBA00ECF0A3EDF0A3EEF0A3EFF022CA
+:10EFC600A8828583F0D083D08212EFDD12EFDD12A6
+:10EFD600EFDD12EFDDE473E493A3C583C5F0C583CB
+:10EFE600C8C582C8F0A3C583C5F0C583C8C582C895
+:01EFF60022F8
+:10EFF70075F008758200EF2FFFEE33FECD33CDCCD1
+:10F0070033CCC58233C5829BED9AEC99E582984053
+:10F017000CF582EE9BFEED9AFDEC99FC0FD5F0D630
+:10F02700E4CEFBE4CDFAE4CCF9A88222B800C1B95A
+:10F037000059BA002DEC8BF084CFCECDFCE5F0CB98
+:10F04700F97818EF2FFFEE33FEED33FDEC33FCEBD1
+:10F0570033FB10D703994004EB99FB0FD8E5E4F98C
+:10F06700FA227818EF2FFFEE33FEED33FDEC33FC79
+:10F07700C933C910D7059BE99A4007EC9BFCE99A6D
+:10F08700F90FD8E0E4C9FAE4CCFB2275F010EF2FB2
+:10F09700FFEE33FEED33FDCC33CCC833C810D707B2
+:10F0A7009BEC9AE899400AED9BFDEC9AFCE899F8ED
+:0EF0B7000FD5F0DAE4CDFBE4CCFAE4C8F92280
+:00000001FF

+ 9 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/uboot.lnp

@@ -0,0 +1,9 @@
+".\Objects\STARTUP_TENX52.obj",
+".\Objects\main.obj",
+".\Objects\CRC.obj",
+".\Objects\iap.obj",
+".\Objects\uart.obj" 
+TO ".\Objects\uboot" REGFILE (.\Objects\uboot.ORC) 
+PRINT(".\Listings\uboot.m51") RAMSIZE(256) 
+CODE( 0xE000-0xE032,0xE03B-0xFBFB )
+XDATA( 0xE800-0xF7FF )

+ 0 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/uboot.log


Разлика између датотеке није приказан због своје велике величине
+ 4386 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/uboot.tenx


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/uboot.tenx.bin


Разлика између датотеке није приказан због своје велике величине
+ 32769 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/uboot.tenx.crc


Разлика између датотеке није приказан због своје велике величине
+ 6888 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/uboot.tenx.crc16_WriterVerify


Разлика између датотеке није приказан због своје велике величине
+ 64512 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/uboot.tenx.crc16verify


Разлика између датотеке није приказан због своје велике величине
+ 32801 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/uboot.tenx.crc2


+ 39 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/uboot_.tin

@@ -0,0 +1,39 @@
+[Project Data state]
+AP_MESS = 0
+SYSCFG = C2 1F 
+SYSCFG_ATK_ENABLE = 0
+MULTI_LANGUAGE = 0
+FORCE_ERASE = 0
+IRCF_O = 0
+SHOW_IRCF = 0
+ICE_MESS = 0
+SHOWMSGBOX_BEFOREDOWNLOAD = 0
+SHOWMSGBOX_BEFOREREADCODE = 0
+UNLOCK_PROTECT_PLUS_ERASE = 0
+FLASH_P = 1
+FLASH_V = 1
+READID_RETRY_COUNT = 0
+READID_DELAY_TIME = 1000
+COMPILE_WITH_MAKETENX = 1
+IDATA_MESS = 0
+
+[Project PageLock state]
+PAGE_LOCK_EN = 0
+PAGE_LOCK_ID = 
+PAGE_LOCK_PATH = 
+PAGE_LOCK_COUNT = 0
+PAGE_LOCK_EXPORT_ID = 
+PAGE_LOCK_EXPORT_COUNT = 0
+PAGE_LOCK_EXPORT_INPATH = 
+PAGE_LOCK_EXPORT_OUTPATH = 
+
+[Project Debug state]
+SKIP_READ_PC = 0
+SKIP_READ_XRAM = 0
+SKIP_READ_SFR = 0
+SKIP_33TO3A_CHECK = 0
+SKIP_CODEEND_CHECK = 0
+WRITE_ONE_BYTE = 0
+
+[Project LCD state]
+LCD_VIEW = 0

+ 2 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/uboot_.tin.bak

@@ -0,0 +1,2 @@
+[Project Data state]
+SYSCFG = C2 1F 

+ 58 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/uboot_CFG.xml

@@ -0,0 +1,58 @@
+IC:TM52F1386
+	<Option>
+	  <Name>PROT</Name>
+	  <Location>0x80</Location>
+	  <StartBit>7</StartBit>
+	  <Length>1</Length>
+	  <Option Value="1">Disable</Option>
+	  <Option Value="0">Enable</Option>
+	</Option>
+
+	<Option>
+	  <Name>XRSTE</Name>
+	  <Location>0x40</Location>
+	  <StartBit>6</StartBit>
+	  <Length>1</Length>
+	  <Option Value="1">Disable</Option>
+	  <Option Value="0">Enable</Option>
+	</Option>
+
+	<Option>
+	  <Name>BOOTV</Name>
+	  <Location>0x03</Location>
+	  <StartBit>0</StartBit>
+	  <Length>2</Length>
+	  <Option Value="0">0x0000</Option>
+	  <Option Value="1">0x0000</Option>
+	  <Option Value="2">0xE000(BOOT area 7K)</Option>
+	  <Option Value="3">0xE800(BOOT area 5K)</Option>
+	</Option>
+
+	<Option>
+	  <Name>IAP data reserve range</Name>
+	  <Location>0x0F</Location>
+	  <StartBit>0</StartBit>
+	  <Length>4</Length>
+	  <Option Value="15">No reserve range</Option>
+	  <Option Value="14">512 bytes(DE00~DFFF)</Option>
+	  <Option Value="13">1024 bytes(DC00~DFFF)</Option>
+	</Option>
+
+	<Option>
+	  <Name>ICE Mode</Name>
+	  <Location>0x10</Location>
+	  <StartBit>4</StartBit>
+	  <Length>1</Length>
+	  <Option Value="1">4-Wire</Option>
+	  <Option Value="0">5-Wire</Option>
+	</Option>
+
+	<Option>
+	  <Name>On Chip CRC16</Name>
+	  <Location>0x20</Location>
+	  <StartBit>5</StartBit>
+	  <Length>1</Length>
+	  <Option Value="0">Disable</Option>
+	  <Option Value="1">Enable</Option>
+	</Option>
+

+ 6 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/uboot_CFGWText.txt

@@ -0,0 +1,6 @@
+01. PROT (0:7)	Disable

+02. XRSTE (0:6)	Disable

+03. BOOTV (0:1~0)	0xE000(BOOT area 7K)

+04. IAP data reserve range (1:3~0)	No reserve range

+05. ICE Mode(1:4)	4-Wire

+06. On Chip CRC16(1:5)	Disable


+ 0 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/uboot_Driver.log


Разлика између датотеке није приказан због своје велике величине
+ 3 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/Objects/uboot_bin.bin


+ 223 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/STARTUP_TENX52.A51

@@ -0,0 +1,223 @@
+$NOMOD51
+;------------------------------------------------------------------------------
+;Description:
+;  This code is executed after a reset.  Besides the usual C51 startup 
+;  settings, Some specific TM52FXXXX  initializations are done here such as the
+;  LCD RAM clear. When the startup code execution is complete, this code jumps to ?C_START that 
+;  is typically the main() function in the C code.
+;  
+;
+;  This example demo code is provided as is and has no warranty,
+;  implied or otherwise.  You are free to use/modify any of the provided
+;  code at your own risk in your applications with the expressed limitation
+;  of liability  so long as your product using the code contains
+;  at least one TM52FXXXX product (device).
+;------------------------------------------------------------------------------
+;  User-defined <h> Power-On Initialization of Memory 
+;
+;  With the following EQU statements the initialization of memory
+;  at processor reset can be defined:
+;
+; <o> IDATALEN: IDATA memory size <0x0-0x100>
+;     <i> Note: The absolute start-address of IDATA memory is always 0
+;     <i>       The IDATA space overlaps physically the DATA and BIT areas.
+IDATALEN        EQU     80H   ; the length of IDATA memory in bytes to clear
+;
+; <o> XDATASTART: XDATA memory start address <0x0-0xFFFF> 
+;     <i> The absolute start address of XDATA memory
+;     <i> TM52FXXXX users need to fill this in based on where SRAM memory mapped.
+XDATAEND        EQU     0FFFFH ; the absolute end-address of XDATA memory
+;
+; <o> XDATALEN: XDATA memory size <0x0-0xFFFF> 
+;     <i> The length of XDATA memory in bytes.
+;     <i> NOTE: The length equates for XDATALEN  should be changed to 
+;     <i>       non-zero values indicating the amount of XDATA 
+;     <i>       memory to be initialized to 0x00.  The start address equates 
+;     <i>       (XDATASTART ) must be set to the respective starting
+;     <i>       addresses as mapped in TM52FXXXX if the memory is to be initialized.
+XDATALEN        EQU     0H      ; the length of XDATA memory in bytes to clear.
+;
+; <o> LCDDATASTART: LCD DATA memory start address <0x0-0xFFFF> 
+;     <i> The absolute start address of LCD DATA memory
+;     <i> TM52XX users need to fill this in based on where LCD DATA memory mapped.
+LCDDATASTART    EQU     0F000H  ; the absolute start-address of LCD DATA memory
+;
+; <o> LCDDATALEN: XDATA memory size <0x0-0xFF> 
+;     <i> The length of LCD DATA memory in bytes.
+;     <i> NOTE: The length equates for LCDDATALEN should be changed to 
+;     <i>       non-zero values indicating the amount of LCD DATA 
+;     <i>       memory to be initialized to 0x00.  The start address equates 
+;     <i>       (LCDDATASTART) must be set to the respective starting
+;     <i>       addresses as mapped in TM52FXXXX if the memory is to be initialized.
+LCDDATALEN      EQU     0H      ; the length of XDATA memory in bytes to clear.
+;
+; <o> PDATASTART: PDATA memory start address <0x0-0xFFFF> 
+;     <i> The absolute start address of PDATA memory
+PDATASTART      EQU     0H		; the absolute start-address of PDATA memory
+;
+; <o> PDATALEN: PDATA memory size <0x0-0xFF> 
+;     <i> The length of PDATA memory in bytes.
+PDATALEN        EQU     0H		; the length of PDATA memory in bytes to clear.
+;
+;</h>
+;------------------------------------------------------------------------------
+;
+;<h> Reentrant Stack Initialization
+;
+;  The following EQU statements define the stack pointer for reentrant
+;  functions and initialized it:
+;
+; <h> Stack Space for reentrant functions in the SMALL model.
+;  <q> IBPSTACK: Enable SMALL model reentrant stack
+;     <i> Stack space for reentrant functions in the SMALL model.
+IBPSTACK        EQU     0           ; set to 1 if small reentrant is used.
+;  <o> IBPSTACKTOP: End address of SMALL model stack <0x0-0xFF>
+;     <i> Set the top of the stack to the highest location.
+IBPSTACKTOP     EQU     0xFF +1     ; default 0FFH+1  
+; </h>
+;
+; <h> Stack Space for reentrant functions in the LARGE model.      
+;  <q> XBPSTACK: Enable LARGE model reentrant stack
+;     <i> Stack space for reentrant functions in the LARGE model.
+XBPSTACK        EQU     0           ; set to 1 if large reentrant is used.
+;  <o> XBPSTACKTOP: End address of LARGE model stack <0x0-0xFFFF>
+;     <i> Set the top of the stack to the highest location.
+XBPSTACKTOP     EQU     0xFFFF +1   ; default 0FFFFH+1 
+; </h>
+;
+; <h> Stack Space for reentrant functions in the COMPACT model.    
+;  <q> PBPSTACK: Enable COMPACT model reentrant stack
+;     <i> Stack space for reentrant functions in the COMPACT model.
+PBPSTACK        EQU     0           ; set to 1 if compact reentrant is used.
+;
+;   <o> PBPSTACKTOP: End address of COMPACT model stack <0x0-0xFFFF>
+;     <i> Set the top of the stack to the highest location.
+PBPSTACKTOP     EQU     0xFF +1     ; default 0FFH+1  
+;</h>
+;</h>
+;------------------------------------------------------------------------------
+;
+;  Memory Page for Using the Compact Model with 64 KByte xdata RAM
+;  <e>Compact Model Page Definition
+;
+;  <i>Define the XDATA page used for PDATA variables. 
+;  <i>PPAGE must conform with the PPAGE set in the linker invocation.
+;
+; Enable pdata memory page initalization
+PPAGEENABLE     EQU     0           ; set to 1 if pdata object are used.
+;
+; <o> PPAGE number <0x0-0xFF> 
+; <i> uppermost 256-byte address of the page used for PDATA variables.
+PPAGE           EQU     0
+;
+; <o> SFR address which supplies uppermost address byte <0x0-0xFF> 
+; <i> most 8051 variants use P2 as uppermost address byte
+PPAGE_SFR       DATA    0A0H
+;
+; </e>
+;; </e>
+;;------------------------------------------------------------------------------
+
+; Standard SFR Symbols 
+ACC     DATA    0E0H
+B       DATA    0F0H
+SP      DATA    81H
+DPL     DATA    82H
+DPH     DATA    83H
+
+                NAME    ?C_STARTUP
+
+
+?C_C51STARTUP   SEGMENT   CODE
+?STACK          SEGMENT   IDATA
+
+                RSEG    ?STACK
+                DS      1
+
+                EXTRN CODE (?C_START)
+                PUBLIC  ?C_STARTUP
+
+                CSEG    AT      0E000H
+?C_STARTUP:     LJMP    STARTUP1
+
+                RSEG    ?C_C51STARTUP
+
+STARTUP1:
+
+IF IDATALEN <> 0
+                MOV     R0,#IDATALEN - 1
+                CLR     A
+IDATALOOP:      MOV     @R0,A
+                DJNZ    R0,IDATALOOP
+ENDIF
+
+IF XDATALEN <> 0
+                MOV     DPTR,#(XDATAEND-XDATALEN)+1
+                MOV     R7,#LOW (XDATALEN)
+  IF (LOW (XDATALEN)) <> 0
+                MOV     R6,#(HIGH (XDATALEN)) +1
+  ELSE
+                MOV     R6,#HIGH (XDATALEN)
+  ENDIF
+                CLR     A
+XDATALOOP:      MOVX    @DPTR,A
+                INC     DPTR
+                DJNZ    R7,XDATALOOP
+                DJNZ    R6,XDATALOOP
+ENDIF
+
+IF LCDDATALEN <> 0
+                MOV     DPTR,#LCDDATASTART
+                MOV     R7,#LCDDATALEN
+                CLR     A
+LCDDATALOOP:    MOVX    @DPTR,A
+                INC     DPTR
+                DJNZ    R7,LCDDATALOOP
+ENDIF
+
+
+IF PPAGEENABLE <> 0
+                MOV     PPAGE_SFR,#PPAGE
+ENDIF
+
+IF PDATALEN <> 0
+                MOV     R0,#LOW (PDATASTART)
+                MOV     R7,#LOW (PDATALEN)
+                CLR     A
+PDATALOOP:      MOVX    @R0,A
+                INC     R0
+                DJNZ    R7,PDATALOOP
+ENDIF
+
+IF IBPSTACK <> 0
+EXTRN DATA (?C_IBP)
+
+                MOV     ?C_IBP,#LOW IBPSTACKTOP
+ENDIF
+
+IF XBPSTACK <> 0
+EXTRN DATA (?C_XBP)
+
+                MOV     ?C_XBP,#HIGH XBPSTACKTOP
+                MOV     ?C_XBP+1,#LOW XBPSTACKTOP
+ENDIF
+
+IF PBPSTACK <> 0
+EXTRN DATA (?C_PBP)
+                MOV     ?C_PBP,#LOW PBPSTACKTOP
+ENDIF
+
+                MOV     SP,#?STACK-1  ; init SP for hardware stack 
+
+; This code is required if you use L51_BANK.A51 with Banking Mode 4
+;<h> Code Banking
+; <q> Select Bank 0 for L51_BANK.A51 Mode 4
+#if 0   
+;     <i> Initialize bank mechanism to code bank 0 when using L51_BANK.A51 with Banking Mode 4.
+EXTRN CODE (?B_SWITCH0)
+                CALL    ?B_SWITCH0      ; init bank mechanism to code bank 0
+#endif
+;</h>
+                LJMP    ?C_START    ;call main() function in the C code
+
+                END

BIN
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/_MakeTenx_uboot/01.bmp


BIN
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/_MakeTenx_uboot/CallKeilDll.exe


+ 57 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/_MakeTenx_uboot/CallKeilDll.tic

@@ -0,0 +1,57 @@
+<?xml version="1.0"  encoding="UTF-8"?>
+<Setting>
+	<Message>
+		<SelectKeilFolder>
+			<Language Enable="0" Value="0">
+				<Item TypeName="TranditionCh" Index="0" Value="Can't find plug-in dll,please select keil-c folder!">
+					<FontSize>10</FontSize>
+				</Item>
+				<Item TypeName="SimpleCh" Index="1" Value="编译生成烧录档失败!!!&#xa;无法检测插件位置,请重新输入keil安装路径。&#xa;或按取消后手动进行工程设定匹配">
+					<FontSize>10</FontSize>
+				</Item>
+				<Item TypeName="English" Index="2" Value="Can't find plug-in dll,please select keil-c folder!">
+					<FontSize>10</FontSize>
+				</Item>
+			</Language>
+		</SelectKeilFolder>
+		<NotFindDll>
+			<Language Enable="0" Value="0">
+				<Item TypeName="TranditionCh" Index="0" Value="Make burn file warning:&#xa;Can't find plug-in dll,&#xa;please go setting dialog to update your settings!">
+					<FontSize>10</FontSize>
+				</Item>
+				<Item TypeName="SimpleCh" Index="1" Value="无法检测插件位置,&#xa;请至&#xa;Project &#xa;-> Options for Target ‘Target 1’… &#xa;-> Utilities页面 &#xa;-> Settings,&#xa;並確認已勾選编译生成烧录档。&#xa;以便更新项目文檔,而正确执行编译生成烧录档。">
+					<FontSize>10</FontSize>
+				</Item>
+				<Item TypeName="English" Index="2" Value="Make burn file warning:&#xa;Can't find plug-in dll,&#xa;please go setting dialog to update your settings!">
+					<FontSize>10</FontSize>
+				</Item>
+			</Language>
+		</NotFindDll>
+		<DllTooOld>
+			<Language Enable="0" Value="0">
+				<Item TypeName="TranditionCh" Index="0" Value="%s plug-in dll is too old,please update!!!">
+					<FontSize>10</FontSize>
+				</Item>
+				<Item TypeName="SimpleCh" Index="1" Value="无法支持%s安装之插件生成烧录档,请更新插件版本!!!">
+					<FontSize>10</FontSize>
+				</Item>
+				<Item TypeName="English" Index="2" Value="%s plug-in dll is too old,please update!!!">
+					<FontSize>10</FontSize>
+				</Item>
+			</Language>
+		</DllTooOld>
+		<CancelToShow>
+			<Language Enable="0" Value="0">
+				<Item TypeName="TranditionCh" Index="0" Value="Cancel">
+					<FontSize>10</FontSize>
+				</Item>
+				<Item TypeName="SimpleCh" Index="1" Value="按取消进入演示">
+					<FontSize>10</FontSize>
+				</Item>
+				<Item TypeName="English" Index="2" Value="Cancel">
+					<FontSize>10</FontSize>
+				</Item>
+			</Language>
+		</CancelToShow>
+	</Message>
+</Setting>

+ 9 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/_MakeTenx_uboot/CallKeilDll.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0"  encoding="UTF-8"?>
+<CallKeilDll>
+	<ProjectFileName>uboot.uvproj</ProjectFileName>
+	<ChipName>TM52F1386</ChipName>
+	<DllName>SampTarg</DllName>
+	<OutFileName>uboot</OutFileName>
+	<OutFolderName>.\Objects\</OutFolderName>
+	<DllFolderPath>C:\Keil_v5_51\</DllFolderPath>
+</CallKeilDll>

+ 1 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/_MakeTenx_uboot/run.bat

@@ -0,0 +1 @@
+".\_MakeTenx_uboot\CallKeilDll.exe"

+ 27 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/src/CRC.c

@@ -0,0 +1,27 @@
+#include <REGtenxTM52F1386.H>
+#include <intrins.h>
+
+/*******************************************************************
+** 函数名称: crc_calcu
+** 函数描述: 数据CRC校验
+** 输入参数: 无
+** 输出参数: ret   CRC的校验值
+*******************************************************************/
+unsigned int crc_calcu(unsigned char *p,unsigned int len)
+{
+	unsigned int ret=0;
+	unsigned int i=0;
+	CRCIN = 0;
+	CRCDH = 0xff;
+	CRCDL = 0xff;
+	for(i = 0;i<len;i++)
+	{
+		CRCIN = p[i];   //将要检验的数据送入到CRCIN寄存器里
+	}
+
+	ret = CRCDH;
+	ret = ret<<8;
+	ret = ret|CRCDL;
+	return ret;    //返回校验值
+}
+

+ 7 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/src/CRC.h

@@ -0,0 +1,7 @@
+#ifndef CRC_H
+#define CRC_H
+
+unsigned int crc_calcu(unsigned char *p,unsigned int len);
+
+
+#endif

+ 332 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/src/iap.c

@@ -0,0 +1,332 @@
+#include <REGtenxTM52F1386.H>
+#include "CRC.h" 
+#include "iap.h"
+
+//以下两个指针必须是xdata类型
+unsigned char xdata *p_info_addr;          //指向信息存储器区域 - 读写
+unsigned char xdata *p_write_app_addr;     //指向app区域 - 写
+unsigned char code  *p_read_app_addr;      //指向app区域 - 读
+
+static  bit iap_flag=0;     //0:正常   1:异常
+
+_ota_mcu_fw ota_fw_info;
+
+/******************************************************************************************
+** 函数名称: erasure_INFO_page
+** 函数描述: 擦除信息存储器区域的一页数据
+** 输入参数: 地址
+** 输出参数: 状态:0 正常, 1 异常
+*******************************************************************************************/
+static bit erasure_INFO_page(unsigned int addr)
+{
+  unsigned char temp_ea;
+  
+  if(addr < 0x800)       //INFO区 5~8,用户可写
+  {
+    return 1;            //返回异常值
+  }
+  
+  iap_flag = 0;          //iap_flag标志清零
+  
+  temp_ea = EA;
+  EA = 0;
+  
+  LVRCON = LVRCON|0x10;  //关闭LVR
+  
+  p_info_addr = (unsigned char *)addr;
+  
+  AUX2 = AUX2&0xF9|0x06; //设置IAP超时时间
+  
+  //写入0XA1和0xBA, 开启 INFO 区域擦除	
+  IAPWE_SFR=0XA1;
+  IAPWE_SFR=0XBA;	
+  
+  //INFO区域不需要设置 SWCMD 寄存器
+  
+  *p_info_addr = 0;      //触发页擦除
+  
+  if(IAPWE_SFR & IAPTO)  //置位表示超时
+  {
+    iap_flag = 1;        //iap_flag标志置位
+  }
+  
+  AUX2 = AUX2&0xF9;      //关闭IAP看门狗
+  IAPWE_SFR = 0x00;      //禁止IAP擦除
+  SWCMD = 0x00;		       //关闭IAP权限
+  
+  LVRCON = LVRCON&~0x10; //开启LVR
+  
+  EA = temp_ea;	
+  
+  return  iap_flag;
+}
+
+/******************************************************************************************
+** 函数名称: read_INFO_byte
+** 函数描述: 读取信息存储器区域的数据
+** 输入参数: 地址 数组的首地址、长度 
+** 输出参数: 无
+*******************************************************************************************/
+static void read_INFO_byte(unsigned int addr, unsigned char *buf, unsigned int len)
+{
+  unsigned int i;
+  
+  p_info_addr =(unsigned char*)addr;
+  
+  for(i = 0; i<len; i++)
+  {
+    buf[i] = *p_info_addr;
+    p_info_addr++;  
+  }
+}
+
+/******************************************************************************************
+** 函数名称: write_INFO_byte
+** 函数描述: 写入信息存储器区域的数据
+** 输入参数: 地址 数组的首地址、长度 
+** 输出参数: 状态:0 正常, 1 异常
+*******************************************************************************************/
+static bit write_INFO_byte(unsigned int addr, unsigned char *buf, unsigned int len)
+{
+  unsigned char temp_ea;
+  unsigned int i;
+  
+  iap_flag = 0;           //iap_flag标志清零
+  
+  temp_ea = EA;
+  EA = 0;
+  
+  LVRCON = LVRCON|0x10;   //关闭LVR
+  
+  p_info_addr = (unsigned char *)addr;
+  
+  AUX2 = AUX2&0xF9|0x06;  //设置IAP超时时间
+  
+  //写入0XA1和0X4C, 开启 INFO 区域擦除	
+  IAPWE_SFR=0XA1;
+  IAPWE_SFR=0X4C;	
+  
+  //INFO区域不需要设置 SWCMD 寄存器
+  for(i = 0; i<len; i++)
+  {
+    *p_info_addr = buf[i];//触发写
+    p_info_addr++;
+  }
+  
+  if(IAPWE_SFR & IAPTO)   //置位表示超时
+  {
+    iap_flag = 1;         //iap_flag标志置位
+  }
+  
+  AUX2 = AUX2&0xF9;       //关闭IAP看门狗
+  IAPWE_SFR = 0x00;       //禁止IAP擦除
+  SWCMD = 0x00;		        //关闭IAP权限
+  
+  LVRCON = LVRCON&~0x10;  //开启LVR
+  
+  EA = temp_ea;	
+  
+  return  iap_flag;	
+}
+
+/******************************************************************************************
+** 函数名称: user_write_INFO_byte
+** 函数描述: 存储INFO数据的函数,供用户使用
+** 输入参数: 地址 数组的首地址、长度 
+** 输出参数: 状态:0 正常, 1 异常
+*******************************************************************************************/
+bit user_write_INFO_byte(unsigned int addr, unsigned char *buf, unsigned int len)
+{
+  bit flag=0;
+  unsigned int crc_write=0,crc_read=0;
+  
+  //页首地址才会执行页擦除,一页512byte
+  if(addr==0 || ((addr%0x200)==0))    
+  {
+    flag = erasure_INFO_page(addr);    
+    if(flag)  return  flag;         //异常就返回
+  }
+  
+  //先擦除页,再写入数据
+  flag = write_INFO_byte(addr,buf,len);
+  if(flag)  return  flag;           //异常就返回
+  crc_write = crc_calcu(buf,len);   //计算写之前的CRC值
+  
+  //读出比较CRC值
+  read_INFO_byte(addr,buf,len);
+  crc_read = crc_calcu(buf,len);    //从flash里读出数据,在计算CRC值
+  
+  if(crc_write != crc_read)         //判断读写的数据是否一致
+  {
+    flag = 1; 
+  }
+  
+  return  flag;
+}
+
+/******************************************************************************************
+** 函数名称: user_read_INFO_byte
+** 函数描述: 读INFO数据的函数,供用户使用
+** 输入参数: 地址 数组的首地址、长度 
+** 输出参数: 无
+*******************************************************************************************/
+void user_read_INFO_byte(unsigned int addr, unsigned char *buf, unsigned int len)
+{
+  read_INFO_byte(addr, buf,len);	
+}
+
+/******************************************************************************************
+** 函数名称: erasure_APP_page
+** 函数描述: 擦除信app区域的一页数据
+** 输入参数: 地址
+** 输出参数: 状态:0 正常, 1 异常
+*******************************************************************************************/
+static bit erasure_APP_page(unsigned int addr)
+{
+  unsigned char temp_ea;
+  
+  iap_flag = 0;           //iap_flag标志清零
+  
+  temp_ea = EA;
+  EA = 0;
+  
+  LVRCON = LVRCON|0x10;   //关闭LVR
+  
+  p_write_app_addr = (unsigned char *)addr;
+  
+  AUX2 = AUX2&0xF9|0x06;  //设置IAP超时时间
+  
+  //写入0xE2和0xBA, 开启APP 区域擦除	
+  IAPWE_SFR=0XE2;
+  IAPWE_SFR=0XBA;	
+  
+  //写入0x65和0xA7,开启APP区域擦除和写入权限
+  SWCMD=0x65;		
+  SWCMD=0xA7;
+  
+  *p_write_app_addr = 0;  //触发页擦除
+  
+  if(IAPWE_SFR & IAPTO)   //置位表示超时
+  {
+    iap_flag = 1;         //iap_flag标志置位
+  }
+  
+  AUX2 = AUX2&0xF9;       //关闭IAP看门狗
+  IAPWE_SFR = 0x00;       //禁止IAP擦除
+  SWCMD = 0x00;		        //关闭IAP权限
+  
+  LVRCON = LVRCON&~0x10;  //开启LVR
+  
+  EA = temp_ea;	
+  
+  return  iap_flag;
+}
+
+/******************************************************************************************
+** 函数名称: read_APP_byte
+** 函数描述: 读取APP区域的数据
+** 输入参数: 地址 数组的首地址、长度 
+** 输出参数: 无
+*******************************************************************************************/
+void read_APP_byte(unsigned int addr, unsigned char *buf, unsigned int len)
+{
+  unsigned int i;
+  
+  p_read_app_addr =(unsigned char*)addr;
+  
+  for(i = 0; i<len; i++)
+  {
+    buf[i] = *p_read_app_addr;
+    p_read_app_addr++;  
+  }
+}
+
+/******************************************************************************************
+** 函数名称: write_APP_byte
+** 函数描述: 写入APP的数据
+** 输入参数: 地址 数组的首地址、长度 
+** 输出参数: 状态:0 正常, 1 异常
+*******************************************************************************************/
+static bit write_APP_byte(unsigned int addr, unsigned char *buf, unsigned int len)
+{
+  unsigned char temp_ea;
+  unsigned int i;
+  
+  iap_flag = 0;           //iap_flag标志清零
+  
+  temp_ea = EA;
+  EA = 0;
+  
+  LVRCON = LVRCON|0x10;   //关闭LVR
+  
+  p_write_app_addr = (unsigned char *)addr;
+  
+  AUX2 = AUX2&0xF9|0x06;  //设置IAP超时时间
+  
+  //写入0xE2和0X4C, 开启APP 区域擦除	
+  IAPWE_SFR=0XE2;
+  IAPWE_SFR=0X4C;	
+  
+  //写入0x65和0xA7,开启APP区域擦除和写入权限
+  SWCMD=0x65;		
+  SWCMD=0xA7;
+  
+  for(i = 0; i<len; i++)
+  {
+    *p_write_app_addr = buf[i];     //触发写
+    p_write_app_addr++;
+  }
+  
+  if(IAPWE_SFR & IAPTO)   //置位表示超时
+  {
+    iap_flag = 1;         //iap_flag标志置位
+  }
+  
+  AUX2 = AUX2&0xF9;       //关闭IAP看门狗
+  IAPWE_SFR = 0x00;       //禁止IAP擦除
+  SWCMD = 0x00;		        //关闭IAP权限
+  
+  LVRCON = LVRCON&~0x10;  //开启LVR
+  
+  EA = temp_ea;	
+  
+  return  iap_flag;	
+}
+
+/******************************************************************************************
+** 函数名称: user_write_APP_byte
+** 函数描述: 存储APP数据的函数,供用户使用
+** 输入参数: 地址 数组的首地址、长度 
+** 输出参数: 状态:0 正常, 1 异常
+*******************************************************************************************/
+bit user_write_APP_byte(unsigned int addr, unsigned char *buf, unsigned int len)
+{
+  bit flag=0;
+  unsigned int crc_write=0,crc_read=0;
+  
+  //页首地址才会执行页擦除
+  if(addr==0 || ((addr%0x200)==0))    
+  {
+    flag = erasure_APP_page(addr);    
+    if(flag)  return  flag;         //异常就返回
+  }
+  
+  //先擦除页,再写入数据
+  flag = write_APP_byte(addr,buf,len);
+  if(flag)  return  flag;           //异常就返回
+  crc_write = crc_calcu(buf,len);   //计算写之前的CRC值
+  
+  //读出比较CRC值
+  read_APP_byte(addr,buf,len);
+  crc_read = crc_calcu(buf,len);    //从flash里读出数据,在计算CRC值
+  
+  if(crc_write != crc_read)
+  {
+    flag = 1; 
+  }
+  
+  return  flag;
+}
+
+
+

+ 49 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/src/iap.h

@@ -0,0 +1,49 @@
+#ifndef IAP_H
+#define IAP_H
+
+/**********************   宏定义    ********************************/
+#define BACKUP_ADDR 0x7000 // 信息存储器INFO5地址
+
+
+bit user_write_APP_byte(unsigned int addr, unsigned char *buf, unsigned int len);
+bit user_write_INFO_byte(unsigned int addr, unsigned char *buf, unsigned int len);
+void user_read_INFO_byte(unsigned int addr, unsigned char *buf, unsigned int len);
+
+///< Byte order of frames
+#define         HEAD_FIRST                      0
+#define         HEAD_SECOND                     1
+#define         PROTOCOL_VERSION                2
+#define         SEQ_HIGH                        3
+#define         SEQ_LOW                         4
+#define         FRAME_TYPE                      5
+#define         LENGTH_HIGH                     6
+#define         LENGTH_LOW                      7
+#define         DATA_START                      8
+
+#define			MCU_OTA_VERSION_CMD				    0x0B							//zigbee request mcu version 
+#define			MCU_OTA_NOTIFY_CMD				    0x0C							//mcu ota notify 
+#define			MCU_OTA_DATA_REQUEST_CMD			0x0D							//MCU OTA data request 
+#define			MCU_OTA_RESULT_CMD					0x0E							//MCU OTA result report
+
+///< frme data define 
+#define SERIAL_PROTOCOL_VER                 0x02                                            // the version of frame 
+#define PROTOCOL_HEAD                       0x09                                           //the lcation of frame length except for tail
+#define FIRST_FRAME_HEAD                    0x55                                            // first byte of frame 
+#define SECOND_FRAME_HEAD                   0xaa                                            // second byte of frame 
+
+#define FW_SINGLE_PACKET_SIZE 		0x20	     ///< firmware single packet size, define by mcu 
+
+/** ota mcu firmware struct*/
+typedef struct
+{
+	unsigned char mcu_ota_pid[8];	  //OTA fw PID
+	unsigned char mcu_ota_ver;	     //OTA fw version
+	long int mcu_ota_fw_size;	 //OTA fw size
+	long int mcu_current_offset; //current offset 
+	long int mcu_ota_checksum;  //OTA fw checksum	
+}_ota_mcu_fw;
+
+extern _ota_mcu_fw ota_fw_info;	///< ota firmware infomation
+extern  void read_APP_byte(unsigned int addr, unsigned char *buf, unsigned int len);
+	
+#endif

+ 501 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/src/main.c

@@ -0,0 +1,501 @@
+#include <REGtenxTM52F1386.h>
+#include "TM52F1386_bsp.h"
+#include <intrins.h>
+#include "iap.h"
+#include "uart.h"
+#include "main.h"
+
+/*********************   全局变量    *******************************/
+unsigned char flag_1ms = 0;        // 1ms时基
+unsigned char up_flag = 0;         // 升级标志 1:升级成功
+unsigned char up_flag_delay = 0;         // 升级标志 1:升级成功延时50ms启动切换
+unsigned char CheckBuf[24] = {0};  // 读取升级标记的数组
+unsigned char FlashBuf[256] = {0}; // flash搬迁
+unsigned char download_flag = 0;   // 下载固件标志,默认为1,如果开机去读到参数区升级参数,则置1,表示升级中
+
+unsigned char flag_err = 0; // OTA异常标识
+
+union_u32_t file_len = {0}; // 升级文件总长度
+long int rec_len = 0;       // 已接收的长度
+
+unsigned char unprocessed_cnt = 0;            // 接收到的帧未处理的次数
+unsigned char processed_cnt = 0;              // 接收到的帧已处理的次数
+unsigned char first_addr = 0;                 // 帧首下标
+unsigned int unprocessed_frame_len[10] = {0}; // 最多一次接收十帧
+
+// 产品信息,需要根据客户自己的产品调整,这里只做演示效果
+unsigned char product_inof[] = {"{\"p\":\"dc4slgded6m69crh\", \"v\":\"1.0.1\", \"m\":2,\"mt\":10,\"n\":0,\"ir\":\"5.12\", \"low\":0}"};
+/**********************   宏定义    ********************************/
+#define INFO5_ADDR 0X800 // 信息存储器INFO5地址
+
+#define delay_10nop() \
+  do                  \
+  {                   \
+    _nop_();          \
+    _nop_();          \
+    _nop_();          \
+    _nop_();          \
+    _nop_();          \
+    _nop_();          \
+    _nop_();          \
+    _nop_();          \
+    _nop_();          \
+    _nop_();          \
+  } while (0)
+
+/*******************************************************************
+** 函数名称: bsp_clock_init
+** 函数描述: 时钟初始化
+** 输入参数: 无
+** 输出参数: 无
+*******************************************************************/
+void bsp_clock_init()
+{
+  SELFCK = 0; // 切换到慢时钟
+
+  CLKCON = 0x03; // 时钟一分频
+
+  delay_10nop();
+  STPPCK = 0; // 开启部分模块使用快时钟
+  delay_10nop();
+  STPFCK = 0; // 开启快时钟
+  delay_10nop();
+  SELFCK = 1; // 切换到快时钟
+  delay_10nop();
+}
+
+/*******************************************************************
+** 函数名称: Timer0_Init
+** 函数描述: tim0初始化函数
+** 输入参数: 无
+** 输出参数: 无
+**  说 明  : 定时1ms
+*******************************************************************/
+void Timer0_Init(void)
+{
+  TMOD = (TMOD & ~0x03) | 0x01;
+
+  TH0 = (65536 - 9216) / 256; // timer0 高字节数据
+  TL0 = (65536 - 9216) % 256; // timer0 低字节数据
+  ET0 = 1;                    // timer0 中断使能
+  TR0 = 1;                    // timer0 运行控制
+}
+
+/*******************************************************************
+** 函数名称: LVR_Init
+** 函数描述: LVR初始化函数
+** 输入参数: 无
+** 输出参数: 无
+**  说 明  : 电压低于设定值,MCU即复位
+*******************************************************************/
+void LVR_Init(void)
+{
+  LVRCON = LVRCON & ~0X07 | 0X04; // LVR设置为3.2V
+}
+
+/*******************************************************************
+** 函数名称: gpio_init
+** 函数描述: 引脚初始化
+** 输入参数: 无
+** 输出参数: 无
+*******************************************************************/
+void gpio_init()
+{
+  PORTIDX = 1;
+  PINMOD76 = PINMOD76 & 0x0f | 0x60; //
+  P1_7 = 1;
+  //
+
+  PORTIDX = 3;
+  PINMOD76 = PINMOD76 & 0x0f | 0x00; // P3.7配置为上拉输入
+  P3_7 = 1;                          // 低有效
+}
+
+/*******************************************************************
+** 函数名称: uart_process
+** 函数描述: 串口接收到数据进程处理
+** 输入参数: 无
+** 输出参数: 无
+*******************************************************************/
+void uart_process(unsigned char *P_recv, unsigned int frame_len)
+{
+  unsigned char command = 0;      // 命令字
+  unsigned char verify_value = 0; // 检验值
+  unsigned char str_len = 0;      // 字符串长度
+  unsigned int i = 0, len = 0;
+  long int fw_offset = 0;
+  static long int current_checksum = 0;
+  char fw_data[FW_SINGLE_PACKET_SIZE] = {-1}; //
+  unsigned char last_package_len = 0;
+
+  // 校验值,字节和校验
+  for (i = 0; i < (frame_len - 1); i++)
+  {
+    verify_value += *(P_recv + i);
+  }
+
+  if (verify_value != *(P_recv + frame_len - 1))
+    return; // 校验不对,返回
+  if ((*(P_recv + 0) != 0x55) || (*(P_recv + 1) != 0xaa))
+    return;                                   // 帧头不对,返回
+  len = (*(P_recv + 6) << 8) + *(P_recv + 7); // 帧里的数据长度
+  if (frame_len != (6 + len + 1 + 2))
+    return; // 长度不对,返回
+
+  command = *(P_recv + 5); // 命令字
+  switch (command)
+  {
+  case 0x00: // WIFI心跳包-取消
+    //	  if(first_poweron_falg)
+    //	  {
+    //		 first_poweron_falg = 0;
+    //		 uart_send_data(0x03,command,1,0x00);     //MCU重启后首次回复心跳包,必须回复0x00
+    //	  }
+    //	  else
+    { // del by zzw 20240328
+      // uart_send_data(0x03, command, 1, 0x01); // 除首次外,必须回复0x01
+    }
+
+    break;
+
+  case 0x01: // 查询产品信息--后期添加
+    //    str_len = sizeof(product_inof);
+    //    uart_send_product(0x03,command,str_len,product_inof);
+    break;
+  case 0x02: // 获取设备联网状态信息--后期添加
+
+    break;
+  case 0x0B: // OTA版本请求指令--后期添加
+
+    break;
+  case 0x0C: // OTA升级请求--后期添加
+
+    break;
+
+  case 0x0d: // 固件包传输
+    // user_write_APP_byte(unsigned int addr, unsigned char *buf, unsigned int len);
+    //  ota_fw_info.mcu_ota_fw_size 为数据包总长度,即OTA文件大小
+    if (rec_len < ota_fw_info.mcu_ota_fw_size)
+    {
+      /*******************增加数据处理部分 add qys start *****************************************/
+      if (*(P_recv + 8) == 0x01) // status check
+        return;
+      i = 0;
+      while (i < 8)
+      {
+        if (ota_fw_info.mcu_ota_pid[i] != *(P_recv + 9 + i)) // pid check
+          return;
+        i++;
+      }
+      if (ota_fw_info.mcu_ota_ver != *(P_recv + 17)) // version check
+        return;
+
+      i = 0;
+      while (i < 4)
+      {
+        fw_offset |= (*(P_recv + 18 + i) << (24 - i * 8)); // offset
+        i++;
+      }
+
+      i = 0;
+      if (ota_fw_info.mcu_current_offset == fw_offset)
+      {
+        if (((ota_fw_info.mcu_ota_fw_size - fw_offset) / FW_SINGLE_PACKET_SIZE != 0) && (ota_fw_info.mcu_ota_fw_size != (fw_offset + FW_SINGLE_PACKET_SIZE)))
+        {
+          if (ota_fw_info.mcu_current_offset == 0)
+          {
+            current_checksum = 0;
+          }
+          while (i < FW_SINGLE_PACKET_SIZE)
+          {
+            fw_data[i] = *(P_recv + 22 + i); // fw data
+            current_checksum += fw_data[i];
+            i++;
+          }
+          ota_fw_info.mcu_current_offset += FW_SINGLE_PACKET_SIZE;
+          //			ota_fw_data_handle(fw_offset, &fw_data[0], FW_SINGLE_PACKET_SIZE); // OTA paket data handle
+        }
+        else
+        {
+          i = 0;
+          if ((ota_fw_info.mcu_ota_fw_size - fw_offset) % FW_SINGLE_PACKET_SIZE != 0)
+          {
+            last_package_len = ota_fw_info.mcu_ota_fw_size - fw_offset;
+          }
+          else
+          {
+            last_package_len = FW_SINGLE_PACKET_SIZE;
+          }
+          while (i < last_package_len)
+          {
+            fw_data[i] = *(P_recv + 22 + i); // fw data
+            current_checksum += fw_data[i];
+            i++;
+          }
+          ota_fw_info.mcu_current_offset += last_package_len;
+          if (ota_fw_info.mcu_ota_checksum != current_checksum)
+          {
+            // ota failure report ota failure and clear ota struct
+            mcu_ota_result_report(1); // failed
+          }
+          else
+          {
+            // ota sucess
+            mcu_ota_result_report(0); // seccess
+          }
+          //	ota_fw_data_handle(fw_offset, &fw_data[0], last_package_len); // OTA paket data handle
+          current_checksum = 0;
+        }
+      }
+
+      flag_err = user_write_APP_byte(rec_len + BACKUP_ADDR, &fw_data[0], len - 14); // modified by zzw 20240328
+      /*******************增加数据处理部分 add qys end *****************************************/
+      rec_len += (len - 14);
+      mcu_ota_fw_request();
+    }
+    if (rec_len == ota_fw_info.mcu_ota_fw_size) // 长度相等,说明接收结束
+    {
+      /*CheckBuf[0] = 0x00;
+      CheckBuf[1] = 0x00;
+      CheckBuf[2] = 0x00;
+      flag_err = user_write_INFO_byte(INFO5_ADDR, CheckBuf, 3); // 擦除升级标志*/
+      
+      up_flag = 1; // 升级成功
+    }
+
+    break;
+  case 0x0e:     // 升级成功
+    up_flag = 1; // 升级成功
+    break;
+
+  default:
+    break;
+  }
+}
+
+/*******************************************************************
+** 函数名称: frame_splitting
+** 函数描述: 一段帧数据分割
+** 输入参数: 无
+** 输出参数: 无
+*******************************************************************/
+void frame_splitting()
+{
+  unsigned char cur_addr = 0, cur_addr_old = 0xff; // 匹配帧头的下标地址
+  unsigned int i = 0;
+
+  first_addr = 0;                            // 帧首下标清零
+  processed_cnt = 0;                         // 已处理次数清零
+  unprocessed_cnt = 0;                       // 未处理次数清零
+  for (i = 0; i < (com0recv_index - 1); i++) // 查询是否多条一起发
+  {
+    if ((com0recv[i] == 0x55) && (com0recv[i + 1] == 0xaa))
+    {
+      unprocessed_cnt++;
+      cur_addr = i;
+      if (cur_addr_old != cur_addr) // 第一次不算,其他次发现帧头计算上一帧长度
+      {
+        if (unprocessed_cnt > 1)
+        {
+          unprocessed_frame_len[unprocessed_cnt - 2] = cur_addr - cur_addr_old;   // 更新上一帧的长度
+          unprocessed_frame_len[unprocessed_cnt - 1] = com0recv_index - cur_addr; // 记录本帧的长度
+        }
+        else
+        {
+          first_addr = cur_addr;                                                  // 记录帧首下标
+          unprocessed_frame_len[unprocessed_cnt - 1] = com0recv_index - cur_addr; // 记录本帧的长度,如果不是最后一帧,下次该长度会重新计算
+        }
+
+        cur_addr_old = cur_addr;
+      }
+    }
+  }
+}
+
+/*******************************************************************
+** 函数名称: main
+** 函数描述: main函数
+** 输入参数: 无
+** 输出参数: 无
+********************************************************************/
+void main()
+{
+  unsigned char cnt = 0;
+  unsigned int tim_3s = 0;
+  unsigned int timout_300s = 0; // 5*60,5分钟超时
+  unsigned char i;
+  unsigned char str_len = 0;
+
+  bsp_clock_init(); // 时钟初始化
+  LVR_Init();       // 设置LVR的复位电压 - 3.2V
+  Timer0_Init();    // 定时器0初始化,1ms中断
+  gpio_init();      // 引脚初始化
+  uart0_init();     // uart初始化,默认115200
+
+  EA = 1;
+
+  user_read_INFO_byte(INFO5_ADDR, CheckBuf, 20); // 读取INFO5地址存储的数据
+  // 增加读取产品信息 add qys
+  for (i = 0; i < 8; i++)
+  {
+    ota_fw_info.mcu_ota_pid[i] = CheckBuf[i + 3];
+  }
+
+  ota_fw_info.mcu_ota_ver = CheckBuf[11];
+
+  ota_fw_info.mcu_ota_fw_size = CheckBuf[12];
+  ota_fw_info.mcu_ota_fw_size = (ota_fw_info.mcu_ota_fw_size << 8) + CheckBuf[13];
+  ota_fw_info.mcu_ota_fw_size = (ota_fw_info.mcu_ota_fw_size << 8) + CheckBuf[14];
+  ota_fw_info.mcu_ota_fw_size = (ota_fw_info.mcu_ota_fw_size << 8) + CheckBuf[15];
+
+  ota_fw_info.mcu_ota_checksum = CheckBuf[16];
+  ota_fw_info.mcu_ota_checksum = (ota_fw_info.mcu_ota_checksum << 8) + CheckBuf[17];
+  ota_fw_info.mcu_ota_checksum = (ota_fw_info.mcu_ota_checksum << 8) + CheckBuf[18];
+  ota_fw_info.mcu_ota_checksum = (ota_fw_info.mcu_ota_checksum << 8) + CheckBuf[19];
+
+  // add by zzw 20240328 增加异常断电,不影响APP运行
+  if (CheckBuf[0] == 0x55 && CheckBuf[1] == 0xaa && CheckBuf[2] == 0x5a) // 表示要升级
+  {
+    download_flag = 0x01; // 启动升级开始
+    CheckBuf[0] = 0x00;
+    CheckBuf[1] = 0x00;
+    CheckBuf[2] = 0x00;
+    flag_err = user_write_INFO_byte(INFO5_ADDR, CheckBuf, 20); // 擦除升级标志,如果现在升级文件中途断电,重启后直接加载到APP
+  }
+  // 开机后流程
+  if (download_flag == 0x01) // 启动升级
+  {
+    // 增加发送请求数据包指令:0x0d指令
+    ota_fw_info.mcu_current_offset = 0;
+    mcu_ota_fw_request();
+    timout_300s = 0;
+    while (1)
+    {
+      if (flag_1ms) // 1ms时基
+      {
+        flag_1ms = 0;
+
+        // 接收完成,处理数据
+        if (com0recv_state == 2)
+        {
+          com0recv_state = 0xff;
+          frame_splitting(); // 帧分析,如果是多条帧就分割开
+        }
+
+        if (processed_cnt < unprocessed_cnt)
+        {
+          if (processed_cnt == 0)
+            uart_process(&com0recv[first_addr], unprocessed_frame_len[processed_cnt]); // 数据处理
+          else
+            uart_process(&com0recv[first_addr + unprocessed_frame_len[processed_cnt - 1]], unprocessed_frame_len[processed_cnt]);
+          processed_cnt++;                      // 已处理计数
+          if (processed_cnt == unprocessed_cnt) // 数据处理结束,清除接收状态,重新接收
+          {
+            processed_cnt = 0;   // 已处理次数清零
+            unprocessed_cnt = 0; // 未处理次数清零
+            com0recv_index = 0;  // 置0
+            com0recv_state = 0;  // 设置接收为空闲
+            OPEN_COM0RECV();     // 使能接收
+          }
+        }
+
+        if (up_flag) // 升级成功,调转到APP
+        {
+          while (!com0send_over)
+            ; // 等待uart回复帧发送结束再执行跳转指令
+          com0send_over = 0;
+
+          up_flag_delay = 0x01; // 升级启动后等待50ms进行数据搬迁以及重启APP
+          cnt = 0;
+					up_flag=0;
+        }
+
+        if (cnt++ >= 50) // 50ms
+        {
+          cnt = 0;
+          P1_7 = ~P1_7; // LED灯爆闪,调试用
+          timout_300s++;
+
+          if (up_flag_delay == 0x01)
+          {
+            // add by zzw  app数据搬迁
+            for (i = 0; i < 100; i++)
+            {
+              read_APP_byte(BACKUP_ADDR + i * 256, FlashBuf, 256); // 读取256字节
+              user_write_APP_byte(i * 256, FlashBuf, 256);         // 写入256字节
+
+            } // modified by zzw 20240328
+
+            // add by zzw  app数据搬迁
+
+            EA = 0;       // 关闭中断
+            BOOTV = 0x00; // 设置热复位后跳转到app
+            SWCMD = 0x56; // 软件复位
+          }
+        }
+        if (timout_300s >= 6000) // 300*20,5分钟超时退出
+        {
+          EA = 0;       // 关闭中断
+          BOOTV = 0x00; // 设置热复位后跳转到app
+          SWCMD = 0x56; // 软件复位
+        }
+      }
+    }
+  }
+  else // 不需要升级,跳转到APP
+  {
+    while (1)
+    {
+      if (flag_1ms) // 1ms时基
+      {
+        flag_1ms = 0;
+
+        if (cnt++ >= 250) // 250ms
+        {
+          cnt = 0;
+          P1_7 = ~P1_7; // LED灯中闪,调试用
+          tim_3s++;
+        }
+      }
+
+      if (tim_3s >= 0) // 修改为实际生产时,可立即跳转, 调试3秒(tim_3s=12)后跳转,调试用。
+      {
+        tim_3s = 0;
+        EA = 0;       // 关闭中断
+        BOOTV = 0x00; // 设置热复位后跳转到app
+        SWCMD = 0x56; // 软件复位
+      }
+    }
+  }
+}
+
+/*******************************************************************
+** 函数名称: timer0_irq
+** 函数描述: timer0中断处理函数
+** 输入参数: 无
+** 输出参数: 无
+********************************************************************/
+void timer0_irq() interrupt 1
+{
+  TF0 = 0; // 清标志位
+  TH0 = (65536 - 9216) / 256;
+  TL0 = (65536 - 9216) % 256;
+
+  flag_1ms = 1;
+
+  // COM0接收空闲处理
+  {
+    if (com0recv_state == 1) // 接收中
+    {
+      com0recv_tim++;
+
+      if (com0recv_tim > 50) // 判定超时时间
+      {
+        com0recv_state = 2; // 置2:接收完成
+        com0recv_tim = 0;   // 清0
+
+        CLOSE_COM0RECV(); // 停止接收
+      }
+    }
+  }
+}

+ 17 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/src/main.h

@@ -0,0 +1,17 @@
+#ifndef MAIN_H
+#define MAIN_H
+
+typedef union
+{
+  unsigned long u32;
+  struct
+  {
+	unsigned char u0;
+	unsigned char u1;
+	unsigned char u2;
+	unsigned char u3;
+  }tt;
+}union_u32_t;
+
+
+#endif

+ 341 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/src/uart.c

@@ -0,0 +1,341 @@
+#include <REGtenxTM52F1386.H>
+#include "CRC.h" 
+#include "uart.h"
+#include "string.h"
+#include "iap.h"
+
+unsigned char com0recv_state=0;    //0:接收空闲 1:正在接收 2:接收完成
+unsigned int  com0recv_index=0;    //接收索引 用于确定接收数据长度
+unsigned int  com0recv_over=0;
+unsigned char com0recv_tim=0;      //用于确定数据有没有接收成功
+unsigned char com0recv[512]={0};	     //COM0接收缓冲区
+
+unsigned char com0send_over=1;     //1:发送完成
+unsigned char com0send_index=0;    //发送索引 用于确定发送数据长度
+unsigned char com0send_len=0;      //
+unsigned char com0send[64]={0};	     //COM0发送缓冲区
+
+static unsigned short global_seq_num;
+
+/******************************************************************************************
+** 函数名称: uart0_init
+** 函数描述: uart0初始化
+** 输入参数: 无
+** 输出参数: 无 
+*******************************************************************************************/
+void uart0_init()
+{
+//  //设置UART的引脚   
+//  PINMODE = PINMODE&~0x03;  //选择P30/P31
+//  //uart引脚初始化
+//  PORTIDX = 3;
+//  PINMOD10 = (PINMOD10&0x00)|(0x02<<4);       
+//  P3_0=1;        //RXD  P30   开漏上拉
+//  P3_1=1;        //TXD  P31   推挽输出
+	
+  //设置UART的引脚  
+  PINMODE = PINMODE&~0x03 | 0x02;    //选择 P44/P45
+  //uart引脚初始化
+  PORTIDX = 4;
+  PINMOD54 = (PINMOD54&0x00)|(0x02<<4);       
+  P4_4=1;        //RXD  P44   开漏上拉
+  P4_5=1;        //TXD  P45   推挽输出
+	
+  UART0CON = UART0CON&~0x80;      //UART0BRS清零,波特率设置同标准 8051 
+	
+  SM0 = 0;
+  SM1 = 1;	         //SM0\SM1=01   UART mode=1;8位数据传送  
+  SM2 = 0;		   	   //Mode 1, 3    波特率采用9600 = (SMOD+1) x Fsysclk / (32 x 2 x (256-TH1)) --- 若使用Timer1 自动重载模式
+  PCON = (PCON & 0x7F) | 0x80;//SMOD=1允许UART双波特率控制	
+  
+  TMOD = TMOD & ~0X30 | 0x20;
+//  TL1 = 256-5;
+//  TH1 = 256-5;      //115200
+	TL1 = 256-60;
+  TH1 = 256-60;     //9600
+  //Fsysclk = 波特率 * 32 * (256 - TH1)
+  //TH1 = 256-Fsysclk/(波特率*32)
+   //115200:TH1 =256- 18432000/115200/32=256-5
+   //9600: TH1 =256- 18432000/9600/32=256- 60 
+  
+  TCLK = 0;  //UART1模式1&3发送时钟源:0-timer1   1-timer2
+  RCLK = 0;  //UART1模式1&3接收时钟源:0-timer1   1-timer2
+  
+  
+  ES = 1;    //允许串口Uart中断
+  TI = 0;    //先清发送中断 标志
+  RI = 0;    //先清接收中断 标志
+  TR1 = 1;   //TIMER1 运行
+  REN = 1;   //UART接收使能
+  
+}
+
+/******************************************************************************************
+** 函数名称: uart_send_data
+** 函数描述:  mcu回复指令函数
+** 输入参数: 无
+** 输出参数: 无 
+*******************************************************************************************/
+/*void uart_send_data(unsigned char version,unsigned char command,unsigned int len,unsigned int tx_data)
+{
+  unsigned char i=0,verify_value=0;
+	
+  com0send[0]=0x55;
+  com0send[1]=0xaa;     
+  com0send[2]=version;  
+  com0send[3]=command;     
+  com0send[4]=(len>>8)&0xff; 
+  com0send[5]=len;  
+  if(len == 0)
+  {
+	com0send_len = 7; 
+  }
+  else if(len == 1)
+  {
+	com0send[6]=tx_data;  
+    com0send_len = 8; 	  
+  }
+  else if(len == 2)
+  {
+	com0send[6]=(tx_data>>8)&0xff; 
+    com0send[7]=tx_data; 
+    com0send_len = 9; 	  
+  }
+  
+  for(i=0;i<(com0send_len-1);i++)
+  {
+	 verify_value += com0send[i];
+  }
+  com0send[com0send_len-1] = verify_value;
+	  
+  com0send_index = 0;
+  while (!com0send_over);        //读忙
+  com0send_over = 0;
+  com0send_index = 1; 
+  SBUF = com0send[0];   //先发首数据       
+}*/
+
+/******************************************************************************************
+** 函数名称: uart_send_product
+** 函数描述:  mcu回复产品信息函数
+** 输入参数: 无
+** 输出参数: 无 
+*******************************************************************************************/
+/*void uart_send_product(unsigned char version,unsigned char command,unsigned int len,unsigned char *p_data)
+{
+  unsigned char verify_value=0;
+  unsigned int i=0;
+	
+  com0send[0]=0x55;
+  com0send[1]=0xaa;     
+  com0send[2]=version;  
+  com0send[3]=command;     
+  com0send[4]=(len>>8)&0xff; 
+  com0send[5]=len;  
+	
+  memcpy(&com0send[6],p_data,len);
+  com0send_len = 7+len;
+	
+  for(i=0;i<(com0send_len-1);i++)
+  {
+	 verify_value += com0send[i];
+  }
+  com0send[com0send_len-1] = verify_value;
+	  
+  com0send_index = 0;
+  while (!com0send_over);        //读忙
+  com0send_over = 0;
+  com0send_index = 1; 
+  SBUF = com0send[0];   //先发首数据       
+}*/
+/******************************************************************************************
+** 函数名称: uart0_irq
+** 函数描述: uart0中断处理函数
+** 输入参数: 无
+** 输出参数: 无
+*******************************************************************************************/
+void uart0_irq()   interrupt  4
+{
+  unsigned char temp_data;
+  unsigned int tmp_index;
+  //static int tmp_i=0;
+  
+  //1. 接收中断
+  if(RI)
+  {
+    RI = 0;  //清零
+    
+    //从接收寄存器读一个字节
+    temp_data = SBUF;  
+    
+    //接收空闲时间清0
+    com0recv_tim = 0; 
+    
+    //存入缓冲区
+    tmp_index = com0recv_index;
+    com0recv[tmp_index] = temp_data;
+	  
+	//tmp_i++;  
+    
+    if(com0recv_state == 0)       //接收空闲(帧头状态)
+    {
+      com0recv_state = 1;         //置1:接收中
+    }
+    else if(com0recv_state == 1)  //接收中
+    {
+      ;
+    } 
+    else  //接收完成                        
+    {
+      //CLOSE_COM0RECV();  //停止接收
+    }
+    
+    tmp_index++;
+    if(tmp_index >= 512)  //缓冲溢出判断
+    {
+      tmp_index = 0;
+    }
+    
+    com0recv_index = tmp_index;
+  }
+  
+  //2. 发送中断
+  if(TI)
+  {
+    TI = 0;  //清零
+    
+    //发送一个字节
+    if(com0send_index >= com0send_len)  //判断已发送的字节数
+    {
+      com0send_over = 1;  //发送完成标志
+    }
+    else  //继续发送
+    {
+      tmp_index = com0send_index;
+      SBUF = com0send[tmp_index];
+      tmp_index++;
+      com0send_index=tmp_index;
+    }
+  }
+}
+
+
+
+unsigned char get_check_sum(unsigned char *pack, unsigned short pack_len)
+{
+  unsigned short i;
+  unsigned char check_sum = 0;
+  
+  for(i = 0; i < pack_len; i ++){
+    check_sum += *pack ++;
+  }
+  
+  return check_sum;
+}
+
+static unsigned short seq_num_get(void)
+{
+	global_seq_num ++;
+	if(global_seq_num > 0xfff0){
+		global_seq_num = 1;
+	}
+	return global_seq_num;
+}
+
+/**
+* @brief send a frame data 
+* @param[in] {fr_cmd} frame cmd id
+* @param[in] {len}    len of frame data 
+* @return  void
+*/
+void zigbee_uart_write_frame(unsigned char fr_cmd, unsigned short len)
+{
+  unsigned char check_sum = 0;	
+  unsigned short  seq;
+	
+  com0send[HEAD_FIRST] = FIRST_FRAME_HEAD;
+  com0send[HEAD_SECOND] = SECOND_FRAME_HEAD;
+  com0send[PROTOCOL_VERSION] = SERIAL_PROTOCOL_VER;
+	
+ 
+  seq = seq_num_get();
+  com0send[SEQ_HIGH] = (seq << 8);
+  com0send[SEQ_LOW] = (seq & 0xff); 
+
+	
+  com0send[FRAME_TYPE] = fr_cmd;
+  com0send[LENGTH_HIGH] = len >> 8;
+  com0send[LENGTH_LOW] = len & 0xff;
+  
+  len += PROTOCOL_HEAD;
+	
+  check_sum = get_check_sum((unsigned char *)com0send, len-1);
+  com0send[len -1] = check_sum;
+  
+  //zigbee_uart_write_data((unsigned char *)com0send, len);
+  com0send_len = len;
+	com0send_index = 0;
+  while (!com0send_over);        //读忙
+  com0send_over = 0;
+  com0send_index = 1; 
+  SBUF = com0send[0];   //先发首数据       
+}
+
+unsigned short set_zigbee_uart_byte(unsigned short dest, unsigned char byte)
+{
+  unsigned char *obj = (unsigned char *)com0send + DATA_START + dest;
+	
+  *obj = byte;
+  dest += 1;
+  
+  return dest;
+}
+
+/**
+* @brief mcu ota offset requset 
+* @param[in] {packet_offset}  packet offset 
+* @return  viod
+*/
+//when call this function, should set timeout event, if not received zigbee send response should res
+void mcu_ota_fw_request(void)
+{
+	unsigned char i = 0;
+	unsigned short length = 0;
+
+	if(ota_fw_info.mcu_current_offset >= ota_fw_info.mcu_ota_fw_size)   //outside
+		return;
+	while(i < 8){
+		length = set_zigbee_uart_byte(length,ota_fw_info.mcu_ota_pid[i]); //ota fw pid
+		i++;
+	}
+	length = set_zigbee_uart_byte(length,ota_fw_info.mcu_ota_ver);		//ota fw version
+	i = 0;
+	while(i < 4){
+		length = set_zigbee_uart_byte(length , ota_fw_info.mcu_current_offset >> (24 - i * 8));	//pakage offset request
+		i++;
+	}
+	length = set_zigbee_uart_byte(length ,FW_SINGLE_PACKET_SIZE);	// packet size request
+	
+	zigbee_uart_write_frame(MCU_OTA_DATA_REQUEST_CMD,length);
+}
+
+void mcu_ota_result_report(unsigned char status)
+{
+	unsigned short length = 0;
+	unsigned char i = 0;
+	
+	length = set_zigbee_uart_byte(length,status); //upgrade result status(0x00:ota success;0x01:ota failed)
+	while(i < 8){
+		length = set_zigbee_uart_byte(length,ota_fw_info.mcu_ota_pid[i]);	//PID
+		i++;
+	}
+	length = set_zigbee_uart_byte(length,ota_fw_info.mcu_ota_ver);	//ota fw version
+	
+	zigbee_uart_write_frame(MCU_OTA_RESULT_CMD,length);	//response 
+}
+
+
+
+
+
+

+ 26 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/src/uart.h

@@ -0,0 +1,26 @@
+#ifndef UART_H
+#define UART_H
+
+extern unsigned char com0recv_state;    //0:接收空闲 1:正在接收 2:接收完成
+extern unsigned int  com0recv_index;    //接收索引 用于确定接收数据长度
+extern unsigned int  com0recv_over;
+extern unsigned char com0recv_tim;      //用于确定数据有没有接收成功
+extern unsigned char com0recv[];	   //COM0接收缓冲区
+
+extern unsigned char com0send_over;     //1:发送完成
+extern unsigned char com0send_index;    //发送索引 用于确定发送数据长度
+extern unsigned char com0send_len;      //
+extern unsigned char com0send[];	   //COM0发送缓冲区
+
+
+#define     CLOSE_COM0RECV()  {REN = 0;}
+#define     OPEN_COM0RECV()	  {REN = 1;}
+#define     CLOSE_COM0SEND()  {}
+#define     OPEN_COM0SEND()	  {}
+	
+void uart0_init();	
+void uart_send_data(unsigned char version,unsigned char command,unsigned int len,unsigned int tx_data);
+void uart_send_product(unsigned char version,unsigned char command,unsigned int len,unsigned char *p_data);
+void mcu_ota_result_report(unsigned char status);
+
+#endif

Разлика између датотеке није приказан због своје велике величине
+ 2626 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/uboot.uvgui.16951


Разлика између датотеке није приказан због своје велике величине
+ 2680 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/uboot.uvgui.BCXX


Разлика између датотеке није приказан због своје велике величине
+ 2635 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/uboot.uvgui.CHENSIR


Разлика између датотеке није приказан због своје велике величине
+ 3645 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/uboot.uvgui.dl.zhou


Разлика између датотеке није приказан због своје велике величине
+ 3591 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/uboot.uvgui.zdl


Разлика између датотеке није приказан због своје велике величине
+ 2626 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/uboot.uvgui_16951.bak


Разлика између датотеке није приказан због своје велике величине
+ 2680 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/uboot.uvgui_BCXX.bak


Разлика између датотеке није приказан због своје велике величине
+ 2635 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/uboot.uvgui_CHENSIR.bak


+ 272 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/uboot.uvopt

@@ -0,0 +1,272 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>Target 1</TargetName>
+    <ToolsetNumber>0x0</ToolsetNumber>
+    <ToolsetName>MCS-51</ToolsetName>
+    <TargetOption>
+      <CLK51>18000000</CLK51>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>0</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>120</PageWidth>
+        <PageLength>65</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\Listings\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>0</CpuCode>
+      <DebugOpt>
+        <uSim>0</uSim>
+        <uTrg>1</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>0</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <tRtrace>1</tRtrace>
+        <sRSysVw>1</sRSysVw>
+        <tRSysVw>1</tRSysVw>
+        <tPdscDbg>1</tPdscDbg>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <nTsel>0</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon>C:\Keil_v5_51\SampTarg.DLL</pMon>
+      </DebugOpt>
+      <TargetDriverDllRegistry>
+        <SetRegEntry>
+          <Number>0</Number>
+          <Key>DLGTP51</Key>
+          <Name>(98=-1,-1,-1,-1,0)(82=-1,-1,-1,-1,0)(83=-1,-1,-1,-1,0)(84=-1,-1,-1,-1,0)(85=-1,-1,-1,-1,0)(5009=-1,-1,-1,-1,0)(5010=-1,-1,-1,-1,0)(80=-1,-1,-1,-1,0)(91=-1,-1,-1,-1,0)(92=-1,-1,-1,-1,0)(2006=-1,-1,-1,-1,0)(2007=-1,-1,-1,-1,0)(5012=-1,-1,-1,-1,0)(3005=-1,-1,-1,-1,0)(5015=-1,-1,-1,-1,0)(103=-1,-1,-1,-1,0)(102=-1,-1,-1,-1,0)</Name>
+        </SetRegEntry>
+        <SetRegEntry>
+          <Number>0</Number>
+          <Key>SampTarg</Key>
+          <Name>-S0 -B0 -O1536</Name>
+        </SetRegEntry>
+      </TargetDriverDllRegistry>
+      <Breakpoint/>
+      <WatchWindow1>
+        <Ww>
+          <count>0</count>
+          <WinNumber>1</WinNumber>
+          <ItemText>CheckBuf</ItemText>
+        </Ww>
+        <Ww>
+          <count>1</count>
+          <WinNumber>1</WinNumber>
+          <ItemText>ota_fw_info</ItemText>
+        </Ww>
+        <Ww>
+          <count>2</count>
+          <WinNumber>1</WinNumber>
+          <ItemText>P_recv</ItemText>
+        </Ww>
+        <Ww>
+          <count>3</count>
+          <WinNumber>1</WinNumber>
+          <ItemText>fw_data</ItemText>
+        </Ww>
+      </WatchWindow1>
+      <MemoryWindow1>
+        <Mm>
+          <WinNumber>1</WinNumber>
+          <SubType>0</SubType>
+          <ItemText>0x00000</ItemText>
+        </Mm>
+      </MemoryWindow1>
+      <Tracepoint>
+        <THDelay>0</THDelay>
+      </Tracepoint>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>0</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>1</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>Source Group 1</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>.\STARTUP_TENX52.A51</PathWithFileName>
+      <FilenameWithoutPath>STARTUP_TENX52.A51</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>src</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>1</tvExp>
+      <Focus>0</Focus>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>.\src\main.c</PathWithFileName>
+      <FilenameWithoutPath>main.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>.\src\CRC.c</PathWithFileName>
+      <FilenameWithoutPath>CRC.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>4</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>1</tvExp>
+      <Focus>0</Focus>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>.\src\iap.c</PathWithFileName>
+      <FilenameWithoutPath>iap.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>5</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>.\src\uart.c</PathWithFileName>
+      <FilenameWithoutPath>uart.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+</ProjectOpt>

+ 401 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/uboot.uvproj

@@ -0,0 +1,401 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+  <SchemaVersion>1.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>Target 1</TargetName>
+      <ToolsetNumber>0x0</ToolsetNumber>
+      <ToolsetName>MCS-51</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>TM52F1386</Device>
+          <Vendor>tenx</Vendor>
+          <Cpu>IRAM(0-0xFF) CLOCK(18000000) XRAM(0xE800-0xF7FF)</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile>"LIB\STARTUP_TENX52.A51"("tenx 8051 Startup Code")</StartupFile>
+          <FlashDriverDll></FlashDriverDll>
+          <DeviceId>0</DeviceId>
+          <RegisterFile>REGtenxTM52F1386.H</RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile></SFDFile>
+          <bCustSvd>0</bCustSvd>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath>\tenx\</RegisterFilePath>
+          <DBRegisterFilePath>\tenx\</DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\Objects\</OutputDirectory>
+          <OutputName>uboot</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>1</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\Listings\</ListingPath>
+          <HexFormatSelection>0</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopB1X>0</nStopB1X>
+            <nStopB2X>0</nStopB2X>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>.\_MakeTenx_uboot\run.bat</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+          <ComprImg>1</ComprImg>
+          <BankNo>65535</BankNo>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>S8051.DLL</SimDllName>
+          <SimDllArguments></SimDllArguments>
+          <SimDlgDll>DP51.DLL</SimDlgDll>
+          <SimDlgDllArguments>-p552</SimDlgDllArguments>
+          <TargetDllName>S8051.DLL</TargetDllName>
+          <TargetDllArguments></TargetDllArguments>
+          <TargetDlgDll>TP51.DLL</TargetDlgDll>
+          <TargetDlgDllArguments>-p552</TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>0</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>0</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+            <RestoreSysVw>1</RestoreSysVw>
+          </Simulator>
+          <Target>
+            <UseTarget>1</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <RestoreTracepoints>1</RestoreTracepoints>
+            <RestoreSysVw>1</RestoreSysVw>
+            <UsePdscDebugDescription>1</UsePdscDebugDescription>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>0</TargetSelection>
+          <SimDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+            <Driver>C:\Keil_v5_51\SampTarg.DLL</Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>1</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>1</Capability>
+            <DriverSelection>4096</DriverSelection>
+          </Flash1>
+          <bUseTDR>0</bUseTDR>
+          <Flash2>C:\Keil_v5_51\SampTarg.DLL</Flash2>
+          <Flash3>"" ()</Flash3>
+          <Flash4></Flash4>
+          <pFcarmOut></pFcarmOut>
+          <pFcarmGrp></pFcarmGrp>
+          <pFcArmRoot></pFcArmRoot>
+          <FcArmLst>0</FcArmLst>
+        </Utilities>
+        <Target51>
+          <Target51Misc>
+            <MemoryModel>2</MemoryModel>
+            <RTOS>0</RTOS>
+            <RomSize>2</RomSize>
+            <DataHold>0</DataHold>
+            <XDataHold>0</XDataHold>
+            <UseOnchipRom>0</UseOnchipRom>
+            <UseOnchipArithmetic>0</UseOnchipArithmetic>
+            <UseMultipleDPTR>0</UseMultipleDPTR>
+            <UseOnchipXram>0</UseOnchipXram>
+            <HadIRAM>1</HadIRAM>
+            <HadXRAM>1</HadXRAM>
+            <HadIROM>0</HadIROM>
+            <Moda2>0</Moda2>
+            <Moddp2>0</Moddp2>
+            <Modp2>0</Modp2>
+            <Mod517dp>0</Mod517dp>
+            <Mod517au>0</Mod517au>
+            <Mode2>0</Mode2>
+            <useCB>0</useCB>
+            <useXB>0</useXB>
+            <useL251>0</useL251>
+            <useA251>0</useA251>
+            <Mx51>0</Mx51>
+            <ModC812>0</ModC812>
+            <ModCont>0</ModCont>
+            <Lp51>0</Lp51>
+            <useXBS>0</useXBS>
+            <ModDA>0</ModDA>
+            <ModAB2>0</ModAB2>
+            <Mx51P>0</Mx51P>
+            <hadXRAM2>0</hadXRAM2>
+            <uocXram2>0</uocXram2>
+            <ModC2>0</ModC2>
+            <ModH2>0</ModH2>
+            <Mdu_R515>0</Mdu_R515>
+            <Mdu_F120>0</Mdu_F120>
+            <Psoc>0</Psoc>
+            <hadIROM2>0</hadIROM2>
+            <ModSmx2>0</ModSmx2>
+            <cBanks>0</cBanks>
+            <xBanks>0</xBanks>
+            <OnChipMemories>
+              <RCB>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0xffff</Size>
+              </RCB>
+              <RXB>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </RXB>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocr1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocr1>
+              <Ocr2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocr2>
+              <Ocr3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocr3>
+              <IRO>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IRO>
+              <IRA>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x100</Size>
+              </IRA>
+              <XRA>
+                <Type>0</Type>
+                <StartAddress>0xe800</StartAddress>
+                <Size>0x1000</Size>
+              </XRA>
+              <XRA512>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRA512>
+              <IROM512>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IROM512>
+            </OnChipMemories>
+          </Target51Misc>
+          <C51>
+            <RegisterColoring>1</RegisterColoring>
+            <VariablesInOrder>0</VariablesInOrder>
+            <IntegerPromotion>1</IntegerPromotion>
+            <uAregs>0</uAregs>
+            <UseInterruptVector>1</UseInterruptVector>
+            <Fuzzy>3</Fuzzy>
+            <Optimize>6</Optimize>
+            <WarningLevel>2</WarningLevel>
+            <SizeSpeed>1</SizeSpeed>
+            <ObjectExtend>1</ObjectExtend>
+            <ACallAJmp>0</ACallAJmp>
+            <InterruptVectorAddress>57344</InterruptVectorAddress>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath>.\src</IncludePath>
+            </VariousControls>
+          </C51>
+          <Ax51>
+            <UseMpl>0</UseMpl>
+            <UseStandard>1</UseStandard>
+            <UseCase>0</UseCase>
+            <UseMod51>0</UseMod51>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Ax51>
+          <Lx51>
+            <useFile>0</useFile>
+            <linkonly>0</linkonly>
+            <UseMemoryFromTarget>0</UseMemoryFromTarget>
+            <CaseSensitiveSymbols>0</CaseSensitiveSymbols>
+            <WarningLevel>2</WarningLevel>
+            <DataOverlaying>1</DataOverlaying>
+            <OverlayString></OverlayString>
+            <MiscControls></MiscControls>
+            <DisableWarningNumbers></DisableWarningNumbers>
+            <LinkerCmdFile></LinkerCmdFile>
+            <Assign></Assign>
+            <ReserveString></ReserveString>
+            <CClasses></CClasses>
+            <UserClasses></UserClasses>
+            <CSection></CSection>
+            <UserSection></UserSection>
+            <CodeBaseAddress>0xE000-0xE032,0xE03B-0xFBFB</CodeBaseAddress>
+            <XDataBaseAddress>0xE800-0xF7FF</XDataBaseAddress>
+            <PDataBaseAddress></PDataBaseAddress>
+            <BitBaseAddress></BitBaseAddress>
+            <DataBaseAddress></DataBaseAddress>
+            <IDataBaseAddress></IDataBaseAddress>
+            <Precede></Precede>
+            <Stack></Stack>
+            <CodeSegmentName></CodeSegmentName>
+            <XDataSegmentName></XDataSegmentName>
+            <BitSegmentName></BitSegmentName>
+            <DataSegmentName></DataSegmentName>
+            <IDataSegmentName></IDataSegmentName>
+          </Lx51>
+        </Target51>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Source Group 1</GroupName>
+          <Files>
+            <File>
+              <FileName>STARTUP_TENX52.A51</FileName>
+              <FileType>2</FileType>
+              <FilePath>.\STARTUP_TENX52.A51</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>src</GroupName>
+          <Files>
+            <File>
+              <FileName>main.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>.\src\main.c</FilePath>
+            </File>
+            <File>
+              <FileName>CRC.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>.\src\CRC.c</FilePath>
+            </File>
+            <File>
+              <FileName>iap.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>.\src\iap.c</FilePath>
+            </File>
+            <File>
+              <FileName>uart.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>.\src\uart.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+</Project>

+ 289 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/uboot_uvopt.bak

@@ -0,0 +1,289 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>Target 1</TargetName>
+    <ToolsetNumber>0x0</ToolsetNumber>
+    <ToolsetName>MCS-51</ToolsetName>
+    <TargetOption>
+      <CLK51>18000000</CLK51>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>0</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>120</PageWidth>
+        <PageLength>65</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\Listings\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>0</CpuCode>
+      <DebugOpt>
+        <uSim>0</uSim>
+        <uTrg>1</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>0</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <tRtrace>1</tRtrace>
+        <sRSysVw>1</sRSysVw>
+        <tRSysVw>1</tRSysVw>
+        <tPdscDbg>1</tPdscDbg>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <nTsel>0</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon>C:\Keil_v5_51\SampTarg.DLL</pMon>
+      </DebugOpt>
+      <TargetDriverDllRegistry>
+        <SetRegEntry>
+          <Number>0</Number>
+          <Key>DLGTP51</Key>
+          <Name>(98=-1,-1,-1,-1,0)(82=-1,-1,-1,-1,0)(83=-1,-1,-1,-1,0)(84=-1,-1,-1,-1,0)(85=-1,-1,-1,-1,0)(5009=-1,-1,-1,-1,0)(5010=-1,-1,-1,-1,0)(80=-1,-1,-1,-1,0)(91=-1,-1,-1,-1,0)(92=-1,-1,-1,-1,0)(2006=-1,-1,-1,-1,0)(2007=-1,-1,-1,-1,0)(5012=-1,-1,-1,-1,0)(3005=-1,-1,-1,-1,0)(5015=-1,-1,-1,-1,0)(103=-1,-1,-1,-1,0)(102=-1,-1,-1,-1,0)</Name>
+        </SetRegEntry>
+        <SetRegEntry>
+          <Number>0</Number>
+          <Key>SampTarg</Key>
+          <Name>-S0 -B0 -O1536</Name>
+        </SetRegEntry>
+      </TargetDriverDllRegistry>
+      <Breakpoint>
+        <Bp>
+          <Number>0</Number>
+          <Type>0</Type>
+          <LineNumber>347</LineNumber>
+          <EnabledFlag>1</EnabledFlag>
+          <Address>-16774427</Address>
+          <ByteObject>0</ByteObject>
+          <HtxType>0</HtxType>
+          <ManyObjects>0</ManyObjects>
+          <SizeOfObject>0</SizeOfObject>
+          <BreakByAccess>0</BreakByAccess>
+          <BreakIfRCount>1</BreakIfRCount>
+          <Filename>D:\Work\GIT\TM52eF1386_OTA\TM52F1386_SDK_v0_0_1\Projects\OTA_boot\project - uboot_v1.1\project - uboot_v1.1\src\MAIN.C</Filename>
+          <ExecCommand></ExecCommand>
+          <Expression>\\uboot\MAIN\347</Expression>
+        </Bp>
+      </Breakpoint>
+      <WatchWindow1>
+        <Ww>
+          <count>0</count>
+          <WinNumber>1</WinNumber>
+          <ItemText>CheckBuf</ItemText>
+        </Ww>
+        <Ww>
+          <count>1</count>
+          <WinNumber>1</WinNumber>
+          <ItemText>ota_fw_info</ItemText>
+        </Ww>
+        <Ww>
+          <count>2</count>
+          <WinNumber>1</WinNumber>
+          <ItemText>P_recv</ItemText>
+        </Ww>
+        <Ww>
+          <count>3</count>
+          <WinNumber>1</WinNumber>
+          <ItemText>fw_data</ItemText>
+        </Ww>
+      </WatchWindow1>
+      <MemoryWindow1>
+        <Mm>
+          <WinNumber>1</WinNumber>
+          <SubType>0</SubType>
+          <ItemText>0x00000</ItemText>
+        </Mm>
+      </MemoryWindow1>
+      <Tracepoint>
+        <THDelay>0</THDelay>
+      </Tracepoint>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>0</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>1</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>Source Group 1</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>.\STARTUP_TENX52.A51</PathWithFileName>
+      <FilenameWithoutPath>STARTUP_TENX52.A51</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>src</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>1</tvExp>
+      <Focus>0</Focus>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>.\src\main.c</PathWithFileName>
+      <FilenameWithoutPath>main.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>.\src\CRC.c</PathWithFileName>
+      <FilenameWithoutPath>CRC.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>4</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>1</tvExp>
+      <Focus>0</Focus>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>.\src\iap.c</PathWithFileName>
+      <FilenameWithoutPath>iap.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>5</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>.\src\uart.c</PathWithFileName>
+      <FilenameWithoutPath>uart.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+</ProjectOpt>

+ 401 - 0
Projects/OTA_boot/project - uboot_v1.1/project - uboot_v1.1/uboot_uvproj.bak

@@ -0,0 +1,401 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+  <SchemaVersion>1.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>Target 1</TargetName>
+      <ToolsetNumber>0x0</ToolsetNumber>
+      <ToolsetName>MCS-51</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>TM52F1386</Device>
+          <Vendor>tenx</Vendor>
+          <Cpu>IRAM(0-0xFF) CLOCK(18000000) XRAM(0xE800-0xF7FF)</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile>"LIB\STARTUP_TENX52.A51"("tenx 8051 Startup Code")</StartupFile>
+          <FlashDriverDll></FlashDriverDll>
+          <DeviceId>0</DeviceId>
+          <RegisterFile>REGtenxTM52F1386.H</RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile></SFDFile>
+          <bCustSvd>0</bCustSvd>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath>\tenx\</RegisterFilePath>
+          <DBRegisterFilePath>\tenx\</DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\Objects\</OutputDirectory>
+          <OutputName>uboot</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>1</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\Listings\</ListingPath>
+          <HexFormatSelection>0</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopB1X>0</nStopB1X>
+            <nStopB2X>0</nStopB2X>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>.\_MakeTenx_uboot\run.bat</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+          <ComprImg>1</ComprImg>
+          <BankNo>65535</BankNo>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>S8051.DLL</SimDllName>
+          <SimDllArguments></SimDllArguments>
+          <SimDlgDll>DP51.DLL</SimDlgDll>
+          <SimDlgDllArguments>-p552</SimDlgDllArguments>
+          <TargetDllName>S8051.DLL</TargetDllName>
+          <TargetDllArguments></TargetDllArguments>
+          <TargetDlgDll>TP51.DLL</TargetDlgDll>
+          <TargetDlgDllArguments>-p552</TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>0</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>0</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+            <RestoreSysVw>1</RestoreSysVw>
+          </Simulator>
+          <Target>
+            <UseTarget>1</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <RestoreTracepoints>1</RestoreTracepoints>
+            <RestoreSysVw>1</RestoreSysVw>
+            <UsePdscDebugDescription>1</UsePdscDebugDescription>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>0</TargetSelection>
+          <SimDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+            <Driver>D:\Keil_c51\SampTarg.DLL</Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>1</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>1</Capability>
+            <DriverSelection>4096</DriverSelection>
+          </Flash1>
+          <bUseTDR>0</bUseTDR>
+          <Flash2>D:\Keil_c51\SampTarg.DLL</Flash2>
+          <Flash3>"" ()</Flash3>
+          <Flash4></Flash4>
+          <pFcarmOut></pFcarmOut>
+          <pFcarmGrp></pFcarmGrp>
+          <pFcArmRoot></pFcArmRoot>
+          <FcArmLst>0</FcArmLst>
+        </Utilities>
+        <Target51>
+          <Target51Misc>
+            <MemoryModel>2</MemoryModel>
+            <RTOS>0</RTOS>
+            <RomSize>2</RomSize>
+            <DataHold>0</DataHold>
+            <XDataHold>0</XDataHold>
+            <UseOnchipRom>0</UseOnchipRom>
+            <UseOnchipArithmetic>0</UseOnchipArithmetic>
+            <UseMultipleDPTR>0</UseMultipleDPTR>
+            <UseOnchipXram>0</UseOnchipXram>
+            <HadIRAM>1</HadIRAM>
+            <HadXRAM>1</HadXRAM>
+            <HadIROM>0</HadIROM>
+            <Moda2>0</Moda2>
+            <Moddp2>0</Moddp2>
+            <Modp2>0</Modp2>
+            <Mod517dp>0</Mod517dp>
+            <Mod517au>0</Mod517au>
+            <Mode2>0</Mode2>
+            <useCB>0</useCB>
+            <useXB>0</useXB>
+            <useL251>0</useL251>
+            <useA251>0</useA251>
+            <Mx51>0</Mx51>
+            <ModC812>0</ModC812>
+            <ModCont>0</ModCont>
+            <Lp51>0</Lp51>
+            <useXBS>0</useXBS>
+            <ModDA>0</ModDA>
+            <ModAB2>0</ModAB2>
+            <Mx51P>0</Mx51P>
+            <hadXRAM2>0</hadXRAM2>
+            <uocXram2>0</uocXram2>
+            <ModC2>0</ModC2>
+            <ModH2>0</ModH2>
+            <Mdu_R515>0</Mdu_R515>
+            <Mdu_F120>0</Mdu_F120>
+            <Psoc>0</Psoc>
+            <hadIROM2>0</hadIROM2>
+            <ModSmx2>0</ModSmx2>
+            <cBanks>0</cBanks>
+            <xBanks>0</xBanks>
+            <OnChipMemories>
+              <RCB>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0xffff</Size>
+              </RCB>
+              <RXB>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </RXB>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocr1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocr1>
+              <Ocr2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocr2>
+              <Ocr3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocr3>
+              <IRO>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IRO>
+              <IRA>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x100</Size>
+              </IRA>
+              <XRA>
+                <Type>0</Type>
+                <StartAddress>0xe800</StartAddress>
+                <Size>0x1000</Size>
+              </XRA>
+              <XRA512>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRA512>
+              <IROM512>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IROM512>
+            </OnChipMemories>
+          </Target51Misc>
+          <C51>
+            <RegisterColoring>1</RegisterColoring>
+            <VariablesInOrder>0</VariablesInOrder>
+            <IntegerPromotion>1</IntegerPromotion>
+            <uAregs>0</uAregs>
+            <UseInterruptVector>1</UseInterruptVector>
+            <Fuzzy>3</Fuzzy>
+            <Optimize>6</Optimize>
+            <WarningLevel>2</WarningLevel>
+            <SizeSpeed>1</SizeSpeed>
+            <ObjectExtend>1</ObjectExtend>
+            <ACallAJmp>0</ACallAJmp>
+            <InterruptVectorAddress>57344</InterruptVectorAddress>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath>.\src</IncludePath>
+            </VariousControls>
+          </C51>
+          <Ax51>
+            <UseMpl>0</UseMpl>
+            <UseStandard>1</UseStandard>
+            <UseCase>0</UseCase>
+            <UseMod51>0</UseMod51>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Ax51>
+          <Lx51>
+            <useFile>0</useFile>
+            <linkonly>0</linkonly>
+            <UseMemoryFromTarget>0</UseMemoryFromTarget>
+            <CaseSensitiveSymbols>0</CaseSensitiveSymbols>
+            <WarningLevel>2</WarningLevel>
+            <DataOverlaying>1</DataOverlaying>
+            <OverlayString></OverlayString>
+            <MiscControls></MiscControls>
+            <DisableWarningNumbers></DisableWarningNumbers>
+            <LinkerCmdFile></LinkerCmdFile>
+            <Assign></Assign>
+            <ReserveString></ReserveString>
+            <CClasses></CClasses>
+            <UserClasses></UserClasses>
+            <CSection></CSection>
+            <UserSection></UserSection>
+            <CodeBaseAddress>0xE000-0xE032,0xE03B-0xFBFB</CodeBaseAddress>
+            <XDataBaseAddress>0xE800-0xF7FF</XDataBaseAddress>
+            <PDataBaseAddress></PDataBaseAddress>
+            <BitBaseAddress></BitBaseAddress>
+            <DataBaseAddress></DataBaseAddress>
+            <IDataBaseAddress></IDataBaseAddress>
+            <Precede></Precede>
+            <Stack></Stack>
+            <CodeSegmentName></CodeSegmentName>
+            <XDataSegmentName></XDataSegmentName>
+            <BitSegmentName></BitSegmentName>
+            <DataSegmentName></DataSegmentName>
+            <IDataSegmentName></IDataSegmentName>
+          </Lx51>
+        </Target51>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Source Group 1</GroupName>
+          <Files>
+            <File>
+              <FileName>STARTUP_TENX52.A51</FileName>
+              <FileType>2</FileType>
+              <FilePath>.\STARTUP_TENX52.A51</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>src</GroupName>
+          <Files>
+            <File>
+              <FileName>main.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>.\src\main.c</FilePath>
+            </File>
+            <File>
+              <FileName>CRC.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>.\src\CRC.c</FilePath>
+            </File>
+            <File>
+              <FileName>iap.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>.\src\iap.c</FilePath>
+            </File>
+            <File>
+              <FileName>uart.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>.\src\uart.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+</Project>

BIN
Projects/OTA_boot/project - uboot_v1.1_0328.zip


BIN
Projects/OTA_boot/project - uboot_v1.1_20240327.zip


+ 22 - 0
Projects/OTA_boot/版本说明.txt

@@ -0,0 +1,22 @@
+boot:0xE000-0xE032,0xE03B-0xFBFB      BOOTV:7K    C51:0xE000
+           0x00-0x32,0x3B-0xFBFF                 BOOTV:0
+
+APP:0x00-0x32,0x3B-0xDFFF   C51:  0x0000(对应BOOTV 7K)
+         0x00-0x32,0x3B-0xFBFF    C51:0x0000
+
+
+
+project - uboot_v1.1_20240327,已支持OTA升级,但是升级失败会变板砖
+待优化:
+1. 升级接收数据存在备份区
+2. 全部接收完成,启动备份数据到APP区,跳转APP
+3. 增加ZIGBEE交互的正常流程,boot可从涂鸦平台获取版本更新APP
+
+
+project - uboot_v1.1_20240327,已支持OTA升级,中途断电可恢复APP
+地址逻辑:
+APP: 可用28K,实际只用25K
+BACKUP:可用26K,实际只用25K
+修改逻辑:
+1、串口接收的写入+0x7000的地址,启动升级清除参数标志位,增加全局变量升级标志位
+2、升级完成,for循环100次读取25k到0地址,每次256字节,清除全局变量升级标志位,跳转app

BIN
Projects/TM52串口IAP方案V1.0.doc


BIN
Projects/macro/switch_ota_V1.0_20240319_完整样机版本.zip


+ 196 - 0
Projects/macro/switch_ota_V1.0_P30P31/EEPROM.c

@@ -0,0 +1,196 @@
+/***********************************************************************************************************
+  显示效果:					
+  用户通过仿真,能够对EEPROM的特定区域地址内容进行读写操作,并验证数据操作正确与否。			
+  eeprom写数据
+  连续写字节不能太多
+  写单个字节的时间根据写的内容的前后不同,时间不等。	以及电源电压相关
+  理论上随着写的次数增加,写的时间会相应增加,建议以单个字节1ms-2ms的时间为基准
+***********************************************************************************************************/
+#include <REGtenxTM52F1386.h>
+#include "TM52F1386_bsp.h"
+#include <intrins.h>
+#include "EEPROM.h"
+
+
+#define		IAPTE_0P8_MS	AUX2=(AUX2&0xf9)|0x02
+#define		IAPTE_3P2_MS	AUX2=(AUX2&0xf9)|0x04
+#define		IAPTE_6P4_MS	AUX2=(AUX2&0xf9)|0x06
+#define		IAPTE_DISABLE	AUX2=(AUX2&0xf9)
+
+// 设置最大20字节存参数
+unsigned char xdata eeprom_address_write[30]  _at_   0XDC00;             //eeprom指定地址,第一页用于状态数据+参数配置
+unsigned char code eeprom_address_read[30]  _at_   0XDC00;             //eeprom指定地址
+
+// 设置最大20字节存参数
+unsigned char xdata eeprom_address_write_backup[30]  _at_   0XDE00;             //eeprom指定地址,第二页,参数配置备份区,第一页读取失败从第二页读取参数备份
+unsigned char code eeprom_address_read_backup[30]  _at_   0XDE00;             //eeprom指定地址
+
+/*
+参数数据(10,实际从1开始,0字节保留):0-9:开机状态(通电勿扰)全局设置1字节-1,三个继电器开机状态3个字节-2-3-4,背光等级1个字节-5 , 开关、场景设置-6-7-8,人感1字节-9
+
+实时数据(6):10:19:当前继电器状态3个字节-10-11-12,雷达状态1字节-13,点动倒计时未结束1个字节-15-16-17,ota状态1字节-19(最后一字节)
+
+点动开关参数(9):,点动开关2个字节(使能1,时间2)-20-21-22,-23-24-25,-26-27-28
+*/
+unsigned char write_mileage[30];//0:人感开关,1:开机状态全局开关,2:按键1默认状态,3:按键2默认状态,4:按键3默认状态
+unsigned char read_mileage[30];
+
+unsigned char write_mileage_backup[30];//0:人感开关,1:开机状态全局开关,2:按键1默认状态,3:按键2默认状态,4:按键3默认状态
+unsigned char read_mileage_backup[30];
+//unsigned char II=0;
+/**********************************************************************************************************
+** 函数名称: iap_eeprom_write
+** 函数描述: iap_EEPROM写数据配置函数  
+** 输入参数: addr:存储地址,范围0~127
+             buf:数据的首地址
+			len:数据长度(addr+len不要超过128)
+** 输出参数: 无 
+**********************************************************************************************************/
+void iap_eeprom_write(unsigned char addr, unsigned char *buf, unsigned char len)       
+{
+	unsigned char i=0,temp_ea=0,temp_lvrpd=0;
+	temp_ea = EA;
+	EA = 0;
+	temp_lvrpd = LVRCON & 0x10;  // LVR的状态位  
+	LVRCON = (LVRCON &~ 0x10) | (1 << 4); //关闭LVR功能
+
+ 	IAPWE_SFR=0XE2;    //使能iap
+ 	IAPWE_SFR=0XBA;    //使能iap	  
+	eeprom_address_write[0] = 0x00;//是所在页的整页都擦除
+	bsp_delay_ms(5);
+	
+ 	IAPWE_SFR=0XE2;    //使能iap
+ 	IAPWE_SFR=0X4C;    //使能iap
+	
+	for(i = 0; i<len; i++) {
+		IAPTE_6P4_MS;        //设置IAP看门狗复位时间
+		eeprom_address_write[addr + i] = *buf;//
+		buf++;
+	}
+	
+	LVRCON = (LVRCON &~ 0x10) | (temp_lvrpd << 4); //还原LVR
+  IAPWE_SFR = 0x00;    //关闭IAP
+	IAPTE_DISABLE;
+	EA = temp_ea;
+}
+
+/**********************************************************************************************************
+** 函数名称: iap_eeprom_write_backup
+** 函数描述: iap_EEPROM写数据配置函数  
+** 输入参数: addr:存储地址,范围0~127
+             buf:数据的首地址
+			len:数据长度(addr+len不要超过128)
+** 输出参数: 无 
+**********************************************************************************************************/
+void iap_eeprom_write_backup(unsigned char addr, unsigned char *buf, unsigned char len)       
+{
+	unsigned char i=0,temp_ea=0,temp_lvrpd=0;
+	temp_ea = EA;
+	EA = 0;
+	temp_lvrpd = LVRCON & 0x10;  // LVR的状态位  
+	LVRCON = (LVRCON &~ 0x10) | (1 << 4); //关闭LVR功能
+
+ 	IAPWE_SFR=0XE2;    //使能iap
+ 	IAPWE_SFR=0XBA;    //使能iap	  
+	eeprom_address_write_backup[0] = 0x00;//是所在页的整页都擦除
+	bsp_delay_ms(5);
+	
+ 	IAPWE_SFR=0XE2;    //使能iap
+ 	IAPWE_SFR=0X4C;    //使能iap
+	
+	for(i = 0; i<len; i++) {
+		IAPTE_6P4_MS;        //设置IAP看门狗复位时间
+		eeprom_address_write_backup[addr + i] = *buf;//
+		buf++;
+	}
+	
+	LVRCON = (LVRCON &~ 0x10) | (temp_lvrpd << 4); //还原LVR
+  IAPWE_SFR = 0x00;    //关闭IAP
+	IAPTE_DISABLE;
+	EA = temp_ea;
+}
+/**********************************************************************************************************
+** 函数名称: iap_eeprom_read
+** 函数描述: iap_EEPROM读数据配置函数  
+** 输入参数: addr:存储地址,范围0~127
+             buf:数据的首地址
+			len:数据长度(addr+len不要超过128)
+** 输出参数: 无 
+**********************************************************************************************************/
+void iap_eeprom_read(unsigned char addr, unsigned char *buf, unsigned char len)    //eeprom读
+{
+ unsigned char i=0,temp_ea=0,temp_lvrpd=0;
+	
+	temp_ea = EA;
+	EA = 0; 
+	for(i = 0;i<len;i++) {
+		*buf = eeprom_address_read[addr+i];
+		buf++;
+	}	
+	EA = temp_ea;
+}
+
+/**********************************************************************************************************
+** 函数名称: iap_eeprom_read_backup
+** 函数描述: iap_EEPROM读数据配置函数  
+** 输入参数: addr:存储地址,范围0~127
+             buf:数据的首地址
+			len:数据长度(addr+len不要超过128)
+** 输出参数: 无 
+**********************************************************************************************************/
+void iap_eeprom_read_backup(unsigned char addr, unsigned char *buf, unsigned char len)    //eeprom读
+{
+ unsigned char i=0,temp_ea=0,temp_lvrpd=0;
+	
+	temp_ea = EA;
+	EA = 0; 
+	for(i = 0;i<len;i++) {
+		*buf = eeprom_address_read_backup[addr+i];
+		buf++;
+	}	
+	EA = temp_ea;
+}
+
+
+/*
+void test(void)
+{
+	
+	bsp_clock_init();                    // 系统快钟18.432 div 2 =  9.216Mhz
+	gpio_init();
+	write_mileage[0] = 0x22;
+	write_mileage[1] = 0x33;
+	write_mileage[2] = 0x44;
+	write_mileage[3] = 0x55;
+  iap_eeprom_write(0,write_mileage,4); //写四个字节(0x22 0x33 0x44 0x55)      
+	bsp_delay_ms(50);                    
+
+	read_mileage[0] = 0;
+	read_mileage[1] = 0;
+	read_mileage[2] = 0;
+	read_mileage[3] = 0;
+	iap_eeprom_read(0,read_mileage,4);  //读四个字节与之前写的四个字节是否一致(0x22 0x33 0x44 0x55)
+	
+	write_mileage[0] = 0x66;
+	write_mileage[1] = 0x77;
+	write_mileage[2] = 0x88;
+	write_mileage[3] = 0x99;
+  iap_eeprom_write(0,write_mileage,4); //写四个字节(0x66 0x77 0x88 0x99) 	                                     
+	bsp_delay_ms(50);                     
+
+	read_mileage[0] = 0;
+	read_mileage[1] = 0;
+	read_mileage[2] = 0;
+	read_mileage[3] = 0;
+	iap_eeprom_read(0,read_mileage,4);  //读四个字节与之前写的四个字节是否一致(0x66 0x77 0x88 0x99)
+
+  while(1) 
+	{
+		if (0x66 == read_mileage[0]) {
+			LED1 = 0;
+		} 
+		else {
+			LED1 = 1;
+		} 
+	}
+}*/

+ 29 - 0
Projects/macro/switch_ota_V1.0_P30P31/EEPROM.h

@@ -0,0 +1,29 @@
+/*******************************************************************************
+*
+*   scheduler 
+*   Soft version:   switch V1.00
+*   File Name:      time2.h
+*   Author   :      zzw (zhangzw_3@163.com)
+*   creation date:  2024-01-17
+*	module description: time2 1ms
+*   Copyright (C) reserve
+*
+********************************************************************************/
+#if !defined(__EEPROM_H__)
+#define __EEPROM_H__
+
+
+extern unsigned char write_mileage[30];//最大写入30个有效字节
+extern unsigned char read_mileage[30];
+
+extern unsigned char write_mileage_backup[30];//最大写入30个有效字节
+extern unsigned char read_mileage_backup[30];
+
+void iap_eeprom_write(unsigned char addr, unsigned char *buf, unsigned char len);
+void iap_eeprom_read(unsigned char addr, unsigned char *buf, unsigned char len);
+
+void iap_eeprom_write_backup(unsigned char addr, unsigned char *buf, unsigned char len);
+void iap_eeprom_read_backup(unsigned char addr, unsigned char *buf, unsigned char len);
+
+#endif
+/* EOF */

+ 154 - 0
Projects/macro/switch_ota_V1.0_P30P31/GLOBAL.c

@@ -0,0 +1,154 @@
+/*******************************************************************************
+*
+*   SW AS 
+*   Soft version:   
+*   File Name:      GLOBAL.c
+*   Author   :      zzw (zhangzw_3@163.com)
+*   creation date:  2022-07-20
+*   module description:定义系统中的全局变量 
+*   Copyright (C) 
+*
+********************************************************************************/
+#include "GLOBAL.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+///////////////////////////////////////////
+volatile            DBit _BitParament0;
+volatile word   	  tickcount;      /* Timer tick count   		*/
+volatile byte 	    sysTickfor10ms;	/* 10millisecond timer 		*/
+volatile byte 		  sysTickfor100ms;/* 100millisecond timer 	*/
+volatile byte 		  sysTickfor1000ms;/* 100millisecond timer 	*/
+
+SWParameters   switchState;//面板状态
+
+unsigned char  gRelayOnOff=0;//继电器状态
+byte gLedState = 0;//按键灯状态
+byte gRelayState = 0; // 4bit 继电器值
+
+byte ZG_Joining;//模块进入配网模式, 指示灯快速闪烁10秒
+WORD ZG_JoinCounter;//模块进入配网计数器,倒计时开始
+byte ZG_Joining_S;//模块进入配网模式
+
+
+byte  Brightflag;  //强光标志位,1:白天,0,夜晚
+byte BrightPWMH=6;           //强光灯强光PWM占空比
+byte NightPWMH=1;           //暗光PWM占空比
+byte Light_Intensity;//光强度
+//byte mKeyLedWeakLight;//背光最大亮度值,根据光感设置
+byte mBLedWeakLight;//背光最大亮度值,根据光感设置
+
+unsigned int gRadarKeepTimer=0;//有人存在时,LED灯等相关动作保持时间
+byte gRadarCheckNull;//雷达监测,1为无人,0为有人
+
+byte shockCounter;//震动计数器
+byte shockStart;//按键按下震动触发
+
+byte appControlLedEnable = 0; // app控制背光灯点亮使能位,0:忽略,1:强制点亮10秒
+
+
+
+byte burn_in_test_start=0;//产测标志位
+u32 burn_in_test_counter=0;//产测计数器
+u32 burn_in_test_timeout=0;//产测开机30秒内收到信标才有效
+
+
+u32 IAPUpdateFlag = 0; 
+u32 OTA_Reciv_Datalen;
+
+static const char g_sas8Base64digits[] =
+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+
+//编码
+void Base64Encode(char *ps8Dest, const char *ps8Source, int s32InLen)
+{
+    if (ps8Dest==NULL || ps8Source==NULL || s32InLen<=0)
+    {
+        return;
+    }
+	
+	for (; s32InLen >= 3; s32InLen -= 3)
+	{
+		*ps8Dest++ = g_sas8Base64digits[ps8Source[0] >> 2];
+		*ps8Dest++ = g_sas8Base64digits[((ps8Source[0] << 4) & 0x30) | (ps8Source[1] >> 4)];
+		*ps8Dest++ = g_sas8Base64digits[((ps8Source[1] << 2) & 0x3c) | (ps8Source[2] >> 6)];
+		*ps8Dest++ = g_sas8Base64digits[ps8Source[2] & 0x3f];
+	    ps8Source += 3;
+	}
+	
+	if (s32InLen > 0)
+	{
+		unsigned char fragment;
+		
+		*ps8Dest++ = g_sas8Base64digits[ps8Source[0] >> 2];
+		fragment = (ps8Source[0] << 4) & 0x30;
+		
+		if (s32InLen > 1)
+			fragment |= ps8Source[1] >> 4;
+		
+		*ps8Dest++ = g_sas8Base64digits[fragment];
+		*ps8Dest++ = (s32InLen < 2) ? '=' : g_sas8Base64digits[(ps8Source[1] << 2) & 0x3c];
+		*ps8Dest++ = '=';
+	}
+	
+	*ps8Dest = '\0';
+}
+
+//解码
+void Base64Decode(char *ps8Dest, const char *ps8Source, int s32InLen)
+{
+    int s32Num = 64;
+    int i,j;
+    char as8ValuePre[4];
+    char s8Temp;
+    int s32Flag = 0;
+	
+    if (ps8Dest==NULL || ps8Source==NULL || s32InLen<=0)
+    {
+        return;
+    }
+    for (i=0; i<s32InLen; i++)
+	{
+		s32Flag = 0;
+		for (j=0; j<64; j++)
+        {
+			if (ps8Source[i] == g_sas8Base64digits[j])
+			{
+                as8ValuePre[i%4] = j;
+                s32Flag = 1;
+                break;
+			}
+		}
+		if (s32Flag == 0)
+		{
+			break;
+		}
+		if (i%4 == 3)
+		{
+			s8Temp = (as8ValuePre[1]>>4)&0x3;
+			*ps8Dest++ = (as8ValuePre[0]<<2) | s8Temp ;
+			s8Temp = (as8ValuePre[2]>>2)&0xF;
+			*ps8Dest++ = (as8ValuePre[1]<<4) | s8Temp ;
+			s8Temp = (as8ValuePre[3])&0x3F;
+			*ps8Dest++ = (as8ValuePre[2]<<6) | s8Temp ;
+		}
+    }
+    i--;
+    if (i%4==1)
+    {
+        s8Temp = (as8ValuePre[1]>>4)&0x3;
+        *ps8Dest++ = (as8ValuePre[0]<<2) | s8Temp ;
+	}
+	else if (i%4==2)
+    {
+        s8Temp = (as8ValuePre[1]>>4)&0x3;
+        *ps8Dest++ = (as8ValuePre[0]<<2) | s8Temp ;
+		s8Temp = (as8ValuePre[2]>>2)&0xF;
+		*ps8Dest++ = (as8ValuePre[1]<<4) | s8Temp ;
+	}
+	
+	*ps8Dest = '\0';
+}
+
+/* EOF */

+ 169 - 0
Projects/macro/switch_ota_V1.0_P30P31/GLOBAL.h

@@ -0,0 +1,169 @@
+/*******************************************************************************
+*
+*   SW 
+*   Soft version:   
+*   File Name:      GLOBAL.h
+*   Author   :      zzw (zhangzw_3@163.com)
+*   creation date:  2011-05-22
+*   module description:声明SW系统中的全局变量 
+*   Copyright (C) 
+*
+********************************************************************************/
+
+#if !defined(_GLOBAL_H_)
+#define _GLOBAL_H_
+
+
+// ************************* Typedef data type  *********************************
+typedef unsigned 	char  	u08;
+typedef          	char  	s08;
+typedef unsigned 	short 	u16;
+typedef          	short 	s16;
+typedef unsigned 	long 	u32;
+typedef          	long 	s32;
+typedef unsigned 	char  	uchar;
+typedef unsigned 	int   	uint;
+
+
+typedef unsigned char   	BOOL;
+typedef unsigned char		BYTE;
+typedef unsigned int		WORD;
+
+
+typedef unsigned char		byte;
+typedef unsigned int		word;
+typedef unsigned long		dword;
+
+typedef unsigned char		UCHAR;
+typedef unsigned int		UINT;
+typedef unsigned short  	USHORT;
+
+
+#ifndef NULL
+#define NULL 0
+#endif
+///////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////
+// 
+// UART消息及外设ID定义
+//
+#define COM1		0 // 
+#define COM2		1 // 
+
+
+/************************ 位变量定义 ***********************/
+typedef union {
+  byte Byte;
+  struct {
+    byte bit0        :1;                                       
+    byte bit1        :1;                                       
+    byte bit2        :1;                                      
+    byte bit3        :1;                                       
+    byte bit4        :1;                                       
+    byte bit5        :1; 
+    byte bit6        :1; 
+    byte bit7        :1;                                       
+  } Bits;
+} DBit;
+
+typedef struct SW_Parameters
+{
+  u16  SWID;			         //模块ID号
+	u08  KeyIn[6];           //按键状态,未按下时0xff
+	u08  step[6];           //01:按键触发,02:闪烁设置,03:全亮,04:闪烁:05:待机背光
+	u32  flicker[6]; //闪烁总时间
+
+  u08  relay_allstatus;   //继电器开机状态全局标志,开关上电状态设置
+  u08  relay_status[3];   //继电器开机1-3状态,开关上电状态设置
+  u08  relay_new_status[3]; //实时最新的状态,继电器断电前的最新状态
+
+  u08  plus_en[3];//点动触发标志,被设置为点动开关,且有按键按下则置1,点动倒计时结束清零
+  u32  plus_counter[3];//点动开关时间,倒计时计数器
+  u32  plus_auto_time[3];//点动开关自动关闭的时间固定值,通过APP设置保存的
+  u08  plus_mod[3];//对应按键开启点动配置
+
+  u08  mod[6]; //0:开关,1:场景
+	//u08  SCENE[4];			   //4个场景模式状态
+	u08  SWITCH[3];		   //4个普通灯的状态
+
+	//u08  LED[4];	     //4个背光状态
+  //u08  LongKey[4];   //长按标志位,LongKey[1-4]:KEY1-KEY4
+
+  //u08  DEBUG;//调试状态,背光常亮
+  //u08  shock;//震动设置,1有效
+  u08  human;//人感设置,1有效
+  u08  gRadarCheckNull;//无人标志位
+ // u08  light;//光感设置,1有效
+  u08  led_level;//led背光亮度等级
+  //u08  bluelight;//氛围灯设置,1有效
+
+  u08  zigbee_work_state;//zigbee网络状态,0:不在网,1:在网,2:脱网报警(60S)
+  //u08  update_config;//APP更新配置参数
+  u32  time;//倒计时
+	
+	u08  KeyPress;			     //1号按键状态,0未被按下,1被按下
+  u32  buttonPressTime;
+} SWParameters;
+
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////
+extern volatile              DBit _BitParament0;
+#define sys10msFlag 		_BitParament0.Bits.bit0 	/* 10ms标志 			*/
+
+//#define sysstate             _BitParament0.Bits.bit7 	/* 0代表无故障,1表示故障开启故障指示灯 */
+#define Nightledvalue        0x0C00	 //背光灯调暗AD采集阈值
+
+extern volatile word   	    tickcount;      /* Timer tick count   		*/
+extern volatile byte 		sysTickfor10ms;	/* 10millisecond timer 		*/
+extern volatile byte 		sysTickfor100ms;/* 100millisecond timer 	*/
+extern volatile byte 		sysTickfor1000ms;/* 100millisecond timer 	*/
+
+
+extern  SWParameters   switchState;
+extern unsigned char gRelayOnOff;
+extern byte gLedState;//按键灯状态
+extern byte gRelayState;// 4bit 继电器值
+
+
+#define CONDITION_NORMAL_TO_BEFOR_JOINING 101
+#define CONDITION_BEFOR_JOINING_TO_JOINING 102 //触发入网后倒计时状态
+#define CONDITION_JOINGING_TO_NORMAL 103
+#define CONDITION_JOINGING__NOT_JION 104
+
+
+#define PWMPRD 18432	// 1ms周期
+#define PWMLEVEL1 32 //4608/72	// 一档 25%占空比,64太亮,降低测试
+#define PWMLEVEL2 64 //9216/72	// 二挡 50%占空比,128太亮,降低测试
+#define PWMLEVEL3 255 //18432/72 // 三挡 100%占空比
+
+extern byte ZG_Joining;//模块进入配网模式, 指示灯快速闪烁10秒
+extern WORD ZG_JoinCounter;//模块进入配网计数器,倒计时开始
+
+extern unsigned int gRadarKeepTimer;
+//#define  mKeyLedFlash 240	  //亮度变化间隔(频率),默认24ms变化改变一个光强度
+
+extern  byte  gRadarCheckNull;//雷达监测,1为无人,0为有人
+
+extern byte appControlLedEnable;//APP控制是否联动背光灯标志位
+
+extern byte shockCounter;//震动计数器
+extern byte shockStart;//按键按下震动触发
+
+
+extern byte burn_in_test_start;//产测标志位
+extern u32 burn_in_test_counter;//产测计数器
+extern u32 burn_in_test_timeout;//产测开机30秒内收到信标才有效
+
+extern u32 IAPUpdateFlag; 
+extern u32 OTA_Reciv_Datalen;
+
+extern void Base64Encode(char *ps8Dest, const char *ps8Source, int s32InLen);
+extern void Base64Decode(char *ps8Dest, const char *ps8Source, int s32InLen);
+
+
+
+#endif // !defined(_GLOBAL_H_)
+
+/* EOF */

+ 243 - 0
Projects/macro/switch_ota_V1.0_P30P31/Listings/EEPROM.lst

@@ -0,0 +1,243 @@
+C51 COMPILER V9.53.0.0   EEPROM                                                            03/26/2024 11:03:42 PAGE 1   
+
+
+C51 COMPILER V9.53.0.0, COMPILATION OF MODULE EEPROM
+OBJECT MODULE PLACED IN .\Objects\EEPROM.obj
+COMPILER INVOKED BY: C:\Keil_v5_51\C51\BIN\C51.EXE EEPROM.c LARGE OPTIMIZE(8,SPEED) BROWSE INCDIR(..\..\..\Drivers) DEBU
+                    -G OBJECTEXTEND PRINT(.\Listings\EEPROM.lst) TABS(2) OBJECT(.\Objects\EEPROM.obj)
+
+line level    source
+
+   1          /*********************************************************************************************************
+             -**
+   2            显示效果:          
+   3            用户通过仿真,能够对EEPROM的特定区域地址内容进行读写操作,并验证数据操作正确与否。      
+   4            eeprom写数据
+   5            连续写字节不能太多
+   6            写单个字节的时间根据写的内容的前后不同,时间不等。  以及电源电压相关
+   7            理论上随着写的次数增加,写的时间会相应增加,建议以单个字节1ms-2ms的时间为基准
+   8          **********************************************************************************************************
+             -*/
+   9          #include <REGtenxTM52F1386.h>
+  10          #include "TM52F1386_bsp.h"
+  11          #include <intrins.h>
+  12          #include "EEPROM.h"
+  13          
+  14          
+  15          #define   IAPTE_0P8_MS  AUX2=(AUX2&0xf9)|0x02
+  16          #define   IAPTE_3P2_MS  AUX2=(AUX2&0xf9)|0x04
+  17          #define   IAPTE_6P4_MS  AUX2=(AUX2&0xf9)|0x06
+  18          #define   IAPTE_DISABLE AUX2=(AUX2&0xf9)
+  19          
+  20          // 设置最大20字节存参数
+  21          unsigned char xdata eeprom_address_write[30]  _at_   0XDC00;             //eeprom指定地址,第一页用于状态数
+             -据+参数配置
+  22          unsigned char code eeprom_address_read[30]  _at_   0XDC00;             //eeprom指定地址
+  23          
+  24          // 设置最大20字节存参数
+  25          unsigned char xdata eeprom_address_write_backup[30]  _at_   0XDE00;             //eeprom指定地址,第二页,
+             -参数配置备份区,第一页读取失败从第二页读取参数备份
+  26          unsigned char code eeprom_address_read_backup[30]  _at_   0XDE00;             //eeprom指定地址
+  27          
+  28          /*
+  29          参数数据(10,实际从1开始,0字节保留):0-9:开机状态(通电勿扰)全局设置1字节-1,三个继电器开机状态3个字节-
+             -2-3-4,背光等级1个字节-5 , 开关、场景设置-6-7-8,人感1字节-9
+  30          
+  31          实时数据(6):10:19:当前继电器状态3个字节-10-11-12,雷达状态1字节-13,点动倒计时未结束1个字节-15-16-17,o
+             -ta状态1字节-19(最后一字节)
+  32          
+  33          点动开关参数(9):,点动开关2个字节(使能1,时间2)-20-21-22,-23-24-25,-26-27-28
+  34          */
+  35          unsigned char write_mileage[30];//0˸пأ1״̬ȫֿأ21Ĭ״̬32Ĭ״̬4
+             -3Ĭ״̬
+  36          unsigned char read_mileage[30];
+  37          
+  38          unsigned char write_mileage_backup[30];//0˸пأ1״̬ȫֿأ21Ĭ״̬32Ĭ
+             -̬43Ĭ״̬
+  39          unsigned char read_mileage_backup[30];
+  40          //unsigned char II=0;
+  41          /*********************************************************************************************************
+             -*
+  42          ** 函数名称: iap_eeprom_write
+  43          ** 函数描述: iap_EEPROM写数据配置函数  
+  44          ** 输入参数: addr:存储地址,范围0~127
+  45                       buf:数据的首地址
+C51 COMPILER V9.53.0.0   EEPROM                                                            03/26/2024 11:03:42 PAGE 2   
+
+  46                len:数据长度(addr+len不要超过128)
+  47          ** 输出参数: 无 
+  48          **********************************************************************************************************
+             -/
+  49          void iap_eeprom_write(unsigned char addr, unsigned char *buf, unsigned char len)       
+  50          {
+  51   1        unsigned char i=0,temp_ea=0,temp_lvrpd=0;
+  52   1        temp_ea = EA;
+  53   1        EA = 0;
+  54   1        temp_lvrpd = LVRCON & 0x10;  // LVR的状态位  
+  55   1        LVRCON = (LVRCON &~ 0x10) | (1 << 4); //关闭LVR功能
+  56   1      
+  57   1        IAPWE_SFR=0XE2;    //使能iap
+  58   1        IAPWE_SFR=0XBA;    //使能iap    
+  59   1        eeprom_address_write[0] = 0x00;//是所在页的整页都擦除
+  60   1        bsp_delay_ms(5);
+  61   1        
+  62   1        IAPWE_SFR=0XE2;    //使能iap
+  63   1        IAPWE_SFR=0X4C;    //使能iap
+  64   1        
+  65   1        for(i = 0; i<len; i++) {
+  66   2          IAPTE_6P4_MS;        //设置IAP看门狗复位时间
+  67   2          eeprom_address_write[addr + i] = *buf;//
+  68   2          buf++;
+  69   2        }
+  70   1        
+  71   1        LVRCON = (LVRCON &~ 0x10) | (temp_lvrpd << 4); //还原LVR
+  72   1        IAPWE_SFR = 0x00;    //关闭IAP
+  73   1        IAPTE_DISABLE;
+  74   1        EA = temp_ea;
+  75   1      }
+  76          
+  77          /*********************************************************************************************************
+             -*
+  78          ** 函数名称: iap_eeprom_write_backup
+  79          ** 函数描述: iap_EEPROM写数据配置函数  
+  80          ** 输入参数: addr:存储地址,范围0~127
+  81                       buf:数据的首地址
+  82                len:数据长度(addr+len不要超过128)
+  83          ** 输出参数: 无 
+  84          **********************************************************************************************************
+             -/
+  85          void iap_eeprom_write_backup(unsigned char addr, unsigned char *buf, unsigned char len)       
+  86          {
+  87   1        unsigned char i=0,temp_ea=0,temp_lvrpd=0;
+  88   1        temp_ea = EA;
+  89   1        EA = 0;
+  90   1        temp_lvrpd = LVRCON & 0x10;  // LVR的状态位  
+  91   1        LVRCON = (LVRCON &~ 0x10) | (1 << 4); //关闭LVR功能
+  92   1      
+  93   1        IAPWE_SFR=0XE2;    //使能iap
+  94   1        IAPWE_SFR=0XBA;    //使能iap    
+  95   1        eeprom_address_write_backup[0] = 0x00;//是所在页的整页都擦除
+  96   1        bsp_delay_ms(5);
+  97   1        
+  98   1        IAPWE_SFR=0XE2;    //使能iap
+  99   1        IAPWE_SFR=0X4C;    //使能iap
+ 100   1        
+ 101   1        for(i = 0; i<len; i++) {
+ 102   2          IAPTE_6P4_MS;        //设置IAP看门狗复位时间
+ 103   2          eeprom_address_write_backup[addr + i] = *buf;//
+ 104   2          buf++;
+C51 COMPILER V9.53.0.0   EEPROM                                                            03/26/2024 11:03:42 PAGE 3   
+
+ 105   2        }
+ 106   1        
+ 107   1        LVRCON = (LVRCON &~ 0x10) | (temp_lvrpd << 4); //还原LVR
+ 108   1        IAPWE_SFR = 0x00;    //关闭IAP
+ 109   1        IAPTE_DISABLE;
+ 110   1        EA = temp_ea;
+ 111   1      }
+ 112          /*********************************************************************************************************
+             -*
+ 113          ** 函数名称: iap_eeprom_read
+ 114          ** 函数描述: iap_EEPROM读数据配置函数  
+ 115          ** 输入参数: addr:存储地址,范围0~127
+ 116                       buf:数据的首地址
+ 117                len:数据长度(addr+len不要超过128)
+ 118          ** 输出参数: 无 
+ 119          **********************************************************************************************************
+             -/
+ 120          void iap_eeprom_read(unsigned char addr, unsigned char *buf, unsigned char len)    //eeprom读
+ 121          {
+ 122   1       unsigned char i=0,temp_ea=0,temp_lvrpd=0;
+ 123   1        
+ 124   1        temp_ea = EA;
+ 125   1        EA = 0; 
+ 126   1        for(i = 0;i<len;i++) {
+ 127   2          *buf = eeprom_address_read[addr+i];
+ 128   2          buf++;
+ 129   2        } 
+ 130   1        EA = temp_ea;
+ 131   1      }
+ 132          
+ 133          /*********************************************************************************************************
+             -*
+ 134          ** 函数名称: iap_eeprom_read_backup
+ 135          ** 函数描述: iap_EEPROM读数据配置函数  
+ 136          ** 输入参数: addr:存储地址,范围0~127
+ 137                       buf:数据的首地址
+ 138                len:数据长度(addr+len不要超过128)
+ 139          ** 输出参数: 无 
+ 140          **********************************************************************************************************
+             -/
+ 141          void iap_eeprom_read_backup(unsigned char addr, unsigned char *buf, unsigned char len)    //eeprom读
+ 142          {
+ 143   1       unsigned char i=0,temp_ea=0,temp_lvrpd=0;
+ 144   1        
+ 145   1        temp_ea = EA;
+ 146   1        EA = 0; 
+ 147   1        for(i = 0;i<len;i++) {
+ 148   2          *buf = eeprom_address_read_backup[addr+i];
+ 149   2          buf++;
+ 150   2        } 
+ 151   1        EA = temp_ea;
+ 152   1      }
+ 153          
+ 154          
+ 155          /*
+ 156          void test(void)
+ 157          {
+ 158            
+ 159            bsp_clock_init();                    // 系统快钟18.432 div 2 =  9.216Mhz
+ 160            gpio_init();
+ 161            write_mileage[0] = 0x22;
+ 162            write_mileage[1] = 0x33;
+C51 COMPILER V9.53.0.0   EEPROM                                                            03/26/2024 11:03:42 PAGE 4   
+
+ 163            write_mileage[2] = 0x44;
+ 164            write_mileage[3] = 0x55;
+ 165            iap_eeprom_write(0,write_mileage,4); //写四个字节(0x22 0x33 0x44 0x55)      
+ 166            bsp_delay_ms(50);                    
+ 167          
+ 168            read_mileage[0] = 0;
+ 169            read_mileage[1] = 0;
+ 170            read_mileage[2] = 0;
+ 171            read_mileage[3] = 0;
+ 172            iap_eeprom_read(0,read_mileage,4);  //读四个字节与之前写的四个字节是否一致(0x22 0x33 0x44 0x55)
+ 173            
+ 174            write_mileage[0] = 0x66;
+ 175            write_mileage[1] = 0x77;
+ 176            write_mileage[2] = 0x88;
+ 177            write_mileage[3] = 0x99;
+ 178            iap_eeprom_write(0,write_mileage,4); //写四个字节(0x66 0x77 0x88 0x99)                                
+             -       
+ 179            bsp_delay_ms(50);                     
+ 180          
+ 181            read_mileage[0] = 0;
+ 182            read_mileage[1] = 0;
+ 183            read_mileage[2] = 0;
+ 184            read_mileage[3] = 0;
+ 185            iap_eeprom_read(0,read_mileage,4);  //读四个字节与之前写的四个字节是否一致(0x66 0x77 0x88 0x99)
+ 186          
+ 187            while(1) 
+ 188            {
+ 189              if (0x66 == read_mileage[0]) {
+ 190                LED1 = 0;
+ 191              } 
+ 192              else {
+ 193                LED1 = 1;
+ 194              } 
+ 195            }
+ 196          }*/
+
+
+MODULE INFORMATION:   STATIC OVERLAYABLE
+   CODE SIZE        =    432    ----
+   CONSTANT SIZE    =   ----    ----
+   XDATA SIZE       =    120      26
+   PDATA SIZE       =   ----    ----
+   DATA SIZE        =   ----    ----
+   IDATA SIZE       =   ----    ----
+   BIT SIZE         =   ----    ----
+END OF MODULE INFORMATION.
+
+
+C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

+ 182 - 0
Projects/macro/switch_ota_V1.0_P30P31/Listings/GLOBAL.lst

@@ -0,0 +1,182 @@
+C51 COMPILER V9.53.0.0   GLOBAL                                                            03/26/2024 11:03:42 PAGE 1   
+
+
+C51 COMPILER V9.53.0.0, COMPILATION OF MODULE GLOBAL
+OBJECT MODULE PLACED IN .\Objects\GLOBAL.obj
+COMPILER INVOKED BY: C:\Keil_v5_51\C51\BIN\C51.EXE GLOBAL.c LARGE OPTIMIZE(8,SPEED) BROWSE INCDIR(..\..\..\Drivers) DEBU
+                    -G OBJECTEXTEND PRINT(.\Listings\GLOBAL.lst) TABS(2) OBJECT(.\Objects\GLOBAL.obj)
+
+line level    source
+
+   1          /*******************************************************************************
+   2          *
+   3          *   SW AS 
+   4          *   Soft version:   
+   5          *   File Name:      GLOBAL.c
+   6          *   Author   :      zzw (zhangzw_3@163.com)
+   7          *   creation date:  2022-07-20
+   8          *   module description:定义系统中的全局变量 
+   9          *   Copyright (C) 
+  10          *
+  11          ********************************************************************************/
+  12          #include "GLOBAL.h"
+  13          #include <stdio.h>
+  14          #include <stdlib.h>
+  15          #include <string.h>
+  16          
+  17          ///////////////////////////////////////////
+  18          volatile            DBit _BitParament0;
+  19          volatile word       tickcount;      /* Timer tick count       */
+  20          volatile byte       sysTickfor10ms; /* 10millisecond timer    */
+  21          volatile byte       sysTickfor100ms;/* 100millisecond timer   */
+  22          volatile byte       sysTickfor1000ms;/* 100millisecond timer  */
+  23          
+  24          SWParameters   switchState;//面板状态
+  25          
+  26          unsigned char  gRelayOnOff=0;//继电器状态
+  27          byte gLedState = 0;//按键灯状态
+  28          byte gRelayState = 0; // 4bit 继电器值
+  29          
+  30          byte ZG_Joining;//模块进入配网模式, 指示灯快速闪烁10秒
+  31          WORD ZG_JoinCounter;//模块进入配网计数器,倒计时开始
+  32          byte ZG_Joining_S;//模块进入配网模式
+  33          
+  34          
+  35          byte  Brightflag;  //强光标志位,1:白天,0,夜晚
+  36          byte BrightPWMH=6;           //强光灯强光PWM占空比
+  37          byte NightPWMH=1;           //暗光PWM占空比
+  38          byte Light_Intensity;//光强度
+  39          //byte mKeyLedWeakLight;//背光最大亮度值,根据光感设置
+  40          byte mBLedWeakLight;//背光最大亮度值,根据光感设置
+  41          
+  42          unsigned int gRadarKeepTimer=0;//有人存在时,LED灯等相关动作保持时间
+  43          byte gRadarCheckNull;//雷达监测,1为无人,0为有人
+  44          
+  45          byte shockCounter;//震动计数器
+  46          byte shockStart;//按键按下震动触发
+  47          
+  48          byte appControlLedEnable = 0; // app控制背光灯点亮使能位,0:忽略,1:强制点亮10秒
+  49          
+  50          
+  51          
+  52          byte burn_in_test_start=0;//产测标志位
+  53          u32 burn_in_test_counter=0;//产测计数器
+  54          u32 burn_in_test_timeout=0;//产测开机30秒内收到信标才有效
+C51 COMPILER V9.53.0.0   GLOBAL                                                            03/26/2024 11:03:42 PAGE 2   
+
+  55          
+  56          
+  57          u32 IAPUpdateFlag = 0; 
+  58          u32 OTA_Reciv_Datalen;
+  59          
+  60          static const char g_sas8Base64digits[] =
+  61          "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+  62          
+  63          //编码
+  64          void Base64Encode(char *ps8Dest, const char *ps8Source, int s32InLen)
+  65          {
+  66   1          if (ps8Dest==NULL || ps8Source==NULL || s32InLen<=0)
+  67   1          {
+  68   2              return;
+  69   2          }
+  70   1        
+  71   1        for (; s32InLen >= 3; s32InLen -= 3)
+  72   1        {
+  73   2          *ps8Dest++ = g_sas8Base64digits[ps8Source[0] >> 2];
+  74   2          *ps8Dest++ = g_sas8Base64digits[((ps8Source[0] << 4) & 0x30) | (ps8Source[1] >> 4)];
+  75   2          *ps8Dest++ = g_sas8Base64digits[((ps8Source[1] << 2) & 0x3c) | (ps8Source[2] >> 6)];
+  76   2          *ps8Dest++ = g_sas8Base64digits[ps8Source[2] & 0x3f];
+  77   2            ps8Source += 3;
+  78   2        }
+  79   1        
+  80   1        if (s32InLen > 0)
+  81   1        {
+  82   2          unsigned char fragment;
+  83   2          
+  84   2          *ps8Dest++ = g_sas8Base64digits[ps8Source[0] >> 2];
+  85   2          fragment = (ps8Source[0] << 4) & 0x30;
+  86   2          
+  87   2          if (s32InLen > 1)
+  88   2            fragment |= ps8Source[1] >> 4;
+  89   2          
+  90   2          *ps8Dest++ = g_sas8Base64digits[fragment];
+  91   2          *ps8Dest++ = (s32InLen < 2) ? '=' : g_sas8Base64digits[(ps8Source[1] << 2) & 0x3c];
+  92   2          *ps8Dest++ = '=';
+  93   2        }
+  94   1        
+  95   1        *ps8Dest = '\0';
+  96   1      }
+  97          
+  98          //解码
+  99          void Base64Decode(char *ps8Dest, const char *ps8Source, int s32InLen)
+ 100          {
+ 101   1          int s32Num = 64;
+ 102   1          int i,j;
+ 103   1          char as8ValuePre[4];
+ 104   1          char s8Temp;
+ 105   1          int s32Flag = 0;
+ 106   1        
+ 107   1          if (ps8Dest==NULL || ps8Source==NULL || s32InLen<=0)
+ 108   1          {
+ 109   2              return;
+ 110   2          }
+ 111   1          for (i=0; i<s32InLen; i++)
+ 112   1        {
+ 113   2          s32Flag = 0;
+ 114   2          for (j=0; j<64; j++)
+ 115   2              {
+ 116   3            if (ps8Source[i] == g_sas8Base64digits[j])
+C51 COMPILER V9.53.0.0   GLOBAL                                                            03/26/2024 11:03:42 PAGE 3   
+
+ 117   3            {
+ 118   4                      as8ValuePre[i%4] = j;
+ 119   4                      s32Flag = 1;
+ 120   4                      break;
+ 121   4            }
+ 122   3          }
+ 123   2          if (s32Flag == 0)
+ 124   2          {
+ 125   3            break;
+ 126   3          }
+ 127   2          if (i%4 == 3)
+ 128   2          {
+ 129   3            s8Temp = (as8ValuePre[1]>>4)&0x3;
+ 130   3            *ps8Dest++ = (as8ValuePre[0]<<2) | s8Temp ;
+ 131   3            s8Temp = (as8ValuePre[2]>>2)&0xF;
+ 132   3            *ps8Dest++ = (as8ValuePre[1]<<4) | s8Temp ;
+ 133   3            s8Temp = (as8ValuePre[3])&0x3F;
+ 134   3            *ps8Dest++ = (as8ValuePre[2]<<6) | s8Temp ;
+ 135   3          }
+ 136   2          }
+ 137   1          i--;
+ 138   1          if (i%4==1)
+ 139   1          {
+ 140   2              s8Temp = (as8ValuePre[1]>>4)&0x3;
+ 141   2              *ps8Dest++ = (as8ValuePre[0]<<2) | s8Temp ;
+ 142   2        }
+ 143   1        else if (i%4==2)
+ 144   1          {
+ 145   2              s8Temp = (as8ValuePre[1]>>4)&0x3;
+ 146   2              *ps8Dest++ = (as8ValuePre[0]<<2) | s8Temp ;
+ 147   2          s8Temp = (as8ValuePre[2]>>2)&0xF;
+ 148   2          *ps8Dest++ = (as8ValuePre[1]<<4) | s8Temp ;
+ 149   2        }
+ 150   1        
+ 151   1        *ps8Dest = '\0';
+ 152   1      }
+ 153          
+ 154          /* EOF */
+
+
+MODULE INFORMATION:   STATIC OVERLAYABLE
+   CODE SIZE        =   1289    ----
+   CONSTANT SIZE    =   ----    ----
+   XDATA SIZE       =    203      30
+   PDATA SIZE       =   ----    ----
+   DATA SIZE        =   ----    ----
+   IDATA SIZE       =   ----    ----
+   BIT SIZE         =   ----    ----
+END OF MODULE INFORMATION.
+
+
+C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

Разлика између датотеке није приказан због своје велике величине
+ 4851 - 0
Projects/macro/switch_ota_V1.0_P30P31/Listings/HSW_1KEY.m51


Разлика између датотеке није приказан због своје велике величине
+ 5239 - 0
Projects/macro/switch_ota_V1.0_P30P31/Listings/HSW_2KEY.m51


Разлика између датотеке није приказан због своје велике величине
+ 4851 - 0
Projects/macro/switch_ota_V1.0_P30P31/Listings/HSW_3KEY.m51


Разлика између датотеке није приказан због своје велике величине
+ 5239 - 0
Projects/macro/switch_ota_V1.0_P30P31/Listings/HSW_6KEY.m51


+ 281 - 0
Projects/macro/switch_ota_V1.0_P30P31/Listings/STARTUP_TENX52.lst

@@ -0,0 +1,281 @@
+A51 MACRO ASSEMBLER  STARTUP_TENX52                                                       03/26/2024 11:03:42 PAGE     1
+
+
+MACRO ASSEMBLER A51 V8.02b
+OBJECT MODULE PLACED IN .\Objects\STARTUP_TENX52.obj
+ASSEMBLER INVOKED BY: C:\Keil_v5_51\C51\BIN\A51.EXE STARTUP_TENX52.A51 INCDIR(..\..\..\Drivers) SET(LARGE) DEBUG PRINT(.
+                      \Listings\STARTUP_TENX52.lst) OBJECT(.\Objects\STARTUP_TENX52.obj) EP
+
+LOC  OBJ            LINE     SOURCE
+
+                       1     $nomod51 
+                       2     ;------------------------------------------------------------------------------
+                       3     ;Description:
+                       4     ;  This code is executed after a reset.  Besides the usual C51 startup 
+                       5     ;  settings, Some specific TM52FXXXX  initializations are done here such as the
+                       6     ;  LCD RAM clear. When the startup code execution is complete, this code jumps to ?C_START 
+                             that 
+                       7     ;  is typically the main() function in the C code.
+                       8     ;  
+                       9     ;
+                      10     ;  This example demo code is provided as is and has no warranty,
+                      11     ;  implied or otherwise.  You are free to use/modify any of the provided
+                      12     ;  code at your own risk in your applications with the expressed limitation
+                      13     ;  of liability  so long as your product using the code contains
+                      14     ;  at least one TM52FXXXX product (device).
+                      15     ;------------------------------------------------------------------------------
+                      16     ;  User-defined <h> Power-On Initialization of Memory 
+                      17     ;
+                      18     ;  With the following EQU statements the initialization of memory
+                      19     ;  at processor reset can be defined:
+                      20     ;
+                      21     ; <o> IDATALEN: IDATA memory size <0x0-0x100>
+                      22     ;     <i> Note: The absolute start-address of IDATA memory is always 0
+                      23     ;     <i>       The IDATA space overlaps physically the DATA and BIT areas.
+  0080                24     IDATALEN        EQU     80H   ; the length of IDATA memory in bytes to clear
+                      25     ;
+                      26     ; <o> XDATASTART: XDATA memory start address <0x0-0xFFFF> 
+                      27     ;     <i> The absolute start address of XDATA memory
+                      28     ;     <i> TM52FXXXX users need to fill this in based on where SRAM memory mapped.
+  FFFF                29     XDATAEND        EQU     0FFFFH ; the absolute end-address of XDATA memory
+                      30     ;
+                      31     ; <o> XDATALEN: XDATA memory size <0x0-0xFFFF> 
+                      32     ;     <i> The length of XDATA memory in bytes.
+                      33     ;     <i> NOTE: The length equates for XDATALEN  should be changed to 
+                      34     ;     <i>       non-zero values indicating the amount of XDATA 
+                      35     ;     <i>       memory to be initialized to 0x00.  The start address equates 
+                      36     ;     <i>       (XDATASTART ) must be set to the respective starting
+                      37     ;     <i>       addresses as mapped in TM52FXXXX if the memory is to be initialized.
+  0000                38     XDATALEN        EQU     0H      ; the length of XDATA memory in bytes to clear.
+                      39     ;
+                      40     ; <o> LCDDATASTART: LCD DATA memory start address <0x0-0xFFFF> 
+                      41     ;     <i> The absolute start address of LCD DATA memory
+                      42     ;     <i> TM52XX users need to fill this in based on where LCD DATA memory mapped.
+  F000                43     LCDDATASTART    EQU     0F000H  ; the absolute start-address of LCD DATA memory
+                      44     ;
+                      45     ; <o> LCDDATALEN: XDATA memory size <0x0-0xFF> 
+                      46     ;     <i> The length of LCD DATA memory in bytes.
+                      47     ;     <i> NOTE: The length equates for LCDDATALEN should be changed to 
+                      48     ;     <i>       non-zero values indicating the amount of LCD DATA 
+                      49     ;     <i>       memory to be initialized to 0x00.  The start address equates 
+                      50     ;     <i>       (LCDDATASTART) must be set to the respective starting
+                      51     ;     <i>       addresses as mapped in TM52FXXXX if the memory is to be initialized.
+  0000                52     LCDDATALEN      EQU     0H      ; the length of XDATA memory in bytes to clear.
+                      53     ;
+                      54     ; <o> PDATASTART: PDATA memory start address <0x0-0xFFFF> 
+                      55     ;     <i> The absolute start address of PDATA memory
+  0000                56     PDATASTART      EQU     0H              ; the absolute start-address of PDATA memory
+A51 MACRO ASSEMBLER  STARTUP_TENX52                                                       03/26/2024 11:03:42 PAGE     2
+
+                      57     ;
+                      58     ; <o> PDATALEN: PDATA memory size <0x0-0xFF> 
+                      59     ;     <i> The length of PDATA memory in bytes.
+  0000                60     PDATALEN        EQU     0H              ; the length of PDATA memory in bytes to clear.
+                      61     ;
+                      62     ;</h>
+                      63     ;------------------------------------------------------------------------------
+                      64     ;
+                      65     ;<h> Reentrant Stack Initialization
+                      66     ;
+                      67     ;  The following EQU statements define the stack pointer for reentrant
+                      68     ;  functions and initialized it:
+                      69     ;
+                      70     ; <h> Stack Space for reentrant functions in the SMALL model.
+                      71     ;  <q> IBPSTACK: Enable SMALL model reentrant stack
+                      72     ;     <i> Stack space for reentrant functions in the SMALL model.
+  0000                73     IBPSTACK        EQU     0           ; set to 1 if small reentrant is used.
+                      74     ;  <o> IBPSTACKTOP: End address of SMALL model stack <0x0-0xFF>
+                      75     ;     <i> Set the top of the stack to the highest location.
+  0100                76     IBPSTACKTOP     EQU     0xFF +1     ; default 0FFH+1  
+                      77     ; </h>
+                      78     ;
+                      79     ; <h> Stack Space for reentrant functions in the LARGE model.      
+                      80     ;  <q> XBPSTACK: Enable LARGE model reentrant stack
+                      81     ;     <i> Stack space for reentrant functions in the LARGE model.
+  0000                82     XBPSTACK        EQU     0           ; set to 1 if large reentrant is used.
+                      83     ;  <o> XBPSTACKTOP: End address of LARGE model stack <0x0-0xFFFF>
+                      84     ;     <i> Set the top of the stack to the highest location.
+  0000                85     XBPSTACKTOP     EQU     0xFFFF +1   ; default 0FFFFH+1 
+                      86     ; </h>
+                      87     ;
+                      88     ; <h> Stack Space for reentrant functions in the COMPACT model.    
+                      89     ;  <q> PBPSTACK: Enable COMPACT model reentrant stack
+                      90     ;     <i> Stack space for reentrant functions in the COMPACT model.
+  0000                91     PBPSTACK        EQU     0           ; set to 1 if compact reentrant is used.
+                      92     ;
+                      93     ;   <o> PBPSTACKTOP: End address of COMPACT model stack <0x0-0xFFFF>
+                      94     ;     <i> Set the top of the stack to the highest location.
+  0100                95     PBPSTACKTOP     EQU     0xFF +1     ; default 0FFH+1  
+                      96     ;</h>
+                      97     ;</h>
+                      98     ;------------------------------------------------------------------------------
+                      99     ;
+                     100     ;  Memory Page for Using the Compact Model with 64 KByte xdata RAM
+                     101     ;  <e>Compact Model Page Definition
+                     102     ;
+                     103     ;  <i>Define the XDATA page used for PDATA variables. 
+                     104     ;  <i>PPAGE must conform with the PPAGE set in the linker invocation.
+                     105     ;
+                     106     ; Enable pdata memory page initalization
+  0000               107     PPAGEENABLE     EQU     0           ; set to 1 if pdata object are used.
+                     108     ;
+                     109     ; <o> PPAGE number <0x0-0xFF> 
+                     110     ; <i> uppermost 256-byte address of the page used for PDATA variables.
+  0000               111     PPAGE           EQU     0
+                     112     ;
+                     113     ; <o> SFR address which supplies uppermost address byte <0x0-0xFF> 
+                     114     ; <i> most 8051 variants use P2 as uppermost address byte
+  00A0               115     PPAGE_SFR       DATA    0A0H
+                     116     ;
+                     117     ; </e>
+                     118     ;; </e>
+                     119     ;;------------------------------------------------------------------------------
+                     120     
+                     121     ; Standard SFR Symbols 
+  00E0               122     ACC     DATA    0E0H
+A51 MACRO ASSEMBLER  STARTUP_TENX52                                                       03/26/2024 11:03:42 PAGE     3
+
+  00F0               123     B       DATA    0F0H
+  0081               124     SP      DATA    81H
+  0082               125     DPL     DATA    82H
+  0083               126     DPH     DATA    83H
+                     127     
+                     128                     NAME    ?C_STARTUP
+                     129     
+                     130     
+                     131     ?C_C51STARTUP   SEGMENT   CODE
+                     132     ?STACK          SEGMENT   IDATA
+                     133     
+----                 134                     RSEG    ?STACK
+0000                 135                     DS      1
+                     136     
+                     137                     EXTRN CODE (?C_START)
+                     138                     PUBLIC  ?C_STARTUP
+                     139     
+----                 140                     CSEG    AT      0
+0000 020000   F      141     ?C_STARTUP:     LJMP    STARTUP1
+                     142     
+----                 143                     RSEG    ?C_C51STARTUP
+                     144     
+0000                 145     STARTUP1:
+                     146     
+                     147     IF IDATALEN <> 0
+0000 787F            148                     MOV     R0,#IDATALEN - 1
+0002 E4              149                     CLR     A
+0003 F6              150     IDATALOOP:      MOV     @R0,A
+0004 D8FD            151                     DJNZ    R0,IDATALOOP
+                     152     ENDIF
+                     153     
+                     154     IF XDATALEN <> 0
+                                             MOV     DPTR,#(XDATAEND-XDATALEN)+1
+                                             MOV     R7,#LOW (XDATALEN)
+                               IF (LOW (XDATALEN)) <> 0
+                                             MOV     R6,#(HIGH (XDATALEN)) +1
+                               ELSE
+                                             MOV     R6,#HIGH (XDATALEN)
+                               ENDIF
+                                             CLR     A
+                             XDATALOOP:      MOVX    @DPTR,A
+                                             INC     DPTR
+                                             DJNZ    R7,XDATALOOP
+                                             DJNZ    R6,XDATALOOP
+                             ENDIF
+                     168     
+                     169     IF LCDDATALEN <> 0
+                                             MOV     DPTR,#LCDDATASTART
+                                             MOV     R7,#LCDDATALEN
+                                             CLR     A
+                             LCDDATALOOP:    MOVX    @DPTR,A
+                                             INC     DPTR
+                                             DJNZ    R7,LCDDATALOOP
+                             ENDIF
+                     177     
+                     178     
+                     179     IF PPAGEENABLE <> 0
+                                             MOV     PPAGE_SFR,#PPAGE
+                             ENDIF
+                     182     
+                     183     IF PDATALEN <> 0
+                                             MOV     R0,#LOW (PDATASTART)
+                                             MOV     R7,#LOW (PDATALEN)
+                                             CLR     A
+                             PDATALOOP:      MOVX    @R0,A
+                                             INC     R0
+A51 MACRO ASSEMBLER  STARTUP_TENX52                                                       03/26/2024 11:03:42 PAGE     4
+
+                                             DJNZ    R7,PDATALOOP
+                             ENDIF
+                     191     
+                     192     IF IBPSTACK <> 0
+                             EXTRN DATA (?C_IBP)
+                             
+                                             MOV     ?C_IBP,#LOW IBPSTACKTOP
+                             ENDIF
+                     197     
+                     198     IF XBPSTACK <> 0
+                             EXTRN DATA (?C_XBP)
+                             
+                                             MOV     ?C_XBP,#HIGH XBPSTACKTOP
+                                             MOV     ?C_XBP+1,#LOW XBPSTACKTOP
+                             ENDIF
+                     204     
+                     205     IF PBPSTACK <> 0
+                             EXTRN DATA (?C_PBP)
+                                             MOV     ?C_PBP,#LOW PBPSTACKTOP
+                             ENDIF
+                     209     
+0006 758100   F      210                     MOV     SP,#?STACK-1  ; init SP for hardware stack 
+                     211     
+                     212     ; This code is required if you use L51_BANK.A51 with Banking Mode 4
+                     213     ;<h> Code Banking
+                     214     ; <q> Select Bank 0 for L51_BANK.A51 Mode 4
+                     215     
+                             
+                             
+                                             
+                             
+                     220     ;</h>
+0009 020000   F      221                     LJMP    ?C_START    ;call main() function in the C code
+                     222     
+                     223                     END
+A51 MACRO ASSEMBLER  STARTUP_TENX52                                                       03/26/2024 11:03:42 PAGE     5
+
+SYMBOL TABLE LISTING
+------ ----- -------
+
+
+N A M E             T Y P E  V A L U E   ATTRIBUTES
+
+?C_C51STARTUP. . .  C SEG    000CH       REL=UNIT
+?C_START . . . . .  C ADDR   -----       EXT
+?C_STARTUP . . . .  C ADDR   0000H   A   
+?STACK . . . . . .  I SEG    0001H       REL=UNIT
+ACC. . . . . . . .  D ADDR   00E0H   A   
+B. . . . . . . . .  D ADDR   00F0H   A   
+DPH. . . . . . . .  D ADDR   0083H   A   
+DPL. . . . . . . .  D ADDR   0082H   A   
+IBPSTACK . . . . .  N NUMB   0000H   A   
+IBPSTACKTOP. . . .  N NUMB   0100H   A   
+IDATALEN . . . . .  N NUMB   0080H   A   
+IDATALOOP. . . . .  C ADDR   0003H   R   SEG=?C_C51STARTUP
+LCDDATALEN . . . .  N NUMB   0000H   A   
+LCDDATASTART . . .  N NUMB   F000H   A   
+PBPSTACK . . . . .  N NUMB   0000H   A   
+PBPSTACKTOP. . . .  N NUMB   0100H   A   
+PDATALEN . . . . .  N NUMB   0000H   A   
+PDATASTART . . . .  N NUMB   0000H   A   
+PPAGE. . . . . . .  N NUMB   0000H   A   
+PPAGEENABLE. . . .  N NUMB   0000H   A   
+PPAGE_SFR. . . . .  D ADDR   00A0H   A   
+SP . . . . . . . .  D ADDR   0081H   A   
+STARTUP1 . . . . .  C ADDR   0000H   R   SEG=?C_C51STARTUP
+XBPSTACK . . . . .  N NUMB   0000H   A   
+XBPSTACKTOP. . . .  N NUMB   0000H   A   
+XDATAEND . . . . .  N NUMB   FFFFH   A   
+XDATALEN . . . . .  N NUMB   0000H   A   
+
+
+REGISTER BANK(S) USED: 0 
+
+
+ASSEMBLY COMPLETE.  0 WARNING(S), 0 ERROR(S)

+ 156 - 0
Projects/macro/switch_ota_V1.0_P30P31/Listings/TM52F1386_bsp.lst

@@ -0,0 +1,156 @@
+C51 COMPILER V9.53.0.0   TM52F1386_BSP                                                     03/26/2024 11:03:43 PAGE 1   
+
+
+C51 COMPILER V9.53.0.0, COMPILATION OF MODULE TM52F1386_BSP
+OBJECT MODULE PLACED IN .\Objects\TM52F1386_bsp.obj
+COMPILER INVOKED BY: C:\Keil_v5_51\C51\BIN\C51.EXE ..\..\..\Drivers\TM52F1386_bsp.c LARGE OPTIMIZE(8,SPEED) BROWSE INCDI
+                    -R(..\..\..\Drivers) DEBUG OBJECTEXTEND PRINT(.\Listings\TM52F1386_bsp.lst) TABS(2) OBJECT(.\Objects\TM52F1386_bsp.obj)
+
+line level    source
+
+   1          #include <REGtenxTM52F1386.h>
+   2          #include <intrins.h>
+   3          #include "TM52F1386_bsp.h"
+   4          
+   5          /*********************************************************************************************************
+             -*
+   6          **函数名称  bsp_clock_init()
+   7          **函数描述 :设置内部FRC/2为系统时钟
+   8          **输    入 :无
+   9          **输    出 :无
+  10          **说    明 :快时钟系统主频为 18.432/2M   默认二分频
+  11          **********************************************************************************************************
+             -/
+  12          void bsp_clock_init()      
+  13          {
+  14   1        SELFCK = 0;          //切换到慢时钟
+  15   1          
+  16   1        CLKCON = 0x02;       //时钟二分频
+  17   1      //  CLKCON = 0x03;       //时钟一分频
+  18   1        
+  19   1        STPPCK = 0;      //开启部分模块使用快时钟
+  20   1        STPFCK = 0;      //开启快时钟
+  21   1        SELFCK = 1;      //切换到快时钟
+  22   1      }
+  23          
+  24          /*********************************************************************************************************
+             -*
+  25          **函数名称  bsp_FXT_clock_init()
+  26          **函数描述 :设置FXT外部快速晶体振荡器/2为系统时钟
+  27          **输    入 :无
+  28          **输    出 :无
+  29          **说    明 :注意 P20 P21需要配置为接外部快速晶振
+  30          **********************************************************************************************************
+             -/
+  31          void bsp_FXT_clock_init()      
+  32          {
+  33   1        SELFCK = 0;          //切换到慢时钟
+  34   1      
+  35   1        CLKCON = 0x02;       //时钟二分频
+  36   1      //  CLKCON = 0x03;       //时钟一分频
+  37   1      
+  38   1        FCKTYPE = 1;     //FXT
+  39   1        STPPCK = 0;      //开启快时钟
+  40   1        STPFCK = 0;      //开启部分模块使用快时钟
+  41   1        //延时2ms等待晶体振荡器稳定
+  42   1        bsp_delay_ms(2);
+  43   1        SELFCK = 1;      //切换到快时钟
+  44   1      }
+  45          
+  46          /*********************************************************************************************************
+             -*
+  47          **函数名称  bsp_SXT_clock_init()
+  48          **函数描述 :设置SXT外部慢速晶体振荡器/2为系统时钟
+  49          **输    入 :无
+C51 COMPILER V9.53.0.0   TM52F1386_BSP                                                     03/26/2024 11:03:43 PAGE 2   
+
+  50          **输    出 :无
+  51          **说    明 :注意 P20 P21需要配置为接外部快速晶振
+  52          **********************************************************************************************************
+             -/
+  53          void bsp_SXT_clock_init()      
+  54          {
+  55   1        SELFCK = 0;      //切换到慢时钟
+  56   1        
+  57   1        CLKCON = 0x02;   //时钟二分频 
+  58   1      //  CLKCON = 0x03;       //时钟一分频
+  59   1        STPPCK = 0;      //开启快时钟
+  60   1        STPFCK = 0;      //开启部分模块使用快时钟
+  61   1        SELFCK = 1;      //切换到快时钟
+  62   1        SCKTYPE = 1;     //SXT
+  63   1        SELFCK = 0;      //切换到慢时钟
+  64   1      }
+  65          
+  66          /*********************************************************************************************************
+             -*
+  67          **函数名称  bsp_delay_100us()
+  68          **函数描述 :100us单位延时函数
+  69          **输    入 :
+  70          **输    出 :无
+  71          **说    明 :基于内部时钟二分频计算,非精确延时 
+  72          **********************************************************************************************************
+             -/
+  73          void bsp_delay_100us(unsigned int cnt)   //该函数不是精确延时,根据内部时钟FRC二分频计算得来的
+  74          {
+  75   1        unsigned int i;
+  76   1        unsigned char delay_cnt;
+  77   1        for(i = 0;i<cnt;i++)
+  78   1        {
+  79   2          delay_cnt = 23;
+  80   2          while(delay_cnt--)
+  81   2          {
+  82   3            delay_10nop();
+  83   3          }
+  84   2        }
+  85   1      }
+  86          
+  87          /*********************************************************************************************************
+             -*
+  88          **函数名称  bsp_delay_100us()
+  89          **函数描述 :100us单位延时函数
+  90          **输    入 :
+  91          **输    出 :无
+  92          **说    明 :基于内部时钟二分频计算,非精确延时 
+  93          **********************************************************************************************************
+             -/
+  94          void bsp_delay_ms(unsigned int ms)      //该函数不是精确延时,根据内部时钟FRC二分频计算得来的
+  95          {
+  96   1        unsigned int i;
+  97   1        unsigned char delay_cnt;
+  98   1        for(i = 0;i<ms;i++)
+  99   1        {
+ 100   2          delay_cnt =95;
+ 101   2          while(delay_cnt--)
+ 102   2          {
+ 103   3            delay_10nop();
+ 104   3            delay_10nop();
+ 105   3            delay_10nop();
+ 106   3            delay_10nop();
+C51 COMPILER V9.53.0.0   TM52F1386_BSP                                                     03/26/2024 11:03:43 PAGE 3   
+
+ 107   3          }
+ 108   2        }
+ 109   1      }
+ 110          
+ 111          
+ 112          
+ 113          
+ 114          
+ 115          
+ 116          
+ 117          
+ 118          
+
+
+MODULE INFORMATION:   STATIC OVERLAYABLE
+   CODE SIZE        =    155    ----
+   CONSTANT SIZE    =   ----    ----
+   XDATA SIZE       =   ----    ----
+   PDATA SIZE       =   ----    ----
+   DATA SIZE        =   ----    ----
+   IDATA SIZE       =   ----    ----
+   BIT SIZE         =   ----    ----
+END OF MODULE INFORMATION.
+
+
+C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

Разлика између датотеке није приказан због своје велике величине
+ 1233 - 0
Projects/macro/switch_ota_V1.0_P30P31/Listings/gpio_ctrl.lst


Разлика између датотеке није приказан због своје велике величине
+ 1062 - 0
Projects/macro/switch_ota_V1.0_P30P31/Listings/main.lst


Разлика између датотеке није приказан због своје велике величине
+ 4851 - 0
Projects/macro/switch_ota_V1.0_P30P31/Listings/main.m51


+ 650 - 0
Projects/macro/switch_ota_V1.0_P30P31/Listings/mcu_api.lst

@@ -0,0 +1,650 @@
+C51 COMPILER V9.53.0.0   MCU_API                                                           03/26/2024 11:03:42 PAGE 1   
+
+
+C51 COMPILER V9.53.0.0, COMPILATION OF MODULE MCU_API
+OBJECT MODULE PLACED IN .\Objects\mcu_api.obj
+COMPILER INVOKED BY: C:\Keil_v5_51\C51\BIN\C51.EXE mcu_api.c LARGE OPTIMIZE(8,SPEED) BROWSE INCDIR(..\..\..\Drivers) DEB
+                    -UG OBJECTEXTEND PRINT(.\Listings\mcu_api.lst) TABS(2) OBJECT(.\Objects\mcu_api.obj)
+
+line level    source
+
+   1          /**
+   2          * @file  mcu_api.c
+   3          * @brief this file contains basic fuctions and DP data report fucntion which is base on DP type
+   4          * @author qinlang
+   5          * @date 2022.05.06
+   6          * @par email:qinlang.chen@tuya.com
+   7          * @copyright HANGZHOU TUYA INFORMATION TECHNOLOGY CO.,LTD
+   8          * @par company
+   9          * http://www.tuya.com
+  10          */
+  11          
+  12          #include "zigbee.h"
+  13          
+  14          /**
+  15          * @brief hex translate to bcd 
+  16          * @param[in] {Value_H} higher bits data 
+  17          * @param[in] {Value_L} lower bits data
+  18          * @return  bcd type data
+  19          */
+  20          unsigned char hex_to_bcd(unsigned char Value_H,unsigned char Value_L)
+  21          {
+  22   1        unsigned char bcd_value;
+  23   1        
+  24   1        if((Value_H >= '0') && (Value_H <= '9')){
+  25   2          Value_H -= '0';
+  26   2        }
+  27   1        else if((Value_H >= 'A') && (Value_H <= 'F')){
+  28   2          Value_H = Value_H - 'A' + 10;
+  29   2        }
+  30   1        else if((Value_H >= 'a') && (Value_H <= 'f')){
+  31   2          Value_H = Value_H - 'a' + 10;
+  32   2        }
+  33   1      
+  34   1        bcd_value = Value_H & 0x0f;
+  35   1        bcd_value <<= 4;
+  36   1      
+  37   1        if((Value_L >= '0') && (Value_L <= '9')){
+  38   2          Value_L -= '0';
+  39   2        }
+  40   1        else if((Value_L >= 'A') && (Value_L <= 'F')){
+  41   2          Value_L = Value_L - 'a' + 10;
+  42   2        }
+  43   1        else if((Value_L >= 'a') && (Value_L <= 'f')){
+  44   2          Value_L = Value_L - 'a' + 10;
+  45   2        }
+  46   1        
+  47   1        bcd_value |= Value_L & 0x0f;
+  48   1      
+  49   1        return bcd_value;
+  50   1      }
+  51          
+  52          /**
+  53          * @brief get string len 
+  54          * @param[in] {str} higher bits data 
+C51 COMPILER V9.53.0.0   MCU_API                                                           03/26/2024 11:03:42 PAGE 2   
+
+  55          * @return string len 
+  56          */
+  57          unsigned long my_strlen(unsigned char *str)  
+  58          {
+  59   1        unsigned long len = 0;
+  60   1        if(str == NULL){ 
+  61   2          return 0;
+  62   2        }
+  63   1        
+  64   1        for(len = 0; *str ++ != '\0'; ){
+  65   2          len ++;
+  66   2        }
+  67   1        
+  68   1        return len;
+  69   1      }
+  70          
+  71          /**
+  72          * @brief  assign ch to the first count bytes of the memory address src
+  73          * @param[in] {src}    srouce address
+  74          * @param[in] {ch}     set value 
+  75          * @param[in] {count}  length of set address 
+  76          * @return void
+  77          */
+  78          void *my_memset(void *src,unsigned char ch,unsigned short count)
+  79          {
+  80   1        unsigned char *tmp = (unsigned char *)src;
+  81   1        if(src == NULL){
+  82   2          return NULL;
+  83   2        }
+  84   1        
+  85   1        while(count --){
+  86   2          *tmp ++ = ch;
+  87   2        }
+  88   1        return src;
+  89   1      }
+  90          
+  91          /**
+  92          * @brief copy count bytes data from src to dest
+  93          * @param[in] {src}    srouce address
+  94          * @param[in] {dest}   destination address
+  95          * @param[in] {count}  length of copy data
+  96          * @return void
+  97          */
+  98          void *my_memcpy(void *dest, const void *src, unsigned short count)  
+  99          {  
+ 100   1        unsigned char *pdest = (unsigned char *)dest;  
+ 101   1        const unsigned char *psrc  = (const unsigned char *)src;  
+ 102   1        unsigned short i;
+ 103   1        
+ 104   1        if(dest == NULL || src == NULL){ 
+ 105   2          return NULL;
+ 106   2        }
+ 107   1        
+ 108   1        if((pdest <= psrc) || (pdest > psrc + count)){  
+ 109   2          for(i = 0; i < count; i ++){  
+ 110   3            pdest[i] = psrc[i];  
+ 111   3          }  
+ 112   2        }
+ 113   1        else{
+ 114   2          for(i = count; i > 0; i --){  
+ 115   3            pdest[i - 1] = psrc[i - 1];  
+ 116   3          }  
+C51 COMPILER V9.53.0.0   MCU_API                                                           03/26/2024 11:03:42 PAGE 3   
+
+ 117   2        }  
+ 118   1        
+ 119   1        return dest;  
+ 120   1      }
+ 121          
+ 122          /**
+ 123          * @brief copy string src to string dest
+ 124          * @param[in] {src}    srouce address
+ 125          * @param[in] {dest}   destination address
+ 126          * @return the tail of destination 
+ 127          */
+ 128          char *my_strcpy(char *dest, const char *src)  
+ 129          {
+ 130   1        char *p = dest;
+ 131   1        while(*src!='\0'){
+ 132   2          *dest++ = *src++;
+ 133   2        }
+ 134   1        *dest = '\0';
+ 135   1        return p;
+ 136   1      }
+ 137          
+ 138          /**
+ 139          * @brief compare string s1 with string s2
+ 140          * @param[in] {s1}  srouce address
+ 141          * @param[in] {s2}  destination address
+ 142          * @return compare result
+ 143          */
+ 144          int my_strcmp(char *s1 , char *s2)
+ 145          {
+ 146   1        while( *s1 && *s2 && *s1 == *s2 ){
+ 147   2          s1++;
+ 148   2          s2++;
+ 149   2        }
+ 150   1        return *s1 - *s2;
+ 151   1      }
+ 152          
+ 153          /**
+ 154          * @brief int translate to byte
+ 155          * @param[in] {number} int data 
+ 156          * @param[out] {value} the result array     
+ 157          * @return void
+ 158          */
+ 159          void int_to_byte(unsigned long number,unsigned char value[4])
+ 160          {
+ 161   1        value[0] = number >> 24;
+ 162   1        value[1] = number >> 16;
+ 163   1        value[2] = number >> 8;
+ 164   1        value[3] = number & 0xff;
+ 165   1      }
+ 166          
+ 167          /**
+ 168          * @brief byte data translate to int 
+ 169          * @param[in] {value}  the byte array 
+ 170          * @return result of int data 
+ 171          */
+ 172          unsigned long byte_to_int(const unsigned char value[4])
+ 173          {
+ 174   1        unsigned long nubmer = 0;
+ 175   1      
+ 176   1        nubmer = (unsigned long)value[0];
+ 177   1        nubmer <<= 8;
+ 178   1        nubmer |= (unsigned long)value[1];
+C51 COMPILER V9.53.0.0   MCU_API                                                           03/26/2024 11:03:42 PAGE 4   
+
+ 179   1        nubmer <<= 8;
+ 180   1        nubmer |= (unsigned long)value[2];
+ 181   1        nubmer <<= 8;
+ 182   1        nubmer |= (unsigned long)value[3];
+ 183   1        
+ 184   1        return nubmer;
+ 185   1      }
+ 186          
+ 187          
+ 188          /**
+ 189          * @brief report bool type DP data to zigbee module 
+ 190          * @param[in]  {dpid}  dp id
+ 191          * @param[in]  {value} Data contents of dp 
+ 192          * @return send result 
+ 193          */
+ 194          unsigned char mcu_dp_bool_update(unsigned char dpid,unsigned char value)
+ 195          {
+ 196   1        unsigned short length = 0;
+ 197   1        
+ 198   1        length = set_zigbee_uart_byte(length,dpid);
+ 199   1        length = set_zigbee_uart_byte(length,DP_TYPE_BOOL);
+ 200   1       
+ 201   1        length = set_zigbee_uart_byte(length,0);
+ 202   1        length = set_zigbee_uart_byte(length,1);
+ 203   1      
+ 204   1        if(value == FALSE){
+ 205   2          length = set_zigbee_uart_byte(length,FALSE);
+ 206   2        }
+ 207   1        else{
+ 208   2          length = set_zigbee_uart_byte(length,1);
+ 209   2        }
+ 210   1        
+ 211   1        zigbee_uart_write_frame(DATA_REPORT_CMD,length);
+ 212   1        
+ 213   1        return SUCCESS;
+ 214   1      }
+ 215          
+ 216          
+ 217          /**
+ 218          * @brief report enum type DP data to zigbee module 
+ 219          * @param[in]  {dpid}  dp id
+ 220          * @param[in]  {value} Data contents of dp 
+ 221          * @return send result 
+ 222          */
+ 223          unsigned char mcu_dp_enum_update(unsigned char dpid,unsigned char value)
+ 224          {
+ 225   1        unsigned short length = 0;
+ 226   1        
+ 227   1        length = set_zigbee_uart_byte(length,dpid);
+ 228   1        length = set_zigbee_uart_byte(length,DP_TYPE_ENUM);
+ 229   1        //
+ 230   1        length = set_zigbee_uart_byte(length,0);
+ 231   1        length = set_zigbee_uart_byte(length,1);
+ 232   1        //
+ 233   1        length = set_zigbee_uart_byte(length,value);
+ 234   1        
+ 235   1        zigbee_uart_write_frame(DATA_REPORT_CMD,length);
+ 236   1        
+ 237   1        return SUCCESS;
+ 238   1      }
+ 239          
+ 240          
+C51 COMPILER V9.53.0.0   MCU_API                                                           03/26/2024 11:03:42 PAGE 5   
+
+ 241          /**
+ 242          * @brief report bitmap type DP data to zigbee module 
+ 243          * @param[in]  {dpid}  dp id
+ 244          * @param[in]  {value} Data contents of dp 
+ 245          * @return send result 
+ 246          */
+ 247          unsigned char mcu_dp_bitmap_update(unsigned char dpid,unsigned long value)
+ 248          {
+ 249   1        unsigned short length = 0;
+ 250   1      
+ 251   1        length = set_zigbee_uart_byte(length,dpid);
+ 252   1        length = set_zigbee_uart_byte(length,DP_TYPE_BITMAP);
+ 253   1        //
+ 254   1        length = set_zigbee_uart_byte(length,0);
+ 255   1        
+ 256   1        if((value | 0xff) == 0xff){
+ 257   2          length = set_zigbee_uart_byte(length,1);
+ 258   2          length = set_zigbee_uart_byte(length,value);
+ 259   2        }
+ 260   1        else if((value | 0xffff) == 0xffff){
+ 261   2          length = set_zigbee_uart_byte(length,2);
+ 262   2          length = set_zigbee_uart_byte(length,value >> 8);
+ 263   2          length = set_zigbee_uart_byte(length,value & 0xff);
+ 264   2        }
+ 265   1        else{
+ 266   2          length = set_zigbee_uart_byte(length,4);
+ 267   2          length = set_zigbee_uart_byte(length,value >> 24);
+ 268   2          length = set_zigbee_uart_byte(length,value >> 16);
+ 269   2          length = set_zigbee_uart_byte(length,value >> 8);
+ 270   2          length = set_zigbee_uart_byte(length,value & 0xff);
+ 271   2        }    
+ 272   1        
+ 273   1        zigbee_uart_write_frame(DATA_REPORT_CMD,length);
+ 274   1      
+ 275   1        return SUCCESS;
+ 276   1      }
+ 277          
+ 278          
+ 279          /**
+ 280          * @brief report fault type DP data to zigbee module 
+ 281          * @param[in]  {dpid}  dp id
+ 282          * @param[in]  {value} Data contents of dp 
+ 283          * @return send result 
+ 284          */
+ 285          unsigned char mcu_dp_fault_update(unsigned char dpid,unsigned long value)
+ 286          {
+ 287   1        unsigned short length = 0;
+ 288   1      
+ 289   1        length = set_zigbee_uart_byte(length,dpid);
+ 290   1        length = set_zigbee_uart_byte(length,DP_TYPE_BITMAP);
+ 291   1        //
+ 292   1        length = set_zigbee_uart_byte(length,0);
+ 293   1        
+ 294   1        if((value | 0xff) == 0xff){
+ 295   2          length = set_zigbee_uart_byte(length,1);
+ 296   2          length = set_zigbee_uart_byte(length,value);
+ 297   2        }
+ 298   1        else if((value | 0xffff) == 0xffff){
+ 299   2          length = set_zigbee_uart_byte(length,2);
+ 300   2          length = set_zigbee_uart_byte(length,value >> 8);
+ 301   2          length = set_zigbee_uart_byte(length,value & 0xff);
+ 302   2        }
+C51 COMPILER V9.53.0.0   MCU_API                                                           03/26/2024 11:03:42 PAGE 6   
+
+ 303   1        else{
+ 304   2          length = set_zigbee_uart_byte(length,4);
+ 305   2          length = set_zigbee_uart_byte(length,value >> 24);
+ 306   2          length = set_zigbee_uart_byte(length,value >> 16);
+ 307   2          length = set_zigbee_uart_byte(length,value >> 8);
+ 308   2          length = set_zigbee_uart_byte(length,value & 0xff);
+ 309   2        }    
+ 310   1        
+ 311   1        zigbee_uart_write_frame(DATA_REPORT_CMD,length);
+ 312   1      
+ 313   1        return SUCCESS;
+ 314   1      }
+ 315          
+ 316          /**
+ 317          * @brief report raw type DP data to zigbee module 
+ 318          * @param[in]  {dpid}  dp id
+ 319          * @param[in]  {value} Data contents of dp 
+ 320          * @param[in]  {len} length of Data contents  
+ 321          * @return send result 
+ 322          */
+ 323          unsigned char mcu_dp_raw_update(unsigned char dpid,const unsigned char value[],unsigned short len)
+ 324          {
+ 325   1        unsigned short length = 0;
+ 326   1        
+ 327   1        length = set_zigbee_uart_byte(length,dpid);
+ 328   1        length = set_zigbee_uart_byte(length,DP_TYPE_RAW);
+ 329   1        //
+ 330   1        length = set_zigbee_uart_byte(length,len / 0x100);
+ 331   1        length = set_zigbee_uart_byte(length,len % 0x100);
+ 332   1        //
+ 333   1        length = set_zigbee_uart_buffer(length,(unsigned char *)value,len);
+ 334   1        
+ 335   1        zigbee_uart_write_frame(DATA_REPORT_CMD,length);
+ 336   1        
+ 337   1        return SUCCESS;
+ 338   1      }
+ 339          
+ 340          /**
+ 341          * @brief report string type DP data to zigbee module 
+ 342          * @param[in]  {dpid}  dp id
+ 343          * @param[in]  {value} Data contents of dp 
+ 344          * @param[in]  {len} length of Data contents  
+ 345          * @return send result 
+ 346          */
+ 347          unsigned char mcu_dp_string_update(unsigned char dpid,const unsigned char value[],unsigned short len)
+ 348          {
+ 349   1        unsigned short length = 0;
+ 350   1        
+ 351   1        length = set_zigbee_uart_byte(length,dpid);
+ 352   1        length = set_zigbee_uart_byte(length,DP_TYPE_STRING);
+ 353   1        //
+ 354   1        length = set_zigbee_uart_byte(length,len / 0x100);
+ 355   1        length = set_zigbee_uart_byte(length,len % 0x100);
+ 356   1        //
+ 357   1        length = set_zigbee_uart_buffer(length,(unsigned char *)value,len);
+ 358   1        
+ 359   1        zigbee_uart_write_frame(DATA_REPORT_CMD,length);
+ 360   1        
+ 361   1        return SUCCESS;
+ 362   1      }
+ 363          
+ 364          /**
+C51 COMPILER V9.53.0.0   MCU_API                                                           03/26/2024 11:03:42 PAGE 7   
+
+ 365          * @brief report raw type DP data to zigbee module 
+ 366          * @param[in]  {dpid}  dp id
+ 367          * @param[in]  {value} Data contents of dp 
+ 368          * @return send result 
+ 369          */
+ 370          unsigned char mcu_dp_value_update(unsigned char dpid,unsigned long value)
+ 371          {
+ 372   1        unsigned short length = 0;
+ 373   1        
+ 374   1        length = set_zigbee_uart_byte(length,dpid);
+ 375   1        length = set_zigbee_uart_byte(length,DP_TYPE_VALUE);
+ 376   1        //
+ 377   1        length = set_zigbee_uart_byte(length,0);
+ 378   1        length = set_zigbee_uart_byte(length,4);
+ 379   1        //
+ 380   1        length = set_zigbee_uart_byte(length,value >> 24);
+ 381   1        length = set_zigbee_uart_byte(length,value >> 16);
+ 382   1        length = set_zigbee_uart_byte(length,value >> 8);
+ 383   1        length = set_zigbee_uart_byte(length,value & 0xff);
+ 384   1        
+ 385   1        zigbee_uart_write_frame(DATA_REPORT_CMD,length);
+ 386   1        
+ 387   1        return SUCCESS;
+ 388   1      }
+ 389          
+ 390          /**
+ 391          * @brief mcu get bool type value from zigbee translate 
+ 392          * @param[in]  {value}  data of dp
+ 393          * @param[in]  {len} Data length
+ 394          * @return  true or false
+ 395          */
+ 396          unsigned char mcu_get_dp_download_bool(const unsigned char value[],unsigned short len)
+ 397          {
+ 398   1        return(value[0]);
+ 399   1      }
+*** WARNING C280 IN LINE 396 OF mcu_api.c: 'len': unreferenced local variable
+ 400          
+ 401          /**
+ 402          * @brief mcu get enum type value from zigbee translate 
+ 403          * @param[in]  {value}  data of dp
+ 404          * @param[in]  {len} Data length
+ 405          * @return  enum data
+ 406          */
+ 407          unsigned char mcu_get_dp_download_enum(const unsigned char value[],unsigned short len)
+ 408          {
+ 409   1        return(value[0]);
+ 410   1      }
+*** WARNING C280 IN LINE 407 OF mcu_api.c: 'len': unreferenced local variable
+ 411          
+ 412          /**
+ 413          * @brief mcu get value type value from zigbee translate 
+ 414          * @param[in]  {value}  data of dp
+ 415          * @param[in]  {len} Data length
+ 416          * @return  value data
+ 417          */
+ 418          unsigned long mcu_get_dp_download_value(const unsigned char value[],unsigned short len)
+ 419          {
+ 420   1        return(byte_to_int(value));
+ 421   1      }
+*** WARNING C280 IN LINE 418 OF mcu_api.c: 'len': unreferenced local variable
+ 422          
+ 423          
+C51 COMPILER V9.53.0.0   MCU_API                                                           03/26/2024 11:03:42 PAGE 8   
+
+ 424          /**
+ 425          * @brief mcu start zigbee module test 
+ 426          * @param[in]  {channel} test channel usually 11
+ 427          * @return void
+ 428          */
+ 429          void mcu_start_zigbee_test(unsigned char channel)
+ 430          {
+ 431   1        zigbee_uart_tx_buf[DATA_START] = channel; 
+ 432   1        zigbee_uart_write_frame(ZIGBEE_RF_TEST_CMD,1);
+ 433   1      }
+ 434          
+ 435          /**
+ 436          * @brief mcu reset zigbee module 
+ 437          * @param[in]  {void} 
+ 438          * @return void
+ 439          */
+ 440          void mcu_reset_zigbee(void)
+ 441          {
+ 442   1        unsigned short length = 0;
+ 443   1      
+ 444   1        length = set_zigbee_uart_byte(length,0);
+ 445   1        zigbee_uart_write_frame(ZIGBEE_CFG_CMD, length);
+ 446   1      }
+ 447          
+ 448          /**
+ 449          * @brief mcu start zigbee module 
+ 450          * this commond must be call after reveived checking proudect info, or after get zigbee network info
+ 451          * @param[in]  {void} 
+ 452          * @return void
+ 453          */
+ 454          void mcu_network_start(void)
+ 455          {
+ 456   1        unsigned short length = 0;
+ 457   1      
+ 458   1        length = set_zigbee_uart_byte(length,1);
+ 459   1        zigbee_uart_write_frame(ZIGBEE_CFG_CMD, length);
+ 460   1      }
+ 461          
+ 462          /**
+ 463          * @brief copy receive data from uart receive interrupt
+ 464          * @param[in]  {value} Data received from interrupt
+ 465          * @return void 
+ 466          */
+ 467          void uart_receive_input(unsigned char value)
+ 468          {
+ 469   1        //#error "please call this fuction in the interrupt fuction of serial receive, and delete this line"
+ 470   1      
+ 471   1          if(1 == queue_out - queue_in) {
+ 472   2              //queue full
+ 473   2          }else if((queue_in > queue_out) && ((queue_in - queue_out) >= sizeof(zigbee_queue_buf))) {
+ 474   2              //queue full
+ 475   2          }else {
+ 476   2              //queue not full
+ 477   2              if(queue_in >= (unsigned char *)(zigbee_queue_buf + sizeof(zigbee_queue_buf))){
+ 478   3                  queue_in = (unsigned char *)(zigbee_queue_buf);
+ 479   3              }
+ 480   2              *queue_in ++ = value;
+ 481   2          }
+ 482   1      }
+ 483          
+ 484          
+ 485          /**
+C51 COMPILER V9.53.0.0   MCU_API                                                           03/26/2024 11:03:42 PAGE 9   
+
+ 486          * @brief init paramter and set rx_buf with zero
+ 487          * @param[in]  {void}
+ 488          * @return void 
+ 489          */
+ 490          void zigbee_protocol_init(void)
+ 491          {
+ 492   1       // #error "please call this fuction in main init"
+ 493   1      
+ 494   1        queue_in = (unsigned char *)zigbee_queue_buf;
+ 495   1        queue_out = (unsigned char *)zigbee_queue_buf;
+ 496   1      }
+ 497          
+ 498          /**
+ 499          * @brief read byte from zigbee_queue_buf array
+ 500          * @param[in]  {void}
+ 501          * @return read byte value
+ 502          */
+ 503          unsigned char Queue_Read_Byte(void)
+ 504          {
+ 505   1          unsigned char value;
+ 506   1          
+ 507   1          if(queue_out != queue_in) {
+ 508   2              //have data in queue
+ 509   2              if(queue_out >= (unsigned char *)(zigbee_queue_buf + sizeof(zigbee_queue_buf))) {
+ 510   3                  queue_out = (unsigned char *)(zigbee_queue_buf);
+ 511   3              }
+ 512   2              value = *queue_out ++;   
+ 513   2          }
+ 514   1          
+ 515   1          return value;
+ 516   1      }
+ 517          
+ 518          /**
+ 519           * @brief  check rx buffer is empty or not
+ 520           * @param  Null
+ 521           * @return the queue state
+ 522           */
+ 523          unsigned char with_data_rxbuff(void)
+ 524          {
+ 525   1          if(queue_out != queue_in)
+ 526   1              return 1;
+ 527   1          else
+ 528   1              return 0;
+ 529   1      }
+ 530          
+ 531          
+ 532          /**
+ 533          * @brief uart receive data handle, call this function at mian loop 
+ 534          * @param[in]  {void}
+ 535          * @return void 
+ 536          */
+ 537          void zigbee_uart_service(void)
+ 538          {
+ 539   1          //#error "please call this fucntion in main while(1){}, and delete this line" 
+ 540   1          static unsigned short rx_in = 0;
+ 541   1          unsigned short offset = 0;
+ 542   1          unsigned short rx_value_len = 0;  
+ 543   1          unsigned short protocol_version = 0, protocol_head_len = PROTOCOL_HEAD;
+ 544   1      
+ 545   1          while((rx_in < sizeof(zigbee_uart_rx_buf)) && (with_data_rxbuff() > 0)){
+ 546   2              zigbee_uart_rx_buf[rx_in++] = Queue_Read_Byte();
+ 547   2          }
+C51 COMPILER V9.53.0.0   MCU_API                                                           03/26/2024 11:03:42 PAGE 10  
+
+ 548   1      
+ 549   1          if(rx_in < PROTOCOL_HEAD){
+ 550   2              return;
+ 551   2          }
+ 552   1      
+ 553   1          while((rx_in - offset) >= PROTOCOL_HEAD){
+ 554   2              if(zigbee_uart_rx_buf[offset + HEAD_FIRST] != FIRST_FRAME_HEAD){
+ 555   3                  offset++;
+ 556   3                  continue;
+ 557   3              }
+ 558   2      
+ 559   2              if(zigbee_uart_rx_buf[offset + HEAD_SECOND] != SECOND_FRAME_HEAD){
+ 560   3                  offset++;
+ 561   3                  continue;
+ 562   3              }
+ 563   2      
+ 564   2              protocol_version = zigbee_uart_rx_buf[offset + PROTOCOL_VERSION];
+ 565   2      
+ 566   2             if(protocol_version != SERIAL_PROTOCOL_VER) /*version 2 is more than two byte  sequence number than
+             - version 1*/
+ 567   2              {
+ 568   3                  offset += 2; 
+ 569   3                  continue;
+ 570   3              }
+ 571   2      
+ 572   2              rx_value_len =  zigbee_uart_rx_buf[offset + LENGTH_HIGH ] * 0x100;
+ 573   2              rx_value_len += (zigbee_uart_rx_buf[offset + LENGTH_LOW] + PROTOCOL_HEAD);
+ 574   2      
+ 575   2              if(rx_value_len > sizeof(zigbee_uart_rx_buf)){
+ 576   3                  offset += 3;
+ 577   3                  continue;
+ 578   3              }
+ 579   2      
+ 580   2              if((rx_in - offset) < rx_value_len){
+ 581   3                  break;
+ 582   3              }
+ 583   2      
+ 584   2              if( get_check_sum((unsigned char *)zigbee_uart_rx_buf + offset, rx_value_len - 1) != zigbee_uart_r
+             -x_buf[offset + rx_value_len - 1]){
+ 585   3                  offset += 3; 
+ 586   3                  continue;
+ 587   3              }
+ 588   2      
+ 589   2              data_handle(offset);//数据处理
+ 590   2              offset += rx_value_len;
+ 591   2          }
+ 592   1          rx_in -= offset;
+ 593   1      
+ 594   1          if(rx_in > 0){
+ 595   2          if((offset == 0)  && (rx_in >= sizeof(zigbee_uart_rx_buf))){
+ 596   3                  offset++;
+ 597   3                  rx_in -= offset;
+ 598   3              }
+ 599   2          my_memcpy((char*)zigbee_uart_rx_buf, (const char *)zigbee_uart_rx_buf + offset, rx_in);
+ 600   2          }
+ 601   1      }
+
+
+MODULE INFORMATION:   STATIC OVERLAYABLE
+   CODE SIZE        =   3430    ----
+   CONSTANT SIZE    =   ----    ----
+   XDATA SIZE       =      2     106
+C51 COMPILER V9.53.0.0   MCU_API                                                           03/26/2024 11:03:42 PAGE 11  
+
+   PDATA SIZE       =   ----    ----
+   DATA SIZE        =   ----    ----
+   IDATA SIZE       =   ----    ----
+   BIT SIZE         =   ----    ----
+END OF MODULE INFORMATION.
+
+
+C51 COMPILATION COMPLETE.  3 WARNING(S),  0 ERROR(S)

Разлика између датотеке није приказан због своје велике величине
+ 2087 - 0
Projects/macro/switch_ota_V1.0_P30P31/Listings/protocol.lst


+ 62 - 0
Projects/macro/switch_ota_V1.0_P30P31/Listings/sTimeout.lst

@@ -0,0 +1,62 @@
+C51 COMPILER V9.53.0.0   STIMEOUT                                                          03/26/2024 11:03:42 PAGE 1   
+
+
+C51 COMPILER V9.53.0.0, COMPILATION OF MODULE STIMEOUT
+OBJECT MODULE PLACED IN .\Objects\sTimeout.obj
+COMPILER INVOKED BY: C:\Keil_v5_51\C51\BIN\C51.EXE sTimeout.c LARGE OPTIMIZE(8,SPEED) BROWSE INCDIR(..\..\..\Drivers) DE
+                    -BUG OBJECTEXTEND PRINT(.\Listings\sTimeout.lst) TABS(2) OBJECT(.\Objects\sTimeout.obj)
+
+line level    source
+
+   1          /*******************************************************************************
+   2          *
+   3          *   Timeout 
+   4          *   Soft version:   V1.00
+   5          *   File Name:      sTimeout.c
+   6          *   Author   :      zzw (zhangzw_3@163.com)
+   7          *   creation date:  2022-07-20
+   8          * module description: 
+   9          *   Copyright (C) reserve
+  10          *
+  11          ********************************************************************************/
+  12          #include "sTimeout.h"
+  13          
+  14          /*******************************************************************************
+  15          Function:     sTimeout()
+  16          Description:    Check for timeout using the given tick counter and timeout value
+  17                  Force timeout if timeout value is zero
+  18          Calls:      
+  19          Called By:    
+  20          Input:      *varp -- the given tick counter, tout -- Force timeout
+  21          Output:     BOOL
+  22          Return:     return 1 when timeout  
+  23          Others:     no
+  24          ********************************************************************************/
+  25          BOOL sTimeout(unsigned int *varp, unsigned int tout)
+  26          {
+  27   1          unsigned int diff;
+  28   1      
+  29   1          diff = tickcount - *varp;
+  30   1          if (!tout || diff >= tout)
+  31   1          {
+  32   2              *varp = tickcount;
+  33   2              return 1;
+  34   2          }
+  35   1          return 0;
+  36   1      }
+  37          
+  38          /* EOF */ 
+
+
+MODULE INFORMATION:   STATIC OVERLAYABLE
+   CODE SIZE        =     63    ----
+   CONSTANT SIZE    =   ----    ----
+   XDATA SIZE       =   ----       2
+   PDATA SIZE       =   ----    ----
+   DATA SIZE        =   ----    ----
+   IDATA SIZE       =   ----    ----
+   BIT SIZE         =   ----    ----
+END OF MODULE INFORMATION.
+
+
+C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

+ 0 - 0
Projects/macro/switch_ota_V1.0_P30P31/Listings/system.lst


Неке датотеке нису приказане због велике количине промена