Перейти к содержанию
    

Доступ к flash памяти STM32 из программы

Добрый день!

Занимаюсь разработкой загрузчика для 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 получить не удается.

Возможно ли реализовать такую запись во флеш именно на таком микроконтроллере? И если возможно, то что я не так делаю? Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А если вторая команда будет

FLASH_ProgramWord_16(address,0x1122);

?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А если вторая команда будет

FLASH_ProgramWord_16(address,0x1122);

?

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

 

Если вторая команда будет

FLASH_ProgramWord_16(address,0x1122);

, результат будет FF22.

Я в приведенном коде по сути нули и добавляю, но не работает. Возможно там аппаратно так сделано, что если одна часть полуслова не 0xFF, то вторую нельзя записать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Возможно ли реализовать такую запись во флеш именно на таком микроконтроллере?
Нет, невозможно. Читайте документацию (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).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

что угодно писать можно только в ячейку, в которой 0xFFFF. В ячейку, содержащую любое другое число можно записать только ноль. Если вы уже записали 0x11FF, то поверх вы можете записать только ноль.

А флешь-память STM32 разве не имеет избыточного блочного кодирования для исправления ошибок? Типа ECC.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А флешь-память STM32 разве не имеет избыточного блочного кодирования для исправления ошибок? Типа ECC.

А разве хоть какой-нибудь микроконтроллер имеет такую флэш-память?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А разве хоть какой-нибудь микроконтроллер имеет такую флэш-память?

 

Имеет. Например, про STM32L051x6 в DS написано следующее:

Memories

– Up to 64 KB Flash memory with ECC

– 8KB RAM

– 2 KB of data EEPROM with ECC

– 20-byte backup register

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А флешь-память STM32 разве не имеет избыточного блочного кодирования для исправления ошибок?
Видимо имеет. Иначе что мешало бы записать любое число с заменой единчных битов на нулевые? Другое дело, что контроль охватывает не 16, а два байта.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А разве хоть какой-нибудь микроконтроллер имеет такую флэш-память?

LPC поголовно такие.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Причем у LPC вообще на флешу шина 128 бит - так что там меньше 16 байт вообще не записать из-за контрольной суммы...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за ответы. Видимо такая запись не осуществима, буду искать другой выход из ситуации

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Видимо
То есть даже цитата из документации от производителя оставляет у вас какие-то сомнения?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А разве хоть какой-нибудь микроконтроллер имеет такую флэш-память?

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

 

Видимо имеет. Иначе что мешало бы записать любое число с заменой единчных битов на нулевые?

Вот и я о том же.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Занимаюсь разработкой загрузчика для STM32F105R8T6.

В современном даташите на этот процессор (DocID13587 Rev 17) об ECC во flash ни слова.

Изменено пользователем Genadi Zawidowski

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В современном даташите на этот процессор (DocID13587 Rev 17) об ECC во flash ни слова.

Очевидно, надо искать в руководстве по программированию.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...