瀏覽代碼

Fix OTA update bug

haitao 1 年之前
父節點
當前提交
0948fda2c0
共有 69 個文件被更改,包括 5075 次插入3243 次删除
  1. 4 3
      app/App/main.c
  2. 5 0
      app/App/otaEvent.c
  3. 1 1
      app/App/otaEvent.h
  4. 2528 1477
      app/Proj/JLinkLog.txt
  5. 828 491
      app/Proj/Listings/Ringzle.map
  6. 二進制
      app/Proj/Objects/Ringzle.axf
  7. 二進制
      app/Proj/Objects/Ringzle.bin
  8. 42 3
      app/Proj/Objects/Ringzle.build_log.htm
  9. 73 71
      app/Proj/Objects/Ringzle.htm
  10. 5 0
      app/Proj/Objects/Ringzle.lnp
  11. 130 6
      app/Proj/Objects/Ringzle_GD32F103C8T6.dep
  12. 7 0
      app/Proj/Objects/dhcp.d
  13. 9 0
      app/Proj/Objects/dns.d
  14. 二進制
      app/Proj/Objects/ec800m.crf
  15. 二進制
      app/Proj/Objects/main.crf
  16. 二進制
      app/Proj/Objects/otaevent.crf
  17. 1 0
      app/Proj/Objects/otaevent.d
  18. 二進制
      app/Proj/Objects/pc.crf
  19. 39 0
      app/Proj/Objects/socket.d
  20. 38 0
      app/Proj/Objects/w5500.d
  21. 38 0
      app/Proj/Objects/wizchip_conf.d
  22. 102 93
      app/Proj/Ringzle.uvguix.16936
  23. 7 15
      app/Proj/Ringzle.uvoptx
  24. 1 0
      bootloader/HW/Source/boot.c
  25. 二進制
      bootloader/OBJ/boot.crf
  26. 1 0
      bootloader/OBJ/boot.d
  27. 二進制
      bootloader/OBJ/bootloader.axf
  28. 4 49
      bootloader/OBJ/bootloader.build_log.htm
  29. 196 176
      bootloader/OBJ/bootloader.htm
  30. 1 0
      bootloader/OBJ/bootloader.lnp
  31. 50 19
      bootloader/OBJ/bootloader_bootloader.dep
  32. 二進制
      bootloader/OBJ/delay.crf
  33. 1 0
      bootloader/OBJ/delay.d
  34. 二進制
      bootloader/OBJ/fmc.crf
  35. 1 0
      bootloader/OBJ/fmc.d
  36. 二進制
      bootloader/OBJ/gd32f10x_fmc.crf
  37. 2 1
      bootloader/OBJ/gd32f10x_fmc.d
  38. 二進制
      bootloader/OBJ/gd32f10x_fwdgt.crf
  39. 18 0
      bootloader/OBJ/gd32f10x_fwdgt.d
  40. 二進制
      bootloader/OBJ/gd32f10x_gpio.crf
  41. 1 0
      bootloader/OBJ/gd32f10x_gpio.d
  42. 二進制
      bootloader/OBJ/gd32f10x_it.crf
  43. 1 0
      bootloader/OBJ/gd32f10x_it.d
  44. 二進制
      bootloader/OBJ/gd32f10x_misc.crf
  45. 1 0
      bootloader/OBJ/gd32f10x_misc.d
  46. 二進制
      bootloader/OBJ/gd32f10x_rcu.crf
  47. 1 0
      bootloader/OBJ/gd32f10x_rcu.d
  48. 二進制
      bootloader/OBJ/gd32f10x_spi.crf
  49. 1 0
      bootloader/OBJ/gd32f10x_spi.d
  50. 二進制
      bootloader/OBJ/gd32f10x_wwdgt.crf
  51. 1 0
      bootloader/OBJ/gd32f10x_wwdgt.d
  52. 二進制
      bootloader/OBJ/main.crf
  53. 1 0
      bootloader/OBJ/main.d
  54. 二進制
      bootloader/OBJ/ota_message.crf
  55. 1 0
      bootloader/OBJ/ota_message.d
  56. 二進制
      bootloader/OBJ/spi.crf
  57. 1 0
      bootloader/OBJ/spi.d
  58. 二進制
      bootloader/OBJ/system_gd32f10x.crf
  59. 1 0
      bootloader/OBJ/system_gd32f10x.d
  60. 二進制
      bootloader/OBJ/w25q32.crf
  61. 1 0
      bootloader/OBJ/w25q32.d
  62. 463 465
      bootloader/USER/JLinkLog.txt
  63. 254 230
      bootloader/USER/Listings/bootloader.map
  64. 1 0
      bootloader/USER/RTE_Components.h
  65. 184 139
      bootloader/USER/bootloader.uvguix.16936
  66. 14 2
      bootloader/USER/bootloader.uvoptx
  67. 5 0
      bootloader/USER/bootloader.uvprojx
  68. 10 1
      bootloader/USER/main.c
  69. 1 1
      bootloader/USER/main.h

+ 4 - 3
app/App/main.c

@@ -118,6 +118,7 @@ int main(void)
 	}
 	//跳出获取信息循环后重新加载一下网关配置
 	gateway = get_config_params();
+	strcpy(gateway->deviceId, strID);
 	strcpy(gateway->version, VERSION);
 	strcpy(gateway->gatewayMode, GATEWAYMODE);
 	strcpy(gateway->gateName,GATEWAYNAME);
@@ -144,10 +145,10 @@ int main(void)
 			LogPrint(LOG_ERROR, __func__, __LINE__, "protocol modbus is 2,dlt645 is 1 ;please check protocol setting");
 			break;
 	}
+	//开启看门狗
+		fwdgt_init();
 	while (1)
 	{
-		//开启看门狗
-		fwdgt_init();
 		check_ota_event();                              //检测是否有ota事件产生
 		MQTT_Alarm_clock(gateway->inboundTime, gateway);
 	}
@@ -199,7 +200,7 @@ void MQTT_Alarm_clock(uint32_t time, CONFIG_PARAMS *gateway)
  */
 void readID(char *strId)
 {
-	static const char *hex_table = "0123456789abcdefghijklmnopqrstuvwxyzzABCDEFGHIJKLMN";
+	static const char *hex_table = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMN";
 	uint32_t CpuID1, CpuID2, CpuID3;
 	CpuID1 = *(volatile uint32_t *)(0x1FFFF7E8);
 	CpuID2 = *(volatile uint32_t *)(0x1FFFF7EC);

+ 5 - 0
app/App/otaEvent.c

@@ -2,6 +2,7 @@
 #include "usart.h"
 #include "systick.h"
 #include "w25q32.h"
+#include "main.h"
 
 #define APPBLOCKNB 2      	//下载的程序位于block的第3块中
 #define OTA_EVENT_BLOCKNB 1 //OTA事件完成标志存储的位置位于第2块中
@@ -24,6 +25,7 @@ uint16_t Xmodem_CRC16(uint8_t *data, uint16_t datalen);
  */
 int8_t check_ota_event()
 {
+	                                           //关闭看门狗
 	// 当标志位为1时证明ota事件产生,将进入ota升级路线
 	if (ota_data.ota_flag == 1)
 	{
@@ -31,6 +33,7 @@ int8_t check_ota_event()
 		int8_t recvSta = xmodem(1000);
 		if (recvSta == 0)
 		{
+			
 			return 0;
 		}
 		else  
@@ -51,6 +54,7 @@ int8_t xmodem(uint16_t timeout)
 	data_flag.xmodemNB=0;                         
 	while(1)
 	{
+		task_fwdgt_reload();                                 //喂狗
 		if(gettick()-startTime>timeout*1000)return 0;
 		usart_data_transmit(COM_232, 'C');
 		delay_1ms(1000);
@@ -61,6 +65,7 @@ int8_t xmodem(uint16_t timeout)
 	{
 		if (ota_data.done == 1)
 		{
+			task_fwdgt_reload();                                       //喂狗
 			if (ota_data.data[0] == SOH && ota_data.data_cnt == 133)
 			{
 				uint16_t XCRC = Xmodem_CRC16(ota_data.data + 3, 128);

+ 1 - 1
app/App/otaEvent.h

@@ -13,7 +13,7 @@ typedef struct OTA_T
 typedef struct OTA_FLAG
 {
 	uint8_t flag;								//存储的flag  0未完成存储,1完成存储
-	uint8_t xmodemNB;           //xmodemNB总计页数
+	uint32_t xmodemNB;           //xmodemNB总计页数
 }OTA_flag;
 
 typedef struct _OTA_MESSAGE_INFO{

文件差異過大導致無法顯示
+ 2528 - 1477
app/Proj/JLinkLog.txt


文件差異過大導致無法顯示
+ 828 - 491
app/Proj/Listings/Ringzle.map


二進制
app/Proj/Objects/Ringzle.axf


二進制
app/Proj/Objects/Ringzle.bin


+ 42 - 3
app/Proj/Objects/Ringzle.build_log.htm

@@ -21,14 +21,53 @@ Target DLL:      Segger\JL2CM3.dll V2.99.36.0
 Dialog DLL:      TCM.DLL V1.36.5.0
  
 <h2>Project:</h2>
-C:\Users\16936\Desktop\dtu_gateway\app\Proj\Ringzle.uvprojx
-Project File Date:  08/08/2023
+D:\Project\dtu\Proj\Ringzle.uvprojx
+Project File Date:  06/28/2023
 
 <h2>Output:</h2>
 *** Using Compiler 'V5.06 update 6 (build 750)', folder: 'D:\workSoftware\stm32Software\mdk\mdkcore\ARM\ARMCC\Bin'
 Build target 'GD32F103C8T6'
+compiling main.c...
+..\App\otaEvent.h(26): warning:  #1295-D: Deprecated declaration check_ota_event - give arg types
+  int8_t check_ota_event();
+..\App\main.c(65): warning:  #1295-D: Deprecated declaration fwdgt_init - give arg types
+  void fwdgt_init();
+..\App\main.c(66): warning:  #1295-D: Deprecated declaration task_fwdgt_reload - give arg types
+  void task_fwdgt_reload();
+..\App\main.c(95): warning:  #167-D: argument of type "uint8_t *" is incompatible with parameter of type "char *restrict"
+  	strcpy(gateway->deviceId, strID);
+..\App\main.c(96): warning:  #167-D: argument of type "uint8_t *" is incompatible with parameter of type "char *restrict"
+  	strcpy(gateway->version, VERSION);
+..\App\main.c(97): warning:  #167-D: argument of type "uint8_t *" is incompatible with parameter of type "char *restrict"
+  	strcpy(gateway->gatewayMode, GATEWAYMODE);
+..\App\main.c(98): warning:  #167-D: argument of type "uint8_t *" is incompatible with parameter of type "char *restrict"
+  	strcpy(gateway->gateName,GATEWAYNAME);
+..\App\main.c(104): warning:  #167-D: argument of type "char *" is incompatible with parameter of type "uint8_t *"
+   	http_load_config(httpURL);
+..\App\main.c(111): warning:  #167-D: argument of type "uint8_t *" is incompatible with parameter of type "char *restrict"
+  		strcpy(gateway->deviceId, strID);
+..\App\main.c(112): warning:  #167-D: argument of type "uint8_t *" is incompatible with parameter of type "char *restrict"
+  		strcpy(gateway->version, VERSION);
+..\App\main.c(113): warning:  #167-D: argument of type "uint8_t *" is incompatible with parameter of type "char *restrict"
+  		strcpy(gateway->gatewayMode, GATEWAYMODE);
+..\App\main.c(114): warning:  #167-D: argument of type "uint8_t *" is incompatible with parameter of type "char *restrict"
+  		strcpy(gateway->gateName,GATEWAYNAME);
+..\App\main.c(121): warning:  #167-D: argument of type "uint8_t *" is incompatible with parameter of type "char *restrict"
+  	strcpy(gateway->deviceId, strID);
+..\App\main.c(122): warning:  #167-D: argument of type "uint8_t *" is incompatible with parameter of type "char *restrict"
+  	strcpy(gateway->version, VERSION);
+..\App\main.c(123): warning:  #167-D: argument of type "uint8_t *" is incompatible with parameter of type "char *restrict"
+  	strcpy(gateway->gatewayMode, GATEWAYMODE);
+..\App\main.c(124): warning:  #167-D: argument of type "uint8_t *" is incompatible with parameter of type "char *restrict"
+  	strcpy(gateway->gateName,GATEWAYNAME);
+..\App\main.c(242): warning:  #167-D: argument of type "uint8_t *" is incompatible with parameter of type "char *"
+  	if (EC800MGetUrl(httpURL) == true) // 从http获取信息,获取成功则保存到本地
+..\App\main.c: 17 warnings, 0 errors
+linking...
+Program Size: Code=38444 RO-data=2680 RW-data=224 ZI-data=90320  
+FromELF: creating hex file...
 After Build - User command #1: fromelf --bin --output ./Objects/Ringzle.bin ./Objects/Ringzle.axf
-".\Objects\Ringzle.axf" - 0 Error(s), 0 Warning(s).
+".\Objects\Ringzle.axf" - 0 Error(s), 17 Warning(s).
 
 <h2>Software Packages used:</h2>
 

+ 73 - 71
app/Proj/Objects/Ringzle.htm

@@ -3,7 +3,7 @@
 <title>Static Call Graph - [.\Objects\Ringzle.axf]</title></head>
 <body><HR>
 <H1>Static Call Graph for image .\Objects\Ringzle.axf</H1><HR>
-<BR><P>#&#060CALLGRAPH&#062# ARM Linker, 5060750: Last Updated: Tue Aug 08 08:48:09 2023
+<BR><P>#&#060CALLGRAPH&#062# ARM Linker, 5060750: Last Updated: Tue Aug 15 15:05:40 2023
 <BR><P>
 <H3>Maximum Stack Usage =      41112 bytes + Unknown(Cycles, Untraceable Function Pointers)</H3><H3>
 Call chain for Maximum Stack Depth:</H3>
@@ -314,8 +314,8 @@ Global Symbols
 <LI><a href="#[f7]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;xmodem
 <LI><a href="#[c5]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;readGatewayMessage
 <LI><a href="#[140]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;mmodbus_readHoldingRegisters8i
-<LI><a href="#[dd]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;internal_alloc
 <LI><a href="#[54]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;dlt645_hw_read
+<LI><a href="#[dd]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;internal_alloc
 </UL>
 
 <P><STRONG><a name="[133]"></a>__aeabi_memcpy4</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, memcpya.o(.text))
@@ -498,18 +498,18 @@ Global Symbols
 <P><STRONG><a name="[6b]"></a>__aeabi_dadd</STRONG> (Thumb, 322 bytes, Stack size 48 bytes, dadd.o(.text))
 <BR><BR>[Stack]<UL><LI>Max Depth = 88<LI>Call Chain = __aeabi_dadd &rArr; _double_epilogue &rArr; _double_round
 </UL>
-<BR>[Calls]<UL><LI><a href="#[6f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_double_round
-<LI><a href="#[6e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_double_epilogue
-<LI><a href="#[6d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_lasr
+<BR>[Calls]<UL><LI><a href="#[6d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_lasr
 <LI><a href="#[6c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_llsl
+<LI><a href="#[6f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_double_round
+<LI><a href="#[6e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_double_epilogue
 </UL>
-<BR>[Called By]<UL><LI><a href="#[e4]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_fp_digits
-<LI><a href="#[71]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_drsub
+<BR>[Called By]<UL><LI><a href="#[71]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_drsub
 <LI><a href="#[105]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;pow
 <LI><a href="#[104]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;data_package_translate_to_int
 <LI><a href="#[70]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_dsub
 <LI><a href="#[dc]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__kernel_poly
 <LI><a href="#[df]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__mathlib_dbl_infnan2
+<LI><a href="#[e4]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_fp_digits
 </UL>
 
 <P><STRONG><a name="[70]"></a>__aeabi_dsub</STRONG> (Thumb, 6 bytes, Stack size 0 bytes, dadd.o(.text))
@@ -533,11 +533,11 @@ Global Symbols
 </UL>
 <BR>[Calls]<UL><LI><a href="#[6e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_double_epilogue
 </UL>
-<BR>[Called By]<UL><LI><a href="#[5e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_fp_value
-<LI><a href="#[e4]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_fp_digits
-<LI><a href="#[105]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;pow
+<BR>[Called By]<UL><LI><a href="#[105]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;pow
 <LI><a href="#[104]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;data_package_translate_to_int
 <LI><a href="#[dc]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__kernel_poly
+<LI><a href="#[5e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_fp_value
+<LI><a href="#[e4]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_fp_digits
 </UL>
 
 <P><STRONG><a name="[61]"></a>__aeabi_ddiv</STRONG> (Thumb, 222 bytes, Stack size 32 bytes, ddiv.o(.text))
@@ -547,12 +547,12 @@ Global Symbols
 </UL>
 <BR>[Called By]<UL><LI><a href="#[a4]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;parseMQTTData
 <LI><a href="#[a1]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;modbusRead
-<LI><a href="#[5e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_fp_value
-<LI><a href="#[e4]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_fp_digits
 <LI><a href="#[105]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;pow
 <LI><a href="#[107]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;dlt645_data_parse_by_format_to_float
 <LI><a href="#[e0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__mathlib_dbl_invalid
 <LI><a href="#[de]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__mathlib_dbl_divzero
+<LI><a href="#[5e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_fp_value
+<LI><a href="#[e4]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_fp_digits
 </UL>
 
 <P><STRONG><a name="[72]"></a>__aeabi_ui2f</STRONG> (Thumb, 10 bytes, Stack size 0 bytes, ffltui.o(.text))
@@ -611,9 +611,9 @@ Global Symbols
 </UL>
 
 <P><STRONG><a name="[e5]"></a>__aeabi_cdrcmple</STRONG> (Thumb, 48 bytes, Stack size 0 bytes, cdrcmple.o(.text))
-<BR><BR>[Called By]<UL><LI><a href="#[e4]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_fp_digits
-<LI><a href="#[105]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;pow
+<BR><BR>[Called By]<UL><LI><a href="#[105]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;pow
 <LI><a href="#[14a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;parse_number
+<LI><a href="#[e4]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_fp_digits
 </UL>
 
 <P><STRONG><a name="[64]"></a>__aeabi_d2f</STRONG> (Thumb, 56 bytes, Stack size 8 bytes, d2f.o(.text))
@@ -623,8 +623,8 @@ Global Symbols
 </UL>
 <BR>[Called By]<UL><LI><a href="#[a4]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;parseMQTTData
 <LI><a href="#[a1]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;modbusRead
-<LI><a href="#[62]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_scanf_really_real
 <LI><a href="#[107]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;dlt645_data_parse_by_format_to_float
+<LI><a href="#[62]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_scanf_really_real
 </UL>
 
 <P><STRONG><a name="[172]"></a>__aeabi_uidiv</STRONG> (Thumb, 0 bytes, Stack size 12 bytes, uidiv.o(.text), UNUSED)
@@ -642,20 +642,20 @@ Global Symbols
 </UL>
 
 <P><STRONG><a name="[6c]"></a>__aeabi_llsl</STRONG> (Thumb, 30 bytes, Stack size 0 bytes, llshl.o(.text))
-<BR><BR>[Called By]<UL><LI><a href="#[6e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_double_epilogue
-<LI><a href="#[7d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_d2ulz
-<LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_dadd
+<BR><BR>[Called By]<UL><LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_dadd
 <LI><a href="#[78]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_uldivmod
+<LI><a href="#[6e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_double_epilogue
+<LI><a href="#[7d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_d2ulz
 </UL>
 
 <P><STRONG><a name="[173]"></a>_ll_shift_l</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, llshl.o(.text), UNUSED)
 
 <P><STRONG><a name="[77]"></a>__aeabi_llsr</STRONG> (Thumb, 32 bytes, Stack size 0 bytes, llushr.o(.text))
-<BR><BR>[Called By]<UL><LI><a href="#[6e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_double_epilogue
-<LI><a href="#[7d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_d2ulz
-<LI><a href="#[76]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_d2iz
+<BR><BR>[Called By]<UL><LI><a href="#[76]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_d2iz
 <LI><a href="#[78]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_uldivmod
 <LI><a href="#[80]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_dsqrt
+<LI><a href="#[6e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_double_epilogue
+<LI><a href="#[7d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_d2ulz
 </UL>
 
 <P><STRONG><a name="[174]"></a>_ll_ushift_r</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, llushr.o(.text), UNUSED)
@@ -667,8 +667,8 @@ Global Symbols
 <P><STRONG><a name="[175]"></a>_ll_sshift_r</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, llsshr.o(.text), UNUSED)
 
 <P><STRONG><a name="[66]"></a>__rt_ctype_table</STRONG> (Thumb, 4 bytes, Stack size 0 bytes, ctype_o.o(.text))
-<BR><BR>[Called By]<UL><LI><a href="#[65]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;strtol
-<LI><a href="#[4c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;isspace
+<BR><BR>[Called By]<UL><LI><a href="#[4c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;isspace
+<LI><a href="#[65]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;strtol
 </UL>
 
 <P><STRONG><a name="[4c]"></a>isspace</STRONG> (Thumb, 18 bytes, Stack size 8 bytes, isspace_o.o(.text))
@@ -676,12 +676,12 @@ Global Symbols
 </UL>
 <BR>[Calls]<UL><LI><a href="#[66]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__rt_ctype_table
 </UL>
-<BR>[Address Reference Count : 2]<UL><LI> scanf_char.o(.text)
-<LI> strtod.o(.text)
+<BR>[Address Reference Count : 2]<UL><LI> strtod.o(.text)
+<LI> scanf_char.o(.text)
 </UL>
 <P><STRONG><a name="[5d]"></a>_chval</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, _chval.o(.text))
-<BR><BR>[Called By]<UL><LI><a href="#[5c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_scanf_int
-<LI><a href="#[67]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_strtoul
+<BR><BR>[Called By]<UL><LI><a href="#[67]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_strtoul
+<LI><a href="#[5c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_scanf_int
 </UL>
 
 <P><STRONG><a name="[5b]"></a>__vfscanf_char</STRONG> (Thumb, 20 bytes, Stack size 0 bytes, scanf_char.o(.text))
@@ -734,23 +734,23 @@ Global Symbols
 <BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = _double_round
 </UL>
 <BR>[Called By]<UL><LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_ddiv
-<LI><a href="#[6e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_double_epilogue
 <LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_dadd
 <LI><a href="#[80]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_dsqrt
+<LI><a href="#[6e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_double_epilogue
 </UL>
 
 <P><STRONG><a name="[6e]"></a>_double_epilogue</STRONG> (Thumb, 156 bytes, Stack size 32 bytes, depilogue.o(.text))
 <BR><BR>[Stack]<UL><LI>Max Depth = 40<LI>Call Chain = _double_epilogue &rArr; _double_round
 </UL>
-<BR>[Calls]<UL><LI><a href="#[6f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_double_round
-<LI><a href="#[77]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_llsr
+<BR>[Calls]<UL><LI><a href="#[77]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_llsr
 <LI><a href="#[6c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_llsl
+<LI><a href="#[6f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_double_round
 </UL>
 <BR>[Called By]<UL><LI><a href="#[75]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_ui2d
-<LI><a href="#[5f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_ul2d
 <LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_dadd
 <LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_i2d
 <LI><a href="#[60]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_dmul
+<LI><a href="#[5f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_ul2d
 </UL>
 
 <P><STRONG><a name="[e2]"></a>__ARM_scalbn</STRONG> (Thumb, 46 bytes, Stack size 16 bytes, dscalb.o(.text))
@@ -797,8 +797,8 @@ Global Symbols
 <P><STRONG><a name="[80]"></a>_dsqrt</STRONG> (Thumb, 162 bytes, Stack size 32 bytes, dsqrt.o(.text))
 <BR><BR>[Stack]<UL><LI>Max Depth = 40<LI>Call Chain = _dsqrt &rArr; _double_round
 </UL>
-<BR>[Calls]<UL><LI><a href="#[6f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_double_round
-<LI><a href="#[77]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_llsr
+<BR>[Calls]<UL><LI><a href="#[77]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_llsr
+<LI><a href="#[6f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_double_round
 </UL>
 <BR>[Called By]<UL><LI><a href="#[153]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;sqrt
 </UL>
@@ -822,8 +822,8 @@ Global Symbols
 </UL>
 <BR>[Calls]<UL><LI><a href="#[84]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;WaitResponse
 <LI><a href="#[83]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EC800MSendCmd
-<LI><a href="#[85]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2sprintf
 <LI><a href="#[86]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;strlen
+<LI><a href="#[85]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2sprintf
 </UL>
 <BR>[Called By]<UL><LI><a href="#[46]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
 </UL>
@@ -844,8 +844,8 @@ Global Symbols
 <BR>[Calls]<UL><LI><a href="#[84]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;WaitResponse
 <LI><a href="#[83]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EC800MSendCmd
 <LI><a href="#[89]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;delay_1ms
-<LI><a href="#[85]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2sprintf
 <LI><a href="#[86]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;strlen
+<LI><a href="#[85]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2sprintf
 </UL>
 <BR>[Called By]<UL><LI><a href="#[131]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;http_load_config
 </UL>
@@ -931,11 +931,11 @@ Global Symbols
 <LI><a href="#[84]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;WaitResponse
 <LI><a href="#[83]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EC800MSendCmd
 <LI><a href="#[89]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;delay_1ms
+<LI><a href="#[86]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;strlen
+<LI><a href="#[57]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_memclr
 <LI><a href="#[50]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;malloc
 <LI><a href="#[51]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;free
 <LI><a href="#[85]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2sprintf
-<LI><a href="#[86]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;strlen
-<LI><a href="#[57]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_memclr
 </UL>
 <BR>[Called By]<UL><LI><a href="#[a0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MQTT_Alarm_clock
 </UL>
@@ -945,8 +945,8 @@ Global Symbols
 </UL>
 <BR>[Calls]<UL><LI><a href="#[84]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;WaitResponse
 <LI><a href="#[83]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EC800MSendCmd
-<LI><a href="#[85]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2sprintf
 <LI><a href="#[86]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;strlen
+<LI><a href="#[85]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2sprintf
 </UL>
 <BR>[Called By]<UL><LI><a href="#[46]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
 </UL>
@@ -1284,8 +1284,8 @@ Global Symbols
 </UL>
 
 <P><STRONG><a name="[68]"></a>__aeabi_errno_addr</STRONG> (Thumb, 4 bytes, Stack size 0 bytes, errno.o(i.__aeabi_errno_addr))
-<BR><BR>[Called By]<UL><LI><a href="#[65]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;strtol
-<LI><a href="#[67]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_strtoul
+<BR><BR>[Called By]<UL><LI><a href="#[67]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_strtoul
+<LI><a href="#[65]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;strtol
 </UL>
 
 <P><STRONG><a name="[182]"></a>__rt_errno_addr</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, errno.o(i.__aeabi_errno_addr), UNUSED)
@@ -2042,7 +2042,7 @@ Global Symbols
 <BR>[Called By]<UL><LI><a href="#[46]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
 </UL>
 
-<P><STRONG><a name="[46]"></a>main</STRONG> (Thumb, 426 bytes, Stack size 16 bytes, main.o(i.main))
+<P><STRONG><a name="[46]"></a>main</STRONG> (Thumb, 436 bytes, Stack size 16 bytes, main.o(i.main))
 <BR><BR>[Stack]<UL><LI>Max Depth = 41112<LI>Call Chain = main &rArr; http_load_config &rArr; WaitForUpData &rArr; processHTTPjson &rArr; save_config_params &rArr; write_struct_to_flash &rArr; W25Q32_PageWrite &rArr; W25Q32_Enable &rArr; W25Q32_WaitBusy &rArr; SPI0_ReadWriteByte
 </UL>
 <BR>[Calls]<UL><LI><a href="#[132]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;load_config_params
@@ -2073,11 +2073,11 @@ Global Symbols
 <LI><a href="#[120]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;fwdgt_init
 <LI><a href="#[a0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MQTT_Alarm_clock
 <LI><a href="#[13a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;mmodbus_init
+<LI><a href="#[a8]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;strcpy
+<LI><a href="#[57]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_memclr
 <LI><a href="#[50]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;malloc
 <LI><a href="#[51]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;free
 <LI><a href="#[85]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2sprintf
-<LI><a href="#[a8]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;strcpy
-<LI><a href="#[57]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_memclr
 </UL>
 <BR>[Address Reference Count : 1]<UL><LI> entry9a.o(.ARM.Collect$$$$0000000B)
 </UL>
@@ -2217,9 +2217,9 @@ Global Symbols
 <LI><a href="#[64]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_d2f
 <LI><a href="#[9e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_f2d
 <LI><a href="#[89]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;delay_1ms
+<LI><a href="#[105]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;pow
 <LI><a href="#[50]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;malloc
 <LI><a href="#[51]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;free
-<LI><a href="#[105]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;pow
 </UL>
 <BR>[Called By]<UL><LI><a href="#[a0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MQTT_Alarm_clock
 </UL>
@@ -2254,9 +2254,9 @@ Global Symbols
 <P><STRONG><a name="[145]"></a>parseIntField</STRONG> (Thumb, 42 bytes, Stack size 24 bytes, parsedevicemessage.o(i.parseIntField))
 <BR><BR>[Stack]<UL><LI>Max Depth = 96<LI>Call Chain = parseIntField &rArr; strtol &rArr; _strtoul
 </UL>
-<BR>[Calls]<UL><LI><a href="#[65]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;strtol
-<LI><a href="#[86]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;strlen
+<BR>[Calls]<UL><LI><a href="#[86]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;strlen
 <LI><a href="#[ab]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;strstr
+<LI><a href="#[65]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;strtol
 </UL>
 <BR>[Called By]<UL><LI><a href="#[d7]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;processHttp
 </UL>
@@ -2284,13 +2284,13 @@ Global Symbols
 <LI><a href="#[84]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;WaitResponse
 <LI><a href="#[83]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EC800MSendCmd
 <LI><a href="#[9a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;LogPrint
-<LI><a href="#[50]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;malloc
-<LI><a href="#[51]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;free
-<LI><a href="#[85]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2sprintf
 <LI><a href="#[a8]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;strcpy
 <LI><a href="#[130]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;strcmp
 <LI><a href="#[86]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;strlen
 <LI><a href="#[105]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;pow
+<LI><a href="#[50]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;malloc
+<LI><a href="#[51]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;free
+<LI><a href="#[85]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2sprintf
 </UL>
 <BR>[Called By]<UL><LI><a href="#[a0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MQTT_Alarm_clock
 </UL>
@@ -2298,9 +2298,9 @@ Global Symbols
 <P><STRONG><a name="[148]"></a>parseStringField</STRONG> (Thumb, 44 bytes, Stack size 24 bytes, parsedevicemessage.o(i.parseStringField))
 <BR><BR>[Stack]<UL><LI>Max Depth = 288<LI>Call Chain = parseStringField &rArr; __0sscanf &rArr; __vfscanf_char &rArr; __vfscanf &rArr; _scanf_real
 </UL>
-<BR>[Calls]<UL><LI><a href="#[5a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__0sscanf
-<LI><a href="#[86]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;strlen
+<BR>[Calls]<UL><LI><a href="#[86]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;strlen
 <LI><a href="#[ab]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;strstr
+<LI><a href="#[5a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__0sscanf
 </UL>
 <BR>[Called By]<UL><LI><a href="#[d7]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;processHttp
 </UL>
@@ -2343,8 +2343,8 @@ Global Symbols
 <LI><a href="#[146]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;processStringData
 <LI><a href="#[147]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;processIntData
 <LI><a href="#[158]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;save_config_params
-<LI><a href="#[5a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__0sscanf
 <LI><a href="#[a8]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;strcpy
+<LI><a href="#[5a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__0sscanf
 </UL>
 <BR>[Called By]<UL><LI><a href="#[d1]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;WaitForUpData
 </UL>
@@ -2355,11 +2355,11 @@ Global Symbols
 <BR>[Calls]<UL><LI><a href="#[148]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;parseStringField
 <LI><a href="#[145]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;parseIntField
 <LI><a href="#[158]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;save_config_params
+<LI><a href="#[11f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;strchr
+<LI><a href="#[ab]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;strstr
 <LI><a href="#[5a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__0sscanf
 <LI><a href="#[50]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;malloc
 <LI><a href="#[51]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;free
-<LI><a href="#[11f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;strchr
-<LI><a href="#[ab]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;strstr
 </UL>
 <BR>[Called By]<UL><LI><a href="#[d1]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;WaitForUpData
 </UL>
@@ -2424,11 +2424,11 @@ Global Symbols
 <BR>[Calls]<UL><LI><a href="#[137]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;get_config_params
 <LI><a href="#[126]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;gd_com_232_send
 <LI><a href="#[13c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;mmodbus_crc16
-<LI><a href="#[50]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;malloc
-<LI><a href="#[51]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;free
 <LI><a href="#[86]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;strlen
 <LI><a href="#[57]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_memclr
 <LI><a href="#[113]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_memcpy
+<LI><a href="#[50]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;malloc
+<LI><a href="#[51]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;free
 </UL>
 <BR>[Called By]<UL><LI><a href="#[31]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART2_IRQHandler
 </UL>
@@ -2452,14 +2452,14 @@ Global Symbols
 <LI><a href="#[15c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_f2iz
 <LI><a href="#[d0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;WaitField
 <LI><a href="#[13c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;mmodbus_crc16
-<LI><a href="#[5a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__0sscanf
-<LI><a href="#[50]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;malloc
-<LI><a href="#[51]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;free
-<LI><a href="#[85]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2sprintf
 <LI><a href="#[86]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;strlen
 <LI><a href="#[ab]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;strstr
 <LI><a href="#[ef]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_memclr4
 <LI><a href="#[57]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_memclr
+<LI><a href="#[5a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__0sscanf
+<LI><a href="#[50]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;malloc
+<LI><a href="#[51]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;free
+<LI><a href="#[85]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2sprintf
 </UL>
 <BR>[Called By]<UL><LI><a href="#[31]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART2_IRQHandler
 </UL>
@@ -2470,11 +2470,11 @@ Global Symbols
 <BR>[Calls]<UL><LI><a href="#[137]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;get_config_params
 <LI><a href="#[126]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;gd_com_232_send
 <LI><a href="#[13c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;mmodbus_crc16
+<LI><a href="#[86]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;strlen
+<LI><a href="#[57]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_memclr
 <LI><a href="#[50]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;malloc
 <LI><a href="#[51]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;free
 <LI><a href="#[85]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2sprintf
-<LI><a href="#[86]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;strlen
-<LI><a href="#[57]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_memclr
 </UL>
 <BR>[Called By]<UL><LI><a href="#[31]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;USART2_IRQHandler
 </UL>
@@ -2580,6 +2580,7 @@ Global Symbols
 </UL>
 <BR>[Called By]<UL><LI><a href="#[a1]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;modbusRead
 <LI><a href="#[a2]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;dlt645_read
+<LI><a href="#[f7]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;xmodem
 <LI><a href="#[a0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MQTT_Alarm_clock
 </UL>
 
@@ -2723,10 +2724,11 @@ Global Symbols
 <BR>[Called By]<UL><LI><a href="#[158]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;save_config_params
 </UL>
 
-<P><STRONG><a name="[f7]"></a>xmodem</STRONG> (Thumb, 476 bytes, Stack size 32 bytes, otaevent.o(i.xmodem))
+<P><STRONG><a name="[f7]"></a>xmodem</STRONG> (Thumb, 460 bytes, Stack size 32 bytes, otaevent.o(i.xmodem))
 <BR><BR>[Stack]<UL><LI>Max Depth = 72<LI>Call Chain = xmodem &rArr; W25Q32_PageWrite &rArr; W25Q32_Enable &rArr; W25Q32_WaitBusy &rArr; SPI0_ReadWriteByte
 </UL>
-<BR>[Calls]<UL><LI><a href="#[ce]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_PageWrite
+<BR>[Calls]<UL><LI><a href="#[a6]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;task_fwdgt_reload
+<LI><a href="#[ce]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_PageWrite
 <LI><a href="#[cc]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_Erase64K
 <LI><a href="#[92]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;usart_data_transmit
 <LI><a href="#[112]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;gettick
@@ -2768,9 +2770,9 @@ Local Symbols
 <P><STRONG><a name="[d2]"></a>extract_data_from_buffer</STRONG> (Thumb, 78 bytes, Stack size 32 bytes, parsedevicemessage.o(i.extract_data_from_buffer))
 <BR><BR>[Stack]<UL><LI>Max Depth = 296<LI>Call Chain = extract_data_from_buffer &rArr; __0sscanf &rArr; __vfscanf_char &rArr; __vfscanf &rArr; _scanf_real
 </UL>
-<BR>[Calls]<UL><LI><a href="#[5a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__0sscanf
-<LI><a href="#[11f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;strchr
+<BR>[Calls]<UL><LI><a href="#[11f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;strchr
 <LI><a href="#[ab]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;strstr
+<LI><a href="#[5a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__0sscanf
 </UL>
 <BR>[Called By]<UL><LI><a href="#[d1]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;WaitForUpData
 </UL>
@@ -2940,21 +2942,21 @@ Local Symbols
 
 <P><STRONG><a name="[e4]"></a>_fp_digits</STRONG> (Thumb, 366 bytes, Stack size 64 bytes, printfa.o(i._fp_digits), UNUSED)
 <BR><BR>[Calls]<UL><LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_ddiv
-<LI><a href="#[7d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_d2ulz
 <LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_dadd
 <LI><a href="#[60]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_dmul
 <LI><a href="#[e5]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_cdrcmple
 <LI><a href="#[78]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_uldivmod
+<LI><a href="#[7d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_d2ulz
 </UL>
 <BR>[Called By]<UL><LI><a href="#[d9]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_printf_core
 </UL>
 
 <P><STRONG><a name="[d9]"></a>_printf_core</STRONG> (Thumb, 1744 bytes, Stack size 136 bytes, printfa.o(i._printf_core), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[e6]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_printf_pre_padding
+<BR><BR>[Calls]<UL><LI><a href="#[78]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_uldivmod
+<LI><a href="#[e8]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_uidivmod
+<LI><a href="#[e6]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_printf_pre_padding
 <LI><a href="#[e7]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_printf_post_padding
 <LI><a href="#[e4]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_fp_digits
-<LI><a href="#[78]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_uldivmod
-<LI><a href="#[e8]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_uidivmod
 </UL>
 <BR>[Called By]<UL><LI><a href="#[db]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__0vsnprintf
 <LI><a href="#[da]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__0sprintf
@@ -2988,8 +2990,8 @@ Local Symbols
 
 <P><STRONG><a name="[5e]"></a>_fp_value</STRONG> (Thumb, 296 bytes, Stack size 64 bytes, scanf_fp.o(.text), UNUSED)
 <BR><BR>[Calls]<UL><LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_ddiv
-<LI><a href="#[5f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_ul2d
 <LI><a href="#[60]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_dmul
+<LI><a href="#[5f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_ul2d
 </UL>
 <BR>[Called By]<UL><LI><a href="#[62]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_scanf_really_real
 </UL>

+ 5 - 0
app/Proj/Objects/Ringzle.lnp

@@ -41,6 +41,11 @@
 ".\objects\ring_buffer.o"
 ".\objects\w25q32.o"
 ".\objects\key.o"
+".\objects\dhcp.o"
+".\objects\dns.o"
+".\objects\socket.o"
+".\objects\w5500.o"
+".\objects\wizchip_conf.o"
 ".\objects\cjson.o"
 ".\objects\dlt645.o"
 ".\objects\dlt645_2007.o"

文件差異過大導致無法顯示
+ 130 - 6
app/Proj/Objects/Ringzle_GD32F103C8T6.dep


+ 7 - 0
app/Proj/Objects/dhcp.d

@@ -0,0 +1,7 @@
+.\objects\dhcp.o: ..\internet\W5500\dhcp.c
+.\objects\dhcp.o: ..\internet\W5500\socket.h
+.\objects\dhcp.o: ..\internet\W5500\wizchip_conf.h
+.\objects\dhcp.o: D:\workSoftware\stm32Software\mdk\mdkcore\ARM\ARMCC\Bin\..\include\stdint.h
+.\objects\dhcp.o: ..\internet\W5500\w5500.h
+.\objects\dhcp.o: ..\internet\W5500\wizchip_conf.h
+.\objects\dhcp.o: ..\internet\W5500\dhcp.h

+ 9 - 0
app/Proj/Objects/dns.d

@@ -0,0 +1,9 @@
+.\objects\dns.o: ..\internet\W5500\dns.c
+.\objects\dns.o: D:\workSoftware\stm32Software\mdk\mdkcore\ARM\ARMCC\Bin\..\include\string.h
+.\objects\dns.o: D:\workSoftware\stm32Software\mdk\mdkcore\ARM\ARMCC\Bin\..\include\stdlib.h
+.\objects\dns.o: ..\internet\W5500\socket.h
+.\objects\dns.o: ..\internet\W5500\wizchip_conf.h
+.\objects\dns.o: D:\workSoftware\stm32Software\mdk\mdkcore\ARM\ARMCC\Bin\..\include\stdint.h
+.\objects\dns.o: ..\internet\W5500\w5500.h
+.\objects\dns.o: ..\internet\W5500\wizchip_conf.h
+.\objects\dns.o: ..\internet\W5500\dns.h

二進制
app/Proj/Objects/ec800m.crf


二進制
app/Proj/Objects/main.crf


二進制
app/Proj/Objects/otaevent.crf


+ 1 - 0
app/Proj/Objects/otaevent.d

@@ -35,3 +35,4 @@
 .\objects\otaevent.o: ..\Firmware\Include\gd32f10x_misc.h
 .\objects\otaevent.o: ..\App\systick.h
 .\objects\otaevent.o: ..\bsp\w25q32.h
+.\objects\otaevent.o: ..\App\main.h

二進制
app/Proj/Objects/pc.crf


+ 39 - 0
app/Proj/Objects/socket.d

@@ -0,0 +1,39 @@
+.\objects\socket.o: ..\internet\W5500\socket.c
+.\objects\socket.o: ..\App\main.h
+.\objects\socket.o: D:\workSoftware\stm32Software\mdk\mdkcore\ARM\ARMCC\Bin\..\include\stdint.h
+.\objects\socket.o: ..\bsp\usart.h
+.\objects\socket.o: ..\CMSIS\gd32f10x.h
+.\objects\socket.o: ..\CMSIS\core_cm3.h
+.\objects\socket.o: ..\CMSIS\core_cmInstr.h
+.\objects\socket.o: ..\CMSIS\core_cmFunc.h
+.\objects\socket.o: ..\CMSIS\system_gd32f10x.h
+.\objects\socket.o: ..\CMSIS\gd32f10x_libopt.h
+.\objects\socket.o: ..\Firmware\Include\gd32f10x_fmc.h
+.\objects\socket.o: ..\CMSIS\gd32f10x.h
+.\objects\socket.o: ..\Firmware\Include\gd32f10x_pmu.h
+.\objects\socket.o: ..\Firmware\Include\gd32f10x_bkp.h
+.\objects\socket.o: ..\Firmware\Include\gd32f10x_rcu.h
+.\objects\socket.o: ..\Firmware\Include\gd32f10x_exti.h
+.\objects\socket.o: ..\Firmware\Include\gd32f10x_gpio.h
+.\objects\socket.o: ..\Firmware\Include\gd32f10x_crc.h
+.\objects\socket.o: ..\Firmware\Include\gd32f10x_dma.h
+.\objects\socket.o: ..\Firmware\Include\gd32f10x_dbg.h
+.\objects\socket.o: ..\Firmware\Include\gd32f10x_adc.h
+.\objects\socket.o: ..\Firmware\Include\gd32f10x_dac.h
+.\objects\socket.o: ..\Firmware\Include\gd32f10x_fwdgt.h
+.\objects\socket.o: ..\Firmware\Include\gd32f10x_wwdgt.h
+.\objects\socket.o: ..\Firmware\Include\gd32f10x_rtc.h
+.\objects\socket.o: ..\Firmware\Include\gd32f10x_timer.h
+.\objects\socket.o: ..\Firmware\Include\gd32f10x_usart.h
+.\objects\socket.o: ..\Firmware\Include\gd32f10x_i2c.h
+.\objects\socket.o: ..\Firmware\Include\gd32f10x_spi.h
+.\objects\socket.o: ..\Firmware\Include\gd32f10x_sdio.h
+.\objects\socket.o: ..\Firmware\Include\gd32f10x_exmc.h
+.\objects\socket.o: ..\Firmware\Include\gd32f10x_can.h
+.\objects\socket.o: ..\Firmware\Include\gd32f10x_enet.h
+.\objects\socket.o: D:\workSoftware\stm32Software\mdk\mdkcore\ARM\ARMCC\Bin\..\include\stdlib.h
+.\objects\socket.o: ..\Firmware\Include\gd32f10x_misc.h
+.\objects\socket.o: ..\internet\W5500\socket.h
+.\objects\socket.o: ..\internet\W5500\wizchip_conf.h
+.\objects\socket.o: ..\internet\W5500\w5500.h
+.\objects\socket.o: ..\internet\W5500\wizchip_conf.h

+ 38 - 0
app/Proj/Objects/w5500.d

@@ -0,0 +1,38 @@
+.\objects\w5500.o: ..\internet\W5500\w5500.c
+.\objects\w5500.o: ..\App\main.h
+.\objects\w5500.o: D:\workSoftware\stm32Software\mdk\mdkcore\ARM\ARMCC\Bin\..\include\stdint.h
+.\objects\w5500.o: ..\internet\W5500\w5500.h
+.\objects\w5500.o: ..\internet\W5500\wizchip_conf.h
+.\objects\w5500.o: ..\internet\W5500\w5500.h
+.\objects\w5500.o: D:\workSoftware\stm32Software\mdk\mdkcore\ARM\ARMCC\Bin\..\include\stdio.h
+.\objects\w5500.o: ..\CMSIS\gd32f10x.h
+.\objects\w5500.o: ..\CMSIS\core_cm3.h
+.\objects\w5500.o: ..\CMSIS\core_cmInstr.h
+.\objects\w5500.o: ..\CMSIS\core_cmFunc.h
+.\objects\w5500.o: ..\CMSIS\system_gd32f10x.h
+.\objects\w5500.o: ..\CMSIS\gd32f10x_libopt.h
+.\objects\w5500.o: ..\Firmware\Include\gd32f10x_fmc.h
+.\objects\w5500.o: ..\CMSIS\gd32f10x.h
+.\objects\w5500.o: ..\Firmware\Include\gd32f10x_pmu.h
+.\objects\w5500.o: ..\Firmware\Include\gd32f10x_bkp.h
+.\objects\w5500.o: ..\Firmware\Include\gd32f10x_rcu.h
+.\objects\w5500.o: ..\Firmware\Include\gd32f10x_exti.h
+.\objects\w5500.o: ..\Firmware\Include\gd32f10x_gpio.h
+.\objects\w5500.o: ..\Firmware\Include\gd32f10x_crc.h
+.\objects\w5500.o: ..\Firmware\Include\gd32f10x_dma.h
+.\objects\w5500.o: ..\Firmware\Include\gd32f10x_dbg.h
+.\objects\w5500.o: ..\Firmware\Include\gd32f10x_adc.h
+.\objects\w5500.o: ..\Firmware\Include\gd32f10x_dac.h
+.\objects\w5500.o: ..\Firmware\Include\gd32f10x_fwdgt.h
+.\objects\w5500.o: ..\Firmware\Include\gd32f10x_wwdgt.h
+.\objects\w5500.o: ..\Firmware\Include\gd32f10x_rtc.h
+.\objects\w5500.o: ..\Firmware\Include\gd32f10x_timer.h
+.\objects\w5500.o: ..\Firmware\Include\gd32f10x_usart.h
+.\objects\w5500.o: ..\Firmware\Include\gd32f10x_i2c.h
+.\objects\w5500.o: ..\Firmware\Include\gd32f10x_spi.h
+.\objects\w5500.o: ..\Firmware\Include\gd32f10x_sdio.h
+.\objects\w5500.o: ..\Firmware\Include\gd32f10x_exmc.h
+.\objects\w5500.o: ..\Firmware\Include\gd32f10x_can.h
+.\objects\w5500.o: ..\Firmware\Include\gd32f10x_enet.h
+.\objects\w5500.o: D:\workSoftware\stm32Software\mdk\mdkcore\ARM\ARMCC\Bin\..\include\stdlib.h
+.\objects\w5500.o: ..\Firmware\Include\gd32f10x_misc.h

+ 38 - 0
app/Proj/Objects/wizchip_conf.d

@@ -0,0 +1,38 @@
+.\objects\wizchip_conf.o: ..\internet\W5500\wizchip_conf.c
+.\objects\wizchip_conf.o: D:\workSoftware\stm32Software\mdk\mdkcore\ARM\ARMCC\Bin\..\include\stddef.h
+.\objects\wizchip_conf.o: ..\bsp\usart.h
+.\objects\wizchip_conf.o: ..\CMSIS\gd32f10x.h
+.\objects\wizchip_conf.o: ..\CMSIS\core_cm3.h
+.\objects\wizchip_conf.o: D:\workSoftware\stm32Software\mdk\mdkcore\ARM\ARMCC\Bin\..\include\stdint.h
+.\objects\wizchip_conf.o: ..\CMSIS\core_cmInstr.h
+.\objects\wizchip_conf.o: ..\CMSIS\core_cmFunc.h
+.\objects\wizchip_conf.o: ..\CMSIS\system_gd32f10x.h
+.\objects\wizchip_conf.o: ..\CMSIS\gd32f10x_libopt.h
+.\objects\wizchip_conf.o: ..\Firmware\Include\gd32f10x_fmc.h
+.\objects\wizchip_conf.o: ..\CMSIS\gd32f10x.h
+.\objects\wizchip_conf.o: ..\Firmware\Include\gd32f10x_pmu.h
+.\objects\wizchip_conf.o: ..\Firmware\Include\gd32f10x_bkp.h
+.\objects\wizchip_conf.o: ..\Firmware\Include\gd32f10x_rcu.h
+.\objects\wizchip_conf.o: ..\Firmware\Include\gd32f10x_exti.h
+.\objects\wizchip_conf.o: ..\Firmware\Include\gd32f10x_gpio.h
+.\objects\wizchip_conf.o: ..\Firmware\Include\gd32f10x_crc.h
+.\objects\wizchip_conf.o: ..\Firmware\Include\gd32f10x_dma.h
+.\objects\wizchip_conf.o: ..\Firmware\Include\gd32f10x_dbg.h
+.\objects\wizchip_conf.o: ..\Firmware\Include\gd32f10x_adc.h
+.\objects\wizchip_conf.o: ..\Firmware\Include\gd32f10x_dac.h
+.\objects\wizchip_conf.o: ..\Firmware\Include\gd32f10x_fwdgt.h
+.\objects\wizchip_conf.o: ..\Firmware\Include\gd32f10x_wwdgt.h
+.\objects\wizchip_conf.o: ..\Firmware\Include\gd32f10x_rtc.h
+.\objects\wizchip_conf.o: ..\Firmware\Include\gd32f10x_timer.h
+.\objects\wizchip_conf.o: ..\Firmware\Include\gd32f10x_usart.h
+.\objects\wizchip_conf.o: ..\Firmware\Include\gd32f10x_i2c.h
+.\objects\wizchip_conf.o: ..\Firmware\Include\gd32f10x_spi.h
+.\objects\wizchip_conf.o: ..\Firmware\Include\gd32f10x_sdio.h
+.\objects\wizchip_conf.o: ..\Firmware\Include\gd32f10x_exmc.h
+.\objects\wizchip_conf.o: ..\Firmware\Include\gd32f10x_can.h
+.\objects\wizchip_conf.o: ..\Firmware\Include\gd32f10x_enet.h
+.\objects\wizchip_conf.o: D:\workSoftware\stm32Software\mdk\mdkcore\ARM\ARMCC\Bin\..\include\stdlib.h
+.\objects\wizchip_conf.o: ..\Firmware\Include\gd32f10x_misc.h
+.\objects\wizchip_conf.o: ..\internet\W5500\wizchip_conf.h
+.\objects\wizchip_conf.o: ..\internet\W5500\w5500.h
+.\objects\wizchip_conf.o: ..\internet\W5500\wizchip_conf.h

文件差異過大導致無法顯示
+ 102 - 93
app/Proj/Ringzle.uvguix.16936


+ 7 - 15
app/Proj/Ringzle.uvoptx

@@ -157,36 +157,28 @@
         <Bp>
           <Number>0</Number>
           <Type>0</Type>
-          <LineNumber>178</LineNumber>
+          <LineNumber>183</LineNumber>
           <EnabledFlag>1</EnabledFlag>
-          <Address>134246720</Address>
+          <Address>0</Address>
           <ByteObject>0</ByteObject>
           <HtxType>0</HtxType>
           <ManyObjects>0</ManyObjects>
           <SizeOfObject>0</SizeOfObject>
           <BreakByAccess>0</BreakByAccess>
-          <BreakIfRCount>1</BreakIfRCount>
-          <Filename>..\App\main.c</Filename>
+          <BreakIfRCount>0</BreakIfRCount>
+          <Filename>..\App\PC.c</Filename>
           <ExecCommand></ExecCommand>
-          <Expression>\\Ringzle\../App/main.c\178</Expression>
+          <Expression></Expression>
         </Bp>
       </Breakpoint>
       <MemoryWindow1>
         <Mm>
           <WinNumber>1</WinNumber>
           <SubType>8</SubType>
-          <ItemText>payload_out</ItemText>
+          <ItemText>gateway</ItemText>
           <AccSizeX>0</AccSizeX>
         </Mm>
       </MemoryWindow1>
-      <MemoryWindow4>
-        <Mm>
-          <WinNumber>4</WinNumber>
-          <SubType>8</SubType>
-          <ItemText>UART0_RX_BUF</ItemText>
-          <AccSizeX>0</AccSizeX>
-        </Mm>
-      </MemoryWindow4>
       <Tracepoint>
         <THDelay>0</THDelay>
       </Tracepoint>
@@ -798,7 +790,7 @@
 
   <Group>
     <GroupName>dlt</GroupName>
-    <tvExp>0</tvExp>
+    <tvExp>1</tvExp>
     <tvExpOptDlg>0</tvExpOptDlg>
     <cbSel>0</cbSel>
     <RteFlg>0</RteFlg>

+ 1 - 0
bootloader/HW/Source/boot.c

@@ -16,6 +16,7 @@ void BootLoader_Brance(uint32_t app_byte)
 	GD32_EraseFlash(GD32_A_START_PAGE,GD32_A_PAGE_NUM);//擦除A区原有程序
 	for(uint8_t i=0;i<app_byte/1024;i++)
 	{
+		task_fwdgt_reload();
 		uint8_t app_programmer[1024];
 		memset(app_programmer,0,1024);
 		uint32_t addr=APP_PROGRAMMER_BLOCK*64*1024+i*1024;   //其在w25q32中的地址

二進制
bootloader/OBJ/boot.crf


+ 1 - 0
bootloader/OBJ/boot.d

@@ -9,6 +9,7 @@
 ..\obj\boot.o: ..\USER\RTE_Components.h
 ..\obj\boot.o: ..\LIB\Include\gd32f10x_fmc.h
 ..\obj\boot.o: ..\CMSIS\Include\gd32f10x.h
+..\obj\boot.o: ..\LIB\Include\gd32f10x_fwdgt.h
 ..\obj\boot.o: ..\LIB\Include\gd32f10x_gpio.h
 ..\obj\boot.o: ..\LIB\Include\gd32f10x_misc.h
 ..\obj\boot.o: ..\LIB\Include\gd32f10x_rcu.h

二進制
bootloader/OBJ/bootloader.axf


+ 4 - 49
bootloader/OBJ/bootloader.build_log.htm

@@ -21,58 +21,13 @@ Target DLL:      Segger\JL2CM3.dll V2.99.36.0
 Dialog DLL:      TCM.DLL V1.36.5.0
  
 <h2>Project:</h2>
-C:\Users\16936\Desktop\dtu_gateway\bootloader\USER\bootloader.uvprojx
-Project File Date:  06/28/2023
+D:\Project\dtu\Bootloader\USER\bootloader.uvprojx
+Project File Date:  08/11/2023
 
 <h2>Output:</h2>
 *** Using Compiler 'V5.06 update 6 (build 750)', folder: 'D:\workSoftware\stm32Software\mdk\mdkcore\ARM\ARMCC\Bin'
 Build target 'bootloader'
-compiling gd32f10x_misc.c...
-compiling system_gd32f10x.c...
-compiling delay.c...
-compiling w25q32.c...
-compiling fmc.c...
-compiling boot.c...
-..\HW\Include\ota_message.h(14): warning:  #1295-D: Deprecated declaration load_ota_message_config_params - give arg types
-  extern int load_ota_message_config_params();
-..\HW\Include\ota_message.h(16): warning:  #1295-D: Deprecated declaration get_config_params - give arg types
-  extern OTA_MESSAGE *get_config_params();
-..\HW\Source\boot.c(20): warning:  #223-D: function "memset" declared implicitly
-  		memset(app_programmer,0,1024);
-..\HW\Source\boot.c(31): warning:  #223-D: function "memset" declared implicitly
-  		memset(app_programmer,0,1024);
-..\HW\Source\boot.c(28): warning:  #177-D: variable "startAddress"  was declared but never referenced
-  		uint32_t startAddress=(app_byte/1024)*1024;
-..\HW\Source\boot.c: 5 warnings, 0 errors
-compiling gd32f10x_it.c...
-compiling gd32f10x_gpio.c...
-compiling gd32f10x_wwdgt.c...
-compiling main.c...
-..\HW\Include\ota_message.h(14): warning:  #1295-D: Deprecated declaration load_ota_message_config_params - give arg types
-  extern int load_ota_message_config_params();
-..\HW\Include\ota_message.h(16): warning:  #1295-D: Deprecated declaration get_config_params - give arg types
-  extern OTA_MESSAGE *get_config_params();
-main.c: 2 warnings, 0 errors
-compiling ota_message.c...
-..\HW\Include\ota_message.h(14): warning:  #1295-D: Deprecated declaration load_ota_message_config_params - give arg types
-  extern int load_ota_message_config_params();
-..\HW\Include\ota_message.h(16): warning:  #1295-D: Deprecated declaration get_config_params - give arg types
-  extern OTA_MESSAGE *get_config_params();
-..\HW\Source\ota_message.c(23): warning:  #223-D: function "memset" declared implicitly
-  		memset(&ota_message, 0, sizeof(OTA_MESSAGE));	
-..\HW\Source\ota_message.c(24): warning:  #223-D: function "memcpy" declared implicitly
-  		memcpy(&ota_message, params, sizeof(OTA_MESSAGE)); 
-..\HW\Source\ota_message.c(41): warning:  #223-D: function "memset" declared implicitly
-  		memset(&ota_message, 0, sizeof(OTA_MESSAGE));//Çå¿ÕÔ­ÏÈÊý¾Ý
-..\HW\Source\ota_message.c: 5 warnings, 0 errors
-compiling spi.c...
-compiling gd32f10x_fmc.c...
-compiling gd32f10x_rcu.c...
-compiling gd32f10x_spi.c...
-linking...
-Program Size: Code=2956 RO-data=336 RW-data=12 ZI-data=4100  
-FromELF: creating hex file...
-"..\OBJ\bootloader.axf" - 0 Error(s), 12 Warning(s).
+"..\OBJ\bootloader.axf" - 0 Error(s), 0 Warning(s).
 
 <h2>Software Packages used:</h2>
 
@@ -86,7 +41,7 @@ Package Vendor: GigaDevice
   D:\workSoftware\stm32Software\mdk\mdkpack\GigaDevice\GD32F10x_DFP\2.0.3\Device\Include
 
 <h2>Collection of Component Files used:</h2>
-Build Time Elapsed:  00:00:01
+Build Time Elapsed:  00:00:00
 </pre>
 </body>
 </html>

+ 196 - 176
bootloader/OBJ/bootloader.htm

@@ -3,7 +3,7 @@
 <title>Static Call Graph - [..\OBJ\bootloader.axf]</title></head>
 <body><HR>
 <H1>Static Call Graph for image ..\OBJ\bootloader.axf</H1><HR>
-<BR><P>#&#060CALLGRAPH&#062# ARM Linker, 5060750: Last Updated: Tue Aug 08 08:48:24 2023
+<BR><P>#&#060CALLGRAPH&#062# ARM Linker, 5060750: Last Updated: Fri Aug 11 14:43:15 2023
 <BR><P>
 <H3>Maximum Stack Usage =       1088 bytes + Unknown(Cycles, Untraceable Function Pointers)</H3><H3>
 Call chain for Maximum Stack Depth:</H3>
@@ -98,7 +98,7 @@ Global Symbols
 <P><STRONG><a name="[48]"></a>__main</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry.o(.ARM.Collect$$$$00000000))
 <BR>[Address Reference Count : 1]<UL><LI> startup_gd32f10x_xd.o(.text)
 </UL>
-<P><STRONG><a name="[7c]"></a>_main_stk</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry2.o(.ARM.Collect$$$$00000001))
+<P><STRONG><a name="[7f]"></a>_main_stk</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry2.o(.ARM.Collect$$$$00000001))
 
 <P><STRONG><a name="[49]"></a>_main_scatterload</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry5.o(.ARM.Collect$$$$00000004))
 <BR><BR>[Calls]<UL><LI><a href="#[4a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__scatterload
@@ -108,18 +108,18 @@ Global Symbols
 <BR><BR>[Called By]<UL><LI><a href="#[4a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__scatterload
 </UL>
 
-<P><STRONG><a name="[7d]"></a>_main_clock</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry7b.o(.ARM.Collect$$$$00000008))
+<P><STRONG><a name="[80]"></a>_main_clock</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry7b.o(.ARM.Collect$$$$00000008))
 
-<P><STRONG><a name="[7e]"></a>_main_cpp_init</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry8b.o(.ARM.Collect$$$$0000000A))
+<P><STRONG><a name="[81]"></a>_main_cpp_init</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry8b.o(.ARM.Collect$$$$0000000A))
 
-<P><STRONG><a name="[7f]"></a>_main_init</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry9a.o(.ARM.Collect$$$$0000000B))
+<P><STRONG><a name="[82]"></a>_main_init</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry9a.o(.ARM.Collect$$$$0000000B))
 
-<P><STRONG><a name="[80]"></a>__rt_final_cpp</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry10a.o(.ARM.Collect$$$$0000000D))
+<P><STRONG><a name="[83]"></a>__rt_final_cpp</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry10a.o(.ARM.Collect$$$$0000000D))
 
-<P><STRONG><a name="[81]"></a>__rt_final_exit</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry11a.o(.ARM.Collect$$$$0000000F))
+<P><STRONG><a name="[84]"></a>__rt_final_exit</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry11a.o(.ARM.Collect$$$$0000000F))
 
-<P><STRONG><a name="[5e]"></a>MSR_SP</STRONG> (Thumb, 6 bytes, Stack size 0 bytes, boot.o(.emb_text))
-<BR><BR>[Called By]<UL><LI><a href="#[55]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;LOAD_A
+<P><STRONG><a name="[5f]"></a>MSR_SP</STRONG> (Thumb, 6 bytes, Stack size 0 bytes, boot.o(.emb_text))
+<BR><BR>[Called By]<UL><LI><a href="#[56]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;LOAD_A
 </UL>
 
 <P><STRONG><a name="[0]"></a>Reset_Handler</STRONG> (Thumb, 8 bytes, Stack size 0 bytes, startup_gd32f10x_xd.o(.text))
@@ -314,19 +314,19 @@ Global Symbols
 <LI><a href="#[4b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_memclr
 </UL>
 
-<P><STRONG><a name="[82]"></a>__aeabi_memset4</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, memseta.o(.text), UNUSED)
+<P><STRONG><a name="[85]"></a>__aeabi_memset4</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, memseta.o(.text), UNUSED)
 
-<P><STRONG><a name="[83]"></a>__aeabi_memset8</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, memseta.o(.text), UNUSED)
+<P><STRONG><a name="[86]"></a>__aeabi_memset8</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, memseta.o(.text), UNUSED)
 
 <P><STRONG><a name="[4b]"></a>__aeabi_memclr</STRONG> (Thumb, 4 bytes, Stack size 0 bytes, memseta.o(.text), UNUSED)
 <BR><BR>[Calls]<UL><LI><a href="#[4c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_memset
 </UL>
 
-<P><STRONG><a name="[51]"></a>__aeabi_memclr4</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, memseta.o(.text))
+<P><STRONG><a name="[52]"></a>__aeabi_memclr4</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, memseta.o(.text))
 <BR><BR>[Called By]<UL><LI><a href="#[4f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;BootLoader_Brance
 </UL>
 
-<P><STRONG><a name="[84]"></a>__aeabi_memclr8</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, memseta.o(.text), UNUSED)
+<P><STRONG><a name="[87]"></a>__aeabi_memclr8</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, memseta.o(.text), UNUSED)
 
 <P><STRONG><a name="[4d]"></a>_memset$wrapper</STRONG> (Thumb, 18 bytes, Stack size 8 bytes, memseta.o(.text), UNUSED)
 <BR><BR>[Calls]<UL><LI><a href="#[4c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_memset
@@ -338,27 +338,28 @@ Global Symbols
 <BR>[Called By]<UL><LI><a href="#[49]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_main_scatterload
 </UL>
 
-<P><STRONG><a name="[85]"></a>__scatterload_rt2</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, init.o(.text), UNUSED)
+<P><STRONG><a name="[88]"></a>__scatterload_rt2</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, init.o(.text), UNUSED)
 
-<P><STRONG><a name="[4f]"></a>BootLoader_Brance</STRONG> (Thumb, 150 bytes, Stack size 1040 bytes, boot.o(i.BootLoader_Brance))
+<P><STRONG><a name="[4f]"></a>BootLoader_Brance</STRONG> (Thumb, 154 bytes, Stack size 1040 bytes, boot.o(i.BootLoader_Brance))
 <BR><BR>[Stack]<UL><LI>Max Depth = 1088<LI>Call Chain = BootLoader_Brance &rArr; clear_ota_message_config_block &rArr; W25Q32_Erase64K &rArr; W25Q32_Enable &rArr; W25Q32_WaitBusy &rArr; SPI0_ReadWriteByte
 </UL>
-<BR>[Calls]<UL><LI><a href="#[54]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;clear_ota_message_config_block
-<LI><a href="#[52]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_Read
-<LI><a href="#[53]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GD32_WriteFlash
+<BR>[Calls]<UL><LI><a href="#[51]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;task_fwdgt_reload
+<LI><a href="#[55]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;clear_ota_message_config_block
+<LI><a href="#[53]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_Read
+<LI><a href="#[54]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GD32_WriteFlash
 <LI><a href="#[50]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GD32_EraseFlash
-<LI><a href="#[55]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;LOAD_A
-<LI><a href="#[51]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_memclr4
+<LI><a href="#[56]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;LOAD_A
+<LI><a href="#[52]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_memclr4
 </UL>
 <BR>[Called By]<UL><LI><a href="#[46]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
 </UL>
 
-<P><STRONG><a name="[56]"></a>BootLoader_Clear</STRONG> (Thumb, 16 bytes, Stack size 8 bytes, boot.o(i.BootLoader_Clear))
+<P><STRONG><a name="[57]"></a>BootLoader_Clear</STRONG> (Thumb, 16 bytes, Stack size 8 bytes, boot.o(i.BootLoader_Clear))
 <BR><BR>[Stack]<UL><LI>Max Depth = 16<LI>Call Chain = BootLoader_Clear &rArr; gpio_deinit
 </UL>
-<BR>[Calls]<UL><LI><a href="#[57]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;gpio_deinit
+<BR>[Calls]<UL><LI><a href="#[58]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;gpio_deinit
 </UL>
-<BR>[Called By]<UL><LI><a href="#[55]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;LOAD_A
+<BR>[Called By]<UL><LI><a href="#[56]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;LOAD_A
 </UL>
 
 <P><STRONG><a name="[4]"></a>BusFault_Handler</STRONG> (Thumb, 4 bytes, Stack size 0 bytes, gd32f10x_it.o(i.BusFault_Handler))
@@ -367,10 +368,10 @@ Global Symbols
 <P><STRONG><a name="[7]"></a>DebugMon_Handler</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, gd32f10x_it.o(i.DebugMon_Handler))
 <BR>[Address Reference Count : 1]<UL><LI> startup_gd32f10x_xd.o(RESET)
 </UL>
-<P><STRONG><a name="[58]"></a>Delay_Init</STRONG> (Thumb, 10 bytes, Stack size 8 bytes, delay.o(i.Delay_Init))
+<P><STRONG><a name="[59]"></a>Delay_Init</STRONG> (Thumb, 10 bytes, Stack size 8 bytes, delay.o(i.Delay_Init))
 <BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = Delay_Init
 </UL>
-<BR>[Calls]<UL><LI><a href="#[59]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;systick_clksource_set
+<BR>[Calls]<UL><LI><a href="#[5a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;systick_clksource_set
 </UL>
 <BR>[Called By]<UL><LI><a href="#[46]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
 </UL>
@@ -378,19 +379,19 @@ Global Symbols
 <P><STRONG><a name="[50]"></a>GD32_EraseFlash</STRONG> (Thumb, 48 bytes, Stack size 16 bytes, fmc.o(i.GD32_EraseFlash))
 <BR><BR>[Stack]<UL><LI>Max Depth = 32<LI>Call Chain = GD32_EraseFlash &rArr; fmc_page_erase &rArr; fmc_bank1_ready_wait
 </UL>
-<BR>[Calls]<UL><LI><a href="#[5a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;fmc_unlock
-<LI><a href="#[5b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;fmc_page_erase
-<LI><a href="#[5c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;fmc_lock
+<BR>[Calls]<UL><LI><a href="#[5b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;fmc_unlock
+<LI><a href="#[5c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;fmc_page_erase
+<LI><a href="#[5d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;fmc_lock
 </UL>
 <BR>[Called By]<UL><LI><a href="#[4f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;BootLoader_Brance
 </UL>
 
-<P><STRONG><a name="[53]"></a>GD32_WriteFlash</STRONG> (Thumb, 38 bytes, Stack size 16 bytes, fmc.o(i.GD32_WriteFlash))
+<P><STRONG><a name="[54]"></a>GD32_WriteFlash</STRONG> (Thumb, 38 bytes, Stack size 16 bytes, fmc.o(i.GD32_WriteFlash))
 <BR><BR>[Stack]<UL><LI>Max Depth = 36<LI>Call Chain = GD32_WriteFlash &rArr; fmc_word_program &rArr; fmc_bank1_ready_wait
 </UL>
-<BR>[Calls]<UL><LI><a href="#[5d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;fmc_word_program
-<LI><a href="#[5a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;fmc_unlock
-<LI><a href="#[5c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;fmc_lock
+<BR>[Calls]<UL><LI><a href="#[5e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;fmc_word_program
+<LI><a href="#[5b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;fmc_unlock
+<LI><a href="#[5d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;fmc_lock
 </UL>
 <BR>[Called By]<UL><LI><a href="#[4f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;BootLoader_Brance
 </UL>
@@ -398,11 +399,11 @@ Global Symbols
 <P><STRONG><a name="[2]"></a>HardFault_Handler</STRONG> (Thumb, 4 bytes, Stack size 0 bytes, gd32f10x_it.o(i.HardFault_Handler))
 <BR>[Address Reference Count : 1]<UL><LI> startup_gd32f10x_xd.o(RESET)
 </UL>
-<P><STRONG><a name="[55]"></a>LOAD_A</STRONG> (Thumb, 44 bytes, Stack size 8 bytes, boot.o(i.LOAD_A))
+<P><STRONG><a name="[56]"></a>LOAD_A</STRONG> (Thumb, 44 bytes, Stack size 8 bytes, boot.o(i.LOAD_A))
 <BR><BR>[Stack]<UL><LI>Max Depth = 24<LI>Call Chain = LOAD_A &rArr; BootLoader_Clear &rArr; gpio_deinit
 </UL>
-<BR>[Calls]<UL><LI><a href="#[56]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;BootLoader_Clear
-<LI><a href="#[5e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MSR_SP
+<BR>[Calls]<UL><LI><a href="#[57]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;BootLoader_Clear
+<LI><a href="#[5f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MSR_SP
 </UL>
 <BR>[Called By]<UL><LI><a href="#[4f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;BootLoader_Brance
 <LI><a href="#[46]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
@@ -417,46 +418,46 @@ Global Symbols
 <P><STRONG><a name="[8]"></a>PendSV_Handler</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, gd32f10x_it.o(i.PendSV_Handler))
 <BR>[Address Reference Count : 1]<UL><LI> startup_gd32f10x_xd.o(RESET)
 </UL>
-<P><STRONG><a name="[5f]"></a>SPI0_Init</STRONG> (Thumb, 94 bytes, Stack size 32 bytes, spi.o(i.SPI0_Init))
+<P><STRONG><a name="[60]"></a>SPI0_Init</STRONG> (Thumb, 94 bytes, Stack size 32 bytes, spi.o(i.SPI0_Init))
 <BR><BR>[Stack]<UL><LI>Max Depth = 52<LI>Call Chain = SPI0_Init &rArr; gpio_init
 </UL>
-<BR>[Calls]<UL><LI><a href="#[63]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;spi_init
-<LI><a href="#[62]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;spi_i2s_deinit
-<LI><a href="#[64]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;spi_enable
-<LI><a href="#[60]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;rcu_periph_clock_enable
-<LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;gpio_init
+<BR>[Calls]<UL><LI><a href="#[64]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;spi_init
+<LI><a href="#[63]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;spi_i2s_deinit
+<LI><a href="#[65]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;spi_enable
+<LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;rcu_periph_clock_enable
+<LI><a href="#[62]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;gpio_init
 </UL>
-<BR>[Called By]<UL><LI><a href="#[72]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_Init
+<BR>[Called By]<UL><LI><a href="#[73]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_Init
 </UL>
 
-<P><STRONG><a name="[65]"></a>SPI0_Read</STRONG> (Thumb, 28 bytes, Stack size 16 bytes, spi.o(i.SPI0_Read))
+<P><STRONG><a name="[66]"></a>SPI0_Read</STRONG> (Thumb, 28 bytes, Stack size 16 bytes, spi.o(i.SPI0_Read))
 <BR><BR>[Stack]<UL><LI>Max Depth = 24<LI>Call Chain = SPI0_Read &rArr; SPI0_ReadWriteByte
 </UL>
-<BR>[Calls]<UL><LI><a href="#[66]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI0_ReadWriteByte
+<BR>[Calls]<UL><LI><a href="#[67]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI0_ReadWriteByte
 </UL>
-<BR>[Called By]<UL><LI><a href="#[52]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_Read
+<BR>[Called By]<UL><LI><a href="#[53]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_Read
 </UL>
 
-<P><STRONG><a name="[66]"></a>SPI0_ReadWriteByte</STRONG> (Thumb, 50 bytes, Stack size 8 bytes, spi.o(i.SPI0_ReadWriteByte))
+<P><STRONG><a name="[67]"></a>SPI0_ReadWriteByte</STRONG> (Thumb, 50 bytes, Stack size 8 bytes, spi.o(i.SPI0_ReadWriteByte))
 <BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = SPI0_ReadWriteByte
 </UL>
-<BR>[Calls]<UL><LI><a href="#[67]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;spi_i2s_flag_get
-<LI><a href="#[68]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;spi_i2s_data_transmit
-<LI><a href="#[69]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;spi_i2s_data_receive
+<BR>[Calls]<UL><LI><a href="#[68]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;spi_i2s_flag_get
+<LI><a href="#[69]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;spi_i2s_data_transmit
+<LI><a href="#[6a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;spi_i2s_data_receive
 </UL>
-<BR>[Called By]<UL><LI><a href="#[6e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_WaitBusy
-<LI><a href="#[6d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_Enable
-<LI><a href="#[6a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI0_Write
-<LI><a href="#[65]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI0_Read
+<BR>[Called By]<UL><LI><a href="#[6f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_WaitBusy
+<LI><a href="#[6e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_Enable
+<LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI0_Write
+<LI><a href="#[66]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI0_Read
 </UL>
 
-<P><STRONG><a name="[6a]"></a>SPI0_Write</STRONG> (Thumb, 26 bytes, Stack size 16 bytes, spi.o(i.SPI0_Write))
+<P><STRONG><a name="[6b]"></a>SPI0_Write</STRONG> (Thumb, 26 bytes, Stack size 16 bytes, spi.o(i.SPI0_Write))
 <BR><BR>[Stack]<UL><LI>Max Depth = 24<LI>Call Chain = SPI0_Write &rArr; SPI0_ReadWriteByte
 </UL>
-<BR>[Calls]<UL><LI><a href="#[66]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI0_ReadWriteByte
+<BR>[Calls]<UL><LI><a href="#[67]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI0_ReadWriteByte
 </UL>
-<BR>[Called By]<UL><LI><a href="#[71]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_Erase64K
-<LI><a href="#[52]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_Read
+<BR>[Called By]<UL><LI><a href="#[72]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_Erase64K
+<LI><a href="#[53]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_Read
 </UL>
 
 <P><STRONG><a name="[6]"></a>SVC_Handler</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, gd32f10x_it.o(i.SVC_Handler))
@@ -468,259 +469,278 @@ Global Symbols
 <P><STRONG><a name="[47]"></a>SystemInit</STRONG> (Thumb, 196 bytes, Stack size 8 bytes, system_gd32f10x.o(i.SystemInit))
 <BR><BR>[Stack]<UL><LI>Max Depth = 16<LI>Call Chain = SystemInit &rArr; system_clock_config
 </UL>
-<BR>[Calls]<UL><LI><a href="#[6c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;nvic_vector_table_set
-<LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;system_clock_config
+<BR>[Calls]<UL><LI><a href="#[6d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;nvic_vector_table_set
+<LI><a href="#[6c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;system_clock_config
 </UL>
 <BR>[Address Reference Count : 1]<UL><LI> startup_gd32f10x_xd.o(.text)
 </UL>
 <P><STRONG><a name="[5]"></a>UsageFault_Handler</STRONG> (Thumb, 4 bytes, Stack size 0 bytes, gd32f10x_it.o(i.UsageFault_Handler))
 <BR>[Address Reference Count : 1]<UL><LI> startup_gd32f10x_xd.o(RESET)
 </UL>
-<P><STRONG><a name="[6d]"></a>W25Q32_Enable</STRONG> (Thumb, 30 bytes, Stack size 8 bytes, w25q32.o(i.W25Q32_Enable))
+<P><STRONG><a name="[6e]"></a>W25Q32_Enable</STRONG> (Thumb, 30 bytes, Stack size 8 bytes, w25q32.o(i.W25Q32_Enable))
 <BR><BR>[Stack]<UL><LI>Max Depth = 24<LI>Call Chain = W25Q32_Enable &rArr; W25Q32_WaitBusy &rArr; SPI0_ReadWriteByte
 </UL>
-<BR>[Calls]<UL><LI><a href="#[70]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;gpio_bit_set
-<LI><a href="#[6f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;gpio_bit_reset
-<LI><a href="#[6e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_WaitBusy
-<LI><a href="#[66]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI0_ReadWriteByte
+<BR>[Calls]<UL><LI><a href="#[71]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;gpio_bit_set
+<LI><a href="#[70]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;gpio_bit_reset
+<LI><a href="#[6f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_WaitBusy
+<LI><a href="#[67]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI0_ReadWriteByte
 </UL>
-<BR>[Called By]<UL><LI><a href="#[71]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_Erase64K
+<BR>[Called By]<UL><LI><a href="#[72]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_Erase64K
 </UL>
 
-<P><STRONG><a name="[71]"></a>W25Q32_Erase64K</STRONG> (Thumb, 70 bytes, Stack size 16 bytes, w25q32.o(i.W25Q32_Erase64K))
+<P><STRONG><a name="[72]"></a>W25Q32_Erase64K</STRONG> (Thumb, 70 bytes, Stack size 16 bytes, w25q32.o(i.W25Q32_Erase64K))
 <BR><BR>[Stack]<UL><LI>Max Depth = 40<LI>Call Chain = W25Q32_Erase64K &rArr; W25Q32_Enable &rArr; W25Q32_WaitBusy &rArr; SPI0_ReadWriteByte
 </UL>
-<BR>[Calls]<UL><LI><a href="#[70]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;gpio_bit_set
-<LI><a href="#[6f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;gpio_bit_reset
-<LI><a href="#[6e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_WaitBusy
-<LI><a href="#[6d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_Enable
-<LI><a href="#[6a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI0_Write
+<BR>[Calls]<UL><LI><a href="#[71]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;gpio_bit_set
+<LI><a href="#[70]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;gpio_bit_reset
+<LI><a href="#[6f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_WaitBusy
+<LI><a href="#[6e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_Enable
+<LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI0_Write
 </UL>
-<BR>[Called By]<UL><LI><a href="#[54]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;clear_ota_message_config_block
+<BR>[Called By]<UL><LI><a href="#[55]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;clear_ota_message_config_block
 </UL>
 
-<P><STRONG><a name="[72]"></a>W25Q32_Init</STRONG> (Thumb, 36 bytes, Stack size 8 bytes, w25q32.o(i.W25Q32_Init))
+<P><STRONG><a name="[73]"></a>W25Q32_Init</STRONG> (Thumb, 36 bytes, Stack size 8 bytes, w25q32.o(i.W25Q32_Init))
 <BR><BR>[Stack]<UL><LI>Max Depth = 60<LI>Call Chain = W25Q32_Init &rArr; SPI0_Init &rArr; gpio_init
 </UL>
-<BR>[Calls]<UL><LI><a href="#[70]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;gpio_bit_set
-<LI><a href="#[60]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;rcu_periph_clock_enable
-<LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;gpio_init
-<LI><a href="#[5f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI0_Init
+<BR>[Calls]<UL><LI><a href="#[71]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;gpio_bit_set
+<LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;rcu_periph_clock_enable
+<LI><a href="#[62]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;gpio_init
+<LI><a href="#[60]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI0_Init
 </UL>
 <BR>[Called By]<UL><LI><a href="#[46]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
 </UL>
 
-<P><STRONG><a name="[52]"></a>W25Q32_Read</STRONG> (Thumb, 70 bytes, Stack size 24 bytes, w25q32.o(i.W25Q32_Read))
+<P><STRONG><a name="[53]"></a>W25Q32_Read</STRONG> (Thumb, 70 bytes, Stack size 24 bytes, w25q32.o(i.W25Q32_Read))
 <BR><BR>[Stack]<UL><LI>Max Depth = 48<LI>Call Chain = W25Q32_Read &rArr; SPI0_Write &rArr; SPI0_ReadWriteByte
 </UL>
-<BR>[Calls]<UL><LI><a href="#[70]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;gpio_bit_set
-<LI><a href="#[6f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;gpio_bit_reset
-<LI><a href="#[6e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_WaitBusy
-<LI><a href="#[6a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI0_Write
-<LI><a href="#[65]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI0_Read
+<BR>[Calls]<UL><LI><a href="#[71]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;gpio_bit_set
+<LI><a href="#[70]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;gpio_bit_reset
+<LI><a href="#[6f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_WaitBusy
+<LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI0_Write
+<LI><a href="#[66]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI0_Read
 </UL>
-<BR>[Called By]<UL><LI><a href="#[79]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;load_ota_message_config_params
+<BR>[Called By]<UL><LI><a href="#[7a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;load_ota_message_config_params
 <LI><a href="#[4f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;BootLoader_Brance
 </UL>
 
-<P><STRONG><a name="[6e]"></a>W25Q32_WaitBusy</STRONG> (Thumb, 44 bytes, Stack size 8 bytes, w25q32.o(i.W25Q32_WaitBusy))
+<P><STRONG><a name="[6f]"></a>W25Q32_WaitBusy</STRONG> (Thumb, 44 bytes, Stack size 8 bytes, w25q32.o(i.W25Q32_WaitBusy))
 <BR><BR>[Stack]<UL><LI>Max Depth = 16<LI>Call Chain = W25Q32_WaitBusy &rArr; SPI0_ReadWriteByte
 </UL>
-<BR>[Calls]<UL><LI><a href="#[70]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;gpio_bit_set
-<LI><a href="#[6f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;gpio_bit_reset
-<LI><a href="#[66]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI0_ReadWriteByte
+<BR>[Calls]<UL><LI><a href="#[71]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;gpio_bit_set
+<LI><a href="#[70]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;gpio_bit_reset
+<LI><a href="#[67]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI0_ReadWriteByte
 </UL>
-<BR>[Called By]<UL><LI><a href="#[71]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_Erase64K
-<LI><a href="#[6d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_Enable
-<LI><a href="#[52]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_Read
+<BR>[Called By]<UL><LI><a href="#[72]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_Erase64K
+<LI><a href="#[6e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_Enable
+<LI><a href="#[53]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_Read
 </UL>
 
-<P><STRONG><a name="[86]"></a>__scatterload_copy</STRONG> (Thumb, 14 bytes, Stack size unknown bytes, handlers.o(i.__scatterload_copy), UNUSED)
+<P><STRONG><a name="[89]"></a>__scatterload_copy</STRONG> (Thumb, 14 bytes, Stack size unknown bytes, handlers.o(i.__scatterload_copy), UNUSED)
 
-<P><STRONG><a name="[87]"></a>__scatterload_null</STRONG> (Thumb, 2 bytes, Stack size unknown bytes, handlers.o(i.__scatterload_null), UNUSED)
+<P><STRONG><a name="[8a]"></a>__scatterload_null</STRONG> (Thumb, 2 bytes, Stack size unknown bytes, handlers.o(i.__scatterload_null), UNUSED)
 
-<P><STRONG><a name="[88]"></a>__scatterload_zeroinit</STRONG> (Thumb, 14 bytes, Stack size unknown bytes, handlers.o(i.__scatterload_zeroinit), UNUSED)
+<P><STRONG><a name="[8b]"></a>__scatterload_zeroinit</STRONG> (Thumb, 14 bytes, Stack size unknown bytes, handlers.o(i.__scatterload_zeroinit), UNUSED)
 
-<P><STRONG><a name="[54]"></a>clear_ota_message_config_block</STRONG> (Thumb, 10 bytes, Stack size 8 bytes, ota_message.o(i.clear_ota_message_config_block))
+<P><STRONG><a name="[55]"></a>clear_ota_message_config_block</STRONG> (Thumb, 10 bytes, Stack size 8 bytes, ota_message.o(i.clear_ota_message_config_block))
 <BR><BR>[Stack]<UL><LI>Max Depth = 48<LI>Call Chain = clear_ota_message_config_block &rArr; W25Q32_Erase64K &rArr; W25Q32_Enable &rArr; W25Q32_WaitBusy &rArr; SPI0_ReadWriteByte
 </UL>
-<BR>[Calls]<UL><LI><a href="#[71]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_Erase64K
+<BR>[Calls]<UL><LI><a href="#[72]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_Erase64K
 </UL>
 <BR>[Called By]<UL><LI><a href="#[4f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;BootLoader_Brance
 </UL>
 
-<P><STRONG><a name="[73]"></a>fmc_bank0_ready_wait</STRONG> (Thumb, 34 bytes, Stack size 4 bytes, gd32f10x_fmc.o(i.fmc_bank0_ready_wait))
+<P><STRONG><a name="[74]"></a>fmc_bank0_ready_wait</STRONG> (Thumb, 34 bytes, Stack size 4 bytes, gd32f10x_fmc.o(i.fmc_bank0_ready_wait))
 <BR><BR>[Stack]<UL><LI>Max Depth = 4<LI>Call Chain = fmc_bank0_ready_wait
 </UL>
-<BR>[Calls]<UL><LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;fmc_bank0_state_get
+<BR>[Calls]<UL><LI><a href="#[75]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;fmc_bank0_state_get
 </UL>
-<BR>[Called By]<UL><LI><a href="#[5d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;fmc_word_program
-<LI><a href="#[5b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;fmc_page_erase
+<BR>[Called By]<UL><LI><a href="#[5e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;fmc_word_program
+<LI><a href="#[5c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;fmc_page_erase
 </UL>
 
-<P><STRONG><a name="[74]"></a>fmc_bank0_state_get</STRONG> (Thumb, 44 bytes, Stack size 0 bytes, gd32f10x_fmc.o(i.fmc_bank0_state_get))
-<BR><BR>[Called By]<UL><LI><a href="#[73]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;fmc_bank0_ready_wait
+<P><STRONG><a name="[75]"></a>fmc_bank0_state_get</STRONG> (Thumb, 44 bytes, Stack size 0 bytes, gd32f10x_fmc.o(i.fmc_bank0_state_get))
+<BR><BR>[Called By]<UL><LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;fmc_bank0_ready_wait
 </UL>
 
-<P><STRONG><a name="[75]"></a>fmc_bank1_ready_wait</STRONG> (Thumb, 34 bytes, Stack size 4 bytes, gd32f10x_fmc.o(i.fmc_bank1_ready_wait))
+<P><STRONG><a name="[76]"></a>fmc_bank1_ready_wait</STRONG> (Thumb, 34 bytes, Stack size 4 bytes, gd32f10x_fmc.o(i.fmc_bank1_ready_wait))
 <BR><BR>[Stack]<UL><LI>Max Depth = 4<LI>Call Chain = fmc_bank1_ready_wait
 </UL>
-<BR>[Calls]<UL><LI><a href="#[76]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;fmc_bank1_state_get
+<BR>[Calls]<UL><LI><a href="#[77]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;fmc_bank1_state_get
 </UL>
-<BR>[Called By]<UL><LI><a href="#[5d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;fmc_word_program
-<LI><a href="#[5b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;fmc_page_erase
+<BR>[Called By]<UL><LI><a href="#[5e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;fmc_word_program
+<LI><a href="#[5c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;fmc_page_erase
 </UL>
 
-<P><STRONG><a name="[76]"></a>fmc_bank1_state_get</STRONG> (Thumb, 44 bytes, Stack size 0 bytes, gd32f10x_fmc.o(i.fmc_bank1_state_get))
-<BR><BR>[Called By]<UL><LI><a href="#[75]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;fmc_bank1_ready_wait
+<P><STRONG><a name="[77]"></a>fmc_bank1_state_get</STRONG> (Thumb, 44 bytes, Stack size 0 bytes, gd32f10x_fmc.o(i.fmc_bank1_state_get))
+<BR><BR>[Called By]<UL><LI><a href="#[76]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;fmc_bank1_ready_wait
 </UL>
 
-<P><STRONG><a name="[5c]"></a>fmc_lock</STRONG> (Thumb, 34 bytes, Stack size 0 bytes, gd32f10x_fmc.o(i.fmc_lock))
-<BR><BR>[Called By]<UL><LI><a href="#[53]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GD32_WriteFlash
+<P><STRONG><a name="[5d]"></a>fmc_lock</STRONG> (Thumb, 34 bytes, Stack size 0 bytes, gd32f10x_fmc.o(i.fmc_lock))
+<BR><BR>[Called By]<UL><LI><a href="#[54]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GD32_WriteFlash
 <LI><a href="#[50]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GD32_EraseFlash
 </UL>
 
-<P><STRONG><a name="[5b]"></a>fmc_page_erase</STRONG> (Thumb, 222 bytes, Stack size 12 bytes, gd32f10x_fmc.o(i.fmc_page_erase))
+<P><STRONG><a name="[5c]"></a>fmc_page_erase</STRONG> (Thumb, 222 bytes, Stack size 12 bytes, gd32f10x_fmc.o(i.fmc_page_erase))
 <BR><BR>[Stack]<UL><LI>Max Depth = 16<LI>Call Chain = fmc_page_erase &rArr; fmc_bank1_ready_wait
 </UL>
-<BR>[Calls]<UL><LI><a href="#[75]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;fmc_bank1_ready_wait
-<LI><a href="#[73]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;fmc_bank0_ready_wait
+<BR>[Calls]<UL><LI><a href="#[76]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;fmc_bank1_ready_wait
+<LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;fmc_bank0_ready_wait
 </UL>
 <BR>[Called By]<UL><LI><a href="#[50]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GD32_EraseFlash
 </UL>
 
-<P><STRONG><a name="[5a]"></a>fmc_unlock</STRONG> (Thumb, 52 bytes, Stack size 0 bytes, gd32f10x_fmc.o(i.fmc_unlock))
-<BR><BR>[Called By]<UL><LI><a href="#[53]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GD32_WriteFlash
+<P><STRONG><a name="[5b]"></a>fmc_unlock</STRONG> (Thumb, 52 bytes, Stack size 0 bytes, gd32f10x_fmc.o(i.fmc_unlock))
+<BR><BR>[Called By]<UL><LI><a href="#[54]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GD32_WriteFlash
 <LI><a href="#[50]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GD32_EraseFlash
 </UL>
 
-<P><STRONG><a name="[5d]"></a>fmc_word_program</STRONG> (Thumb, 178 bytes, Stack size 16 bytes, gd32f10x_fmc.o(i.fmc_word_program))
+<P><STRONG><a name="[5e]"></a>fmc_word_program</STRONG> (Thumb, 178 bytes, Stack size 16 bytes, gd32f10x_fmc.o(i.fmc_word_program))
 <BR><BR>[Stack]<UL><LI>Max Depth = 20<LI>Call Chain = fmc_word_program &rArr; fmc_bank1_ready_wait
 </UL>
-<BR>[Calls]<UL><LI><a href="#[75]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;fmc_bank1_ready_wait
-<LI><a href="#[73]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;fmc_bank0_ready_wait
+<BR>[Calls]<UL><LI><a href="#[76]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;fmc_bank1_ready_wait
+<LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;fmc_bank0_ready_wait
 </UL>
-<BR>[Called By]<UL><LI><a href="#[53]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GD32_WriteFlash
+<BR>[Called By]<UL><LI><a href="#[54]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GD32_WriteFlash
 </UL>
 
-<P><STRONG><a name="[7a]"></a>get_config_params</STRONG> (Thumb, 4 bytes, Stack size 0 bytes, ota_message.o(i.get_config_params))
+<P><STRONG><a name="[7e]"></a>fwdgt_counter_reload</STRONG> (Thumb, 10 bytes, Stack size 0 bytes, gd32f10x_fwdgt.o(i.fwdgt_counter_reload))
+<BR><BR>[Called By]<UL><LI><a href="#[51]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;task_fwdgt_reload
+</UL>
+
+<P><STRONG><a name="[7d]"></a>fwdgt_write_enable</STRONG> (Thumb, 10 bytes, Stack size 0 bytes, gd32f10x_fwdgt.o(i.fwdgt_write_enable))
+<BR><BR>[Called By]<UL><LI><a href="#[51]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;task_fwdgt_reload
+</UL>
+
+<P><STRONG><a name="[7b]"></a>get_config_params</STRONG> (Thumb, 4 bytes, Stack size 0 bytes, ota_message.o(i.get_config_params))
 <BR><BR>[Called By]<UL><LI><a href="#[46]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
 </UL>
 
-<P><STRONG><a name="[6f]"></a>gpio_bit_reset</STRONG> (Thumb, 4 bytes, Stack size 0 bytes, gd32f10x_gpio.o(i.gpio_bit_reset))
-<BR><BR>[Called By]<UL><LI><a href="#[6e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_WaitBusy
-<LI><a href="#[71]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_Erase64K
-<LI><a href="#[6d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_Enable
-<LI><a href="#[52]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_Read
+<P><STRONG><a name="[70]"></a>gpio_bit_reset</STRONG> (Thumb, 4 bytes, Stack size 0 bytes, gd32f10x_gpio.o(i.gpio_bit_reset))
+<BR><BR>[Called By]<UL><LI><a href="#[6f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_WaitBusy
+<LI><a href="#[72]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_Erase64K
+<LI><a href="#[6e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_Enable
+<LI><a href="#[53]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_Read
 </UL>
 
-<P><STRONG><a name="[70]"></a>gpio_bit_set</STRONG> (Thumb, 4 bytes, Stack size 0 bytes, gd32f10x_gpio.o(i.gpio_bit_set))
-<BR><BR>[Called By]<UL><LI><a href="#[6e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_WaitBusy
-<LI><a href="#[72]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_Init
-<LI><a href="#[71]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_Erase64K
-<LI><a href="#[6d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_Enable
-<LI><a href="#[52]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_Read
+<P><STRONG><a name="[71]"></a>gpio_bit_set</STRONG> (Thumb, 4 bytes, Stack size 0 bytes, gd32f10x_gpio.o(i.gpio_bit_set))
+<BR><BR>[Called By]<UL><LI><a href="#[6f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_WaitBusy
+<LI><a href="#[73]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_Init
+<LI><a href="#[72]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_Erase64K
+<LI><a href="#[6e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_Enable
+<LI><a href="#[53]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_Read
 </UL>
 
-<P><STRONG><a name="[57]"></a>gpio_deinit</STRONG> (Thumb, 186 bytes, Stack size 8 bytes, gd32f10x_gpio.o(i.gpio_deinit))
+<P><STRONG><a name="[58]"></a>gpio_deinit</STRONG> (Thumb, 186 bytes, Stack size 8 bytes, gd32f10x_gpio.o(i.gpio_deinit))
 <BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = gpio_deinit
 </UL>
-<BR>[Calls]<UL><LI><a href="#[77]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;rcu_periph_reset_enable
-<LI><a href="#[78]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;rcu_periph_reset_disable
+<BR>[Calls]<UL><LI><a href="#[78]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;rcu_periph_reset_enable
+<LI><a href="#[79]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;rcu_periph_reset_disable
 </UL>
-<BR>[Called By]<UL><LI><a href="#[56]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;BootLoader_Clear
+<BR>[Called By]<UL><LI><a href="#[57]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;BootLoader_Clear
 </UL>
 
-<P><STRONG><a name="[61]"></a>gpio_init</STRONG> (Thumb, 172 bytes, Stack size 20 bytes, gd32f10x_gpio.o(i.gpio_init))
+<P><STRONG><a name="[62]"></a>gpio_init</STRONG> (Thumb, 172 bytes, Stack size 20 bytes, gd32f10x_gpio.o(i.gpio_init))
 <BR><BR>[Stack]<UL><LI>Max Depth = 20<LI>Call Chain = gpio_init
 </UL>
-<BR>[Called By]<UL><LI><a href="#[72]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_Init
-<LI><a href="#[5f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI0_Init
+<BR>[Called By]<UL><LI><a href="#[73]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_Init
+<LI><a href="#[60]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI0_Init
 </UL>
 
-<P><STRONG><a name="[79]"></a>load_ota_message_config_params</STRONG> (Thumb, 36 bytes, Stack size 8 bytes, ota_message.o(i.load_ota_message_config_params))
+<P><STRONG><a name="[7a]"></a>load_ota_message_config_params</STRONG> (Thumb, 36 bytes, Stack size 8 bytes, ota_message.o(i.load_ota_message_config_params))
 <BR><BR>[Stack]<UL><LI>Max Depth = 56<LI>Call Chain = load_ota_message_config_params &rArr; W25Q32_Read &rArr; SPI0_Write &rArr; SPI0_ReadWriteByte
 </UL>
-<BR>[Calls]<UL><LI><a href="#[52]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_Read
+<BR>[Calls]<UL><LI><a href="#[53]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_Read
 </UL>
 <BR>[Called By]<UL><LI><a href="#[46]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
 </UL>
 
-<P><STRONG><a name="[46]"></a>main</STRONG> (Thumb, 38 bytes, Stack size 0 bytes, main.o(i.main))
+<P><STRONG><a name="[46]"></a>main</STRONG> (Thumb, 42 bytes, Stack size 0 bytes, main.o(i.main))
 <BR><BR>[Stack]<UL><LI>Max Depth = 1088<LI>Call Chain = main &rArr; BootLoader_Brance &rArr; clear_ota_message_config_block &rArr; W25Q32_Erase64K &rArr; W25Q32_Enable &rArr; W25Q32_WaitBusy &rArr; SPI0_ReadWriteByte
 </UL>
-<BR>[Calls]<UL><LI><a href="#[79]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;load_ota_message_config_params
-<LI><a href="#[7a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;get_config_params
-<LI><a href="#[72]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_Init
-<LI><a href="#[58]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Delay_Init
-<LI><a href="#[55]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;LOAD_A
+<BR>[Calls]<UL><LI><a href="#[7a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;load_ota_message_config_params
+<LI><a href="#[7b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;get_config_params
+<LI><a href="#[73]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_Init
+<LI><a href="#[59]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Delay_Init
+<LI><a href="#[51]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;task_fwdgt_reload
+<LI><a href="#[56]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;LOAD_A
 <LI><a href="#[4f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;BootLoader_Brance
 </UL>
 <BR>[Address Reference Count : 1]<UL><LI> entry9a.o(.ARM.Collect$$$$0000000B)
 </UL>
-<P><STRONG><a name="[6c]"></a>nvic_vector_table_set</STRONG> (Thumb, 16 bytes, Stack size 0 bytes, gd32f10x_misc.o(i.nvic_vector_table_set))
+<P><STRONG><a name="[6d]"></a>nvic_vector_table_set</STRONG> (Thumb, 16 bytes, Stack size 0 bytes, gd32f10x_misc.o(i.nvic_vector_table_set))
 <BR><BR>[Called By]<UL><LI><a href="#[47]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SystemInit
 </UL>
 
-<P><STRONG><a name="[60]"></a>rcu_periph_clock_enable</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, gd32f10x_rcu.o(i.rcu_periph_clock_enable))
-<BR><BR>[Called By]<UL><LI><a href="#[72]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_Init
-<LI><a href="#[5f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI0_Init
+<P><STRONG><a name="[61]"></a>rcu_periph_clock_enable</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, gd32f10x_rcu.o(i.rcu_periph_clock_enable))
+<BR><BR>[Called By]<UL><LI><a href="#[73]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;W25Q32_Init
+<LI><a href="#[60]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI0_Init
 </UL>
 
-<P><STRONG><a name="[78]"></a>rcu_periph_reset_disable</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, gd32f10x_rcu.o(i.rcu_periph_reset_disable))
-<BR><BR>[Called By]<UL><LI><a href="#[62]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;spi_i2s_deinit
-<LI><a href="#[57]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;gpio_deinit
+<P><STRONG><a name="[79]"></a>rcu_periph_reset_disable</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, gd32f10x_rcu.o(i.rcu_periph_reset_disable))
+<BR><BR>[Called By]<UL><LI><a href="#[63]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;spi_i2s_deinit
+<LI><a href="#[58]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;gpio_deinit
 </UL>
 
-<P><STRONG><a name="[77]"></a>rcu_periph_reset_enable</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, gd32f10x_rcu.o(i.rcu_periph_reset_enable))
-<BR><BR>[Called By]<UL><LI><a href="#[62]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;spi_i2s_deinit
-<LI><a href="#[57]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;gpio_deinit
+<P><STRONG><a name="[78]"></a>rcu_periph_reset_enable</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, gd32f10x_rcu.o(i.rcu_periph_reset_enable))
+<BR><BR>[Called By]<UL><LI><a href="#[63]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;spi_i2s_deinit
+<LI><a href="#[58]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;gpio_deinit
 </UL>
 
-<P><STRONG><a name="[64]"></a>spi_enable</STRONG> (Thumb, 10 bytes, Stack size 0 bytes, gd32f10x_spi.o(i.spi_enable))
-<BR><BR>[Called By]<UL><LI><a href="#[5f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI0_Init
+<P><STRONG><a name="[65]"></a>spi_enable</STRONG> (Thumb, 10 bytes, Stack size 0 bytes, gd32f10x_spi.o(i.spi_enable))
+<BR><BR>[Called By]<UL><LI><a href="#[60]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI0_Init
 </UL>
 
-<P><STRONG><a name="[69]"></a>spi_i2s_data_receive</STRONG> (Thumb, 8 bytes, Stack size 0 bytes, gd32f10x_spi.o(i.spi_i2s_data_receive))
-<BR><BR>[Called By]<UL><LI><a href="#[66]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI0_ReadWriteByte
+<P><STRONG><a name="[6a]"></a>spi_i2s_data_receive</STRONG> (Thumb, 8 bytes, Stack size 0 bytes, gd32f10x_spi.o(i.spi_i2s_data_receive))
+<BR><BR>[Called By]<UL><LI><a href="#[67]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI0_ReadWriteByte
 </UL>
 
-<P><STRONG><a name="[68]"></a>spi_i2s_data_transmit</STRONG> (Thumb, 4 bytes, Stack size 0 bytes, gd32f10x_spi.o(i.spi_i2s_data_transmit))
-<BR><BR>[Called By]<UL><LI><a href="#[66]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI0_ReadWriteByte
+<P><STRONG><a name="[69]"></a>spi_i2s_data_transmit</STRONG> (Thumb, 4 bytes, Stack size 0 bytes, gd32f10x_spi.o(i.spi_i2s_data_transmit))
+<BR><BR>[Called By]<UL><LI><a href="#[67]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI0_ReadWriteByte
 </UL>
 
-<P><STRONG><a name="[62]"></a>spi_i2s_deinit</STRONG> (Thumb, 82 bytes, Stack size 8 bytes, gd32f10x_spi.o(i.spi_i2s_deinit))
+<P><STRONG><a name="[63]"></a>spi_i2s_deinit</STRONG> (Thumb, 82 bytes, Stack size 8 bytes, gd32f10x_spi.o(i.spi_i2s_deinit))
 <BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = spi_i2s_deinit
 </UL>
-<BR>[Calls]<UL><LI><a href="#[77]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;rcu_periph_reset_enable
-<LI><a href="#[78]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;rcu_periph_reset_disable
+<BR>[Calls]<UL><LI><a href="#[78]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;rcu_periph_reset_enable
+<LI><a href="#[79]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;rcu_periph_reset_disable
+</UL>
+<BR>[Called By]<UL><LI><a href="#[60]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI0_Init
 </UL>
-<BR>[Called By]<UL><LI><a href="#[5f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI0_Init
+
+<P><STRONG><a name="[68]"></a>spi_i2s_flag_get</STRONG> (Thumb, 16 bytes, Stack size 0 bytes, gd32f10x_spi.o(i.spi_i2s_flag_get))
+<BR><BR>[Called By]<UL><LI><a href="#[67]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI0_ReadWriteByte
 </UL>
 
-<P><STRONG><a name="[67]"></a>spi_i2s_flag_get</STRONG> (Thumb, 16 bytes, Stack size 0 bytes, gd32f10x_spi.o(i.spi_i2s_flag_get))
-<BR><BR>[Called By]<UL><LI><a href="#[66]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI0_ReadWriteByte
+<P><STRONG><a name="[64]"></a>spi_init</STRONG> (Thumb, 50 bytes, Stack size 0 bytes, gd32f10x_spi.o(i.spi_init))
+<BR><BR>[Called By]<UL><LI><a href="#[60]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI0_Init
 </UL>
 
-<P><STRONG><a name="[63]"></a>spi_init</STRONG> (Thumb, 50 bytes, Stack size 0 bytes, gd32f10x_spi.o(i.spi_init))
-<BR><BR>[Called By]<UL><LI><a href="#[5f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI0_Init
+<P><STRONG><a name="[5a]"></a>systick_clksource_set</STRONG> (Thumb, 40 bytes, Stack size 0 bytes, gd32f10x_misc.o(i.systick_clksource_set))
+<BR><BR>[Called By]<UL><LI><a href="#[59]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Delay_Init
 </UL>
 
-<P><STRONG><a name="[59]"></a>systick_clksource_set</STRONG> (Thumb, 40 bytes, Stack size 0 bytes, gd32f10x_misc.o(i.systick_clksource_set))
-<BR><BR>[Called By]<UL><LI><a href="#[58]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Delay_Init
+<P><STRONG><a name="[51]"></a>task_fwdgt_reload</STRONG> (Thumb, 12 bytes, Stack size 8 bytes, main.o(i.task_fwdgt_reload))
+<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = task_fwdgt_reload
+</UL>
+<BR>[Calls]<UL><LI><a href="#[7d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;fwdgt_write_enable
+<LI><a href="#[7e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;fwdgt_counter_reload
+</UL>
+<BR>[Called By]<UL><LI><a href="#[4f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;BootLoader_Brance
+<LI><a href="#[46]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
 </UL>
 <P>
 <H3>
 Local Symbols
 </H3>
-<P><STRONG><a name="[7b]"></a>system_clock_108m_hxtal</STRONG> (Thumb, 182 bytes, Stack size 0 bytes, system_gd32f10x.o(i.system_clock_108m_hxtal))
-<BR><BR>[Called By]<UL><LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;system_clock_config
+<P><STRONG><a name="[7c]"></a>system_clock_108m_hxtal</STRONG> (Thumb, 182 bytes, Stack size 0 bytes, system_gd32f10x.o(i.system_clock_108m_hxtal))
+<BR><BR>[Called By]<UL><LI><a href="#[6c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;system_clock_config
 </UL>
 
-<P><STRONG><a name="[6b]"></a>system_clock_config</STRONG> (Thumb, 8 bytes, Stack size 8 bytes, system_gd32f10x.o(i.system_clock_config))
+<P><STRONG><a name="[6c]"></a>system_clock_config</STRONG> (Thumb, 8 bytes, Stack size 8 bytes, system_gd32f10x.o(i.system_clock_config))
 <BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = system_clock_config
 </UL>
-<BR>[Calls]<UL><LI><a href="#[7b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;system_clock_108m_hxtal
+<BR>[Calls]<UL><LI><a href="#[7c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;system_clock_108m_hxtal
 </UL>
 <BR>[Called By]<UL><LI><a href="#[47]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SystemInit
 </UL>

+ 1 - 0
bootloader/OBJ/bootloader.lnp

@@ -14,6 +14,7 @@
 "..\obj\gd32f10x_gpio.o"
 "..\obj\gd32f10x_fmc.o"
 "..\obj\gd32f10x_spi.o"
+"..\obj\gd32f10x_fwdgt.o"
 "..\obj\main.o"
 --library_type=microlib --strict --scatter "..\OBJ\bootloader.sct"
 --summary_stderr --info summarysizes --map --load_addr_map_info --xref --callgraph --symbols

文件差異過大導致無法顯示
+ 50 - 19
bootloader/OBJ/bootloader_bootloader.dep


二進制
bootloader/OBJ/delay.crf


+ 1 - 0
bootloader/OBJ/delay.d

@@ -9,6 +9,7 @@
 ..\obj\delay.o: ..\USER\RTE_Components.h
 ..\obj\delay.o: ..\LIB\Include\gd32f10x_fmc.h
 ..\obj\delay.o: ..\CMSIS\Include\gd32f10x.h
+..\obj\delay.o: ..\LIB\Include\gd32f10x_fwdgt.h
 ..\obj\delay.o: ..\LIB\Include\gd32f10x_gpio.h
 ..\obj\delay.o: ..\LIB\Include\gd32f10x_misc.h
 ..\obj\delay.o: ..\LIB\Include\gd32f10x_rcu.h

二進制
bootloader/OBJ/fmc.crf


+ 1 - 0
bootloader/OBJ/fmc.d

@@ -9,6 +9,7 @@
 ..\obj\fmc.o: ..\USER\RTE_Components.h
 ..\obj\fmc.o: ..\LIB\Include\gd32f10x_fmc.h
 ..\obj\fmc.o: ..\CMSIS\Include\gd32f10x.h
+..\obj\fmc.o: ..\LIB\Include\gd32f10x_fwdgt.h
 ..\obj\fmc.o: ..\LIB\Include\gd32f10x_gpio.h
 ..\obj\fmc.o: ..\LIB\Include\gd32f10x_misc.h
 ..\obj\fmc.o: ..\LIB\Include\gd32f10x_rcu.h

二進制
bootloader/OBJ/gd32f10x_fmc.crf


+ 2 - 1
bootloader/OBJ/gd32f10x_fmc.d

@@ -9,8 +9,9 @@
 ..\obj\gd32f10x_fmc.o: D:\workSoftware\stm32Software\mdk\mdkpack\GigaDevice\GD32F10x_DFP\2.0.3\Device\Include\gd32f10x_libopt.h
 ..\obj\gd32f10x_fmc.o: ..\USER\RTE_Components.h
 ..\obj\gd32f10x_fmc.o: ..\LIB\Include\gd32f10x_fmc.h
-..\obj\gd32f10x_fmc.o: ..\LIB\Include\gd32f10x_gpio.h
+..\obj\gd32f10x_fmc.o: ..\LIB\Include\gd32f10x_fwdgt.h
 ..\obj\gd32f10x_fmc.o: ..\CMSIS\Include\gd32f10x.h
+..\obj\gd32f10x_fmc.o: ..\LIB\Include\gd32f10x_gpio.h
 ..\obj\gd32f10x_fmc.o: ..\LIB\Include\gd32f10x_misc.h
 ..\obj\gd32f10x_fmc.o: ..\LIB\Include\gd32f10x_rcu.h
 ..\obj\gd32f10x_fmc.o: ..\LIB\Include\gd32f10x_spi.h

二進制
bootloader/OBJ/gd32f10x_fwdgt.crf


+ 18 - 0
bootloader/OBJ/gd32f10x_fwdgt.d

@@ -0,0 +1,18 @@
+..\obj\gd32f10x_fwdgt.o: ..\LIB\Source\gd32f10x_fwdgt.c
+..\obj\gd32f10x_fwdgt.o: ..\LIB\Include\gd32f10x_fwdgt.h
+..\obj\gd32f10x_fwdgt.o: ..\CMSIS\Include\gd32f10x.h
+..\obj\gd32f10x_fwdgt.o: ..\CMSIS\Include\core_cm3.h
+..\obj\gd32f10x_fwdgt.o: D:\workSoftware\stm32Software\mdk\mdkcore\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\gd32f10x_fwdgt.o: ..\CMSIS\Include\core_cmInstr.h
+..\obj\gd32f10x_fwdgt.o: ..\CMSIS\Include\core_cmFunc.h
+..\obj\gd32f10x_fwdgt.o: ..\CMSIS\Include\system_gd32f10x.h
+..\obj\gd32f10x_fwdgt.o: D:\workSoftware\stm32Software\mdk\mdkpack\GigaDevice\GD32F10x_DFP\2.0.3\Device\Include\gd32f10x_libopt.h
+..\obj\gd32f10x_fwdgt.o: ..\USER\RTE_Components.h
+..\obj\gd32f10x_fwdgt.o: ..\LIB\Include\gd32f10x_fmc.h
+..\obj\gd32f10x_fwdgt.o: ..\CMSIS\Include\gd32f10x.h
+..\obj\gd32f10x_fwdgt.o: ..\LIB\Include\gd32f10x_fwdgt.h
+..\obj\gd32f10x_fwdgt.o: ..\LIB\Include\gd32f10x_gpio.h
+..\obj\gd32f10x_fwdgt.o: ..\LIB\Include\gd32f10x_misc.h
+..\obj\gd32f10x_fwdgt.o: ..\LIB\Include\gd32f10x_rcu.h
+..\obj\gd32f10x_fwdgt.o: ..\LIB\Include\gd32f10x_spi.h
+..\obj\gd32f10x_fwdgt.o: ..\LIB\Include\gd32f10x_wwdgt.h

二進制
bootloader/OBJ/gd32f10x_gpio.crf


+ 1 - 0
bootloader/OBJ/gd32f10x_gpio.d

@@ -10,6 +10,7 @@
 ..\obj\gd32f10x_gpio.o: ..\USER\RTE_Components.h
 ..\obj\gd32f10x_gpio.o: ..\LIB\Include\gd32f10x_fmc.h
 ..\obj\gd32f10x_gpio.o: ..\CMSIS\Include\gd32f10x.h
+..\obj\gd32f10x_gpio.o: ..\LIB\Include\gd32f10x_fwdgt.h
 ..\obj\gd32f10x_gpio.o: ..\LIB\Include\gd32f10x_gpio.h
 ..\obj\gd32f10x_gpio.o: ..\LIB\Include\gd32f10x_misc.h
 ..\obj\gd32f10x_gpio.o: ..\LIB\Include\gd32f10x_rcu.h

二進制
bootloader/OBJ/gd32f10x_it.crf


+ 1 - 0
bootloader/OBJ/gd32f10x_it.d

@@ -10,6 +10,7 @@
 ..\obj\gd32f10x_it.o: ..\USER\RTE_Components.h
 ..\obj\gd32f10x_it.o: ..\LIB\Include\gd32f10x_fmc.h
 ..\obj\gd32f10x_it.o: ..\CMSIS\Include\gd32f10x.h
+..\obj\gd32f10x_it.o: ..\LIB\Include\gd32f10x_fwdgt.h
 ..\obj\gd32f10x_it.o: ..\LIB\Include\gd32f10x_gpio.h
 ..\obj\gd32f10x_it.o: ..\LIB\Include\gd32f10x_misc.h
 ..\obj\gd32f10x_it.o: ..\LIB\Include\gd32f10x_rcu.h

二進制
bootloader/OBJ/gd32f10x_misc.crf


+ 1 - 0
bootloader/OBJ/gd32f10x_misc.d

@@ -10,6 +10,7 @@
 ..\obj\gd32f10x_misc.o: ..\USER\RTE_Components.h
 ..\obj\gd32f10x_misc.o: ..\LIB\Include\gd32f10x_fmc.h
 ..\obj\gd32f10x_misc.o: ..\CMSIS\Include\gd32f10x.h
+..\obj\gd32f10x_misc.o: ..\LIB\Include\gd32f10x_fwdgt.h
 ..\obj\gd32f10x_misc.o: ..\LIB\Include\gd32f10x_gpio.h
 ..\obj\gd32f10x_misc.o: ..\LIB\Include\gd32f10x_misc.h
 ..\obj\gd32f10x_misc.o: ..\LIB\Include\gd32f10x_rcu.h

二進制
bootloader/OBJ/gd32f10x_rcu.crf


+ 1 - 0
bootloader/OBJ/gd32f10x_rcu.d

@@ -10,6 +10,7 @@
 ..\obj\gd32f10x_rcu.o: ..\USER\RTE_Components.h
 ..\obj\gd32f10x_rcu.o: ..\LIB\Include\gd32f10x_fmc.h
 ..\obj\gd32f10x_rcu.o: ..\CMSIS\Include\gd32f10x.h
+..\obj\gd32f10x_rcu.o: ..\LIB\Include\gd32f10x_fwdgt.h
 ..\obj\gd32f10x_rcu.o: ..\LIB\Include\gd32f10x_gpio.h
 ..\obj\gd32f10x_rcu.o: ..\LIB\Include\gd32f10x_misc.h
 ..\obj\gd32f10x_rcu.o: ..\LIB\Include\gd32f10x_rcu.h

二進制
bootloader/OBJ/gd32f10x_spi.crf


+ 1 - 0
bootloader/OBJ/gd32f10x_spi.d

@@ -10,6 +10,7 @@
 ..\obj\gd32f10x_spi.o: ..\USER\RTE_Components.h
 ..\obj\gd32f10x_spi.o: ..\LIB\Include\gd32f10x_fmc.h
 ..\obj\gd32f10x_spi.o: ..\CMSIS\Include\gd32f10x.h
+..\obj\gd32f10x_spi.o: ..\LIB\Include\gd32f10x_fwdgt.h
 ..\obj\gd32f10x_spi.o: ..\LIB\Include\gd32f10x_gpio.h
 ..\obj\gd32f10x_spi.o: ..\LIB\Include\gd32f10x_misc.h
 ..\obj\gd32f10x_spi.o: ..\LIB\Include\gd32f10x_rcu.h

二進制
bootloader/OBJ/gd32f10x_wwdgt.crf


+ 1 - 0
bootloader/OBJ/gd32f10x_wwdgt.d

@@ -10,6 +10,7 @@
 ..\obj\gd32f10x_wwdgt.o: ..\USER\RTE_Components.h
 ..\obj\gd32f10x_wwdgt.o: ..\LIB\Include\gd32f10x_fmc.h
 ..\obj\gd32f10x_wwdgt.o: ..\CMSIS\Include\gd32f10x.h
+..\obj\gd32f10x_wwdgt.o: ..\LIB\Include\gd32f10x_fwdgt.h
 ..\obj\gd32f10x_wwdgt.o: ..\LIB\Include\gd32f10x_gpio.h
 ..\obj\gd32f10x_wwdgt.o: ..\LIB\Include\gd32f10x_misc.h
 ..\obj\gd32f10x_wwdgt.o: ..\LIB\Include\gd32f10x_rcu.h

二進制
bootloader/OBJ/main.crf


+ 1 - 0
bootloader/OBJ/main.d

@@ -9,6 +9,7 @@
 ..\obj\main.o: ..\USER\RTE_Components.h
 ..\obj\main.o: ..\LIB\Include\gd32f10x_fmc.h
 ..\obj\main.o: ..\CMSIS\Include\gd32f10x.h
+..\obj\main.o: ..\LIB\Include\gd32f10x_fwdgt.h
 ..\obj\main.o: ..\LIB\Include\gd32f10x_gpio.h
 ..\obj\main.o: ..\LIB\Include\gd32f10x_misc.h
 ..\obj\main.o: ..\LIB\Include\gd32f10x_rcu.h

二進制
bootloader/OBJ/ota_message.crf


+ 1 - 0
bootloader/OBJ/ota_message.d

@@ -10,6 +10,7 @@
 ..\obj\ota_message.o: ..\USER\RTE_Components.h
 ..\obj\ota_message.o: ..\LIB\Include\gd32f10x_fmc.h
 ..\obj\ota_message.o: ..\CMSIS\Include\gd32f10x.h
+..\obj\ota_message.o: ..\LIB\Include\gd32f10x_fwdgt.h
 ..\obj\ota_message.o: ..\LIB\Include\gd32f10x_gpio.h
 ..\obj\ota_message.o: ..\LIB\Include\gd32f10x_misc.h
 ..\obj\ota_message.o: ..\LIB\Include\gd32f10x_rcu.h

二進制
bootloader/OBJ/spi.crf


+ 1 - 0
bootloader/OBJ/spi.d

@@ -9,6 +9,7 @@
 ..\obj\spi.o: ..\USER\RTE_Components.h
 ..\obj\spi.o: ..\LIB\Include\gd32f10x_fmc.h
 ..\obj\spi.o: ..\CMSIS\Include\gd32f10x.h
+..\obj\spi.o: ..\LIB\Include\gd32f10x_fwdgt.h
 ..\obj\spi.o: ..\LIB\Include\gd32f10x_gpio.h
 ..\obj\spi.o: ..\LIB\Include\gd32f10x_misc.h
 ..\obj\spi.o: ..\LIB\Include\gd32f10x_rcu.h

二進制
bootloader/OBJ/system_gd32f10x.crf


+ 1 - 0
bootloader/OBJ/system_gd32f10x.d

@@ -9,6 +9,7 @@
 ..\obj\system_gd32f10x.o: ..\USER\RTE_Components.h
 ..\obj\system_gd32f10x.o: ..\LIB\Include\gd32f10x_fmc.h
 ..\obj\system_gd32f10x.o: ..\CMSIS\Include\gd32f10x.h
+..\obj\system_gd32f10x.o: ..\LIB\Include\gd32f10x_fwdgt.h
 ..\obj\system_gd32f10x.o: ..\LIB\Include\gd32f10x_gpio.h
 ..\obj\system_gd32f10x.o: ..\LIB\Include\gd32f10x_misc.h
 ..\obj\system_gd32f10x.o: ..\LIB\Include\gd32f10x_rcu.h

二進制
bootloader/OBJ/w25q32.crf


+ 1 - 0
bootloader/OBJ/w25q32.d

@@ -9,6 +9,7 @@
 ..\obj\w25q32.o: ..\USER\RTE_Components.h
 ..\obj\w25q32.o: ..\LIB\Include\gd32f10x_fmc.h
 ..\obj\w25q32.o: ..\CMSIS\Include\gd32f10x.h
+..\obj\w25q32.o: ..\LIB\Include\gd32f10x_fwdgt.h
 ..\obj\w25q32.o: ..\LIB\Include\gd32f10x_gpio.h
 ..\obj\w25q32.o: ..\LIB\Include\gd32f10x_misc.h
 ..\obj\w25q32.o: ..\LIB\Include\gd32f10x_rcu.h

文件差異過大導致無法顯示
+ 463 - 465
bootloader/USER/JLinkLog.txt


+ 254 - 230
bootloader/USER/Listings/bootloader.map

@@ -21,6 +21,7 @@ Section Cross References
     startup_gd32f10x_xd.o(.text) refers to system_gd32f10x.o(i.SystemInit) for SystemInit
     startup_gd32f10x_xd.o(.text) refers to entry.o(.ARM.Collect$$$$00000000) for __main
     boot.o(i.BootLoader_Brance) refers to fmc.o(i.GD32_EraseFlash) for GD32_EraseFlash
+    boot.o(i.BootLoader_Brance) refers to main.o(i.task_fwdgt_reload) for task_fwdgt_reload
     boot.o(i.BootLoader_Brance) refers to memseta.o(.text) for __aeabi_memclr4
     boot.o(i.BootLoader_Brance) refers to w25q32.o(i.W25Q32_Read) for W25Q32_Read
     boot.o(i.BootLoader_Brance) refers to fmc.o(i.GD32_WriteFlash) for GD32_WriteFlash
@@ -114,10 +115,13 @@ Section Cross References
     gd32f10x_spi.o(i.spi_i2s_deinit) refers to gd32f10x_rcu.o(i.rcu_periph_reset_disable) for rcu_periph_reset_disable
     main.o(i.main) refers to delay.o(i.Delay_Init) for Delay_Init
     main.o(i.main) refers to w25q32.o(i.W25Q32_Init) for W25Q32_Init
+    main.o(i.main) refers to main.o(i.task_fwdgt_reload) for task_fwdgt_reload
     main.o(i.main) refers to ota_message.o(i.load_ota_message_config_params) for load_ota_message_config_params
     main.o(i.main) refers to ota_message.o(i.get_config_params) for get_config_params
     main.o(i.main) refers to boot.o(i.BootLoader_Brance) for BootLoader_Brance
     main.o(i.main) refers to boot.o(i.LOAD_A) for LOAD_A
+    main.o(i.task_fwdgt_reload) refers to gd32f10x_fwdgt.o(i.fwdgt_write_enable) for fwdgt_write_enable
+    main.o(i.task_fwdgt_reload) refers to gd32f10x_fwdgt.o(i.fwdgt_counter_reload) for fwdgt_counter_reload
     entry.o(.ARM.Collect$$$$00000000) refers (Special) to entry10a.o(.ARM.Collect$$$$0000000D) for __rt_final_cpp
     entry.o(.ARM.Collect$$$$00000000) refers (Special) to entry11a.o(.ARM.Collect$$$$0000000F) for __rt_final_exit
     entry.o(.ARM.Collect$$$$00000000) refers (Special) to entry7b.o(.ARM.Collect$$$$00000008) for _main_clock
@@ -282,11 +286,19 @@ Removing Unused input sections from the image.
     Removing gd32f10x_spi.o(i.spi_nss_output_disable), (10 bytes).
     Removing gd32f10x_spi.o(i.spi_nss_output_enable), (10 bytes).
     Removing gd32f10x_spi.o(i.spi_struct_para_init), (18 bytes).
+    Removing gd32f10x_fwdgt.o(.rev16_text), (4 bytes).
+    Removing gd32f10x_fwdgt.o(.revsh_text), (4 bytes).
+    Removing gd32f10x_fwdgt.o(i.fwdgt_config), (104 bytes).
+    Removing gd32f10x_fwdgt.o(i.fwdgt_enable), (16 bytes).
+    Removing gd32f10x_fwdgt.o(i.fwdgt_flag_get), (24 bytes).
+    Removing gd32f10x_fwdgt.o(i.fwdgt_prescaler_value_config), (60 bytes).
+    Removing gd32f10x_fwdgt.o(i.fwdgt_reload_value_config), (64 bytes).
+    Removing gd32f10x_fwdgt.o(i.fwdgt_write_disable), (12 bytes).
     Removing main.o(.rev16_text), (4 bytes).
     Removing main.o(.revsh_text), (4 bytes).
     Removing main.o(.data), (8 bytes).
 
-146 unused section(s) (total 70566 bytes) removed from the image.
+154 unused section(s) (total 70854 bytes) removed from the image.
 
 ==============================================================================
 
@@ -296,19 +308,19 @@ Image Symbol Table
 
     Symbol Name                              Value     Ov Type        Size  Object(Section)
 
-    ../clib/microlib/init/entry.s            0x00000000   Number         0  entry10b.o ABSOLUTE
-    ../clib/microlib/init/entry.s            0x00000000   Number         0  entry8b.o ABSOLUTE
-    ../clib/microlib/init/entry.s            0x00000000   Number         0  entry9a.o ABSOLUTE
+    ../clib/microlib/init/entry.s            0x00000000   Number         0  entry5.o ABSOLUTE
+    ../clib/microlib/init/entry.s            0x00000000   Number         0  entry7b.o ABSOLUTE
     ../clib/microlib/init/entry.s            0x00000000   Number         0  entry2.o ABSOLUTE
     ../clib/microlib/init/entry.s            0x00000000   Number         0  entry11b.o ABSOLUTE
     ../clib/microlib/init/entry.s            0x00000000   Number         0  entry.o ABSOLUTE
+    ../clib/microlib/init/entry.s            0x00000000   Number         0  entry8b.o ABSOLUTE
     ../clib/microlib/init/entry.s            0x00000000   Number         0  entry11a.o ABSOLUTE
+    ../clib/microlib/init/entry.s            0x00000000   Number         0  entry7a.o ABSOLUTE
+    ../clib/microlib/init/entry.s            0x00000000   Number         0  entry10b.o ABSOLUTE
+    ../clib/microlib/init/entry.s            0x00000000   Number         0  entry9a.o ABSOLUTE
+    ../clib/microlib/init/entry.s            0x00000000   Number         0  entry9b.o ABSOLUTE
     ../clib/microlib/init/entry.s            0x00000000   Number         0  entry8a.o ABSOLUTE
     ../clib/microlib/init/entry.s            0x00000000   Number         0  entry10a.o ABSOLUTE
-    ../clib/microlib/init/entry.s            0x00000000   Number         0  entry5.o ABSOLUTE
-    ../clib/microlib/init/entry.s            0x00000000   Number         0  entry7b.o ABSOLUTE
-    ../clib/microlib/init/entry.s            0x00000000   Number         0  entry9b.o ABSOLUTE
-    ../clib/microlib/init/entry.s            0x00000000   Number         0  entry7a.o ABSOLUTE
     ../clib/microlib/string/memset.c         0x00000000   Number         0  memseta.o ABSOLUTE
     ..\CMSIS\Source\startup_gd32f10x_xd.s    0x00000000   Number         0  startup_gd32f10x_xd.o ABSOLUTE
     ..\CMSIS\Source\system_gd32f10x.c        0x00000000   Number         0  system_gd32f10x.o ABSOLUTE
@@ -320,6 +332,7 @@ Image Symbol Table
     ..\HW\Source\spi.c                       0x00000000   Number         0  spi.o ABSOLUTE
     ..\HW\Source\w25q32.c                    0x00000000   Number         0  w25q32.o ABSOLUTE
     ..\LIB\Source\gd32f10x_fmc.c             0x00000000   Number         0  gd32f10x_fmc.o ABSOLUTE
+    ..\LIB\Source\gd32f10x_fwdgt.c           0x00000000   Number         0  gd32f10x_fwdgt.o ABSOLUTE
     ..\LIB\Source\gd32f10x_gpio.c            0x00000000   Number         0  gd32f10x_gpio.o ABSOLUTE
     ..\LIB\Source\gd32f10x_misc.c            0x00000000   Number         0  gd32f10x_misc.o ABSOLUTE
     ..\LIB\Source\gd32f10x_rcu.c             0x00000000   Number         0  gd32f10x_rcu.o ABSOLUTE
@@ -334,6 +347,7 @@ Image Symbol Table
     ..\\HW\\Source\\spi.c                    0x00000000   Number         0  spi.o ABSOLUTE
     ..\\HW\\Source\\w25q32.c                 0x00000000   Number         0  w25q32.o ABSOLUTE
     ..\\LIB\\Source\\gd32f10x_fmc.c          0x00000000   Number         0  gd32f10x_fmc.o ABSOLUTE
+    ..\\LIB\\Source\\gd32f10x_fwdgt.c        0x00000000   Number         0  gd32f10x_fwdgt.o ABSOLUTE
     ..\\LIB\\Source\\gd32f10x_gpio.c         0x00000000   Number         0  gd32f10x_gpio.o ABSOLUTE
     ..\\LIB\\Source\\gd32f10x_misc.c         0x00000000   Number         0  gd32f10x_misc.o ABSOLUTE
     ..\\LIB\\Source\\gd32f10x_rcu.c          0x00000000   Number         0  gd32f10x_rcu.o ABSOLUTE
@@ -360,64 +374,67 @@ Image Symbol Table
     .text                                    0x08000170   Section        0  memseta.o(.text)
     .text                                    0x08000194   Section       36  init.o(.text)
     i.BootLoader_Brance                      0x080001b8   Section        0  boot.o(i.BootLoader_Brance)
-    i.BootLoader_Clear                       0x08000254   Section        0  boot.o(i.BootLoader_Clear)
-    i.BusFault_Handler                       0x0800026c   Section        0  gd32f10x_it.o(i.BusFault_Handler)
-    i.DebugMon_Handler                       0x08000270   Section        0  gd32f10x_it.o(i.DebugMon_Handler)
-    i.Delay_Init                             0x08000272   Section        0  delay.o(i.Delay_Init)
-    i.GD32_EraseFlash                        0x0800027c   Section        0  fmc.o(i.GD32_EraseFlash)
-    i.GD32_WriteFlash                        0x080002ac   Section        0  fmc.o(i.GD32_WriteFlash)
-    i.HardFault_Handler                      0x080002d2   Section        0  gd32f10x_it.o(i.HardFault_Handler)
-    i.LOAD_A                                 0x080002d8   Section        0  boot.o(i.LOAD_A)
-    i.MemManage_Handler                      0x0800030c   Section        0  gd32f10x_it.o(i.MemManage_Handler)
-    i.NMI_Handler                            0x08000310   Section        0  gd32f10x_it.o(i.NMI_Handler)
-    i.PendSV_Handler                         0x08000312   Section        0  gd32f10x_it.o(i.PendSV_Handler)
-    i.SPI0_Init                              0x08000314   Section        0  spi.o(i.SPI0_Init)
-    i.SPI0_Read                              0x0800037c   Section        0  spi.o(i.SPI0_Read)
-    i.SPI0_ReadWriteByte                     0x08000398   Section        0  spi.o(i.SPI0_ReadWriteByte)
-    i.SPI0_Write                             0x080003d0   Section        0  spi.o(i.SPI0_Write)
-    i.SVC_Handler                            0x080003ea   Section        0  gd32f10x_it.o(i.SVC_Handler)
-    i.SysTick_Handler                        0x080003ec   Section        0  gd32f10x_it.o(i.SysTick_Handler)
-    i.SystemInit                             0x080003f0   Section        0  system_gd32f10x.o(i.SystemInit)
-    i.UsageFault_Handler                     0x080004c4   Section        0  gd32f10x_it.o(i.UsageFault_Handler)
-    i.W25Q32_Enable                          0x080004c8   Section        0  w25q32.o(i.W25Q32_Enable)
-    i.W25Q32_Erase64K                        0x080004ec   Section        0  w25q32.o(i.W25Q32_Erase64K)
-    i.W25Q32_Init                            0x08000538   Section        0  w25q32.o(i.W25Q32_Init)
-    i.W25Q32_Read                            0x08000560   Section        0  w25q32.o(i.W25Q32_Read)
-    i.W25Q32_WaitBusy                        0x080005ac   Section        0  w25q32.o(i.W25Q32_WaitBusy)
-    i.__scatterload_copy                     0x080005dc   Section       14  handlers.o(i.__scatterload_copy)
-    i.__scatterload_null                     0x080005ea   Section        2  handlers.o(i.__scatterload_null)
-    i.__scatterload_zeroinit                 0x080005ec   Section       14  handlers.o(i.__scatterload_zeroinit)
-    i.clear_ota_message_config_block         0x080005fa   Section        0  ota_message.o(i.clear_ota_message_config_block)
-    i.fmc_bank0_ready_wait                   0x08000604   Section        0  gd32f10x_fmc.o(i.fmc_bank0_ready_wait)
-    i.fmc_bank0_state_get                    0x08000628   Section        0  gd32f10x_fmc.o(i.fmc_bank0_state_get)
-    i.fmc_bank1_ready_wait                   0x08000658   Section        0  gd32f10x_fmc.o(i.fmc_bank1_ready_wait)
-    i.fmc_bank1_state_get                    0x0800067c   Section        0  gd32f10x_fmc.o(i.fmc_bank1_state_get)
-    i.fmc_lock                               0x080006ac   Section        0  gd32f10x_fmc.o(i.fmc_lock)
-    i.fmc_page_erase                         0x080006d8   Section        0  gd32f10x_fmc.o(i.fmc_page_erase)
-    i.fmc_unlock                             0x080007c4   Section        0  gd32f10x_fmc.o(i.fmc_unlock)
-    i.fmc_word_program                       0x08000808   Section        0  gd32f10x_fmc.o(i.fmc_word_program)
-    i.get_config_params                      0x080008c8   Section        0  ota_message.o(i.get_config_params)
-    i.gpio_bit_reset                         0x080008d0   Section        0  gd32f10x_gpio.o(i.gpio_bit_reset)
-    i.gpio_bit_set                           0x080008d4   Section        0  gd32f10x_gpio.o(i.gpio_bit_set)
-    i.gpio_deinit                            0x080008d8   Section        0  gd32f10x_gpio.o(i.gpio_deinit)
-    i.gpio_init                              0x0800099c   Section        0  gd32f10x_gpio.o(i.gpio_init)
-    i.load_ota_message_config_params         0x08000a48   Section        0  ota_message.o(i.load_ota_message_config_params)
-    i.main                                   0x08000a70   Section        0  main.o(i.main)
-    i.nvic_vector_table_set                  0x08000a9c   Section        0  gd32f10x_misc.o(i.nvic_vector_table_set)
-    i.rcu_periph_clock_enable                0x08000ab4   Section        0  gd32f10x_rcu.o(i.rcu_periph_clock_enable)
-    i.rcu_periph_reset_disable               0x08000ad4   Section        0  gd32f10x_rcu.o(i.rcu_periph_reset_disable)
-    i.rcu_periph_reset_enable                0x08000af4   Section        0  gd32f10x_rcu.o(i.rcu_periph_reset_enable)
-    i.spi_enable                             0x08000b14   Section        0  gd32f10x_spi.o(i.spi_enable)
-    i.spi_i2s_data_receive                   0x08000b1e   Section        0  gd32f10x_spi.o(i.spi_i2s_data_receive)
-    i.spi_i2s_data_transmit                  0x08000b26   Section        0  gd32f10x_spi.o(i.spi_i2s_data_transmit)
-    i.spi_i2s_deinit                         0x08000b2c   Section        0  gd32f10x_spi.o(i.spi_i2s_deinit)
-    i.spi_i2s_flag_get                       0x08000b84   Section        0  gd32f10x_spi.o(i.spi_i2s_flag_get)
-    i.spi_init                               0x08000b94   Section        0  gd32f10x_spi.o(i.spi_init)
-    i.system_clock_108m_hxtal                0x08000bc8   Section        0  system_gd32f10x.o(i.system_clock_108m_hxtal)
-    system_clock_108m_hxtal                  0x08000bc9   Thumb Code   182  system_gd32f10x.o(i.system_clock_108m_hxtal)
-    i.system_clock_config                    0x08000c8c   Section        0  system_gd32f10x.o(i.system_clock_config)
-    system_clock_config                      0x08000c8d   Thumb Code     8  system_gd32f10x.o(i.system_clock_config)
-    i.systick_clksource_set                  0x08000c94   Section        0  gd32f10x_misc.o(i.systick_clksource_set)
+    i.BootLoader_Clear                       0x08000258   Section        0  boot.o(i.BootLoader_Clear)
+    i.BusFault_Handler                       0x08000270   Section        0  gd32f10x_it.o(i.BusFault_Handler)
+    i.DebugMon_Handler                       0x08000274   Section        0  gd32f10x_it.o(i.DebugMon_Handler)
+    i.Delay_Init                             0x08000276   Section        0  delay.o(i.Delay_Init)
+    i.GD32_EraseFlash                        0x08000280   Section        0  fmc.o(i.GD32_EraseFlash)
+    i.GD32_WriteFlash                        0x080002b0   Section        0  fmc.o(i.GD32_WriteFlash)
+    i.HardFault_Handler                      0x080002d6   Section        0  gd32f10x_it.o(i.HardFault_Handler)
+    i.LOAD_A                                 0x080002dc   Section        0  boot.o(i.LOAD_A)
+    i.MemManage_Handler                      0x08000310   Section        0  gd32f10x_it.o(i.MemManage_Handler)
+    i.NMI_Handler                            0x08000314   Section        0  gd32f10x_it.o(i.NMI_Handler)
+    i.PendSV_Handler                         0x08000316   Section        0  gd32f10x_it.o(i.PendSV_Handler)
+    i.SPI0_Init                              0x08000318   Section        0  spi.o(i.SPI0_Init)
+    i.SPI0_Read                              0x08000380   Section        0  spi.o(i.SPI0_Read)
+    i.SPI0_ReadWriteByte                     0x0800039c   Section        0  spi.o(i.SPI0_ReadWriteByte)
+    i.SPI0_Write                             0x080003d4   Section        0  spi.o(i.SPI0_Write)
+    i.SVC_Handler                            0x080003ee   Section        0  gd32f10x_it.o(i.SVC_Handler)
+    i.SysTick_Handler                        0x080003f0   Section        0  gd32f10x_it.o(i.SysTick_Handler)
+    i.SystemInit                             0x080003f4   Section        0  system_gd32f10x.o(i.SystemInit)
+    i.UsageFault_Handler                     0x080004c8   Section        0  gd32f10x_it.o(i.UsageFault_Handler)
+    i.W25Q32_Enable                          0x080004cc   Section        0  w25q32.o(i.W25Q32_Enable)
+    i.W25Q32_Erase64K                        0x080004f0   Section        0  w25q32.o(i.W25Q32_Erase64K)
+    i.W25Q32_Init                            0x0800053c   Section        0  w25q32.o(i.W25Q32_Init)
+    i.W25Q32_Read                            0x08000564   Section        0  w25q32.o(i.W25Q32_Read)
+    i.W25Q32_WaitBusy                        0x080005b0   Section        0  w25q32.o(i.W25Q32_WaitBusy)
+    i.__scatterload_copy                     0x080005e0   Section       14  handlers.o(i.__scatterload_copy)
+    i.__scatterload_null                     0x080005ee   Section        2  handlers.o(i.__scatterload_null)
+    i.__scatterload_zeroinit                 0x080005f0   Section       14  handlers.o(i.__scatterload_zeroinit)
+    i.clear_ota_message_config_block         0x080005fe   Section        0  ota_message.o(i.clear_ota_message_config_block)
+    i.fmc_bank0_ready_wait                   0x08000608   Section        0  gd32f10x_fmc.o(i.fmc_bank0_ready_wait)
+    i.fmc_bank0_state_get                    0x0800062c   Section        0  gd32f10x_fmc.o(i.fmc_bank0_state_get)
+    i.fmc_bank1_ready_wait                   0x0800065c   Section        0  gd32f10x_fmc.o(i.fmc_bank1_ready_wait)
+    i.fmc_bank1_state_get                    0x08000680   Section        0  gd32f10x_fmc.o(i.fmc_bank1_state_get)
+    i.fmc_lock                               0x080006b0   Section        0  gd32f10x_fmc.o(i.fmc_lock)
+    i.fmc_page_erase                         0x080006dc   Section        0  gd32f10x_fmc.o(i.fmc_page_erase)
+    i.fmc_unlock                             0x080007c8   Section        0  gd32f10x_fmc.o(i.fmc_unlock)
+    i.fmc_word_program                       0x0800080c   Section        0  gd32f10x_fmc.o(i.fmc_word_program)
+    i.fwdgt_counter_reload                   0x080008cc   Section        0  gd32f10x_fwdgt.o(i.fwdgt_counter_reload)
+    i.fwdgt_write_enable                     0x080008dc   Section        0  gd32f10x_fwdgt.o(i.fwdgt_write_enable)
+    i.get_config_params                      0x080008ec   Section        0  ota_message.o(i.get_config_params)
+    i.gpio_bit_reset                         0x080008f4   Section        0  gd32f10x_gpio.o(i.gpio_bit_reset)
+    i.gpio_bit_set                           0x080008f8   Section        0  gd32f10x_gpio.o(i.gpio_bit_set)
+    i.gpio_deinit                            0x080008fc   Section        0  gd32f10x_gpio.o(i.gpio_deinit)
+    i.gpio_init                              0x080009c0   Section        0  gd32f10x_gpio.o(i.gpio_init)
+    i.load_ota_message_config_params         0x08000a6c   Section        0  ota_message.o(i.load_ota_message_config_params)
+    i.main                                   0x08000a94   Section        0  main.o(i.main)
+    i.nvic_vector_table_set                  0x08000ac4   Section        0  gd32f10x_misc.o(i.nvic_vector_table_set)
+    i.rcu_periph_clock_enable                0x08000adc   Section        0  gd32f10x_rcu.o(i.rcu_periph_clock_enable)
+    i.rcu_periph_reset_disable               0x08000afc   Section        0  gd32f10x_rcu.o(i.rcu_periph_reset_disable)
+    i.rcu_periph_reset_enable                0x08000b1c   Section        0  gd32f10x_rcu.o(i.rcu_periph_reset_enable)
+    i.spi_enable                             0x08000b3c   Section        0  gd32f10x_spi.o(i.spi_enable)
+    i.spi_i2s_data_receive                   0x08000b46   Section        0  gd32f10x_spi.o(i.spi_i2s_data_receive)
+    i.spi_i2s_data_transmit                  0x08000b4e   Section        0  gd32f10x_spi.o(i.spi_i2s_data_transmit)
+    i.spi_i2s_deinit                         0x08000b54   Section        0  gd32f10x_spi.o(i.spi_i2s_deinit)
+    i.spi_i2s_flag_get                       0x08000bac   Section        0  gd32f10x_spi.o(i.spi_i2s_flag_get)
+    i.spi_init                               0x08000bbc   Section        0  gd32f10x_spi.o(i.spi_init)
+    i.system_clock_108m_hxtal                0x08000bf0   Section        0  system_gd32f10x.o(i.system_clock_108m_hxtal)
+    system_clock_108m_hxtal                  0x08000bf1   Thumb Code   182  system_gd32f10x.o(i.system_clock_108m_hxtal)
+    i.system_clock_config                    0x08000cb4   Section        0  system_gd32f10x.o(i.system_clock_config)
+    system_clock_config                      0x08000cb5   Thumb Code     8  system_gd32f10x.o(i.system_clock_config)
+    i.systick_clksource_set                  0x08000cbc   Section        0  gd32f10x_misc.o(i.systick_clksource_set)
+    i.task_fwdgt_reload                      0x08000ce4   Section        0  main.o(i.task_fwdgt_reload)
     .data                                    0x20000000   Section        4  boot.o(.data)
     .data                                    0x20000004   Section        8  ota_message.o(.data)
     ota_message                              0x20000004   Data           8  ota_message.o(.data)
@@ -517,63 +534,66 @@ Image Symbol Table
     _memset$wrapper                          0x08000183   Thumb Code    18  memseta.o(.text)
     __scatterload                            0x08000195   Thumb Code    28  init.o(.text)
     __scatterload_rt2                        0x08000195   Thumb Code     0  init.o(.text)
-    BootLoader_Brance                        0x080001b9   Thumb Code   150  boot.o(i.BootLoader_Brance)
-    BootLoader_Clear                         0x08000255   Thumb Code    16  boot.o(i.BootLoader_Clear)
-    BusFault_Handler                         0x0800026d   Thumb Code     4  gd32f10x_it.o(i.BusFault_Handler)
-    DebugMon_Handler                         0x08000271   Thumb Code     2  gd32f10x_it.o(i.DebugMon_Handler)
-    Delay_Init                               0x08000273   Thumb Code    10  delay.o(i.Delay_Init)
-    GD32_EraseFlash                          0x0800027d   Thumb Code    48  fmc.o(i.GD32_EraseFlash)
-    GD32_WriteFlash                          0x080002ad   Thumb Code    38  fmc.o(i.GD32_WriteFlash)
-    HardFault_Handler                        0x080002d3   Thumb Code     4  gd32f10x_it.o(i.HardFault_Handler)
-    LOAD_A                                   0x080002d9   Thumb Code    44  boot.o(i.LOAD_A)
-    MemManage_Handler                        0x0800030d   Thumb Code     4  gd32f10x_it.o(i.MemManage_Handler)
-    NMI_Handler                              0x08000311   Thumb Code     2  gd32f10x_it.o(i.NMI_Handler)
-    PendSV_Handler                           0x08000313   Thumb Code     2  gd32f10x_it.o(i.PendSV_Handler)
-    SPI0_Init                                0x08000315   Thumb Code    94  spi.o(i.SPI0_Init)
-    SPI0_Read                                0x0800037d   Thumb Code    28  spi.o(i.SPI0_Read)
-    SPI0_ReadWriteByte                       0x08000399   Thumb Code    50  spi.o(i.SPI0_ReadWriteByte)
-    SPI0_Write                               0x080003d1   Thumb Code    26  spi.o(i.SPI0_Write)
-    SVC_Handler                              0x080003eb   Thumb Code     2  gd32f10x_it.o(i.SVC_Handler)
-    SysTick_Handler                          0x080003ed   Thumb Code     2  gd32f10x_it.o(i.SysTick_Handler)
-    SystemInit                               0x080003f1   Thumb Code   196  system_gd32f10x.o(i.SystemInit)
-    UsageFault_Handler                       0x080004c5   Thumb Code     4  gd32f10x_it.o(i.UsageFault_Handler)
-    W25Q32_Enable                            0x080004c9   Thumb Code    30  w25q32.o(i.W25Q32_Enable)
-    W25Q32_Erase64K                          0x080004ed   Thumb Code    70  w25q32.o(i.W25Q32_Erase64K)
-    W25Q32_Init                              0x08000539   Thumb Code    36  w25q32.o(i.W25Q32_Init)
-    W25Q32_Read                              0x08000561   Thumb Code    70  w25q32.o(i.W25Q32_Read)
-    W25Q32_WaitBusy                          0x080005ad   Thumb Code    44  w25q32.o(i.W25Q32_WaitBusy)
-    __scatterload_copy                       0x080005dd   Thumb Code    14  handlers.o(i.__scatterload_copy)
-    __scatterload_null                       0x080005eb   Thumb Code     2  handlers.o(i.__scatterload_null)
-    __scatterload_zeroinit                   0x080005ed   Thumb Code    14  handlers.o(i.__scatterload_zeroinit)
-    clear_ota_message_config_block           0x080005fb   Thumb Code    10  ota_message.o(i.clear_ota_message_config_block)
-    fmc_bank0_ready_wait                     0x08000605   Thumb Code    34  gd32f10x_fmc.o(i.fmc_bank0_ready_wait)
-    fmc_bank0_state_get                      0x08000629   Thumb Code    44  gd32f10x_fmc.o(i.fmc_bank0_state_get)
-    fmc_bank1_ready_wait                     0x08000659   Thumb Code    34  gd32f10x_fmc.o(i.fmc_bank1_ready_wait)
-    fmc_bank1_state_get                      0x0800067d   Thumb Code    44  gd32f10x_fmc.o(i.fmc_bank1_state_get)
-    fmc_lock                                 0x080006ad   Thumb Code    34  gd32f10x_fmc.o(i.fmc_lock)
-    fmc_page_erase                           0x080006d9   Thumb Code   222  gd32f10x_fmc.o(i.fmc_page_erase)
-    fmc_unlock                               0x080007c5   Thumb Code    52  gd32f10x_fmc.o(i.fmc_unlock)
-    fmc_word_program                         0x08000809   Thumb Code   178  gd32f10x_fmc.o(i.fmc_word_program)
-    get_config_params                        0x080008c9   Thumb Code     4  ota_message.o(i.get_config_params)
-    gpio_bit_reset                           0x080008d1   Thumb Code     4  gd32f10x_gpio.o(i.gpio_bit_reset)
-    gpio_bit_set                             0x080008d5   Thumb Code     4  gd32f10x_gpio.o(i.gpio_bit_set)
-    gpio_deinit                              0x080008d9   Thumb Code   186  gd32f10x_gpio.o(i.gpio_deinit)
-    gpio_init                                0x0800099d   Thumb Code   172  gd32f10x_gpio.o(i.gpio_init)
-    load_ota_message_config_params           0x08000a49   Thumb Code    36  ota_message.o(i.load_ota_message_config_params)
-    main                                     0x08000a71   Thumb Code    38  main.o(i.main)
-    nvic_vector_table_set                    0x08000a9d   Thumb Code    16  gd32f10x_misc.o(i.nvic_vector_table_set)
-    rcu_periph_clock_enable                  0x08000ab5   Thumb Code    28  gd32f10x_rcu.o(i.rcu_periph_clock_enable)
-    rcu_periph_reset_disable                 0x08000ad5   Thumb Code    28  gd32f10x_rcu.o(i.rcu_periph_reset_disable)
-    rcu_periph_reset_enable                  0x08000af5   Thumb Code    28  gd32f10x_rcu.o(i.rcu_periph_reset_enable)
-    spi_enable                               0x08000b15   Thumb Code    10  gd32f10x_spi.o(i.spi_enable)
-    spi_i2s_data_receive                     0x08000b1f   Thumb Code     8  gd32f10x_spi.o(i.spi_i2s_data_receive)
-    spi_i2s_data_transmit                    0x08000b27   Thumb Code     4  gd32f10x_spi.o(i.spi_i2s_data_transmit)
-    spi_i2s_deinit                           0x08000b2d   Thumb Code    82  gd32f10x_spi.o(i.spi_i2s_deinit)
-    spi_i2s_flag_get                         0x08000b85   Thumb Code    16  gd32f10x_spi.o(i.spi_i2s_flag_get)
-    spi_init                                 0x08000b95   Thumb Code    50  gd32f10x_spi.o(i.spi_init)
-    systick_clksource_set                    0x08000c95   Thumb Code    40  gd32f10x_misc.o(i.systick_clksource_set)
-    Region$$Table$$Base                      0x08000cbc   Number         0  anon$$obj.o(Region$$Table)
-    Region$$Table$$Limit                     0x08000cdc   Number         0  anon$$obj.o(Region$$Table)
+    BootLoader_Brance                        0x080001b9   Thumb Code   154  boot.o(i.BootLoader_Brance)
+    BootLoader_Clear                         0x08000259   Thumb Code    16  boot.o(i.BootLoader_Clear)
+    BusFault_Handler                         0x08000271   Thumb Code     4  gd32f10x_it.o(i.BusFault_Handler)
+    DebugMon_Handler                         0x08000275   Thumb Code     2  gd32f10x_it.o(i.DebugMon_Handler)
+    Delay_Init                               0x08000277   Thumb Code    10  delay.o(i.Delay_Init)
+    GD32_EraseFlash                          0x08000281   Thumb Code    48  fmc.o(i.GD32_EraseFlash)
+    GD32_WriteFlash                          0x080002b1   Thumb Code    38  fmc.o(i.GD32_WriteFlash)
+    HardFault_Handler                        0x080002d7   Thumb Code     4  gd32f10x_it.o(i.HardFault_Handler)
+    LOAD_A                                   0x080002dd   Thumb Code    44  boot.o(i.LOAD_A)
+    MemManage_Handler                        0x08000311   Thumb Code     4  gd32f10x_it.o(i.MemManage_Handler)
+    NMI_Handler                              0x08000315   Thumb Code     2  gd32f10x_it.o(i.NMI_Handler)
+    PendSV_Handler                           0x08000317   Thumb Code     2  gd32f10x_it.o(i.PendSV_Handler)
+    SPI0_Init                                0x08000319   Thumb Code    94  spi.o(i.SPI0_Init)
+    SPI0_Read                                0x08000381   Thumb Code    28  spi.o(i.SPI0_Read)
+    SPI0_ReadWriteByte                       0x0800039d   Thumb Code    50  spi.o(i.SPI0_ReadWriteByte)
+    SPI0_Write                               0x080003d5   Thumb Code    26  spi.o(i.SPI0_Write)
+    SVC_Handler                              0x080003ef   Thumb Code     2  gd32f10x_it.o(i.SVC_Handler)
+    SysTick_Handler                          0x080003f1   Thumb Code     2  gd32f10x_it.o(i.SysTick_Handler)
+    SystemInit                               0x080003f5   Thumb Code   196  system_gd32f10x.o(i.SystemInit)
+    UsageFault_Handler                       0x080004c9   Thumb Code     4  gd32f10x_it.o(i.UsageFault_Handler)
+    W25Q32_Enable                            0x080004cd   Thumb Code    30  w25q32.o(i.W25Q32_Enable)
+    W25Q32_Erase64K                          0x080004f1   Thumb Code    70  w25q32.o(i.W25Q32_Erase64K)
+    W25Q32_Init                              0x0800053d   Thumb Code    36  w25q32.o(i.W25Q32_Init)
+    W25Q32_Read                              0x08000565   Thumb Code    70  w25q32.o(i.W25Q32_Read)
+    W25Q32_WaitBusy                          0x080005b1   Thumb Code    44  w25q32.o(i.W25Q32_WaitBusy)
+    __scatterload_copy                       0x080005e1   Thumb Code    14  handlers.o(i.__scatterload_copy)
+    __scatterload_null                       0x080005ef   Thumb Code     2  handlers.o(i.__scatterload_null)
+    __scatterload_zeroinit                   0x080005f1   Thumb Code    14  handlers.o(i.__scatterload_zeroinit)
+    clear_ota_message_config_block           0x080005ff   Thumb Code    10  ota_message.o(i.clear_ota_message_config_block)
+    fmc_bank0_ready_wait                     0x08000609   Thumb Code    34  gd32f10x_fmc.o(i.fmc_bank0_ready_wait)
+    fmc_bank0_state_get                      0x0800062d   Thumb Code    44  gd32f10x_fmc.o(i.fmc_bank0_state_get)
+    fmc_bank1_ready_wait                     0x0800065d   Thumb Code    34  gd32f10x_fmc.o(i.fmc_bank1_ready_wait)
+    fmc_bank1_state_get                      0x08000681   Thumb Code    44  gd32f10x_fmc.o(i.fmc_bank1_state_get)
+    fmc_lock                                 0x080006b1   Thumb Code    34  gd32f10x_fmc.o(i.fmc_lock)
+    fmc_page_erase                           0x080006dd   Thumb Code   222  gd32f10x_fmc.o(i.fmc_page_erase)
+    fmc_unlock                               0x080007c9   Thumb Code    52  gd32f10x_fmc.o(i.fmc_unlock)
+    fmc_word_program                         0x0800080d   Thumb Code   178  gd32f10x_fmc.o(i.fmc_word_program)
+    fwdgt_counter_reload                     0x080008cd   Thumb Code    10  gd32f10x_fwdgt.o(i.fwdgt_counter_reload)
+    fwdgt_write_enable                       0x080008dd   Thumb Code    10  gd32f10x_fwdgt.o(i.fwdgt_write_enable)
+    get_config_params                        0x080008ed   Thumb Code     4  ota_message.o(i.get_config_params)
+    gpio_bit_reset                           0x080008f5   Thumb Code     4  gd32f10x_gpio.o(i.gpio_bit_reset)
+    gpio_bit_set                             0x080008f9   Thumb Code     4  gd32f10x_gpio.o(i.gpio_bit_set)
+    gpio_deinit                              0x080008fd   Thumb Code   186  gd32f10x_gpio.o(i.gpio_deinit)
+    gpio_init                                0x080009c1   Thumb Code   172  gd32f10x_gpio.o(i.gpio_init)
+    load_ota_message_config_params           0x08000a6d   Thumb Code    36  ota_message.o(i.load_ota_message_config_params)
+    main                                     0x08000a95   Thumb Code    42  main.o(i.main)
+    nvic_vector_table_set                    0x08000ac5   Thumb Code    16  gd32f10x_misc.o(i.nvic_vector_table_set)
+    rcu_periph_clock_enable                  0x08000add   Thumb Code    28  gd32f10x_rcu.o(i.rcu_periph_clock_enable)
+    rcu_periph_reset_disable                 0x08000afd   Thumb Code    28  gd32f10x_rcu.o(i.rcu_periph_reset_disable)
+    rcu_periph_reset_enable                  0x08000b1d   Thumb Code    28  gd32f10x_rcu.o(i.rcu_periph_reset_enable)
+    spi_enable                               0x08000b3d   Thumb Code    10  gd32f10x_spi.o(i.spi_enable)
+    spi_i2s_data_receive                     0x08000b47   Thumb Code     8  gd32f10x_spi.o(i.spi_i2s_data_receive)
+    spi_i2s_data_transmit                    0x08000b4f   Thumb Code     4  gd32f10x_spi.o(i.spi_i2s_data_transmit)
+    spi_i2s_deinit                           0x08000b55   Thumb Code    82  gd32f10x_spi.o(i.spi_i2s_deinit)
+    spi_i2s_flag_get                         0x08000bad   Thumb Code    16  gd32f10x_spi.o(i.spi_i2s_flag_get)
+    spi_init                                 0x08000bbd   Thumb Code    50  gd32f10x_spi.o(i.spi_init)
+    systick_clksource_set                    0x08000cbd   Thumb Code    40  gd32f10x_misc.o(i.systick_clksource_set)
+    task_fwdgt_reload                        0x08000ce5   Thumb Code    12  main.o(i.task_fwdgt_reload)
+    Region$$Table$$Base                      0x08000cf0   Number         0  anon$$obj.o(Region$$Table)
+    Region$$Table$$Limit                     0x08000d10   Number         0  anon$$obj.o(Region$$Table)
     load_A                                   0x20000000   Data           4  boot.o(.data)
     __initial_sp                             0x20001010   Data           0  startup_gd32f10x_xd.o(STACK)
 
@@ -585,101 +605,104 @@ Memory Map of the image
 
   Image Entry point : 0x08000131
 
-  Load Region LR_IROM1 (Base: 0x08000000, Size: 0x00000ce8, Max: 0x00005000, ABSOLUTE)
+  Load Region LR_IROM1 (Base: 0x08000000, Size: 0x00000d1c, Max: 0x00005000, ABSOLUTE)
 
-    Execution Region ER_IROM1 (Exec base: 0x08000000, Load base: 0x08000000, Size: 0x00000cdc, Max: 0x00005000, ABSOLUTE)
+    Execution Region ER_IROM1 (Exec base: 0x08000000, Load base: 0x08000000, Size: 0x00000d10, Max: 0x00005000, ABSOLUTE)
 
     Exec Addr    Load Addr    Size         Type   Attr      Idx    E Section Name        Object
 
-    0x08000000   0x08000000   0x00000130   Data   RO           82    RESET               startup_gd32f10x_xd.o
-    0x08000130   0x08000130   0x00000000   Code   RO         1319  * .ARM.Collect$$$$00000000  mc_w.l(entry.o)
-    0x08000130   0x08000130   0x00000004   Code   RO         1324    .ARM.Collect$$$$00000001  mc_w.l(entry2.o)
-    0x08000134   0x08000134   0x00000004   Code   RO         1327    .ARM.Collect$$$$00000004  mc_w.l(entry5.o)
-    0x08000138   0x08000138   0x00000000   Code   RO         1329    .ARM.Collect$$$$00000008  mc_w.l(entry7b.o)
-    0x08000138   0x08000138   0x00000000   Code   RO         1331    .ARM.Collect$$$$0000000A  mc_w.l(entry8b.o)
-    0x08000138   0x08000138   0x00000008   Code   RO         1332    .ARM.Collect$$$$0000000B  mc_w.l(entry9a.o)
-    0x08000140   0x08000140   0x00000000   Code   RO         1334    .ARM.Collect$$$$0000000D  mc_w.l(entry10a.o)
-    0x08000140   0x08000140   0x00000000   Code   RO         1336    .ARM.Collect$$$$0000000F  mc_w.l(entry11a.o)
-    0x08000140   0x08000140   0x00000004   Code   RO         1325    .ARM.Collect$$$$00002712  mc_w.l(entry2.o)
-    0x08000144   0x08000144   0x00000006   Code   RO           89    .emb_text           boot.o
+    0x08000000   0x08000000   0x00000130   Data   RO           85    RESET               startup_gd32f10x_xd.o
+    0x08000130   0x08000130   0x00000000   Code   RO         1390  * .ARM.Collect$$$$00000000  mc_w.l(entry.o)
+    0x08000130   0x08000130   0x00000004   Code   RO         1395    .ARM.Collect$$$$00000001  mc_w.l(entry2.o)
+    0x08000134   0x08000134   0x00000004   Code   RO         1398    .ARM.Collect$$$$00000004  mc_w.l(entry5.o)
+    0x08000138   0x08000138   0x00000000   Code   RO         1400    .ARM.Collect$$$$00000008  mc_w.l(entry7b.o)
+    0x08000138   0x08000138   0x00000000   Code   RO         1402    .ARM.Collect$$$$0000000A  mc_w.l(entry8b.o)
+    0x08000138   0x08000138   0x00000008   Code   RO         1403    .ARM.Collect$$$$0000000B  mc_w.l(entry9a.o)
+    0x08000140   0x08000140   0x00000000   Code   RO         1405    .ARM.Collect$$$$0000000D  mc_w.l(entry10a.o)
+    0x08000140   0x08000140   0x00000000   Code   RO         1407    .ARM.Collect$$$$0000000F  mc_w.l(entry11a.o)
+    0x08000140   0x08000140   0x00000004   Code   RO         1396    .ARM.Collect$$$$00002712  mc_w.l(entry2.o)
+    0x08000144   0x08000144   0x00000006   Code   RO           92    .emb_text           boot.o
     0x0800014a   0x0800014a   0x00000002   PAD
-    0x0800014c   0x0800014c   0x00000024   Code   RO           83    .text               startup_gd32f10x_xd.o
-    0x08000170   0x08000170   0x00000024   Code   RO         1322    .text               mc_w.l(memseta.o)
-    0x08000194   0x08000194   0x00000024   Code   RO         1338    .text               mc_w.l(init.o)
-    0x080001b8   0x080001b8   0x0000009c   Code   RO           90    i.BootLoader_Brance  boot.o
-    0x08000254   0x08000254   0x00000018   Code   RO           91    i.BootLoader_Clear  boot.o
-    0x0800026c   0x0800026c   0x00000004   Code   RO          213    i.BusFault_Handler  gd32f10x_it.o
-    0x08000270   0x08000270   0x00000002   Code   RO          214    i.DebugMon_Handler  gd32f10x_it.o
-    0x08000272   0x08000272   0x0000000a   Code   RO          155    i.Delay_Init        delay.o
-    0x0800027c   0x0800027c   0x00000030   Code   RO          187    i.GD32_EraseFlash   fmc.o
-    0x080002ac   0x080002ac   0x00000026   Code   RO          188    i.GD32_WriteFlash   fmc.o
-    0x080002d2   0x080002d2   0x00000004   Code   RO          215    i.HardFault_Handler  gd32f10x_it.o
-    0x080002d6   0x080002d6   0x00000002   PAD
-    0x080002d8   0x080002d8   0x00000034   Code   RO           92    i.LOAD_A            boot.o
-    0x0800030c   0x0800030c   0x00000004   Code   RO          216    i.MemManage_Handler  gd32f10x_it.o
-    0x08000310   0x08000310   0x00000002   Code   RO          217    i.NMI_Handler       gd32f10x_it.o
-    0x08000312   0x08000312   0x00000002   Code   RO          218    i.PendSV_Handler    gd32f10x_it.o
-    0x08000314   0x08000314   0x00000068   Code   RO          284    i.SPI0_Init         spi.o
-    0x0800037c   0x0800037c   0x0000001c   Code   RO          285    i.SPI0_Read         spi.o
-    0x08000398   0x08000398   0x00000038   Code   RO          286    i.SPI0_ReadWriteByte  spi.o
-    0x080003d0   0x080003d0   0x0000001a   Code   RO          287    i.SPI0_Write        spi.o
-    0x080003ea   0x080003ea   0x00000002   Code   RO          219    i.SVC_Handler       gd32f10x_it.o
-    0x080003ec   0x080003ec   0x00000002   Code   RO          220    i.SysTick_Handler   gd32f10x_it.o
-    0x080003ee   0x080003ee   0x00000002   PAD
-    0x080003f0   0x080003f0   0x000000d4   Code   RO            3    i.SystemInit        system_gd32f10x.o
-    0x080004c4   0x080004c4   0x00000004   Code   RO          221    i.UsageFault_Handler  gd32f10x_it.o
-    0x080004c8   0x080004c8   0x00000024   Code   RO          325    i.W25Q32_Enable     w25q32.o
-    0x080004ec   0x080004ec   0x0000004c   Code   RO          326    i.W25Q32_Erase64K   w25q32.o
-    0x08000538   0x08000538   0x00000028   Code   RO          327    i.W25Q32_Init       w25q32.o
-    0x08000560   0x08000560   0x0000004c   Code   RO          329    i.W25Q32_Read       w25q32.o
-    0x080005ac   0x080005ac   0x00000030   Code   RO          330    i.W25Q32_WaitBusy   w25q32.o
-    0x080005dc   0x080005dc   0x0000000e   Code   RO         1342    i.__scatterload_copy  mc_w.l(handlers.o)
-    0x080005ea   0x080005ea   0x00000002   Code   RO         1343    i.__scatterload_null  mc_w.l(handlers.o)
-    0x080005ec   0x080005ec   0x0000000e   Code   RO         1344    i.__scatterload_zeroinit  mc_w.l(handlers.o)
-    0x080005fa   0x080005fa   0x0000000a   Code   RO          375    i.clear_ota_message_config_block  ota_message.o
-    0x08000604   0x08000604   0x00000022   Code   RO          885    i.fmc_bank0_ready_wait  gd32f10x_fmc.o
-    0x08000626   0x08000626   0x00000002   PAD
-    0x08000628   0x08000628   0x00000030   Code   RO          886    i.fmc_bank0_state_get  gd32f10x_fmc.o
-    0x08000658   0x08000658   0x00000022   Code   RO          890    i.fmc_bank1_ready_wait  gd32f10x_fmc.o
-    0x0800067a   0x0800067a   0x00000002   PAD
-    0x0800067c   0x0800067c   0x00000030   Code   RO          891    i.fmc_bank1_state_get  gd32f10x_fmc.o
-    0x080006ac   0x080006ac   0x0000002c   Code   RO          900    i.fmc_lock          gd32f10x_fmc.o
-    0x080006d8   0x080006d8   0x000000ec   Code   RO          902    i.fmc_page_erase    gd32f10x_fmc.o
-    0x080007c4   0x080007c4   0x00000044   Code   RO          903    i.fmc_unlock        gd32f10x_fmc.o
-    0x08000808   0x08000808   0x000000c0   Code   RO          904    i.fmc_word_program  gd32f10x_fmc.o
-    0x080008c8   0x080008c8   0x00000008   Code   RO          376    i.get_config_params  ota_message.o
-    0x080008d0   0x080008d0   0x00000004   Code   RO          768    i.gpio_bit_reset    gd32f10x_gpio.o
-    0x080008d4   0x080008d4   0x00000004   Code   RO          769    i.gpio_bit_set      gd32f10x_gpio.o
-    0x080008d8   0x080008d8   0x000000c4   Code   RO          771    i.gpio_deinit       gd32f10x_gpio.o
-    0x0800099c   0x0800099c   0x000000ac   Code   RO          776    i.gpio_init         gd32f10x_gpio.o
-    0x08000a48   0x08000a48   0x00000028   Code   RO          377    i.load_ota_message_config_params  ota_message.o
-    0x08000a70   0x08000a70   0x0000002c   Code   RO         1295    i.main              main.o
-    0x08000a9c   0x08000a9c   0x00000018   Code   RO          484    i.nvic_vector_table_set  gd32f10x_misc.o
-    0x08000ab4   0x08000ab4   0x00000020   Code   RO          562    i.rcu_periph_clock_enable  gd32f10x_rcu.o
-    0x08000ad4   0x08000ad4   0x00000020   Code   RO          565    i.rcu_periph_reset_disable  gd32f10x_rcu.o
-    0x08000af4   0x08000af4   0x00000020   Code   RO          566    i.rcu_periph_reset_enable  gd32f10x_rcu.o
-    0x08000b14   0x08000b14   0x0000000a   Code   RO         1116    i.spi_enable        gd32f10x_spi.o
-    0x08000b1e   0x08000b1e   0x00000008   Code   RO         1118    i.spi_i2s_data_receive  gd32f10x_spi.o
-    0x08000b26   0x08000b26   0x00000004   Code   RO         1119    i.spi_i2s_data_transmit  gd32f10x_spi.o
-    0x08000b2a   0x08000b2a   0x00000002   PAD
-    0x08000b2c   0x08000b2c   0x00000058   Code   RO         1120    i.spi_i2s_deinit    gd32f10x_spi.o
-    0x08000b84   0x08000b84   0x00000010   Code   RO         1121    i.spi_i2s_flag_get  gd32f10x_spi.o
-    0x08000b94   0x08000b94   0x00000032   Code   RO         1125    i.spi_init          gd32f10x_spi.o
-    0x08000bc6   0x08000bc6   0x00000002   PAD
-    0x08000bc8   0x08000bc8   0x000000c4   Code   RO            4    i.system_clock_108m_hxtal  system_gd32f10x.o
-    0x08000c8c   0x08000c8c   0x00000008   Code   RO            5    i.system_clock_config  system_gd32f10x.o
-    0x08000c94   0x08000c94   0x00000028   Code   RO          487    i.systick_clksource_set  gd32f10x_misc.o
-    0x08000cbc   0x08000cbc   0x00000020   Data   RO         1340    Region$$Table       anon$$obj.o
-
-
-    Execution Region RW_IRAM1 (Exec base: 0x20000000, Load base: 0x08000cdc, Size: 0x00001010, Max: 0x00018000, ABSOLUTE)
+    0x0800014c   0x0800014c   0x00000024   Code   RO           86    .text               startup_gd32f10x_xd.o
+    0x08000170   0x08000170   0x00000024   Code   RO         1393    .text               mc_w.l(memseta.o)
+    0x08000194   0x08000194   0x00000024   Code   RO         1409    .text               mc_w.l(init.o)
+    0x080001b8   0x080001b8   0x000000a0   Code   RO           93    i.BootLoader_Brance  boot.o
+    0x08000258   0x08000258   0x00000018   Code   RO           94    i.BootLoader_Clear  boot.o
+    0x08000270   0x08000270   0x00000004   Code   RO          216    i.BusFault_Handler  gd32f10x_it.o
+    0x08000274   0x08000274   0x00000002   Code   RO          217    i.DebugMon_Handler  gd32f10x_it.o
+    0x08000276   0x08000276   0x0000000a   Code   RO          158    i.Delay_Init        delay.o
+    0x08000280   0x08000280   0x00000030   Code   RO          190    i.GD32_EraseFlash   fmc.o
+    0x080002b0   0x080002b0   0x00000026   Code   RO          191    i.GD32_WriteFlash   fmc.o
+    0x080002d6   0x080002d6   0x00000004   Code   RO          218    i.HardFault_Handler  gd32f10x_it.o
+    0x080002da   0x080002da   0x00000002   PAD
+    0x080002dc   0x080002dc   0x00000034   Code   RO           95    i.LOAD_A            boot.o
+    0x08000310   0x08000310   0x00000004   Code   RO          219    i.MemManage_Handler  gd32f10x_it.o
+    0x08000314   0x08000314   0x00000002   Code   RO          220    i.NMI_Handler       gd32f10x_it.o
+    0x08000316   0x08000316   0x00000002   Code   RO          221    i.PendSV_Handler    gd32f10x_it.o
+    0x08000318   0x08000318   0x00000068   Code   RO          287    i.SPI0_Init         spi.o
+    0x08000380   0x08000380   0x0000001c   Code   RO          288    i.SPI0_Read         spi.o
+    0x0800039c   0x0800039c   0x00000038   Code   RO          289    i.SPI0_ReadWriteByte  spi.o
+    0x080003d4   0x080003d4   0x0000001a   Code   RO          290    i.SPI0_Write        spi.o
+    0x080003ee   0x080003ee   0x00000002   Code   RO          222    i.SVC_Handler       gd32f10x_it.o
+    0x080003f0   0x080003f0   0x00000002   Code   RO          223    i.SysTick_Handler   gd32f10x_it.o
+    0x080003f2   0x080003f2   0x00000002   PAD
+    0x080003f4   0x080003f4   0x000000d4   Code   RO            3    i.SystemInit        system_gd32f10x.o
+    0x080004c8   0x080004c8   0x00000004   Code   RO          224    i.UsageFault_Handler  gd32f10x_it.o
+    0x080004cc   0x080004cc   0x00000024   Code   RO          328    i.W25Q32_Enable     w25q32.o
+    0x080004f0   0x080004f0   0x0000004c   Code   RO          329    i.W25Q32_Erase64K   w25q32.o
+    0x0800053c   0x0800053c   0x00000028   Code   RO          330    i.W25Q32_Init       w25q32.o
+    0x08000564   0x08000564   0x0000004c   Code   RO          332    i.W25Q32_Read       w25q32.o
+    0x080005b0   0x080005b0   0x00000030   Code   RO          333    i.W25Q32_WaitBusy   w25q32.o
+    0x080005e0   0x080005e0   0x0000000e   Code   RO         1413    i.__scatterload_copy  mc_w.l(handlers.o)
+    0x080005ee   0x080005ee   0x00000002   Code   RO         1414    i.__scatterload_null  mc_w.l(handlers.o)
+    0x080005f0   0x080005f0   0x0000000e   Code   RO         1415    i.__scatterload_zeroinit  mc_w.l(handlers.o)
+    0x080005fe   0x080005fe   0x0000000a   Code   RO          378    i.clear_ota_message_config_block  ota_message.o
+    0x08000608   0x08000608   0x00000022   Code   RO          888    i.fmc_bank0_ready_wait  gd32f10x_fmc.o
+    0x0800062a   0x0800062a   0x00000002   PAD
+    0x0800062c   0x0800062c   0x00000030   Code   RO          889    i.fmc_bank0_state_get  gd32f10x_fmc.o
+    0x0800065c   0x0800065c   0x00000022   Code   RO          893    i.fmc_bank1_ready_wait  gd32f10x_fmc.o
+    0x0800067e   0x0800067e   0x00000002   PAD
+    0x08000680   0x08000680   0x00000030   Code   RO          894    i.fmc_bank1_state_get  gd32f10x_fmc.o
+    0x080006b0   0x080006b0   0x0000002c   Code   RO          903    i.fmc_lock          gd32f10x_fmc.o
+    0x080006dc   0x080006dc   0x000000ec   Code   RO          905    i.fmc_page_erase    gd32f10x_fmc.o
+    0x080007c8   0x080007c8   0x00000044   Code   RO          906    i.fmc_unlock        gd32f10x_fmc.o
+    0x0800080c   0x0800080c   0x000000c0   Code   RO          907    i.fmc_word_program  gd32f10x_fmc.o
+    0x080008cc   0x080008cc   0x00000010   Code   RO         1299    i.fwdgt_counter_reload  gd32f10x_fwdgt.o
+    0x080008dc   0x080008dc   0x00000010   Code   RO         1305    i.fwdgt_write_enable  gd32f10x_fwdgt.o
+    0x080008ec   0x080008ec   0x00000008   Code   RO          379    i.get_config_params  ota_message.o
+    0x080008f4   0x080008f4   0x00000004   Code   RO          771    i.gpio_bit_reset    gd32f10x_gpio.o
+    0x080008f8   0x080008f8   0x00000004   Code   RO          772    i.gpio_bit_set      gd32f10x_gpio.o
+    0x080008fc   0x080008fc   0x000000c4   Code   RO          774    i.gpio_deinit       gd32f10x_gpio.o
+    0x080009c0   0x080009c0   0x000000ac   Code   RO          779    i.gpio_init         gd32f10x_gpio.o
+    0x08000a6c   0x08000a6c   0x00000028   Code   RO          380    i.load_ota_message_config_params  ota_message.o
+    0x08000a94   0x08000a94   0x00000030   Code   RO         1360    i.main              main.o
+    0x08000ac4   0x08000ac4   0x00000018   Code   RO          487    i.nvic_vector_table_set  gd32f10x_misc.o
+    0x08000adc   0x08000adc   0x00000020   Code   RO          565    i.rcu_periph_clock_enable  gd32f10x_rcu.o
+    0x08000afc   0x08000afc   0x00000020   Code   RO          568    i.rcu_periph_reset_disable  gd32f10x_rcu.o
+    0x08000b1c   0x08000b1c   0x00000020   Code   RO          569    i.rcu_periph_reset_enable  gd32f10x_rcu.o
+    0x08000b3c   0x08000b3c   0x0000000a   Code   RO         1119    i.spi_enable        gd32f10x_spi.o
+    0x08000b46   0x08000b46   0x00000008   Code   RO         1121    i.spi_i2s_data_receive  gd32f10x_spi.o
+    0x08000b4e   0x08000b4e   0x00000004   Code   RO         1122    i.spi_i2s_data_transmit  gd32f10x_spi.o
+    0x08000b52   0x08000b52   0x00000002   PAD
+    0x08000b54   0x08000b54   0x00000058   Code   RO         1123    i.spi_i2s_deinit    gd32f10x_spi.o
+    0x08000bac   0x08000bac   0x00000010   Code   RO         1124    i.spi_i2s_flag_get  gd32f10x_spi.o
+    0x08000bbc   0x08000bbc   0x00000032   Code   RO         1128    i.spi_init          gd32f10x_spi.o
+    0x08000bee   0x08000bee   0x00000002   PAD
+    0x08000bf0   0x08000bf0   0x000000c4   Code   RO            4    i.system_clock_108m_hxtal  system_gd32f10x.o
+    0x08000cb4   0x08000cb4   0x00000008   Code   RO            5    i.system_clock_config  system_gd32f10x.o
+    0x08000cbc   0x08000cbc   0x00000028   Code   RO          490    i.systick_clksource_set  gd32f10x_misc.o
+    0x08000ce4   0x08000ce4   0x0000000c   Code   RO         1361    i.task_fwdgt_reload  main.o
+    0x08000cf0   0x08000cf0   0x00000020   Data   RO         1411    Region$$Table       anon$$obj.o
+
+
+    Execution Region RW_IRAM1 (Exec base: 0x20000000, Load base: 0x08000d10, Size: 0x00001010, Max: 0x00018000, ABSOLUTE)
 
     Exec Addr    Load Addr    Size         Type   Attr      Idx    E Section Name        Object
 
-    0x20000000   0x08000cdc   0x00000004   Data   RW           93    .data               boot.o
-    0x20000004   0x08000ce0   0x00000008   Data   RW          380    .data               ota_message.o
-    0x2000000c   0x08000ce8   0x00000004   PAD
-    0x20000010        -       0x00001000   Zero   RW           80    STACK               startup_gd32f10x_xd.o
+    0x20000000   0x08000d10   0x00000004   Data   RW           96    .data               boot.o
+    0x20000004   0x08000d14   0x00000008   Data   RW          383    .data               ota_message.o
+    0x2000000c   0x08000d1c   0x00000004   PAD
+    0x20000010        -       0x00001000   Zero   RW           83    STACK               startup_gd32f10x_xd.o
 
 
 ==============================================================================
@@ -689,24 +712,25 @@ Image component sizes
 
       Code (inc. data)   RO Data    RW Data    ZI Data      Debug   Object Name
 
-       238         22          0          4          0       3129   boot.o
-        10          0          0          0          0        425   delay.o
-        86          0          0          0          0       1600   fmc.o
-       704         62          0          0          0       4474   gd32f10x_fmc.o
-       376         10          0          0          0       2378   gd32f10x_gpio.o
-        26          0          0          0          0       3806   gd32f10x_it.o
-        64          8          0          0          0       1032   gd32f10x_misc.o
-        96         12          0          0          0       1463   gd32f10x_rcu.o
-       176          6          0          0          0       3947   gd32f10x_spi.o
-        44          6          0          0          0        943   main.o
-        58          8          0          8          0       2270   ota_message.o
-       214         16          0          0          0       2582   spi.o
+       242         22          0          4          0       2993   boot.o
+        10          0          0          0          0        405   delay.o
+        86          0          0          0          0       1540   fmc.o
+       704         62          0          0          0       4314   gd32f10x_fmc.o
+        32         12          0          0          0        840   gd32f10x_fwdgt.o
+       376         10          0          0          0       2298   gd32f10x_gpio.o
+        26          0          0          0          0       3626   gd32f10x_it.o
+        64          8          0          0          0        992   gd32f10x_misc.o
+        96         12          0          0          0       1403   gd32f10x_rcu.o
+       176          6          0          0          0       3807   gd32f10x_spi.o
+        60          6          0          0          0       1303   main.o
+        58          8          0          8          0       2170   ota_message.o
+       214         16          0          0          0       2482   spi.o
         36          8        304          0       4096        776   startup_gd32f10x_xd.o
-       416         30          0          0          0      35785   system_gd32f10x.o
-       276         26          0          0          0       3008   w25q32.o
+       416         30          0          0          0      35625   system_gd32f10x.o
+       276         26          0          0          0       2888   w25q32.o
 
     ----------------------------------------------------------------------
-      2834        214        336         12       4100      67618   Object Totals
+      2886        226        336         12       4100      67462   Object Totals
          0          0         32          0          0          0   (incl. Generated)
         14          0          0          0          4          0   (incl. Padding)
 
@@ -746,15 +770,15 @@ Image component sizes
 
       Code (inc. data)   RO Data    RW Data    ZI Data      Debug   
 
-      2956        230        336         12       4100      65346   Grand Totals
-      2956        230        336         12       4100      65346   ELF Image Totals
-      2956        230        336         12          0          0   ROM Totals
+      3008        242        336         12       4100      65034   Grand Totals
+      3008        242        336         12       4100      65034   ELF Image Totals
+      3008        242        336         12          0          0   ROM Totals
 
 ==============================================================================
 
-    Total RO  Size (Code + RO Data)                 3292 (   3.21kB)
+    Total RO  Size (Code + RO Data)                 3344 (   3.27kB)
     Total RW  Size (RW Data + ZI Data)              4112 (   4.02kB)
-    Total ROM Size (Code + RO Data + RW Data)       3304 (   3.23kB)
+    Total ROM Size (Code + RO Data + RW Data)       3356 (   3.28kB)
 
 ==============================================================================
 

+ 1 - 0
bootloader/USER/RTE_Components.h

@@ -6,4 +6,5 @@
 #define RTE_DEVICE_STDPERIPHERALS_GPIO
 #define RTE_DEVICE_STDPERIPHERALS_FMC
 #define RTE_DEVICE_STDPERIPHERALS_SPI
+#define RTE_DEVICE_STDPERIPHERALS_FWDGT
 #endif

文件差異過大導致無法顯示
+ 184 - 139
bootloader/USER/bootloader.uvguix.16936


+ 14 - 2
bootloader/USER/bootloader.uvoptx

@@ -341,7 +341,7 @@
       <GroupNumber>3</GroupNumber>
       <FileNumber>10</FileNumber>
       <FileType>1</FileType>
-      <tvExp>0</tvExp>
+      <tvExp>1</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
       <bDave2>0</bDave2>
       <PathWithFileName>..\LIB\Source\gd32f10x_wwdgt.c</PathWithFileName>
@@ -409,6 +409,18 @@
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>16</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\LIB\Source\gd32f10x_fwdgt.c</PathWithFileName>
+      <FilenameWithoutPath>gd32f10x_fwdgt.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
   </Group>
 
   <Group>
@@ -419,7 +431,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>16</FileNumber>
+      <FileNumber>17</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>

+ 5 - 0
bootloader/USER/bootloader.uvprojx

@@ -467,6 +467,11 @@
               <FileType>1</FileType>
               <FilePath>..\LIB\Source\gd32f10x_spi.c</FilePath>
             </File>
+            <File>
+              <FileName>gd32f10x_fwdgt.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\LIB\Source\gd32f10x_fwdgt.c</FilePath>
+            </File>
           </Files>
         </Group>
         <Group>

+ 10 - 1
bootloader/USER/main.c

@@ -6,7 +6,7 @@
 
 #include "boot.h"
 #include "w25q32.h"
-        
+void task_fwdgt_reload(void);
 OTA_STRUCT UpDataA;           //A区更新用到的结构体
 
 int main(void)
@@ -14,6 +14,7 @@ int main(void)
 	Delay_Init();          
 	W25Q32_Init();	
 	OTA_MESSAGE *ota_data;
+	task_fwdgt_reload();
 	if(load_ota_message_config_params()==0)
 	{
 		//ota事件产生了,进入Bootloader分支
@@ -33,3 +34,11 @@ int main(void)
 	}
 	
 }
+
+void task_fwdgt_reload(void)
+{
+	/* uncock fwdgt write protect*/
+	fwdgt_write_enable();
+	/* feed fwdgt */
+	fwdgt_counter_reload();	
+}

+ 1 - 1
bootloader/USER/main.h

@@ -22,7 +22,7 @@ typedef struct{
 
 
 extern OTA_STRUCT UpDataA;    
- 
+void task_fwdgt_reload();
 
 #endif