PYJ преди 5 години
родител
ревизия
dd5d4a9027
променени са 3 файла, в които са добавени 82 реда и са изтрити 45 реда
  1. 2 3
      Bluecell_Inc/flash.h
  2. 79 41
      Bluecell_Src/flash.c
  3. 1 1
      STM32F103ZE_FLASH.ld

+ 2 - 3
Bluecell_Inc/flash.h

@@ -16,9 +16,8 @@
16
 #define APPLICATION_ADDRESS     (uint32_t)0x08005000      /* Start user code address: ADDR_FLASH_PAGE_8 */
16
 #define APPLICATION_ADDRESS     (uint32_t)0x08005000      /* Start user code address: ADDR_FLASH_PAGE_8 */
17
 
17
 
18
 
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)
19
+#define FLASH_USER_BANK1_START_ADDR ((uint32_t)0x08025000)
20
+#define FLASH_USER_BANK2_START_ADDR ((uint32_t)0x08045000)
22
 
21
 
23
 
22
 
24
 
23
 

+ 79 - 41
Bluecell_Src/flash.c

@@ -30,7 +30,7 @@ void Jump_App(void){
30
 void Flash_InitRead(void) // ?占쏙옙湲고븿?占쏙옙
30
 void Flash_InitRead(void) // ?占쏙옙湲고븿?占쏙옙
31
 {
31
 {
32
     uint32_t  Address = 0;
32
     uint32_t  Address = 0;
33
-    Address = FLASH_USER_TEMPBANK_START_ADDR;
33
+    Address = FLASH_USER_BANK1_START_ADDR;
34
     for(uint32_t i = 0; i < 300; i++ ){
34
     for(uint32_t i = 0; i < 300; i++ ){
35
         printf("%08x : %02X \n",Address ,*(uint8_t*)Address);
35
         printf("%08x : %02X \n",Address ,*(uint8_t*)Address);
36
         Address++;
36
         Address++;
@@ -55,6 +55,7 @@ uint8_t Flash_Data_Write(uint8_t* data){
55
     uint16_t Firmdata = 0;
55
     uint16_t Firmdata = 0;
56
     uint8_t ret = 0;
56
     uint8_t ret = 0;
57
     int i = 0;
57
     int i = 0;
58
+    static uint8_t Errcnt = 0;
58
     static uint32_t Curr_Download_DataIndex = 0;
59
     static uint32_t Curr_Download_DataIndex = 0;
59
     static uint32_t Prev_Download_DataIndex = 0;  
60
     static uint32_t Prev_Download_DataIndex = 0;  
60
     
61
     
@@ -66,16 +67,21 @@ uint8_t Flash_Data_Write(uint8_t* data){
66
 //    data[MBIC_PAYLOADSTART + 12 +i];
67
 //    data[MBIC_PAYLOADSTART + 12 +i];
67
    
68
    
68
     returntoFirst:
69
     returntoFirst:
69
-    UserAddress -= i;
70
     for(i= 0; i <= Curr_Download_DataIndex - Prev_Download_DataIndex; i+=2){
70
     for(i= 0; i <= Curr_Download_DataIndex - Prev_Download_DataIndex; i+=2){
71
         Firmdata  = ((data[MBIC_PAYLOADSTART + 12 +i]) & 0x00FF);
71
         Firmdata  = ((data[MBIC_PAYLOADSTART + 12 +i]) & 0x00FF);
72
         Firmdata  += ((data[MBIC_PAYLOADSTART + 12 +i + 1] << 8) & 0xFF00);
72
         Firmdata  += ((data[MBIC_PAYLOADSTART + 12 +i + 1] << 8) & 0xFF00);
73
-        if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD,UserAddress ,   (uint16_t)Firmdata) != HAL_OK){
73
+        if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD,UserAddress ,   (uint16_t)Firmdata) != HAL_OK)
74
+        {
74
             printf("HAL NOT OK \n");
75
             printf("HAL NOT OK \n");
75
             ret = 1;
76
             ret = 1;
76
             HAL_Delay(1000);
77
             HAL_Delay(1000);
78
+            if(Errcnt == 0xFF)
79
+                return;
80
+            
81
+            Errcnt++;
77
             goto returntoFirst;
82
             goto returntoFirst;
78
         }else{
83
         }else{
84
+            Errcnt = 0; //Err Cnt Init;
79
             UserAddress += 2;
85
             UserAddress += 2;
80
         }
86
         }
81
     }
87
     }
@@ -83,6 +89,43 @@ uint8_t Flash_Data_Write(uint8_t* data){
83
     return ret;
89
     return ret;
84
 }
90
 }
85
 
91
 
92
+uint8_t API_Flash_Data_Write(uint8_t* data){
93
+    uint16_t Firmdata = 0;
94
+    uint8_t ret = 0;
95
+    int i = 0;
96
+    static uint8_t Errcnt = 0;
97
+    static uint32_t Curr_Download_DataIndex = 0;
98
+    static uint32_t Prev_Download_DataIndex = 0;  
99
+    
100
+    Curr_Download_DataIndex = data[MBIC_PAYLOADSTART  + 4] << 24;
101
+    Curr_Download_DataIndex += data[MBIC_PAYLOADSTART + 5] << 16;
102
+    Curr_Download_DataIndex += data[MBIC_PAYLOADSTART + 6] << 8;            
103
+    Curr_Download_DataIndex += data[MBIC_PAYLOADSTART + 7];      
104
+
105
+//    data[MBIC_PAYLOADSTART + 12 +i];
106
+   
107
+    returntoFirst:
108
+    for(i= 0; i <= Curr_Download_DataIndex - Prev_Download_DataIndex; i+=2){
109
+        Firmdata  = ((data[MBIC_PAYLOADSTART + 12 +i]) & 0x00FF);
110
+        Firmdata  += ((data[MBIC_PAYLOADSTART + 12 +i + 1] << 8) & 0xFF00);
111
+        if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD,UserAddress ,   (uint16_t)Firmdata) != HAL_OK)
112
+        {
113
+            printf("HAL NOT OK \n");
114
+            ret = 1;
115
+            HAL_Delay(1000);
116
+            if(Errcnt == 0xFF)
117
+                return;
118
+            
119
+            Errcnt++;
120
+            goto returntoFirst;
121
+        }else{
122
+            Errcnt = 0; //Err Cnt Init;
123
+            UserAddress += 2;
124
+        }
125
+    }
126
+    Prev_Download_DataIndex = Curr_Download_DataIndex + 1;
127
+    return ret;
128
+}
86
 
129
 
87
 
130
 
88
 
131
 
@@ -118,11 +161,6 @@ uint8_t Bank_Flash_write(uint8_t* data,uint32_t StartBankAddress) // ?占쏙옙
118
                 EraseInitStruct.NbPages     = (FLASH_USER_END_ADDR - FLASH_USER_BANK2_START_ADDR) / FLASH_PAGE_SIZE;
161
                 EraseInitStruct.NbPages     = (FLASH_USER_END_ADDR - FLASH_USER_BANK2_START_ADDR) / FLASH_PAGE_SIZE;
119
 
162
 
120
             break;
163
             break;
121
-            case FLASH_USER_TEMPBANK_START_ADDR:
122
-                EraseInitStruct.TypeErase   = FLASH_TYPEERASE_PAGES;
123
-                EraseInitStruct.PageAddress = FLASH_USER_TEMPBANK_START_ADDR - 128;
124
-                EraseInitStruct.NbPages     = (FLASH_USER_END_ADDR - FLASH_USER_TEMPBANK_START_ADDR) / FLASH_PAGE_SIZE;
125
-            break;
126
 
164
 
127
         }        
165
         }        
128
         
166
         
@@ -136,10 +174,10 @@ uint8_t Bank_Flash_write(uint8_t* data,uint32_t StartBankAddress) // ?占쏙옙
136
     HAL_FLASH_Lock(); // lock ?占쏙옙洹멸린
174
     HAL_FLASH_Lock(); // lock ?占쏙옙洹멸린
137
     return ret;
175
     return ret;
138
 }
176
 }
139
-#define DATA_32                 ((uint32_t)0x12345678)
177
+#define DATA_32                 ((uint32_t)0x33333333)
140
 __IO bool EraseInit = false;
178
 __IO bool EraseInit = false;
141
 
179
 
142
-void MBIC_APIFLASH_test(){
180
+void MBIC_APIFLASH_test(uint8_t* data,uint32_t size){
143
     static FLASH_EraseInitTypeDef EraseInitStruct;
181
     static FLASH_EraseInitTypeDef EraseInitStruct;
144
     static uint32_t Address = 0, PAGEError = 0;
182
     static uint32_t Address = 0, PAGEError = 0;
145
         
183
         
@@ -153,8 +191,8 @@ void MBIC_APIFLASH_test(){
153
     /* Fill EraseInit structure*/
191
     /* Fill EraseInit structure*/
154
     if(EraseInit == false){
192
     if(EraseInit == false){
155
         EraseInitStruct.TypeErase   = FLASH_TYPEERASE_PAGES;
193
         EraseInitStruct.TypeErase   = FLASH_TYPEERASE_PAGES;
156
-        EraseInitStruct.PageAddress = FLASH_USER_TEMPBANK_START_ADDR;
157
-        EraseInitStruct.NbPages     = ((FLASH_USER_TEMPBANK_START_ADDR + ((uint32_t)0x000FFFF)) - FLASH_USER_TEMPBANK_START_ADDR) / FLASH_PAGE_SIZE;
194
+        EraseInitStruct.PageAddress = FLASH_USER_BANK1_START_ADDR;
195
+        EraseInitStruct.NbPages     = ((FLASH_USER_BANK1_START_ADDR + ((uint32_t)0x000FFFF)) - FLASH_USER_BANK1_START_ADDR) / FLASH_PAGE_SIZE;
158
         printf("Erase Start\r\n");
196
         printf("Erase Start\r\n");
159
         if (HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError) != HAL_OK)
197
         if (HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError) != HAL_OK)
160
         {
198
         {
@@ -179,13 +217,13 @@ void MBIC_APIFLASH_test(){
179
     /* Program the user Flash area word by word
217
     /* Program the user Flash area word by word
180
       (area defined by FLASH_USER_START_ADDR and FLASH_USER_END_ADDR) ***********/
218
       (area defined by FLASH_USER_START_ADDR and FLASH_USER_END_ADDR) ***********/
181
     
219
     
182
-    Address = FLASH_USER_TEMPBANK_START_ADDR;
220
+    Address = FLASH_USER_BANK1_START_ADDR;
183
     printf("HAL_FLASH_Program Start\r\n");
221
     printf("HAL_FLASH_Program Start\r\n");
184
-    while (Address < ((FLASH_USER_TEMPBANK_START_ADDR + ((uint32_t)0x000FFFF))))
222
+    while (Address < ((FLASH_USER_BANK1_START_ADDR + 12)))
185
     {
223
     {
186
       if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, Address, DATA_32) == HAL_OK)
224
       if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, Address, DATA_32) == HAL_OK)
187
       {
225
       {
188
-        Address = Address + 2;
226
+        Address = Address + 4;
189
       }
227
       }
190
       else
228
       else
191
       {
229
       {
@@ -208,34 +246,34 @@ void MBIC_APIFLASH_test(){
208
     /* Check if the programmed data is OK
246
     /* Check if the programmed data is OK
209
         MemoryProgramStatus = 0: data programmed correctly
247
         MemoryProgramStatus = 0: data programmed correctly
210
         MemoryProgramStatus != 0: number of words not programmed correctly ******/
248
         MemoryProgramStatus != 0: number of words not programmed correctly ******/
211
-    Address = FLASH_USER_TEMPBANK_START_ADDR;
249
+    Address = FLASH_USER_BANK1_START_ADDR;
212
     MemoryProgramStatus = 0x0;
250
     MemoryProgramStatus = 0x0;
213
     
251
     
214
-    while (Address < ((FLASH_USER_TEMPBANK_START_ADDR + ((uint32_t)0x000FFFF))))
215
-    {
216
-      data32 = *(__IO uint32_t *)Address;
217
-       printf("%08x : %02X \n",Address ,*(uint8_t*)Address);
218
-      if (data32 != DATA_32)
219
-      {
220
-        MemoryProgramStatus++;
221
-      }
222
-      Address = Address + 4;
223
-    }
224
-    
225
-    /*Check if there is an issue to program data*/
226
-    if (MemoryProgramStatus == 0)
227
-    {
228
-        printf("DATA OK \r\n");
229
-      /* No error detected. Switch on LED2*/
230
-    }
231
-    else
232
-    {
233
-      /* Error detected. LED2 will blink with 1s period */
234
-      while (1)
235
-      {
236
-         printf("Read Error\r\n");
237
-      }
238
-    }
252
+//    while (Address < ((FLASH_USER_BANK1_START_ADDR + 12)))
253
+//    {
254
+//      data32 = *(__IO uint32_t *)Address;
255
+//       printf("%08x : %02X \n",Address ,*(uint8_t*)Address);
256
+//      if (data32 != DATA_32)
257
+//      {
258
+//        MemoryProgramStatus++;
259
+//      }
260
+//      Address = Address + 4;
261
+//    }
262
+//    
263
+//    /*Check if there is an issue to program data*/
264
+//    if (MemoryProgramStatus == 0)
265
+//    {
266
+//        printf("DATA OK \r\n");
267
+//      /* No error detected. Switch on LED2*/
268
+//    }
269
+//    else
270
+//    {
271
+//      /* Error detected. LED2 will blink with 1s period */
272
+//      while (1)
273
+//      {
274
+//         printf("Read Error\r\n");
275
+//      }
276
+//    }
239
 
277
 
240
 
278
 
241
 }
279
 }

+ 1 - 1
STM32F103ZE_FLASH.ld

@@ -62,7 +62,7 @@ _Min_Stack_Size = 0x400; /* required amount of stack */
62
 MEMORY
62
 MEMORY
63
 {
63
 {
64
 RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 64K
64
 RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 64K
65
-FLASH (rx)      : ORIGIN = 0x8005000, LENGTH = 64K
65
+FLASH (rx)      : ORIGIN = 0x8005000, LENGTH = 512K - 64K
66
 }
66
 }
67
 
67
 
68
 /* Define output sections */
68
 /* Define output sections */