MCU:STM32F407ZGT6
RTOS: FreeRTOS
1. 选定一块flash
stm32f407_flash.pngstm32的flash是以sector为单位擦除的。所以选择flash的时候需要选择完整的sector。这里我选择了sector3和sector4。为什么选择两个sector呢?因为FLASH模拟EEPROM的库需要用到两个sector。
2. 在Flash中开辟一段空间,供用户使用
在STM32F407VETx_FLASH.ld中增加如下代码:
/* Define output sections */
SECTIONS
{
/* The startup code goes first into FLASH */
.isr_vector :
{
. = ALIGN(4);
KEEP(*(.isr_vector)) /* Startup code */
. = ALIGN(4);
} >FLASH
.user_config 0x08008000 :
{
. = ALIGN(4);
. = . + 0x8000;
. = ALIGN(4);
} >FLASH
......
}
.user_config 0x08008000 :
中0x08008000是sector2的起始地址,. = . + 0x8000;
这里的0x8000是32Kbytes。
3. 初始化
uint16_t VirtAddVarTab[NB_OF_VAR];
uint16_t power_down_info_half_word_count = 0;
static void start_task_code(void *arg)
{
elog_init();
elog_set_text_color_enabled(true);
elog_set_fmt(ELOG_LVL_ERROR, ELOG_FMT_LVL | ELOG_FMT_TAG | ELOG_FMT_TIME | ELOG_FMT_FUNC | ELOG_FMT_LINE | ELOG_FMT_T_INFO);
elog_set_fmt(ELOG_LVL_WARN, ELOG_FMT_LVL | ELOG_FMT_TAG | ELOG_FMT_TIME | ELOG_FMT_T_INFO);
elog_set_fmt(ELOG_LVL_INFO, ELOG_FMT_LVL | ELOG_FMT_TAG | ELOG_FMT_TIME | ELOG_FMT_T_INFO);
elog_set_fmt(ELOG_LVL_DEBUG, ELOG_FMT_LVL | ELOG_FMT_TAG | ELOG_FMT_TIME | ELOG_FMT_FUNC | ELOG_FMT_LINE | ELOG_FMT_T_INFO);
elog_start();
/* 初始化变量虚地址表 */
power_down_info_half_word_count = sizeof(power_down_info_t) / 2;
log_i("power_down_info_t have %d half word.", sizeof(power_down_info_t) / 2);
for (uint16_t i = 0; i < power_down_info_half_word_count && i < NB_OF_VAR; i++) {
VirtAddVarTab[i] = i;
}
HAL_FLASH_Unlock();
EE_Init();
......
}
4.读操作
for (uint16_t i = 0; i < power_down_info_half_word_count; i++) {
EE_ReadVariable(i, ((uint16_t *)(&power_down_info) + i));
}
5.写操作
for (uint16_t i = 0; i < power_down_info_half_word_count; i++) {
EE_WriteVariable(i, *((uint16_t *)(&power_down_info) + i));
}
6.库地址
地址:https://www.aliyundrive.com/s/fUE5g5VBCqp
提取码:7qx0
网友评论