Eskimos 0 7 февраля, 2017 Опубликовано 7 февраля, 2017 · Жалоба Добрый день! Занимаюсь разработкой загрузчика для 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 1 7 февраля, 2017 Опубликовано 7 февраля, 2017 · Жалоба А если вторая команда будет FLASH_ProgramWord_16(address,0x1122); ? Прочитать, что есть, добавить своих нулей (единиц уже не получится), записать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Eskimos 0 7 февраля, 2017 Опубликовано 7 февраля, 2017 · Жалоба А если вторая команда будет FLASH_ProgramWord_16(address,0x1122); ? Прочитать, что есть, добавить своих нулей (единиц уже не получится), записать. Если вторая команда будет FLASH_ProgramWord_16(address,0x1122); , результат будет FF22. Я в приведенном коде по сути нули и добавляю, но не работает. Возможно там аппаратно так сделано, что если одна часть полуслова не 0xFF, то вторую нельзя записать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 117 7 февраля, 2017 Опубликовано 7 февраля, 2017 · Жалоба Возможно ли реализовать такую запись во флеш именно на таком микроконтроллере?Нет, невозможно. Читайте документацию (PM0075, "STM32F10xxx Flash memory microcontrollers Programming manual"), там явно сказано: что угодно писать можно только в ячейку, в которой 0xFFFF. В ячейку, содержащую любое другое число можно записать только ноль. Если вы уже записали 0x11FF, то поверх вы можете записать только ноль. 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 172 7 февраля, 2017 Опубликовано 7 февраля, 2017 · Жалоба что угодно писать можно только в ячейку, в которой 0xFFFF. В ячейку, содержащую любое другое число можно записать только ноль. Если вы уже записали 0x11FF, то поверх вы можете записать только ноль. А флешь-память STM32 разве не имеет избыточного блочного кодирования для исправления ошибок? Типа ECC. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 8 февраля, 2017 Опубликовано 8 февраля, 2017 · Жалоба А флешь-память STM32 разве не имеет избыточного блочного кодирования для исправления ошибок? Типа ECC. А разве хоть какой-нибудь микроконтроллер имеет такую флэш-память? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
makc 182 8 февраля, 2017 Опубликовано 8 февраля, 2017 · Жалоба А разве хоть какой-нибудь микроконтроллер имеет такую флэш-память? Имеет. Например, про STM32L051x6 в DS написано следующее: Memories – Up to 64 KB Flash memory with ECC – 8KB RAM – 2 KB of data EEPROM with ECC – 20-byte backup register Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 117 8 февраля, 2017 Опубликовано 8 февраля, 2017 · Жалоба А флешь-память STM32 разве не имеет избыточного блочного кодирования для исправления ошибок?Видимо имеет. Иначе что мешало бы записать любое число с заменой единчных битов на нулевые? Другое дело, что контроль охватывает не 16, а два байта. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 56 8 февраля, 2017 Опубликовано 8 февраля, 2017 · Жалоба А разве хоть какой-нибудь микроконтроллер имеет такую флэш-память? LPC поголовно такие. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 0 8 февраля, 2017 Опубликовано 8 февраля, 2017 · Жалоба Причем у LPC вообще на флешу шина 128 бит - так что там меньше 16 байт вообще не записать из-за контрольной суммы... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Eskimos 0 8 февраля, 2017 Опубликовано 8 февраля, 2017 · Жалоба Спасибо за ответы. Видимо такая запись не осуществима, буду искать другой выход из ситуации Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 117 8 февраля, 2017 Опубликовано 8 февраля, 2017 · Жалоба ВидимоТо есть даже цитата из документации от производителя оставляет у вас какие-то сомнения? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 172 8 февраля, 2017 Опубликовано 8 февраля, 2017 · Жалоба А разве хоть какой-нибудь микроконтроллер имеет такую флэш-память? LPC17xx хотя-бы. Вообще - я думал все имеют. Видимо имеет. Иначе что мешало бы записать любое число с заменой единчных битов на нулевые? Вот и я о том же. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 8 февраля, 2017 Опубликовано 8 февраля, 2017 (изменено) · Жалоба Занимаюсь разработкой загрузчика для STM32F105R8T6. В современном даташите на этот процессор (DocID13587 Rev 17) об ECC во flash ни слова. Изменено 8 февраля, 2017 пользователем Genadi Zawidowski Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 9 февраля, 2017 Опубликовано 9 февраля, 2017 · Жалоба В современном даташите на этот процессор (DocID13587 Rev 17) об ECC во flash ни слова. Очевидно, надо искать в руководстве по программированию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться