|
Доступ к flash памяти STM32 из программы, Дописать незаписанный байт в слово |
|
|
|
Feb 7 2017, 13:18
|
Группа: Участник
Сообщений: 6
Регистрация: 19-11-10
Пользователь №: 61 022

|
Добрый день! Занимаюсь разработкой загрузчика для 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 получить не удается. Возможно ли реализовать такую запись во флеш именно на таком микроконтроллере? И если возможно, то что я не так делаю? Спасибо.
|
|
|
|
|
Feb 7 2017, 13:32
|
Группа: Участник
Сообщений: 6
Регистрация: 19-11-10
Пользователь №: 61 022

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

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
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).
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Feb 8 2017, 06:04
|

Гуру
     
Группа: Админы
Сообщений: 3 621
Регистрация: 18-10-04
Из: Москва
Пользователь №: 904

|
Цитата(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
--------------------
BR, Makc В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
|
|
|
|
|
Feb 8 2017, 08:19
|
Группа: Участник
Сообщений: 6
Регистрация: 19-11-10
Пользователь №: 61 022

|
Спасибо за ответы. Видимо такая запись не осуществима, буду искать другой выход из ситуации
|
|
|
|
|
Feb 8 2017, 14:03
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(ViKo @ Feb 8 2017, 07:42)  А разве хоть какой-нибудь микроконтроллер имеет такую флэш-память? LPC17xx хотя-бы. Вообще - я думал все имеют. Цитата(Сергей Борщ @ Feb 8 2017, 08:56)  Видимо имеет. Иначе что мешало бы записать любое число с заменой единчных битов на нулевые? Вот и я о том же.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|