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

불필요한 Define 제거 /BootLoader User Start address 변경

MBIC Tail Header size Define 추가
Uart Data Recv  Size 최소화
Flash 4byte / 8byte 함수 Test 버전 추가
MBIC Header Check 및 Response 함수 추가 및 변경
PYJ пре 5 година
родитељ
комит
09b08c96dc

BIN
Debug/STM32F103_ATTEN_PLL_Zig.elf


Разлика између датотеке није приказан због своје велике величине
+ 612 - 571
Debug/STM32F103_ATTEN_PLL_Zig.hex


Разлика између датотеке није приказан због своје велике величине
+ 3524 - 3057
Debug/STM32F103_ATTEN_PLL_Zig.list


Разлика између датотеке није приказан због своје велике величине
+ 486 - 462
Debug/STM32F103_ATTEN_PLL_Zig.map


+ 0 - 27
Inc/Bootloader.h

@@ -11,28 +11,6 @@
11 11
 #include "uart.h"
12 12
 extern uint8_t * UpdateFiledata;
13 13
 
14
-typedef struct{
15
-	uint8_t bluecell_header01;
16
-	uint8_t bluecell_header02;
17
-	uint8_t bluecell_header03;
18
-	uint8_t bluecell_header04;
19
-	uint8_t bluecell_type;
20
-	uint8_t bluecell_length_h;
21
-	uint8_t bluecell_length_l;
22
-	uint8_t bluecell_data[2048];
23
-}Blueprotocol_t;
24
-typedef enum {
25
-	BLUECELL_HEADER00 = 0,
26
-	BLUECELL_HEADER01,
27
-	BLUECELL_HEADER02,
28
-	BLUECELL_HEADER03,
29
-	BLUECELL_TYPE,
30
-	BLUECELL_LENGTH_H,
31
-	BLUECELL_LENGTH_L,
32
-	BLUECELL_UPDATACNT_H,
33
-	BLUECELL_UPDATACNT_L,
34
-	BLUECELL_DATA,
35
-}Bluenum;
36 14
 typedef enum {
37 15
 	BLUECELL_RESET = 0,
38 16
 	BLUECELL_START,
@@ -55,11 +33,6 @@ typedef enum{
55 33
     bluecell_ext,   
56 34
 }FirmwareUpdate_t;
57 35
 
58
-/*bluecell Header*/
59
-#define Bluecell_Header0  0x42//ASCII : B
60
-#define Bluecell_Header1  0x4C//ASCII : L
61
-#define Bluecell_Header2  0x55//ASCII : U
62
-#define Bluecell_Header3  0x45//ASCII : E
63 36
 /*bluecell type*/
64 37
 #define Bluecell_Reset  0x0A//ASCII : R
65 38
 #define Bluecell_Firmupdate_start     0x55//ASCII : U

+ 2 - 0
Inc/MBIC_Bootloader.h

@@ -24,6 +24,8 @@ typedef enum{
24 24
 }MBIC_Download_Rsp_L;
25 25
 
26 26
 #define MBIC_HEADER_SIZE 22
27
+#define MBIC_TAIL_SIZE 3
28
+
27 29
 #define MBIC_PREAMBLE0 0x16
28 30
 #define MBIC_PREAMBLE1 0x16
29 31
 #define MBIC_PREAMBLE2 0x16

+ 10 - 2
Inc/flash.h

@@ -11,9 +11,17 @@
11 11
 #include "main.h"
12 12
 #include "CRC16.h"
13 13
 
14
-#define FLASH_USER_START_ADDR ((uint32_t)0x08004000)
14
+#define FLASH_USER_START_ADDR ((uint32_t)0x08005000)
15 15
 #define FLASH_USER_END_ADDR     FLASH_USER_START_ADDR + ((uint32_t)0x000FFFF)   /* End @ of user Flash area */
16
-#define APPLICATION_ADDRESS     (uint32_t)0x08004000      /* Start user code address: ADDR_FLASH_PAGE_8 */
16
+#define APPLICATION_ADDRESS     (uint32_t)0x08005000      /* Start user code address: ADDR_FLASH_PAGE_8 */
17
+
18
+
19
+#define FLASH_USER_BANK1_START_ADDR ((uint32_t)0x08015000)
20
+#define FLASH_USER_BANK2_START_ADDR ((uint32_t)0x08025000)
21
+#define FLASH_USER_TEMPBANK_START_ADDR ((uint32_t)0x08035000)
22
+
23
+
24
+
17 25
 
18 26
 
19 27
 #define FirmwareUpdataAck  0x11

+ 1 - 1
Inc/uart.h

@@ -13,7 +13,7 @@
13 13
 #define hTerminal    huart1
14 14
 #define hTest        huart2
15 15
 
16
-#define QUEUE_BUFFER_LENGTH 2048
16
+#define QUEUE_BUFFER_LENGTH 1100
17 17
 
18 18
 typedef struct
19 19
 {

+ 1 - 1
STM32F103ZE_FLASH.ld

@@ -41,7 +41,7 @@ _Min_Stack_Size = 0x400; /* required amount of stack */
41 41
 MEMORY
42 42
 {
43 43
 RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 64K
44
-FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 16K
44
+FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 20K
45 45
 }
46 46
 
47 47
 /* Define output sections */

+ 170 - 52
Src/MBIC_Bootloader.c

@@ -5,11 +5,12 @@
5 5
  *      Author: parkyj
6 6
  */
7 7
 
8
+#include <stdint.h>
9
+#include <stdbool.h>
8 10
 
9 11
 #include "main.h"
10
-#include <stdbool.h>
11 12
 #include "MBIC_Bootloader.h"
12
-
13
+#include "CRC16.h"
13 14
 #define MARK_START_POSITION						0
14 15
 #define TYPE_START_POSITION						9	
15 16
 #define FILE_TYPE_START_POSITION				10
@@ -87,9 +88,9 @@ BootLoaderDataCheck_st MBIC_FileDataCheck(uint8_t* data){
87 88
   }  
88 89
   for(i = i; i < 43; i++){
89 90
     if(MBIC_FileName2[i-30] != data[i]){
90
-      printf("Data Diff %c\r\n",data[i]);
91
-      printf("MBIC_FileName2[%d] : %x, data[%d] :  %x\r\n",i - 30,MBIC_FileName2[i - 30],i,data[i]);
92
-      return ret;
91
+//      printf("Data Diff %c\r\n",data[i]);
92
+//      printf("MBIC_FileName2[%d] : %x, data[%d] :  %x\r\n",i - 30,MBIC_FileName2[i - 30],i,data[i]);
93
+   //   return ret;
93 94
     }
94 95
     else
95 96
       printf("File Name Data Success %c\r\n",data[i]);
@@ -125,57 +126,79 @@ BootLoaderDataCheck_st MBIC_FileDataCheck(uint8_t* data){
125 126
   return ret;
126 127
 }
127 128
 
129
+/*
130
+  MBIC Basic Header merge function 
131
+  Data : Response Data
132
+  Length : Response Data Length
133
+  CRCINDEX : CRC INDEX Number
128 134
 
129
-uint8_t* MBIC_HeaderMergeFunction(uint8_t* data, uint32_t CrcIndex)
135
+*/
136
+uint8_t* MBIC_HeaderMergeFunction(uint8_t* data,uint16_t Length )
130 137
 {
131
-    byte[] ret = new byte[data.Length + 22 + 3];
132
-    UInt16 CRCData = CRC16_Generate(data,data.Length);
133
-
134
-    ret[(int)MBICProt_st.MBIC_PAYLOADSTART + CrcIndex + 0] = Convert.ToByte((CRCData & 0xFF00) >> 8);
135
-    ret[(int)MBICProt_st.MBIC_PAYLOADSTART + CrcIndex + 1] = Convert.ToByte((CRCData & 0x00FF));
136
-    ret[(int)MBICProt_st.MBIC_PAYLOADSTART + CrcIndex + 2] = 0x03;
138
+    uint8_t ret[Length + 22 + 3];/*Data Length + Header Length + Tail Length*/
139
+    uint16_t CRCData = CRC16_Generate(data,Length);
140
+    uint16_t cmd = data[MBIC_CMD_0];
141
+    /*CRC Create*/
142
+    ret[MBIC_PAYLOADSTART + Length + 0] = ((CRCData & 0xFF00) >> 8);
143
+    ret[MBIC_PAYLOADSTART + Length + 1] = ((CRCData & 0x00FF));
144
+    ret[MBIC_PAYLOADSTART + Length + 2] = 0x03;
145
+    /*Data Mark Create*/
146
+    ret[MBIC_PREAMBLE_0] = MBIC_PREAMBLE0;
147
+    ret[MBIC_PREAMBLE_1] = MBIC_PREAMBLE1;
148
+    ret[MBIC_PREAMBLE_2] = MBIC_PREAMBLE2;
149
+    ret[MBIC_PREAMBLE_3] = MBIC_PREAMBLE3;
150
+    /*Data Subid Create*/
151
+    ret[MBIC_SUBUID_0] = MBIC_SUBUID0;
152
+    ret[MBIC_SUBUID_1] = MBIC_SUBUID1;
137 153
 
138
-    ret[(int)MBICProt_st.MBIC_PREAMBLE_0] = MBIC_PREAMBLE0;
139
-    ret[(int)MBICProt_st.MBIC_PREAMBLE_1] = MBIC_PREAMBLE1;
140
-    ret[(int)MBICProt_st.MBIC_PREAMBLE_2] = MBIC_PREAMBLE2;
141
-    ret[(int)MBICProt_st.MBIC_PREAMBLE_3] = MBIC_PREAMBLE3;
154
+    ret[MBIC_RCODE_0] = data[MBIC_RCODE_0];
142 155
 
143
-    ret[(int)MBICProt_st.MBIC_SUBUID_0] = MBIC_SUBUID0;
144
-    ret[(int)MBICProt_st.MBIC_SUBUID_1] = MBIC_SUBUID1;
156
+    ret[MBIC_TRID_0] = data[MBIC_TRID_0];
157
+    ret[MBIC_TRID_1] = data[MBIC_TRID_1];
145 158
 
146
-    ret[(int)MBICProt_st.MBIC_RCODE_0] = 0;
159
+    ret[MBIC_SEQSUM_0] = data[MBIC_SEQSUM_0];
147 160
 
148
-    ret[(int)MBICProt_st.MBIC_TRID_0] = 0;
149
-    ret[(int)MBICProt_st.MBIC_TRID_1] = 0;
161
+    ret[MBIC_TTL_0] = data[MBIC_TTL_0];
150 162
 
151
-    ret[(int)MBICProt_st.MBIC_SEQSUM_0] = 0;
163
+    ret[MBIC_TIME_0] = data[MBIC_TIME_0];
164
+    ret[MBIC_TIME_1] = data[MBIC_TIME_1];
165
+    ret[MBIC_TIME_2] = data[MBIC_TIME_2];
166
+    ret[MBIC_TIME_3] = data[MBIC_TIME_3];
167
+    ret[MBIC_TIME_4] = data[MBIC_TIME_4];
168
+    ret[MBIC_TIME_5] = data[MBIC_TIME_5];
169
+    ret[MBIC_ERRRESPONSE_0] = MBIC_ERRRESPONSE;
152 170
 
153
-    ret[(int)MBICProt_st.MBIC_TTL_0] = 0;
154 171
 
155
-    ret[(int)MBICProt_st.MBIC_TIME_0] = 0;
156
-    ret[(int)MBICProt_st.MBIC_TIME_1] = 0;
157
-    ret[(int)MBICProt_st.MBIC_TIME_2] = 0;
158
-    ret[(int)MBICProt_st.MBIC_TIME_3] = 0;
159
-    ret[(int)MBICProt_st.MBIC_TIME_4] = 0;
160
-    ret[(int)MBICProt_st.MBIC_TIME_5] = 0;
161
-    ret[(int)MBICProt_st.MBIC_ERRRESPONSE_0] = MBIC_ERRRESPONSE;
162 172
 
163
-    ret[(int)MBICProt_st.MBIC_CMD_0] = MBIC_ERRRESPONSE;
173
+        
164 174
 
165
-    ret[(int)MBICProt_st.MBIC_LENGTH_0] = MBIC_ERRRESPONSE;
166
-    ret[(int)MBICProt_st.MBIC_LENGTH_1] = MBIC_ERRRESPONSE;
175
+    ret[MBIC_LENGTH_0] = (Length & 0xFF00) << 8;
176
+    ret[MBIC_LENGTH_1] = Length & 0x00FF;
167 177
 
168
-    ret[(int)MBICProt_st.MBIC_HEADERCHECKSUM_0] = Chksum_Create(ret);
169
-
170
-    for(int i = 0; i < data.Length; i ++)
171
-        ret[(int)MBICProt_st.MBIC_PAYLOADSTART + i] = data[i];
178
+    ret[MBIC_HEADERCHECKSUM_0] = Chksum_Create(ret);
179
+    /*Data Move*/
180
+    for(int i = 0; i < Length; i++){
181
+        data[MBIC_HEADER_SIZE + i] = data[i];
182
+    }
183
+    for(int i = 0; i < MBIC_HEADER_SIZE; i++){
184
+        data[i] = ret[i];
185
+    }
186
+      for(int i = MBIC_HEADER_SIZE + Length; i < MBIC_HEADER_SIZE + MBIC_TAIL_SIZE + Length; i++){
187
+        data[i] = ret[i];
188
+    }
189
+//    for(uint16_t i = 0; i < Length; i ++)
190
+//        ret[MBIC_PAYLOADSTART + i] = data[i];
172 191
 
173
-    return ret;
192
+    return data;
174 193
 }
175 194
 
176 195
 void MBIC_Bootloader_FirmwareUpdate(uint8_t* data){
177
-    uint8_t datatype = data[MBIC_PAYLOADSTART];
178
-
196
+    uint8_t MBIC_DownLoadData[0xFFFF];
197
+    uint16_t cmd = data[MBIC_CMD_0];
198
+    static uint8_t Download_Option = 0;
199
+    uint16_t index = 0;
200
+    static uint32_t Curr_Download_DataIndex = 0;
201
+    static uint32_t Prev_Download_DataIndex = 0;    
179 202
 #if 0 // PYJ.2020.06.04_BEGIN -- 
180 203
     uint8_t dataTest[1024] = {
181 204
       0x4A,0x54,0x2D,0x4E,0x52,0x44,0x41,0x53,0x20,0x20,0x00,0x00,
@@ -191,28 +214,123 @@ void MBIC_Bootloader_FirmwareUpdate(uint8_t* data){
191 214
     };
192 215
     
193 216
 #endif // PYJ.2020.06.04_END -- 
194
-    MBIC_FileDataCheck(&data[MBIC_PAYLOADSTART]);
217
+    MBIC_FileDataCheck(data);
195 218
 
196
-    
197 219
 //    printf("RX");
198 220
 //    for(int i = 0; i < 128; i++)
199 221
 //        printf("%c",*data++);
200
-    switch(datatype){
222
+    switch(cmd){
201 223
         case MBIC_Notice_REQ:
202
-            
224
+            cmd = MBIC_Notice_RSP;
225
+            /*TOTAL FRAME NUMBER*/
226
+            data[MBIC_PAYLOADSTART + index++] = data[MBIC_PAYLOADSTART + 0];
227
+            data[MBIC_PAYLOADSTART + index++] = data[MBIC_PAYLOADSTART + 1];        
228
+            data[MBIC_PAYLOADSTART + index++] = data[MBIC_PAYLOADSTART + 2];
229
+            data[MBIC_PAYLOADSTART + index++] = data[MBIC_PAYLOADSTART + 3];        
230
+            /*DOWNLOAD OPTION*/        
231
+            data[MBIC_PAYLOADSTART + index++] = data[MBIC_PAYLOADSTART + 4];
232
+            Download_Option = data[MBIC_PAYLOADSTART + 4];
233
+            /*DOWNLOAD DELAY REQUEST*/
234
+            data[MBIC_PAYLOADSTART + index++] = 3;
235
+            /*DOWNLOAD Reserve*/
236
+            data[MBIC_PAYLOADSTART + index++] = 0;
237
+            data[MBIC_PAYLOADSTART + index++] = 0;
238
+            data[MBIC_PAYLOADSTART + index++] = 0;
239
+            data[MBIC_PAYLOADSTART + index++] = 0;
240
+            data[MBIC_PAYLOADSTART + index++] = 0;
241
+            data[MBIC_PAYLOADSTART + index++] = 0;        
203 242
         break;
204 243
         case MBIC_Download_DATA_REQ:
205
-
206
-        break;
244
+            cmd = MBIC_Download_DATA_RSP;
245
+            /*TOTAL FRAME NUMBER*/
246
+            data[MBIC_PAYLOADSTART + index++] = data[MBIC_PAYLOADSTART + 0];
247
+            data[MBIC_PAYLOADSTART + index++] = data[MBIC_PAYLOADSTART + 1];        
248
+            data[MBIC_PAYLOADSTART + index++] = data[MBIC_PAYLOADSTART + 2];
249
+            data[MBIC_PAYLOADSTART + index++] = data[MBIC_PAYLOADSTART + 3];        
250
+            /*Current Download Frame Number*/        
251
+            data[MBIC_PAYLOADSTART + index++] = data[MBIC_PAYLOADSTART + 4];
252
+            data[MBIC_PAYLOADSTART + index++] = data[MBIC_PAYLOADSTART + 5];        
253
+            data[MBIC_PAYLOADSTART + index++] = data[MBIC_PAYLOADSTART + 6];
254
+            data[MBIC_PAYLOADSTART + index++] = data[MBIC_PAYLOADSTART + 7];        
255
+            Curr_Download_DataIndex = data[MBIC_PAYLOADSTART  + 4] << 24;
256
+            Curr_Download_DataIndex += data[MBIC_PAYLOADSTART + 5] << 16;
257
+            Curr_Download_DataIndex += data[MBIC_PAYLOADSTART + 6] << 8;            
258
+            Curr_Download_DataIndex += data[MBIC_PAYLOADSTART + 7];                        
259
+            /*DOWNLOAD Reserve*/
260
+            data[MBIC_PAYLOADSTART + index++] = 0;
261
+            data[MBIC_PAYLOADSTART + index++] = 0;
262
+            data[MBIC_PAYLOADSTART + index++] = 0;
263
+            data[MBIC_PAYLOADSTART + index++] = 0;
264
+            for(uint32_t i = Prev_Download_DataIndex; i < Curr_Download_DataIndex; i++){
265
+                MBIC_DownLoadData[i] = data[index + i];
266
+                printf("MBIC_DownLoadData[i] : %x",MBIC_DownLoadData[i]);
267
+            }
268
+            
269
+            Prev_Download_DataIndex  = Curr_Download_DataIndex;
270
+            break;
207 271
         case MBIC_Download_Confirm_REQ:
208
-
272
+            cmd = MBIC_Download_Confirm_RSP;
273
+            /*TOTAL FRAME NUMBER*/
274
+            data[MBIC_PAYLOADSTART + index++] = data[MBIC_PAYLOADSTART + 0];
275
+            data[MBIC_PAYLOADSTART + index++] = data[MBIC_PAYLOADSTART + 1];        
276
+            data[MBIC_PAYLOADSTART + index++] = data[MBIC_PAYLOADSTART + 2];
277
+            data[MBIC_PAYLOADSTART + index++] = data[MBIC_PAYLOADSTART + 3];        
278
+            /*DOWNLOAD OPTION*/        
279
+            data[MBIC_PAYLOADSTART + index++] = data[MBIC_PAYLOADSTART + 4];
280
+            Download_Option = data[MBIC_PAYLOADSTART + 4];
281
+            /*DOWNLOAD DELAY REQUEST*/
282
+            data[MBIC_PAYLOADSTART + index++] = 3;
283
+            /*DOWNLOAD Reserve*/
284
+            data[MBIC_PAYLOADSTART + index++] = 0;
285
+            data[MBIC_PAYLOADSTART + index++] = 0;
286
+            data[MBIC_PAYLOADSTART + index++] = 0;
287
+            data[MBIC_PAYLOADSTART + index++] = 0;
288
+            data[MBIC_PAYLOADSTART + index++] = 0;
289
+            data[MBIC_PAYLOADSTART + index++] = 0;  
209 290
         break;
210 291
         case MBIC_Complete_Notice_REQ_REQ:
211
-
212
-        break;
292
+            cmd = MBIC_Complete_Notice_RSP;
293
+            /*TOTAL FRAME NUMBER*/
294
+            data[MBIC_PAYLOADSTART + index++] = data[MBIC_PAYLOADSTART + 0];
295
+            data[MBIC_PAYLOADSTART + index++] = data[MBIC_PAYLOADSTART + 1];        
296
+            data[MBIC_PAYLOADSTART + index++] = data[MBIC_PAYLOADSTART + 2];
297
+            data[MBIC_PAYLOADSTART + index++] = data[MBIC_PAYLOADSTART + 3];        
298
+            /*DOWNLOAD OPTION*/        
299
+            data[MBIC_PAYLOADSTART + index++] = data[MBIC_PAYLOADSTART + 4];
300
+            Download_Option = data[MBIC_PAYLOADSTART + 4];
301
+            /*DOWNLOAD DELAY REQUEST*/
302
+            data[MBIC_PAYLOADSTART + index++] = 3;
303
+            /*DOWNLOAD Reserve*/
304
+            data[MBIC_PAYLOADSTART + index++] = 0;
305
+            data[MBIC_PAYLOADSTART + index++] = 0;
306
+            data[MBIC_PAYLOADSTART + index++] = 0;
307
+            data[MBIC_PAYLOADSTART + index++] = 0;
308
+            data[MBIC_PAYLOADSTART + index++] = 0;
309
+            data[MBIC_PAYLOADSTART + index++] = 0;  
310
+            break;
213 311
         case MBIC_Reboot_Notice_REQ:
214
-
215
-        break;
312
+            cmd = MBIC_Reboot_Notice_RSP;
313
+            /*TOTAL FRAME NUMBER*/
314
+            data[MBIC_PAYLOADSTART + index++] = data[MBIC_PAYLOADSTART + 0];
315
+            data[MBIC_PAYLOADSTART + index++] = data[MBIC_PAYLOADSTART + 1];        
316
+            data[MBIC_PAYLOADSTART + index++] = data[MBIC_PAYLOADSTART + 2];
317
+            data[MBIC_PAYLOADSTART + index++] = data[MBIC_PAYLOADSTART + 3];        
318
+            /*DOWNLOAD OPTION*/        
319
+            data[MBIC_PAYLOADSTART + index++] = data[MBIC_PAYLOADSTART + 4];
320
+            Download_Option = data[MBIC_PAYLOADSTART + 4];
321
+            /*DOWNLOAD DELAY REQUEST*/
322
+            data[MBIC_PAYLOADSTART + index++] = 3;
323
+            /*DOWNLOAD Reserve*/
324
+            data[MBIC_PAYLOADSTART + index++] = 0;
325
+            data[MBIC_PAYLOADSTART + index++] = 0;
326
+            data[MBIC_PAYLOADSTART + index++] = 0;
327
+            data[MBIC_PAYLOADSTART + index++] = 0;
328
+            data[MBIC_PAYLOADSTART + index++] = 0;
329
+            data[MBIC_PAYLOADSTART + index++] = 0;          
330
+            break;
331
+        default:
332
+            return;
216 333
     }
217
-
334
+    data[MBIC_CMD_0] = cmd;
335
+    MBIC_HeaderMergeFunction(data,index); // reponse
218 336
 }

+ 134 - 13
Src/flash.c

@@ -61,7 +61,7 @@ void Flash_InitRead(void) // ?占쏙옙湲고븿?占쏙옙
61 61
 uint8_t Flash_RGB_Data_Write(uint8_t* data){
62 62
     uint16_t Firmdata = 0;
63 63
     uint8_t ret = 0;
64
-    for(uint8_t i = 0; i < data[bluecell_length] - 2; i+=2){
64
+    for(int i = 0; i < data[bluecell_length] - 2; i+=2){
65 65
         Firmdata  = ((data[(bluecell_length + 1) + i]) & 0x00FF);
66 66
         Firmdata  += ((data[(bluecell_length + 1) + (i + 1)] << 8) & 0xFF00);
67 67
         if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD,Address ,   (uint16_t)Firmdata) != HAL_OK){
@@ -74,26 +74,97 @@ uint8_t Flash_RGB_Data_Write(uint8_t* data){
74 74
     }
75 75
     return ret;
76 76
 }
77
-#else
78
-uint8_t Flash_RGB_Data_Write(uint8_t* data){
79
-    uint32_t Firmdata = 0;
77
+uint8_t Flash_Bank_Data_Write(uint8_t* data){
78
+    uint16_t Firmdata = 0;
79
+    uint16_t Length = 0;
80
+    static uint32_t WriteIndex = 0;
80 81
     uint8_t ret = 0;
81
-    for(uint8_t i = 0; i < data[bluecell_length] - 2; i+=4){
82
-        Firmdata  = ((data[(bluecell_length + 1) + i]) & 0x000000FF);
83
-        Firmdata  += ((data[(bluecell_length + 1) + (i + 1)] << 8) & 0x0000FF00);
84
-        Firmdata  += ((data[(bluecell_length + 1) + (i + 2)] << 8) & 0x00FF0000);
85
-        Firmdata  += ((data[(bluecell_length + 1) + (i + 3)] << 8) & 0xFF000000);        
86
-        if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,Address ,   (uint32_t)Firmdata) != HAL_OK){
82
+    for(int i = 0; i < Length; i+=2){
83
+        Firmdata  = ((data[WriteIndex++]) & 0x00FF);
84
+        Firmdata  += ((data[WriteIndex++] << 8) & 0xFF00);
85
+        if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD,Address ,   (uint16_t)Firmdata) != HAL_OK){
87 86
             printf("HAL NOT OK \n");
88 87
             ret = 1;
89 88
         }
90
-        Address += 4;
89
+        Address += 2;
90
+        //if(!(i%FirmwareUpdateDelay))
91
+      //  HAL_Delay(1);
92
+    }
93
+    return ret;
94
+}
95
+
96
+uint8_t Flash_Data_Write(uint8_t* data){
97
+    uint64_t Firmdata = 0;
98
+    uint8_t ret = 0;
99
+    uint8_t Length = data[bluecell_length] - 2;
100
+    uint8_t Length_remainder =  Length % 8;    
101
+    uint8_t Length_ans =  Length / 8;    
102
+
103
+    for(int i = 0; i < Length; i+=8){
104
+        Firmdata  =  ((data[(bluecell_length + 1) + i])             & 0x00000000000000FF);
105
+        Firmdata  += ((data[(bluecell_length + 1) + (i + 1)] << 8)  & 0x000000000000FF00);
106
+        Firmdata  += ((data[(bluecell_length + 1) + (i + 2)] << 16) & 0x0000000000FF0000);
107
+        Firmdata  += ((data[(bluecell_length + 1) + (i + 3)] << 24) & 0x00000000FF000000);
108
+        Firmdata  += ((data[(bluecell_length + 1) + (i + 4)] << 32) & 0x000000FF00000000);
109
+        Firmdata  += ((data[(bluecell_length + 1) + (i + 5)] << 40) & 0x0000FF0000000000);
110
+        Firmdata  += ((data[(bluecell_length + 1) + (i + 6)] << 48) & 0x00FF000000000000);        
111
+        Firmdata  += ((data[(bluecell_length + 1) + (i + 7)] << 56) & 0xFF00000000000000);                
112
+        if(Length_remainder > 0 && Length_ans > i){
113
+            for(int a = 0; a < Length_remainder; a += 2){
114
+                if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD,Address ,   (uint16_t)Firmdata) != HAL_OK){
115
+                    printf("HAL NOT OK \n");
116
+                    ret = 1;
117
+                }
118
+                Address += 2;            
119
+            }
120
+        }
121
+        else{        
122
+            if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD,Address ,   (uint64_t)Firmdata) != HAL_OK){
123
+                printf("HAL NOT OK \n");
124
+                ret = 1;
125
+            }
126
+            Address += 8;
127
+        }
91 128
         //if(!(i%FirmwareUpdateDelay))
92 129
       //  HAL_Delay(1);
93 130
     }
94 131
     return ret;
95 132
 }
133
+uint8_t Flash_DataTest_Write(uint8_t* data){
134
+    uint32_t Firmdata = 0;
135
+    uint8_t ret = 0;
136
+    uint8_t Length = data[bluecell_length] - 2;
137
+    uint8_t Length_remainder =  Length % 4;    
138
+    uint8_t Length_ans =  Length / 4;        
139
+    for(int i = 0; i < data[bluecell_length] - 2; i+=4){
96 140
 
141
+        if(Length_remainder > 0 && Length_ans > i){
142
+            for(int a = 0; a < Length_remainder; a += 2){
143
+                Firmdata  = ((data[(bluecell_length + 1) + i]) & 0x00FF);
144
+                Firmdata  += ((data[(bluecell_length + 1) + (i + 1)] << 8) & 0xFF00);                
145
+                if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD,Address ,   (uint16_t)Firmdata) != HAL_OK){
146
+                    printf("HAL NOT OK \n");
147
+                    ret = 1;
148
+                }
149
+                Address += 2;            
150
+            }
151
+        }
152
+        else{
153
+            Firmdata  = ((data[(bluecell_length + 1) + i]) 	          & 0x000000FF);
154
+            Firmdata  += ((data[(bluecell_length + 1) + (i + 1)] << 8) & 0x0000FF00);
155
+            Firmdata  += ((data[(bluecell_length + 1) + (i + 2)] << 16) & 0x00FF0000);
156
+            Firmdata  += ((data[(bluecell_length + 1) + (i + 3)] << 24) & 0xFF000000);            
157
+            if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,Address ,   (uint32_t)Firmdata) != HAL_OK){
158
+                printf("HAL NOT OK \n");
159
+                ret = 1;
160
+            }
161
+            Address += 4;
162
+        }
163
+        //if(!(i%FirmwareUpdateDelay))
164
+      //  HAL_Delay(1);
165
+    }
166
+    return ret;
167
+}
97 168
 #endif // PYJ.2020.05.20_END -- 
98 169
 
99 170
 uint8_t Flash_write(uint8_t* data) // ?占쏙옙湲고븿?占쏙옙
@@ -108,7 +179,7 @@ uint8_t Flash_write(uint8_t* data) // ?占쏙옙湲고븿?占쏙옙
108 179
     EraseInitStruct.PageAddress = FLASH_USER_START_ADDR;
109 180
     EraseInitStruct.NbPages     = (FLASH_USER_END_ADDR - FLASH_USER_START_ADDR) / FLASH_PAGE_SIZE;
110 181
 
111
-    __HAL_RCC_TIM6_CLK_DISABLE(); // 留ㅼ씤???占쏙옙癒몌옙?? ?占쏙옙占�??占쏙옙?占쏙옙?占쏙옙
182
+//    __HAL_RCC_TIM6_CLK_DISABLE(); // 留ㅼ씤???占쏙옙癒몌옙?? ?占쏙옙占�??占쏙옙?占쏙옙?占쏙옙
112 183
     HAL_FLASH_Unlock(); // lock ??占�?
113 184
     if(flashinit == 0){
114 185
         flashinit= 1;
@@ -119,9 +190,59 @@ uint8_t Flash_write(uint8_t* data) // ?占쏙옙湲고븿?占쏙옙
119 190
     }
120 191
 //    FLASH_If_Erase();
121 192
     ret = Flash_RGB_Data_Write(&data[bluecell_stx]);
193
+//    ret = Flash_DataTest_Write(&data[bluecell_stx]);
194
+
122 195
     HAL_FLASH_Lock(); // lock ?占쏙옙洹멸린
123
-    __HAL_RCC_TIM6_CLK_ENABLE(); // 留ㅼ씤???占쏙옙癒몌옙?? ?占쏙옙?占쏙옙?占쏙옙?占쏙옙?占쏙옙?占쏙옙
196
+//    __HAL_RCC_TIM6_CLK_ENABLE(); // 留ㅼ씤???占쏙옙癒몌옙?? ?占쏙옙?占쏙옙?占쏙옙?占쏙옙?占쏙옙?占쏙옙
124 197
 
125 198
     return ret;
199
+}
200
+
201
+
202
+uint8_t Bank_Flash_write(uint8_t* data,uint32_t StartBankAddress) // ?占쏙옙湲고븿?占쏙옙
203
+{
204
+
205
+    /*Variable used for Erase procedure*/
206
+    static FLASH_EraseInitTypeDef EraseInitStruct;
207
+    static uint32_t PAGEError = 0;
208
+    uint8_t ret = 0;
209
+    /* Fill EraseInit structure*/
210
+    switch(StartBankAddress){
211
+        case FLASH_USER_START_ADDR:
212
+            EraseInitStruct.TypeErase   = FLASH_TYPEERASE_PAGES;
213
+            EraseInitStruct.PageAddress = FLASH_USER_START_ADDR;
214
+            EraseInitStruct.NbPages     = (FLASH_USER_END_ADDR - FLASH_USER_START_ADDR) / FLASH_PAGE_SIZE;
215
+        break;
216
+        case FLASH_USER_BANK1_START_ADDR:
217
+            EraseInitStruct.TypeErase   = FLASH_TYPEERASE_PAGES;
218
+            EraseInitStruct.PageAddress = FLASH_USER_BANK1_START_ADDR;
219
+            EraseInitStruct.NbPages     = (FLASH_USER_END_ADDR - FLASH_USER_BANK1_START_ADDR) / FLASH_PAGE_SIZE;
220
+
221
+        break;
222
+        case FLASH_USER_BANK2_START_ADDR:
223
+            EraseInitStruct.TypeErase   = FLASH_TYPEERASE_PAGES;
224
+            EraseInitStruct.PageAddress = FLASH_USER_BANK2_START_ADDR;
225
+            EraseInitStruct.NbPages     = (FLASH_USER_END_ADDR - FLASH_USER_BANK2_START_ADDR) / FLASH_PAGE_SIZE;
226
+
227
+        break;
228
+        case FLASH_USER_TEMPBANK_START_ADDR:
229
+            EraseInitStruct.TypeErase   = FLASH_TYPEERASE_PAGES;
230
+            EraseInitStruct.PageAddress = FLASH_USER_TEMPBANK_START_ADDR;
231
+            EraseInitStruct.NbPages     = (FLASH_USER_END_ADDR - FLASH_USER_TEMPBANK_START_ADDR) / FLASH_PAGE_SIZE;
232
+        break;
233
+
234
+    }
126 235
 
236
+    HAL_FLASH_Unlock(); // lock ??占�?
237
+    if(flashinit == 0){
238
+        flashinit= 1;
239
+        //FLASH_PageErase(StartAddr);
240
+        if (HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError) != HAL_OK){
241
+            printf("Erase Failed \r\n");
242
+        }
243
+    }
244
+    ret = Flash_RGB_Data_Write(&data[bluecell_stx]);
245
+    HAL_FLASH_Lock(); // lock ?占쏙옙洹멸린
246
+    return ret;
127 247
 }
248
+

+ 1 - 1
Src/main.c

@@ -144,7 +144,7 @@ int main(void)
144 144
 	 // printf("Uart Start \r\n");
145 145
 	  if(LedTimerCnt > 500){HAL_GPIO_TogglePin(BOOT_LED_GPIO_Port,BOOT_LED_Pin);LedTimerCnt = 0;}
146 146
 	  while (TerminalQueue.data > 0 && UartTimerCnt > 30) GetDataFromUartQueue(&hTerminal);
147
-//	  while(FirmwareTimerCnt > 3000)  Jump_App();
147
+	  while(FirmwareTimerCnt > 3000)  Jump_App();
148 148
 
149 149
 	  //HAL_Delay(500);
150 150
     /* USER CODE END WHILE */