Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Доступ к flash памяти STM32 из программы
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Eskimos
Добрый день!
Занимаюсь разработкой загрузчика для STM32F105R8T6.
Согласно документации на семейство микроконтроллеров запись во флеш память осуществляется 16-битными полусловами.
У меня появилась необходимость записать в ячейку памяти с четным адресом 1 байт, а затем(то есть не одновременно 2 байта, а 1 за 1, в общем случае между этими записями могут быть еще какие-то операции) с последующим нечетным адресом еще 1 байт. Перед записью все используемые ячейки памяти стерты. Поскольку писать можно только 16-битными полусловами, приходится сделать следующее для записи(привожу 2 варианта в разном порядке):
Код
    uint32_t address = 0x08006040;
    FLASH_ProgramWord_16(address,0xFF22);
    FLASH_ProgramWord_16(address,0x11FF);


Код
    uint32_t address = 0x08006040;
    FLASH_ProgramWord_16(address,0x11FF);
    FLASH_ProgramWord_16(address,0xFF22);


Сама процедура записи(но вряд ли дело в ней):
Код
void FLASH_ProgramWord_16_was(uint32_t Address, uint16_t Data)
{
   /*Разблокировать flash*/
   if((FLASH->CR & FLASH_CR_LOCK) != RESET)
   {
       FLASH->KEYR = (uint32_t)0x45670123;
       FLASH->KEYR = (uint32_t)0xCDEF89AB;
   }
    
   /* Ожидание последняя операция должна быть завершена */
   while (FLASH->SR & FLASH_SR_BSY);
   if (FLASH->SR & FLASH_SR_EOP)
   {
        FLASH->SR = FLASH_SR_EOP;
   }
    
   FLASH->CR |= FLASH_CR_PG;
   *(uint16_t*)Address = Data;
   while (FLASH->SR & FLASH_SR_BSY);
}


В 1 варианте получаю FF22, во втором 11FF, желанные 1122 получить не удается.
Возможно ли реализовать такую запись во флеш именно на таком микроконтроллере? И если возможно, то что я не так делаю? Спасибо.
ViKo
А если вторая команда будет
Код
FLASH_ProgramWord_16(address,0x1122);

?
Прочитать, что есть, добавить своих нулей (единиц уже не получится), записать.
Eskimos
Цитата(ViKo @ Feb 7 2017, 16:27) *
А если вторая команда будет
Код
FLASH_ProgramWord_16(address,0x1122);

?
Прочитать, что есть, добавить своих нулей (единиц уже не получится), записать.


Если вторая команда будет
Код
FLASH_ProgramWord_16(address,0x1122);
, результат будет FF22.
Я в приведенном коде по сути нули и добавляю, но не работает. Возможно там аппаратно так сделано, что если одна часть полуслова не 0xFF, то вторую нельзя записать.
Сергей Борщ
QUOTE (Eskimos @ Feb 7 2017, 15:18) *
Возможно ли реализовать такую запись во флеш именно на таком микроконтроллере?
Нет, невозможно. Читайте документацию (PM0075, "STM32F10xxx Flash memory microcontrollers Programming manual"), там явно сказано: что угодно писать можно только в ячейку, в которой 0xFFFF. В ячейку, содержащую любое другое число можно записать только ноль. Если вы уже записали 0x11FF, то поверх вы можете записать только ноль.

QUOTE
FPEC preliminarily
reads the value at the addressed main Flash memory location and checks that it has been
erased. If not, the program operation is skipped and a warning is issued by the PGERR bit in
FLASH_SR register (the only exception to this is when 0x0000 is programmed. In this case,
the location is correctly programmed to 0x0000 and the PGERR bit is not set).
jcxz
Цитата(Сергей Борщ @ Feb 7 2017, 17:03) *
что угодно писать можно только в ячейку, в которой 0xFFFF. В ячейку, содержащую любое другое число можно записать только ноль. Если вы уже записали 0x11FF, то поверх вы можете записать только ноль.

А флешь-память STM32 разве не имеет избыточного блочного кодирования для исправления ошибок? Типа ECC.
ViKo
Цитата(jcxz @ Feb 8 2017, 01:19) *
А флешь-память STM32 разве не имеет избыточного блочного кодирования для исправления ошибок? Типа ECC.

А разве хоть какой-нибудь микроконтроллер имеет такую флэш-память?
makc
Цитата(ViKo @ Feb 8 2017, 08:42) *
А разве хоть какой-нибудь микроконтроллер имеет такую флэш-память?


Имеет. Например, про STM32L051x6 в DS написано следующее:
Цитата
Memories
– Up to 64 KB Flash memory with ECC
– 8KB RAM
– 2 KB of data EEPROM with ECC
– 20-byte backup register
Сергей Борщ
QUOTE (jcxz @ Feb 8 2017, 00:19) *
А флешь-память STM32 разве не имеет избыточного блочного кодирования для исправления ошибок?
Видимо имеет. Иначе что мешало бы записать любое число с заменой единчных битов на нулевые? Другое дело, что контроль охватывает не 16, а два байта.
aaarrr
Цитата(ViKo @ Feb 8 2017, 08:42) *
А разве хоть какой-нибудь микроконтроллер имеет такую флэш-память?

LPC поголовно такие.
KRS
Причем у LPC вообще на флешу шина 128 бит - так что там меньше 16 байт вообще не записать из-за контрольной суммы...
Eskimos
Спасибо за ответы. Видимо такая запись не осуществима, буду искать другой выход из ситуации
Сергей Борщ
QUOTE (Eskimos @ Feb 8 2017, 10:19) *
Видимо
То есть даже цитата из документации от производителя оставляет у вас какие-то сомнения?
jcxz
Цитата(ViKo @ Feb 8 2017, 07:42) *
А разве хоть какой-нибудь микроконтроллер имеет такую флэш-память?

LPC17xx хотя-бы. Вообще - я думал все имеют.

Цитата(Сергей Борщ @ Feb 8 2017, 08:56) *
Видимо имеет. Иначе что мешало бы записать любое число с заменой единчных битов на нулевые?

Вот и я о том же.
Genadi Zawidowski
Цитата
Занимаюсь разработкой загрузчика для STM32F105R8T6.

В современном даташите на этот процессор (DocID13587 Rev 17) об ECC во flash ни слова.
ViKo
Цитата(Genadi Zawidowski @ Feb 9 2017, 00:12) *
В современном даташите на этот процессор (DocID13587 Rev 17) об ECC во flash ни слова.

Очевидно, надо искать в руководстве по программированию.
Genadi Zawidowski
Встроенный flash 105-го не корректируется (DocID13902 Rev 16).
scifi
Цитата(Genadi Zawidowski @ Feb 9 2017, 12:46) *
Встроенный flash 105-го не корректируется (DocID13902 Rev 16).

Вообще-то это следует из той цитаты, которую привёл Сергей Борщ.
Там сказано, что значение 0x0000 можно записать поверх любого другого. Это сразу исключает ECC.
Сергей Борщ
QUOTE (scifi @ Feb 9 2017, 12:33) *
Это сразу исключает ECC.
Я думал, что как раз наоборот. FFFF - стертая память, 0000 - полностью записанная, исправляющий код к этому числу тоже равен нулю и может быть записан поверх любого предыдущего, как и само число 0000 может быть записано поверх любого другого. Т.е. это допустимая комбинация, не приводящая к ошибке ECC. Все остальные "дозаписи" приводят к ошибке ECC и поэтому аппаратно запрещены.
Obam
Если мне не изменяет память, то (да, не F105) у L162 очищеная Flash - 00H. Навряд ли будет отличаться.
scifi
Цитата(Сергей Борщ @ Feb 9 2017, 13:40) *
исправляющий код к этому числу тоже равен нулю и может быть записан поверх любого предыдущего

Код ECC должен защищать блок размером побольше, чем 2 байта, иначе смысла нет. Не существует такой код ECC, у которого при обнулении любого 16-битного слова в коде биты только сбрасываются и не устанавливаются. Так что не получится.
Если же имеется в виду контрольная сумма, то это другое. ECC - error correcting code - код, исправляющий ошибки.
ViKo
Вот что написано в datasheet Reference manual на упомянутый выше STM32L0x1
Цитата
ECC (Error Correction Code): 6 bits stored for every word to recognize and correct just one error

Круто, исправляет одиночную ошибку в слове!
Похоже, ECC есть в МК с EEPROM памятью. Флэш тоже корректируется, а то.
Сергей Борщ
QUOTE (scifi @ Feb 9 2017, 13:01) *
Код ECC должен защищать блок размером побольше, чем 2 байта, иначе смысла нет.
Почему смысла нет?
QUOTE (scifi @ Feb 9 2017, 13:01) *
Не существует такой код ECC, у которого при обнулении любого 16-битного слова в коде биты только сбрасываются и не устанавливаются. Так что не получится.
Недопонял. У БЧХ нулевое слово дает нулевые проверочные биты.
scifi
Цитата(Сергей Борщ @ Feb 9 2017, 15:21) *
Почему смысла нет?

С точки зрения расхода памяти эффективнее защищать более крупные блоки.
Хотя, как отметил ViKo, у STM32L0x1 ECC защищает 32-битные слова, так что я был неправ.

Цитата(Сергей Борщ @ Feb 9 2017, 15:21) *
Недопонял. У БЧХ нулевое слово дает нулевые проверочные биты.

Имелся в виду случай, когда размер защищённого блока больше, чем гранулярность операции записи.
umup
а нельзя писать в 2 разных слова ? [CENSORED], или 2 байт жалко ?
esaulenka
Цитата(umup @ Feb 13 2017, 15:11) *
а нельзя писать в 2 разных слова ? [CENSORED], или 2 байт жалко ?

Прочитайте, пожалуйста, вторую строку самого первого сообщения.
Оттуда вполне очевидно следует: НЕТ, НЕЛЬЗЯ, censored.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.