搜索
bottom↓
回复: 15

用STM32 官方flash模拟eeprom的例程,碰到的一些问题.

[复制链接]

出0入0汤圆

发表于 2017-5-20 20:25:03 | 显示全部楼层 |阅读模式
本帖最后由 liang_work 于 2017-5-20 20:42 编辑

现在在做一个项目,要用到eeprom保存参数,所以.参考了用STM32 官方flash模拟eeprom的例子,现在读写正常,但写入的数据多了,就会出错,自已也上网找STM32 官方模拟eeprom的例子分析.明白了一些,但还是解决不了问题.所以向大家请教.我自已也分析了一下,出错的地方应是在eeprom从page0到page1切换时出错的.但是找不出那里出错.

我现在用的MCU是103RC 256K的,eeprom按说明分页应是128页2K.我的数据保存在192K之后.要保存的数据有414个,其中前面的400个分为50组X8个,每次写入一组(8个u16字),之前的一组写了,下次就写到后面的一组,依次循环用这50组保存数据,后面的14个u16字,用来保存系统的配置字,比较少写.现在的情况是,写入数据比较少时,就不会出错,写入多了,就出错,最明显的,就是配置位的数据会掉失.
另还有一个,就是,我的系统在第一次工作时,会先将上面的400全清0,后面的14个字设定对应的值.正常工作时,才一一写入数据.

简单地说,就是我要如何做,才能在我的芯片上,用上STM32 官方模拟eeprom的例子来保存我下面的414个数据.

下面是我认为用STM32 官方flash模拟eeprom,需要改动的地方如下.

1.定义地址数组的大小
/* Variables' number */#define NumbOfVar               ((uint16_t)414)


2.开始的首址
/* EEPROM start address in Flash */
#define EEPROM_START_ADDRESS    ((uint32_t)0x08030000) /* EEPROM emulation start address:     after 192 KByte of used Flash memory */

3.定义414个字的地址
const uint16_t VirtAddVarTab[NumbOfVar] = {
        
0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
        
0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
        
0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF,
0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,               
        
0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF,        
0x0100, 0x0101, 0x0102, 0x0103, 0x0104, 0x0105, 0x0106, 0x0107, 0x0108, 0x0109, 0x010A, 0x010B, 0x010C, 0x010D, 0x010E, 0x010F,
0x0110, 0x0111, 0x0112, 0x0113, 0x0114, 0x0115, 0x0116, 0x0117, 0x0118, 0x0119, 0x011A, 0x011B, 0x011C, 0x011D, 0x011E, 0x011F,
0x0120, 0x0121, 0x0122, 0x0123, 0x0124, 0x0125, 0x0126, 0x0127, 0x0128, 0x0129, 0x012A, 0x012B, 0x012C, 0x012D, 0x012E, 0x012F,
0x0130, 0x0131, 0x0132, 0x0133, 0x0134, 0x0135, 0x0136, 0x0137, 0x0138, 0x0139, 0x013A, 0x013B, 0x013C, 0x013D, 0x013E, 0x013F,

0x0140, 0x0141, 0x0142, 0x0143, 0x0144, 0x0145, 0x0146, 0x0147, 0x0148, 0x0149, 0x014A, 0x014B, 0x014C, 0x014D, 0x014E, 0x014F,
0x0150, 0x0151, 0x0152, 0x0153, 0x0154, 0x0155, 0x0156, 0x0157, 0x0158, 0x0159, 0x015A, 0x015B, 0x015C, 0x015D, 0x015E, 0x015F,
0x0160, 0x0161, 0x0162, 0x0163, 0x0164, 0x0165, 0x0166, 0x0167, 0x0168, 0x0169, 0x016A, 0x016B, 0x016C, 0x016D, 0x016E, 0x016F,
0x0170, 0x0171, 0x0172, 0x0173, 0x0174, 0x0175, 0x0176, 0x0177, 0x0178, 0x0179, 0x017A, 0x017B, 0x017C, 0x017D, 0x017E, 0x017F,
0x0180, 0x0181, 0x0182, 0x0183, 0x0184, 0x0185, 0x0186, 0x0187, 0x0188, 0x0189, 0x018A, 0x018B, 0x018C, 0x018D, 0x018E, 0x018F,//0x018F=399

0x0190, 0x0191, 0x0192, 0x0193, 0x0194, 0x0195, 0x0196, 0x0197, 0x0198, 0x0199, 0x019A, 0x019B, 0x019C, 0x019D
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入20汤圆

发表于 2017-5-21 09:23:27 | 显示全部楼层
/* Includes ------------------------------------------------------------------*/
#include "stm32f2xx.h"
#include <string.h>
/* Private define ------------------------------------------------------------*/
/* Base address of the Flash sectors */
#define ADDR_FLASH_SECTOR_0     ((uint32_t)0x08000000) /* Base @ of Sector 0, 16 Kbytes */
#define ADDR_FLASH_SECTOR_1     ((uint32_t)0x08004000) /* Base @ of Sector 1, 16 Kbytes */
#define ADDR_FLASH_SECTOR_2     ((uint32_t)0x08008000) /* Base @ of Sector 2, 16 Kbytes */
#define ADDR_FLASH_SECTOR_3     ((uint32_t)0x0800C000) /* Base @ of Sector 3, 16 Kbytes */
#define ADDR_FLASH_SECTOR_4     ((uint32_t)0x08010000) /* Base @ of Sector 4, 64 Kbytes */
#define ADDR_FLASH_SECTOR_5     ((uint32_t)0x08020000) /* Base @ of Sector 5, 128 Kbytes */
#define ADDR_FLASH_SECTOR_6     ((uint32_t)0x08040000) /* Base @ of Sector 6, 128 Kbytes */
#define ADDR_FLASH_SECTOR_7     ((uint32_t)0x08060000) /* Base @ of Sector 7, 128 Kbytes */
#define ADDR_FLASH_SECTOR_8     ((uint32_t)0x08080000) /* Base @ of Sector 8, 128 Kbytes */
#define ADDR_FLASH_SECTOR_9     ((uint32_t)0x080A0000) /* Base @ of Sector 9, 128 Kbytes */
#define ADDR_FLASH_SECTOR_10    ((uint32_t)0x080C0000) /* Base @ of Sector 10, 128 Kbytes */
#define ADDR_FLASH_SECTOR_11    ((uint32_t)0x080E0000) /* Base @ of Sector 11, 128 Kbytes */

#define FLASH_USER_START_ADDR                   ADDR_FLASH_SECTOR_2           /* Start @ of user Flash area */
#define FLASH_BAK_START_ADDR                           ADDR_FLASH_SECTOR_3           /* Start @ of user Flash area */
#define FLASH_USER_SECTOR_ADDR             FLASH_Sector_2                                   /* End @ of user Flash area */
#define FLASH_BAK_SECTOR_ADDR             FLASH_Sector_3                                   /* End @ of user Flash area */

/* -------------------------------------------------------------*/
const unsigned char Flash_Var[1024*16*2] __attribute__ ((at(FLASH_USER_START_ADDR)));

/* Private function prototypes -----------------------------------------------*/
void wr_FLASH_IAP_MCU(unsigned int sector,unsigned char *p,unsigned int cnt){
        unsigned int adr[2];
        unsigned int s[2];
       
        if(sector >1 ) return;
        s[0]=FLASH_Sector_2;
        s[1]=FLASH_Sector_3;
        adr[0]=FLASH_USER_START_ADDR;
        adr[1]=FLASH_BAK_START_ADDR;
       
        if(0==memcmp(p,(unsigned char *)adr[sector],cnt)) return;
       
  FLASH_Unlock();
  FLASH_ClearFlag(FLASH_FLAG_EOP                 | FLASH_FLAG_OPERR         | FLASH_FLAG_WRPERR         |
                  FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR        |        FLASH_FLAG_PGSERR);

  /* Device voltage range supposed to be [2.7V to 3.6V], the operation will  be done by word */
        FLASH_PrefetchBufferCmd(DISABLE);
  if(FLASH_EraseSector(s[sector], VoltageRange_3) != FLASH_COMPLETE) return;

        while(cnt--){
                if(FLASH_ProgramByte(adr[sector]++, *p++) != FLASH_COMPLETE) break;
  }
        FLASH_PrefetchBufferCmd(ENABLE);
  FLASH_Lock();
}
//***********************************************************************************************
//读取数据
//***********************************************************************************************
void rd_FLASH_IAP_MCU(unsigned int sector,unsigned char *p,unsigned int cnt){
        if(sector==0)                memcpy(p,(unsigned char *)FLASH_USER_START_ADDR,cnt);
        if(sector==1)                memcpy(p,(unsigned char *)FLASH_BAK_START_ADDR,cnt);
}
//**************************************************************************************************

出0入20汤圆

发表于 2017-5-21 09:24:11 | 显示全部楼层
const unsigned char Flash_Var[1024*16*2] __attribute__ ((at(FLASH_USER_START_ADDR)));
这句是关键!!

出0入20汤圆

发表于 2017-5-21 09:27:32 | 显示全部楼层
本帖最后由 mon51 于 2017-5-22 20:23 编辑

这是你的代码:修改如下

const uint16_t VirtAddVarTab[NumbOfVar]  __attribute__ ((at(EEPROM_START_ADDRESS )))={
0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
        
0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
        
0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF,
0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,               
        
0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF,        
0x0100, 0x0101, 0x0102, 0x0103, 0x0104, 0x0105, 0x0106, 0x0107, 0x0108, 0x0109, 0x010A, 0x010B, 0x010C, 0x010D, 0x010E, 0x010F,
0x0110, 0x0111, 0x0112, 0x0113, 0x0114, 0x0115, 0x0116, 0x0117, 0x0118, 0x0119, 0x011A, 0x011B, 0x011C, 0x011D, 0x011E, 0x011F,
0x0120, 0x0121, 0x0122, 0x0123, 0x0124, 0x0125, 0x0126, 0x0127, 0x0128, 0x0129, 0x012A, 0x012B, 0x012C, 0x012D, 0x012E, 0x012F,
0x0130, 0x0131, 0x0132, 0x0133, 0x0134, 0x0135, 0x0136, 0x0137, 0x0138, 0x0139, 0x013A, 0x013B, 0x013C, 0x013D, 0x013E, 0x013F,

0x0140, 0x0141, 0x0142, 0x0143, 0x0144, 0x0145, 0x0146, 0x0147, 0x0148, 0x0149, 0x014A, 0x014B, 0x014C, 0x014D, 0x014E, 0x014F,
0x0150, 0x0151, 0x0152, 0x0153, 0x0154, 0x0155, 0x0156, 0x0157, 0x0158, 0x0159, 0x015A, 0x015B, 0x015C, 0x015D, 0x015E, 0x015F,
0x0160, 0x0161, 0x0162, 0x0163, 0x0164, 0x0165, 0x0166, 0x0167, 0x0168, 0x0169, 0x016A, 0x016B, 0x016C, 0x016D, 0x016E, 0x016F,
0x0170, 0x0171, 0x0172, 0x0173, 0x0174, 0x0175, 0x0176, 0x0177, 0x0178, 0x0179, 0x017A, 0x017B, 0x017C, 0x017D, 0x017E, 0x017F,
0x0180, 0x0181, 0x0182, 0x0183, 0x0184, 0x0185, 0x0186, 0x0187, 0x0188, 0x0189, 0x018A, 0x018B, 0x018C, 0x018D, 0x018E, 0x018F,//0x018F=399

0x0190, 0x0191, 0x0192, 0x0193, 0x0194, 0x0195, 0x0196, 0x0197, 0x0198, 0x0199, 0x019A, 0x019B, 0x019C, 0x019D

};

出0入20汤圆

发表于 2017-5-21 09:33:00 | 显示全部楼层
我们设计的产品,从有IAP功能开始,几乎全部是用MCU-flash存放参数。这样电路简单,成本也低。到现在了STM32F429也不例外。
上电判别参数的可靠性。一般有2个独立扇区的存放,全部有特征字和校验字。如果2个扇区的内容均坏了,就从代码区把默认参数调入。
//******************************************************
#define         IDK                        0x1d87a8a3        //特征子

/**********************************************************
校验字节
***********************************************************/
unsigned char GetJiaoData(unsigned char *pBuf,unsigned long Long){
        unsigned char j;
       
        j=0;
        while (Long--)        j += *pBuf++;
        return j;
}
//*******************************************************************
//2013-4-16 添加的替换程序
void Rd_Mp1(unsigned int m,unsigned char *p,unsigned int cnt){
        //HW_Flash_Read(m*SST25_SECTOR_SIZE,cnt,p);
        if(m > 1) return;
        rd_FLASH_IAP_MCU(m,p,cnt);
}
//*******************************************************************
//2013-4-16 添加的替换程序
void Wr_Mp1(unsigned int m,unsigned char *p,unsigned int cnt){
        //HW_Flash_EraseWrite(m*SST25_SECTOR_SIZE,cnt,p);
        if(m > 1) return;
        wr_FLASH_IAP_MCU(m,p,cnt);
}
//************************************************************
//M: FLASH的扇区号!
//************************************************************
void WriteToEexx(unsigned int M){
       
        if(Mp1.ID != IDK) return;
        //******************************************************
        Mp1.crc=0;
        Mp1.crc=GetJiaoData((unsigned char *)&Mp1,sizeof(MP1));
        //*******************************************************
        Wr_Mp1(M,(unsigned char *)&Mp1,sizeof(Mp1));                                         //自动控制写入地址
        Wr_Mp1(M+1,(unsigned char *)&Mp1,sizeof(Mp1));                                 //自动控制写入备份地址
}
//***************************************************************************
//初始化的程序
void Init_Mp1(void){
        Get_P1_define_Data((float *)&Mp1.P1);
        //*************************************************************
        Mp1.ID=IDK;
        WriteToEexx(MastMenu_ADR);
        //----------------------------------------------------------------------
        //必须初始化的程序!
        JB_Sn();
}
//**********************************************************************************
//返回=1 校验OK
//**********************************************************************************
unsigned char JB_CRC(void){
        unsigned char i;

        i=Mp1.crc;
        Mp1.crc=0;
        Mp1.crc=GetJiaoData((unsigned char *)&Mp1,sizeof(MP1));
        if( i !=Mp1.crc || Mp1.ID !=IDK){
                i=0;       
        }else{
                i=1;
        }
        return i;
}
/***********************************************************************************
如果FIRST!=fIRST写入FLASHROM中 =0 数据正确;=1 数据有误!
************************************************************************************/
unsigned char  ReadMP(unsigned char sector){
        MP1 Mp;
       
        Rd_Mp1(sector,(unsigned char *)&Mp,sizeof(Mp));          //全部读出来!
        //*************************************************************
        //校验
        memcpy((unsigned char *)&Mp1,(unsigned char *)&Mp,sizeof(Mp));
        if(JB_CRC())  return 0;
        //--------------------------------------------------------------------
        //主菜单有问题,使用备用菜单
        Rd_Mp1(sector+1,(unsigned char *)&Mp,sizeof(Mp));          //全部读出来!
        //*************************************************************
        //校验
        memcpy((unsigned char *)&Mp1,(unsigned char *)&Mp,sizeof(Mp));
        if(JB_CRC()){
                WriteToEexx(sector); //必须要先覆盖MP1,再保存到EEROM。
                return 0;
        }
        return 1; //有问题
}
//************************************************************************************/
void Jb_First(){
        if(0 == ReadMP(MastMenu_ADR)) return ;
        Init_Mp1();        //全部出错,必须重新读取默认菜单!
}

出0入0汤圆

 楼主| 发表于 2017-5-21 18:03:03 | 显示全部楼层
本帖最后由 liang_work 于 2017-5-21 18:07 编辑
mon51 发表于 2017-5-21 09:24
const unsigned char Flash_Var[1024*16*2] __attribute__ ((at(FLASH_USER_START_ADDR)));
这句是关键! ...


不太明,可以说得具体一些吗,多谢了.
就我现在的情况,我应如何处理,因为我现在用的是官方的例程.

出0入20汤圆

发表于 2017-5-21 20:28:32 | 显示全部楼层
liang_work 发表于 2017-5-21 18:03
不太明,可以说得具体一些吗,多谢了.
就我现在的情况,我应如何处理,因为我现在用的是官方的例程. ...

实际使用的程序都发给你了,自己看吧!我不负责扫盲。解释要打太多的字。

出0入10汤圆

发表于 2017-5-21 21:06:23 | 显示全部楼层
收藏mark

出0入0汤圆

发表于 2017-5-22 13:37:03 | 显示全部楼层
mark stm32片上 flash编程

出0入0汤圆

发表于 2017-6-9 17:46:38 | 显示全部楼层
mark flash模拟eeprom

出0入0汤圆

发表于 2017-6-10 17:47:09 来自手机 | 显示全部楼层
收藏一下

出0入0汤圆

发表于 2018-1-2 17:23:26 | 显示全部楼层
5楼方案,可以借鉴

出5入10汤圆

发表于 2018-1-23 21:14:13 | 显示全部楼层
mark,最近上了stm32的片子,要用到这个功能,收藏下。

出0入0汤圆

发表于 2018-1-24 04:05:45 | 显示全部楼层
我们最近也遇到这个问题了,好好琢磨琢磨看看。

出0入0汤圆

发表于 2018-5-3 09:11:59 | 显示全部楼层
现在需用到ST官方例程,能给个链接吗?

出0入8汤圆

发表于 2018-5-3 09:24:30 | 显示全部楼层
mon51 发表于 2017-5-21 09:33
我们设计的产品,从有IAP功能开始,几乎全部是用MCU-flash存放参数。这样电路简单,成本也低。到现在了STM3 ...

他这个有没做负载均衡,写index的地方会不会被写坏
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 09:07

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表