Новичок здесь. В настоящее время я работаю над проектом, который включает сохранение пароля на флэш-памяти 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";
Надеюсь, вы понимаете, что я имею в виду. Спасибо.
*(uint32_t *)
, вероятно, не работает, поскольку он не изменчив, поэтому все те операции чтения и записи, которые его используют, скорее всего, потерпят неудачу. Также вашuint8_t new_password[5];
использует 8-битную кодировку ASCII с прямым порядком байтов, ноuint32_t user_password1 = "1234";
(кстати, должно быть1234
, а не"1234"
) является 32-битным двоичным целым числом без знака, родным порядком байтов. Эти два представления несовместимы друг с другом. - person user3528438   schedule 01.12.2016FMC_Write()
FMC_Read()
FMC_Erase()
, и все же вы написали свою собственную функцию чтения с обычным уважением к указателю, а затем спрашиваете людей, почему она не работает? Почему вы думаете, что это может сработать? - person user3528438   schedule 01.12.2016uint32_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