Я работаю с 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);
}