2016-12-01 2 views
2

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

Эти коды работают очень хорошо. После записи я могу прочитать точное значение 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"; 

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

+0

Прежде всего '* (uint32_t *)', вероятно, не работает, поскольку он не является изменчивым, поэтому все те чтения и записи, которые его используют, скорее всего, потерпят неудачу. Также ваш 'uint8_t new_password [5];' использует 8-битную кодировку большого конца ASCII, но 'uint32_t user_password1 =" 1234 ";' (BTW должно быть '1234' не' "1234" ') - 32-битное двоичное целое без знака, родное обратный порядок байт. Эти два представления несовместимы друг с другом. – user3528438

+0

Серьезно, вам предоставляется библиотечная функция, такая как 'FMC_Write()' 'FMC_Read()' 'FMC_Erase()', и все же вы написали свою собственную функцию «читать» с обычным почтовым уважением, а затем спросите людей, почему она не работает ? Почему вы думаете, что это может сработать? – user3528438

+0

'uint32_t user_password1 =" 1234 ";' -> 'uint32_t user_password1 = 0x31323334;' и 'FMC_Write (PASSWORD1_LOCATION, user_password1);' -> 'FMC_Write (PASSWORD1_LOCATION, & user_password1);' – LPs

ответ

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); 
+0

как насчет его в массиве? Могу ли я это сделать? uint8_t new_pass1 [4]; new_pass1 [0] = 0x31000000; new_pass1 [1] = 0x00320000; new_pass1 [2] = 0x00003300; new_pass1 [3] = 0x00000034; затем uint32_t user_password1 = new_pass [0] + new_pass [1] +. , , , – khelogram

+0

№ Вы можете сделать uint8_t new_array [4] = {0x31, 0x32, 0x33, 0x34}; – LPs

Смежные вопросы