Программирование флэш-памяти микроконтроллера на 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);

Но я буду использовать массив uint8_t из 5 (включая завершающий «\ 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";

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


person khelogram    schedule 01.12.2016    source источник
comment
во-первых, *(uint32_t *), вероятно, не работает, поскольку он не изменчив, поэтому все те операции чтения и записи, которые его используют, скорее всего, потерпят неудачу. Также ваш uint8_t new_password[5]; использует 8-битную кодировку ASCII с прямым порядком байтов, но uint32_t user_password1 = "1234"; (кстати, должно быть 1234, а не "1234") является 32-битным двоичным целым числом без знака, родным порядком байтов. Эти два представления несовместимы друг с другом.   -  person user3528438    schedule 01.12.2016
comment
Серьезно, вам предоставлена ​​библиотечная функция, такая как FMC_Write() FMC_Read() FMC_Erase(), и все же вы написали свою собственную функцию чтения с обычным уважением к указателю, а затем спрашиваете людей, почему она не работает? Почему вы думаете, что это может сработать?   -  person user3528438    schedule 01.12.2016
comment
uint32_t user_password1 = "1234"; --› uint32_t user_password1 = 0x31323334; и FMC_Write(PASSWORD1_LOCATION,user_password1); --› FMC_Write(PASSWORD1_LOCATION, &user_password1);   -  person LPs    schedule 01.12.2016
comment
@user3528438 user3528438 Я сделал это 1234, потому что это пароль, который обычно представляет собой символ. Я имею в виду, что могу изменить свой пароль на 12AB. Спасибо за ваши ответы!   -  person khelogram    schedule 01.12.2016


Ответы (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);
person LPs    schedule 01.12.2016
comment
а если в массиве? я могу это сделать? uint8_t новый_пароль1[4]; новый_пасс1[0] = 0x31000000; новый_пароль1[1] = 0x00320000; новый_пароль1[2] = 0x00003300; новый_пасс1[3] = 0x00000034; затем uint32_t user_password1 = new_pass[0] + new_pass[1] + . . . . - person khelogram; 01.12.2016
comment
Нет. Вы можете сделать uint8_t new_array [4] = {0x31, 0x32, 0x33, 0x34}; - person LPs; 01.12.2016