STM32F0xx эмулировал EEPROM в проблеме раздела FLASH - PullRequest
0 голосов
/ 24 ноября 2018

Я работаю с STM32F030RC MCU и хочу сохранить данные во внутреннем EEPROM: STM32F0 не имеет раздела EEPROM, поэтому я использовал эмулированный EEPROM для хранения данных во флэш-памяти.Иногда во время чтения или записи произошла ошибка в обработчике данных процессора.

#define EEPROM_baseADD 0
#define S1_ADD_ADC_OC 0                   // 12 int
#define S1_ADD_Temperature_Offset_x1000 1 // 20 int
#define S1_ADD_ADC_Zero 2                 // 30 int
#define S1_ADD_T_Zero 3                   // 32 int
#define S1_ADD_RH_Zero 4                  // 34 int
#define S1_ADD_ADC_Span 5                 // 40 int
#define S1_ADD_T_Span 6                   // 42 int
#define S1_ADD_RH_Span 7                  // 44 int
#define S1_ADD_PPM_Span_x100 8            // 46 int
#define S1_ADD_LMP91000_B01 9             // 50 int
#define S1_ADD_LMP91000_B10 10            // 52 int
#define S1_ADD_LMP91000_B11 11            // 54 int
#define S1_ADD_LMP91000_B12 12            // 56 int
#define S1_ADD_nA_per_PPM_x100 13         // 70 int

void LMP91000_ReadROM_Sensor(LMP91000_Object_t * LMP91000, unsigned char Sen_No, unsigned int EEPROM_baseADD) {
  unsigned char i = 0;

  EE_ReadVariable(EEPROM_baseADD + S1_ADD_ADC_OC, & LMP91000 - > ADC_OC); // 12
  EE_ReadVariable(EEPROM_baseADD + S1_ADD_Temperature_Offset_x1000, & LMP91000 - > Temperature_Offset_x1000); // 20
  EE_ReadVariable(EEPROM_baseADD + S1_ADD_ADC_Zero, & LMP91000 - > ADC_Zero); // 30
  EE_ReadVariable(EEPROM_baseADD + S1_ADD_T_Zero, & LMP91000 - > T_Zero); // 32
  EE_ReadVariable(EEPROM_baseADD + S1_ADD_RH_Zero, & LMP91000 - > RH_Zero); // 34
  EE_ReadVariable(EEPROM_baseADD + S1_ADD_ADC_Span, & LMP91000 - > ADC_Span); // 40
  EE_ReadVariable(EEPROM_baseADD + S1_ADD_T_Span, & LMP91000 - > T_Span); // 42
  EE_ReadVariable(EEPROM_baseADD + S1_ADD_RH_Span, & LMP91000 - > RH_Span); // 44
  EE_ReadVariable(EEPROM_baseADD + S1_ADD_PPM_Span_x100, & LMP91000 - > PPM_Span_x100); // 46
  EE_ReadVariable(EEPROM_baseADD + S1_ADD_LMP91000_B01, & LMP91000 - > LMP91000_B01); // 50
  EE_ReadVariable(EEPROM_baseADD + S1_ADD_LMP91000_B10, & LMP91000 - > LMP91000_B10); // 52
  EE_ReadVariable(EEPROM_baseADD + S1_ADD_LMP91000_B11, & LMP91000 - > LMP91000_B11); // 54
  EE_ReadVariable(EEPROM_baseADD + S1_ADD_LMP91000_B12, & LMP91000 - > LMP91000_B12); // 56
  EE_ReadVariable(EEPROM_baseADD + S1_ADD_nA_per_PPM_x100, (uint16_t * ) & LMP91000 - > nA_per_PPM_x100); // 70
  // I am able to read all above successfully but
  // for the blew loops it give Cpu handler error after read the first byte only

  i = 0;
  while (i < S1_ADD_OFFEST_LMP91000_Serial_Number) {
    EE_ReadVariable((S1_ADD_LMP91000_Serial_Number + EEPROM_baseADD), (uint16_t * ) & LMP91000 - > Serial_Number_[i]); // 300+12*2
    i++;
  }
  i = 0;
  while (i < S1_ADD_OFFEST_LMP91000_Part_Number) {
    EE_ReadVariable((S1_ADD_LMP91000_Part_Number + EEPROM_baseADD) + (i), (uint16_t * ) & LMP91000 - > Part_Number_[i]); // 330+7*2
    HAL_Delay(100);
    i++;
  }
  LMP91000 - > Part_Number = atol(LMP91000 - > Part_Number_);
  i = 0;
  while (i < S1_ADD_OFFEST_LMP91000_Gas) {
    EE_ReadVariable((S1_ADD_LMP91000_Gas + EEPROM_baseADD) + (i), (uint16_t * ) & LMP91000 - > Gas_[i]); // 350+10*2
    i++;
    HAL_Delay(100);
  }
  i = 0;
  while (i < S1_ADD_OFFEST_LMP91000_Date_Code) {
    EE_ReadVariable((S1_ADD_LMP91000_Date_Code + EEPROM_baseADD) + (i), (uint16_t * ) & LMP91000 - > Date_Code_[i]); //370+5*2
    i++;
  }
  i = 0;
  while (i < S1_ADD_offest_LMP91000_Sensitivity_Code) {
    EE_ReadVariable((S1_ADD_LMP91000_Sensitivity_Code + EEPROM_baseADD) + (i), (uint16_t * ) & LMP91000 - > Sensitivity_Code_[i]); //380+8*2
    i++;
  }

  LMP91000_Unlock(Sen_No);
  LMP91000_Write_0x10(LMP91000 - > LMP91000_B10, Sen_No);
  LMP91000_Write_0x11(LMP91000 - > LMP91000_B11, Sen_No);
  LMP91000_Write_0x12(LMP91000 - > LMP91000_B12, Sen_No);

}

Чтобы получить полное представление о проблеме, это функция записи, и я посмотрел на флэш-память во время перезаписи: все записанные мной данные были успешно сохранены во флэш-памяти.

void LMP91000_UART_Config(LMP91000_Object_t * LMP91000_ptr, Cqueue * BufQ, char * Buffer, unsigned char ADC_Sens_Num, unsigned char Sen_No, unsigned int EEPROM_baseADD) {
    unsigned long int i;
    unsigned long int j;
    unsigned long int k;
    unsigned char index_i = 0;
    if (Buffer[0] == 'B') {
      for (index_i = 0; index_i < 49; index_i++) Buffer[index_i] = Buffer[index_i + 1];
      i = 0;
      while (i < 12) {
        LMP91000_ptr - > Serial_Number_[i] = Buffer[i];
        i++;
      }
      LMP91000_ptr - > Serial_Number_[i] = '\0';
      i++;
      while (i < 19) {
        LMP91000_ptr - > Part_Number_[i - 13] = Buffer[i];
        i++;
      }
      LMP91000_ptr - > Part_Number_[i - 13] = '\0';
      i++;
      while (i < 22) {
        LMP91000_ptr - > Gas_[i - 20] = Buffer[i];
        i++;
      }
      while (i < 30) {
        if (Buffer[i] != ' ') {
          LMP91000_ptr - > Gas_[i - 20] = Buffer[i];
        } else {
          break;
        }
        i++;
      }
      LMP91000_ptr - > Gas_[i - 20] = '\0';
      i++;
      k = i + 4;
      j = 0;
      while (i < k) {
        LMP91000_ptr - > Date_Code_[j] = Buffer[i];
        j++;
        i++;
      }
      LMP91000_ptr - > Date_Code_[j] = '\0';
      i++;
      k = i + 7;
      j = 0;
      while (i < k) {
        LMP91000_ptr - > Sensitivity_Code_[j] = Buffer[i];
        j++;
        i++;
      }
      LMP91000_ptr - > Sensitivity_Code_[j] = '\0';
      i = 0;
      while (i < S1_ADD_OFFEST_LMP91000_Serial_Number) {
        EE_WriteVariable(((S1_ADD_LMP91000_Serial_Number + EEPROM_baseADD) + (i)), LMP91000_ptr - > Serial_Number_[i]);
        i++;
      }
      i = 0;
      while (i < S1_ADD_OFFEST_LMP91000_Part_Number) {
        EE_WriteVariable(((S1_ADD_LMP91000_Part_Number + EEPROM_baseADD) + (i)), LMP91000_ptr - > Part_Number_[i]);
        i++;
      }
      i = 0;
      while (i < S1_ADD_OFFEST_LMP91000_Date_Code) {
        EE_WriteVariable(((S1_ADD_LMP91000_Date_Code + EEPROM_baseADD) + (i)), LMP91000_ptr - > Date_Code_[i]);
        i++;
      }
      i = 0;
      while (i < S1_ADD_offest_LMP91000_Sensitivity_Code) {
        EE_WriteVariable(((S1_ADD_LMP91000_Sensitivity_Code + EEPROM_baseADD) + (i)), LMP91000_ptr - > Sensitivity_Code_[i]);
        i++;
      }
      LMP91000_ptr - > nA_per_PPM_x100 = (int)(100 * my_atof(LMP91000_ptr - > Sensitivity_Code_));
      LMP91000_ptr - > nA_per_PPM_x100 = LMP91000_ptr - > nA_per_PPM_x100 & 0xFFFF;
      EE_WriteVariable((S1_ADD_nA_per_PPM_x100 + EEPROM_baseADD), LMP91000_ptr - > nA_per_PPM_x100);
    }
...