Pārlūkot izejas kodu

Flash 주소 변경

PYJ 5 gadi atpakaļ
vecāks
revīzija
dd5d4a9027
3 mainītis faili ar 82 papildinājumiem un 45 dzēšanām
  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 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 30
 void Flash_InitRead(void) // ?占쏙옙湲고븿?占쏙옙
31 31
 {
32 32
     uint32_t  Address = 0;
33
-    Address = FLASH_USER_TEMPBANK_START_ADDR;
33
+    Address = FLASH_USER_BANK1_START_ADDR;
34 34
     for(uint32_t i = 0; i < 300; i++ ){
35 35
         printf("%08x : %02X \n",Address ,*(uint8_t*)Address);
36 36
         Address++;
@@ -55,6 +55,7 @@ uint8_t Flash_Data_Write(uint8_t* data){
55 55
     uint16_t Firmdata = 0;
56 56
     uint8_t ret = 0;
57 57
     int i = 0;
58
+    static uint8_t Errcnt = 0;
58 59
     static uint32_t Curr_Download_DataIndex = 0;
59 60
     static uint32_t Prev_Download_DataIndex = 0;  
60 61
     
@@ -66,16 +67,21 @@ uint8_t Flash_Data_Write(uint8_t* data){
66 67
 //    data[MBIC_PAYLOADSTART + 12 +i];
67 68
    
68 69
     returntoFirst:
69
-    UserAddress -= i;
70 70
     for(i= 0; i <= Curr_Download_DataIndex - Prev_Download_DataIndex; i+=2){
71 71
         Firmdata  = ((data[MBIC_PAYLOADSTART + 12 +i]) & 0x00FF);
72 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 75
             printf("HAL NOT OK \n");
75 76
             ret = 1;
76 77
             HAL_Delay(1000);
78
+            if(Errcnt == 0xFF)
79
+                return;
80
+            
81
+            Errcnt++;
77 82
             goto returntoFirst;
78 83
         }else{
84
+            Errcnt = 0; //Err Cnt Init;
79 85
             UserAddress += 2;
80 86
         }
81 87
     }
@@ -83,6 +89,43 @@ uint8_t Flash_Data_Write(uint8_t* data){
83 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 161
                 EraseInitStruct.NbPages     = (FLASH_USER_END_ADDR - FLASH_USER_BANK2_START_ADDR) / FLASH_PAGE_SIZE;
119 162
 
120 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 174
     HAL_FLASH_Lock(); // lock ?占쏙옙洹멸린
137 175
     return ret;
138 176
 }
139
-#define DATA_32                 ((uint32_t)0x12345678)
177
+#define DATA_32                 ((uint32_t)0x33333333)
140 178
 __IO bool EraseInit = false;
141 179
 
142
-void MBIC_APIFLASH_test(){
180
+void MBIC_APIFLASH_test(uint8_t* data,uint32_t size){
143 181
     static FLASH_EraseInitTypeDef EraseInitStruct;
144 182
     static uint32_t Address = 0, PAGEError = 0;
145 183
         
@@ -153,8 +191,8 @@ void MBIC_APIFLASH_test(){
153 191
     /* Fill EraseInit structure*/
154 192
     if(EraseInit == false){
155 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 196
         printf("Erase Start\r\n");
159 197
         if (HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError) != HAL_OK)
160 198
         {
@@ -179,13 +217,13 @@ void MBIC_APIFLASH_test(){
179 217
     /* Program the user Flash area word by word
180 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 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 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 228
       else
191 229
       {
@@ -208,34 +246,34 @@ void MBIC_APIFLASH_test(){
208 246
     /* Check if the programmed data is OK
209 247
         MemoryProgramStatus = 0: data programmed correctly
210 248
         MemoryProgramStatus != 0: number of words not programmed correctly ******/
211
-    Address = FLASH_USER_TEMPBANK_START_ADDR;
249
+    Address = FLASH_USER_BANK1_START_ADDR;
212 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 62
 MEMORY
63 63
 {
64 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 68
 /* Define output sections */