Программирование флэш-памяти MCU на C

Новичок здесь. В настоящее время я работаю над проектом, который предусматривает сохранение пароля на флэш-памяти MCU(NUC200LE3AN).

Эти коды работают просто отлично. После его записи я могу прочитать точное значение user_password1 даже после перезапуска MCU.

FMC_Erase(PASSWORD1_LOCATION); //u32addr 
if (*(uint32_t *)(PASSWORD1_LOCATION) == 0xffffffff)
{
    uint32_t user_password1 = "1234";
    FMC_Write(PASSWORD1_LOCATION,user_password1);
}

uint32_t ReadPass1 = *(uint32_t *)(PASSWORD1_LOCATION);

UART_Write(UART0,ReadPass1,4); //4 -> string length 
_UART_SENDBYTE(UART0,0x0D);

Но я буду использовать массив из 5 uint8_t (включая завершающий '\0') в качестве источника для изменения моего пароля. Пример:

FMC_Erase(PASSWORD1_LOCATION);    

uint8_t new_password[5];
new_password[0] = '1';
new_password[1] = '2';
new_password[2] = '3';
new_password[3] = '4';
new_password[4] = '\0';

if (*(uint32_t *)(PASSWORD1_LOCATION) == 0xffffffff)
{
  user_password1 = (uint32_t *)(new_password);
  FMC_Write(PASSWORD1_LOCATION,user_password1);
}

uint32_t ReadPass1 = *(uint32_t *)(PASSWORD1_LOCATION);

UART_Write(UART0,ReadPass1,4); //4 -> string length 
_UART_SENDBYTE(UART0,0x0D);

С помощью этого я могу написать пароль и прочитать его, пока есть эти значения исправлений, и эти значения исправлений только для пароля по умолчанию. После того, как я изменил свой пароль, пока я не выключаю MCU, он все еще может быть прочитан, что недопустимо из-за необходимости включения / выключения MCU. Если я применяю это и затем перезагружаю MCU, чтение PASSWORD1_LOCATION возвращает мусор / ноль.

Есть ли способ повернуть это:

uint8_t new_password[5];     
new_password[0] = '1';
new_password[1] = '2';
new_password[2] = '3';
new_password[3] = '4';
new_password[4] = '\0';

В это:

uint32_t user_password1 = "1234";

Я надеюсь, вы понимаете, о чем я. Спасибо.

1 ответ

Решение

Если вы действительно хотите сохранить значения ascii, вы можете просто перевести его в его значение в шестнадцатеричном виде:

"1234" будет 0x31 0x32 0x33 0x34 0x00

Чтобы сохранить его в uint32_t, избавиться от нулевого терминатора и

FMC_Erase(PASSWORD1_LOCATION); //u32addr 
if (*(uint32_t *)(PASSWORD1_LOCATION) == 0xffffffff)
{
    uint32_t user_password1 = 0x31323334;
    FMC_Write(PASSWORD1_LOCATION, &user_password1);
}

uint32_t ReadPass1 = *(uint32_t *)(PASSWORD1_LOCATION);

UART_Write(UART0,ReadPass1,4); //4 -> string length 
_UART_SENDBYTE(UART0,0x0D);
Другие вопросы по тегам