tdse-tf_3-02

Controlador PID para derretidor de miel con control local via botones y remoto via WiFi
Index Commits Files Refs Submodules README
commit 85050a73c523acaad3d18886c4e6cc3d32ffba3c
parent cf121b2246f0af4d4016c44d24ab682a2dc5a426
Author: Martin Kloeckner <mjkloeckner@gmail.com>
Date:   Mon, 30 Mar 2026 13:30:27 -0300

Agregar persistencia de `temp_set_point` escribiendo el valor en FLASH

Esto introduce un problema y es que en cada actualizacion del valor se
debe borrar la pagina de flash donde se almacena la variable. Esta
operacion de borrado es muy lenta ya que se deben aplicar tensiones
altas. Esta demora es de aproximadamente 22 ms, por lo que no se
cumpliria la pauta de que cada tick de la aplicacion se ejecute por
debajo de 1 ms.

Como solución se puede escribir en direcciones contiguas diferentes en
cada actualizacion, y solo borrar una vez que se llena la página.

Diffstat:
Mfirmware/Core/Inc/main.h | 2+-
Mfirmware/Core/Src/main.c | 4++--
Mfirmware/app/src/app.c | 12++++++------
Mfirmware/app/src/task_system.c | 59+++++++++++++++++++++++++++++++++++++++++++++++++++++++----
4 files changed, 64 insertions(+), 13 deletions(-)
diff --git a/firmware/Core/Inc/main.h b/firmware/Core/Inc/main.h
@@ -48,7 +48,7 @@ extern RTC_DateTypeDef s_date;
 
 /* Exported constants --------------------------------------------------------*/
 /* USER CODE BEGIN EC */
-#define TASK_SYSTEM_RTC_MAGIC_NUMBER 0x32F2
+#define RTC_BACKUP_MAGIC_NUMBER 0x32F2
 
 /* USER CODE END EC */
 
diff --git a/firmware/Core/Src/main.c b/firmware/Core/Src/main.c
@@ -256,9 +256,9 @@ static void MX_RTC_Init(void)
 
   /* USER CODE BEGIN Check_RTC_BKUP */
 
-  if (HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1) == TASK_SYSTEM_RTC_MAGIC_NUMBER)
+  if (HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1) == RTC_BACKUP_MAGIC_NUMBER)
   {
-    return;
+      return;
   }
 
   /* USER CODE END Check_RTC_BKUP */
diff --git a/firmware/app/src/app.c b/firmware/app/src/app.c
@@ -63,12 +63,6 @@ void app_init(void)
 
     cycle_counter_init();
 
-    for (uint32_t index = 0; TASK_QTY > index; index++)
-    {
-        (*task_cfg_list[index].task_init)(task_cfg_list[index].parameters);
-        task_dta_list[index].WCET = TASK_X_WCET_INI;
-    }
-
     shared_data_type *p_shared_data = &shared_data;
 
     p_shared_data->temp_set_point = 0;
@@ -76,6 +70,12 @@ void app_init(void)
     p_shared_data->temp_ctrl_pwm_dc = 0;
     p_shared_data->temp_ctrl_enabled = false;
 
+    for (uint32_t index = 0; TASK_QTY > index; index++)
+    {
+        (*task_cfg_list[index].task_init)(task_cfg_list[index].parameters);
+        task_dta_list[index].WCET = TASK_X_WCET_INI;
+    }
+
     __asm("CPSID i");
     g_app_tick_cnt = G_APP_TICK_CNT_INI;
     g_task_system_tick_cnt = G_APP_TICK_CNT_INI;
diff --git a/firmware/app/src/task_system.c b/firmware/app/src/task_system.c
@@ -18,8 +18,9 @@
 #include "task_menu_attribute.h"
 #include "task_menu_interface.h"
 
-#define G_TASK_SYS_CNT_INI       0ul
-#define G_TASK_SYS_TICK_CNT_INI  0ul
+#define G_TASK_SYS_CNT_INI               0ul
+#define G_TASK_SYS_TICK_CNT_INI          0ul
+#define G_TASK_SYS_EEPROM_START_ADDR 0x0801FC00
 
 #define DEL_SYS_MIN             0ul
 #define DEL_SYS_MED             50ul
@@ -40,6 +41,8 @@ void task_system_statechart(void *parameters);
 void task_system_rtc_init(void);
 void task_system_rtc_increment_hour(void);
 void task_system_rtc_increment_min(void);
+void task_system_eeprom_read_param(void *parameters);
+void task_system_eeprom_write_param(void *parameters);
 
 // Public function definition
 void task_system_init(void *parameters)
@@ -53,6 +56,7 @@ void task_system_init(void *parameters)
 
     task_system_interface_init_event_queue();
     task_system_rtc_init();
+    task_system_eeprom_read_param(parameters);
 
     p_task_system_dta = &task_system_dta;
 
@@ -100,7 +104,7 @@ void task_system_rtc_init(void)
     HAL_PWR_EnableBkUpAccess();
 
     // Set RTC Time only if RTC has been reset
-    if (HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1) != TASK_SYSTEM_RTC_MAGIC_NUMBER)
+    if (HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1) != RTC_BACKUP_MAGIC_NUMBER)
     {
         s_time.Hours   = 16;
         s_time.Minutes = 41;
@@ -112,7 +116,7 @@ void task_system_rtc_init(void)
         s_date.Date    = 20;
         s_date.Year    = 26; // 2026
         HAL_RTC_SetDate(&hrtc, &s_date, RTC_FORMAT_BIN);
-        HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, TASK_SYSTEM_RTC_MAGIC_NUMBER);
+        HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, RTC_BACKUP_MAGIC_NUMBER);
     }
 }
 
@@ -130,6 +134,52 @@ void task_system_rtc_increment_min()
     HAL_RTC_SetTime(&hrtc, &s_time, RTC_FORMAT_BIN);
 }
 
+void task_system_eeprom_read_param(void *parameters)
+{
+    shared_data_type *p_shared_data = (shared_data_type *)parameters;
+    p_shared_data->temp_set_point = *(uint16_t *)G_TASK_SYS_EEPROM_START_ADDR;
+}
+
+// To reduce the wear of flash its better to write the new variables on the same
+// page but on contiguous address, every time the variables are updated, and
+// only erase the flash once the page fills
+void task_system_eeprom_write_param(void *parameters)
+{
+    shared_data_type *p_shared_data = (shared_data_type *)parameters;
+
+    if(p_shared_data->temp_set_point == *(uint16_t *)G_TASK_SYS_EEPROM_START_ADDR)
+    {
+        // No need to update if the value is the same
+        return;
+    }
+
+    HAL_FLASH_Unlock();
+
+    FLASH_EraseInitTypeDef erase = {0};
+    uint32_t sector_error;
+
+    erase.TypeErase   = FLASH_TYPEERASE_PAGES;
+    erase.PageAddress = G_TASK_SYS_EEPROM_START_ADDR;
+    erase.NbPages     = 1; // 1024 bytes
+
+    if(HAL_FLASHEx_Erase(&erase, &sector_error) != HAL_OK)
+    {
+        HAL_FLASH_Lock();
+        LOGGER_ERROR("Could erase flash at address %d",
+                G_TASK_SYS_EEPROM_START_ADDR);
+        return;
+    }
+
+    uint16_t data[] = {
+        p_shared_data->temp_set_point
+    };
+
+    HAL_FLASH_Program(TYPEPROGRAM_HALFWORD,
+            G_TASK_SYS_EEPROM_START_ADDR, *(uint64_t *)data);
+
+    HAL_FLASH_Lock();
+}
+
 void task_system_statechart(void *parameters)
 {
     task_system_dta_t *p_task_system_dta = &task_system_dta;
@@ -202,6 +252,7 @@ void task_system_statechart(void *parameters)
                     case EV_SYS_BTN_D_ACTIVE:
                         p_task_system_dta->state = ST_SYS_IDLE;
                         task_menu_interface_put_event(EV_MEN_ST_IDLE);
+                        task_system_eeprom_write_param(parameters);
                     break;
 
                     case EV_SYS_BTN_B_ACTIVE: