美文网首页读书
STM32:FLASH模拟EEPROM

STM32:FLASH模拟EEPROM

作者: xEndLess | 来源:发表于2023-07-12 17:37 被阅读0次

    MCU:STM32F407ZGT6
    RTOS: FreeRTOS

    1. 选定一块flash

    stm32f407_flash.png

    stm32的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

    相关文章

      网友评论

        本文标题:STM32:FLASH模拟EEPROM

        本文链接:https://www.haomeiwen.com/subject/wwjeudtx.html