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:
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, §or_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: