Browse Source

Модуль настроек теперь работает.

TelenkovDmitry 1 week ago
parent
commit
0a2fa91cb7

+ 18 - 2
desk/modules/configs/config.h

@@ -8,9 +8,25 @@
 
 #define SETTINGS_ADDR       0x08000000 + (63 * 2048)  //0x01F7FF
 
-#define CRC_ADDRESS         0x01FFFC  
+// Ключ для контроля сектора настроек
+#define SETTINGS_KEY            123456789
+
+// Страница настроек
+#define SETTINGS_PAGE           63
+
+// Возвращает адрес страницы по номеру страницы
+#define GET_PAGE_ADDR(x)            ((uint32_t)(0x08000000 + 0x800 * (x)))
+
+// Возвращает адрес настроек по номеру страницы
+#define GET_SETTINGS_ADDR(x)        (GET_PAGE_ADDR(SETTINGS_PAGE + 1) - 4)
+
+// Возвращает адрес ключа настроек по номеру страницы
+#define GET_SETTINGS_KEY_ADDR(x)    (GET_PAGE_ADDR(SETTINGS_PAGE + 1) - 16)
+
+// Возвращает адрес CRC структуры настроек во флеш памяти по номеру страницы
+#define GET_SETTINGS_CRC_ADDR(x) (GET_PAGE_ADDR(SETTINGS_PAGE + 1) - 8)
+
 
-#define FLASH_ROW_SIZE          32
 
 /* @note All the executable code is mapped in SRAM1 area */
 #define FLASH_USER_START_ADDR   ADDR_FLASH_PAGE_0   /* Start @ of user Flash area */

+ 69 - 37
desk/modules/settings/settings.cpp

@@ -6,9 +6,6 @@
 
 CRC_HandleTypeDef hcrc;
 
-
-//volatile FLASH_Status FLASHStatus = FLASH_COMPLETE;
-
 settings_t settings;
 
 static FLASH_EraseInitTypeDef EraseInitStruct;
@@ -22,7 +19,7 @@ void settings_crc_init(void)
     hcrc.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_ENABLE;
     hcrc.Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_NONE;
     hcrc.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_DISABLE;
-    hcrc.InputDataFormat = CRC_INPUTDATA_FORMAT_WORDS;
+    hcrc.InputDataFormat = CRC_INPUTDATA_FORMAT_BYTES;
     HAL_CRC_Init(&hcrc);
 }
 
@@ -56,7 +53,7 @@ void settings_load(void)
     settings_read_from_flash((uint8_t*)&settings, sizeof(settings));
 
     // Считываем CRC из флеш памяти
-    load_crc = (*(uint32_t*)CRC_ADDRESS);
+    load_crc = (*(uint32_t*)GET_SETTINGS_CRC_ADDR(SETTINGS_PAGE));
 
     // Рассчитываем CRC для структуры настроек
     new_crc = settings_get_crc();
@@ -70,47 +67,83 @@ void settings_load(void)
 
 
 //
-void settings_save(void)
+bool settings_save(void)
 {
-    uint32_t baseAddress = SETTINGS_ADDR;
-    uint32_t crc;
-    uint32_t size = sizeof(settings) / 4;
-    uint32_t *data = (uint32_t*)&settings;
+    uint32_t addr = GET_PAGE_ADDR(SETTINGS_PAGE);
+    uint64_t *ptr = (uint64_t*)&settings;
     
-    HAL_FLASH_Unlock();
+    taskENTER_CRITICAL();
     
-    __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPTVERR);
-    
-    EraseInitStruct.TypeErase = FLASH_TYPEERASE_MASSERASE;
-    EraseInitStruct.Banks     = FLASH_BANK_1;
-    //HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError)
+    HAL_FLASH_Unlock();
     
-    FLASH_PageErase(SETTINGS_ADDR, FLASH_BANK_1);
+    settings_erase_page(SETTINGS_PAGE);
+              
+    save_settings_attributes(SETTINGS_PAGE);
+      
+    for (uint16_t i = 0; i < (sizeof(settings) / 8) + 1; i++)
+    {
+        if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, addr, *ptr) != HAL_OK)
+        {
+            return false;
+        }
+        
+        addr += 8;
+        ptr++;
+    }
     
     HAL_FLASH_Lock();
     
-#if 0    
-    vPortEnterCritical();
-    
-    FLASH_Unlock();
-    
-    FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
+    taskEXIT_CRITICAL();
     
-    FLASHStatus = FLASH_ErasePage(SETTINGS_ADDR);
-        
-    //crc = settings_get_crc();
-    
-    FLASH_ProgramWord(CRC_ADDRESS, crc);
+    return true;
+}
+
+
+//
+bool save_settings_attributes(uint16_t page)
+{
+    uint32_t crc_addr = GET_SETTINGS_CRC_ADDR(page);
+    uint32_t crc;
+   
+    crc = settings_get_crc();
     
-    for (uint32_t i = 0; i < size; i++) {
-        FLASH_ProgramWord(baseAddress, *data++);
-        baseAddress += 4;
+    if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, crc_addr, 
+                         (uint64_t)crc) != HAL_OK) {
+        return false;
     }
-          
-    FLASH_Lock();
     
-    vPortExitCritical();
-#endif    
+    return true;
+}
+
+
+//
+bool settings_erase_page(uint16_t page)
+{
+    uint32_t bank_number = 0;
+    uint32_t addr = 0;
+    uint32_t PAGEError = 0;
+      
+    __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPTVERR);
+            
+    addr = GET_PAGE_ADDR(page);
+    bank_number = settings_get_bank(addr);
+  
+    EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
+    EraseInitStruct.NbPages   = 1;
+    EraseInitStruct.Page      = page;
+    EraseInitStruct.Banks     = bank_number;
+            
+    if (HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError) != HAL_OK)
+        return false;
+    
+    return true;
+}
+
+
+//
+uint32_t settings_get_bank(uint32_t addr)
+{
+    return FLASH_BANK_1;
 }
 
 
@@ -129,9 +162,8 @@ void settings_set_def(void)
 //
 uint32_t settings_get_crc(void)
 {
-    //CRC_ResetDR();
+    __HAL_CRC_DR_RESET(&hcrc);
     return HAL_CRC_Calculate(&hcrc, (uint32_t*)&settings, sizeof(settings));
-    //return CRC_CalcBlockCRC((uint32_t*)&settings, sizeof(settings));
 }
 
 

+ 12 - 3
desk/modules/settings/settings.h

@@ -6,7 +6,7 @@
 
 
 // общая структура настроек
-//#pragma pack(push, 4)
+#pragma pack(push, 4)
 typedef struct
 {
     char fw_version[20];
@@ -15,7 +15,7 @@ typedef struct
     uint32_t temperature_threshold;
       
 } settings_t;
-//#pragma pack(pop)    
+#pragma pack(pop)    
 
 
 //
@@ -25,7 +25,16 @@ void settings_crc_init(void);
 void settings_load(void);
 
 //
-void settings_save(void);
+bool settings_save(void);
+
+//
+bool save_settings_attributes(uint16_t page);
+
+//
+bool settings_erase_page(uint16_t page);
+
+//
+uint32_t settings_get_bank(uint32_t addr);
 
 //
 void settings_set_def(void);

BIN
project/ewarm/desk/Debug/Exe/desk.out


BIN
project/ewarm/desk/Debug/Exe/desk.sim


File diff suppressed because it is too large
+ 365 - 348
project/ewarm/desk/Debug/List/desk.map


+ 4 - 1
project/ewarm/desk/settings/desk.dnx

@@ -16,7 +16,7 @@
         <ShowSource>1</ShowSource>
     </Trace1>
     <DebugChecksum>
-        <Checksum>1081711284</Checksum>
+        <Checksum>3682967441</Checksum>
     </DebugChecksum>
     <Disassembly>
         <MixedMode>1</MixedMode>
@@ -75,6 +75,9 @@
         <ITMportsLogFile>0</ITMportsLogFile>
         <ITMlogFile>$PROJ_DIR$\ITM.log</ITMlogFile>
     </SWOTraceHWSettings>
+    <watch_formats>
+        <Fmt0>{W}1:data	4	0</Fmt0>
+    </watch_formats>
     <Trace2>
         <Enabled>0</Enabled>
         <ShowSource>0</ShowSource>

Some files were not shown because too many files changed in this diff