реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Доступ к flash памяти STM32 из программы, Дописать незаписанный байт в слово
Eskimos
сообщение Feb 7 2017, 13:18
Сообщение #1





Группа: Участник
Сообщений: 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 получить не удается.
Возможно ли реализовать такую запись во флеш именно на таком микроконтроллере? И если возможно, то что я не так делаю? Спасибо.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 7 2017, 13:27
Сообщение #2


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



А если вторая команда будет
Код
FLASH_ProgramWord_16(address,0x1122);

?
Прочитать, что есть, добавить своих нулей (единиц уже не получится), записать.
Go to the top of the page
 
+Quote Post
Eskimos
сообщение Feb 7 2017, 13:32
Сообщение #3





Группа: Участник
Сообщений: 6
Регистрация: 19-11-10
Пользователь №: 61 022



Цитата(ViKo @ Feb 7 2017, 16:27) *
А если вторая команда будет
Код
FLASH_ProgramWord_16(address,0x1122);

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


Если вторая команда будет
Код
FLASH_ProgramWord_16(address,0x1122);
, результат будет FF22.
Я в приведенном коде по сути нули и добавляю, но не работает. Возможно там аппаратно так сделано, что если одна часть полуслова не 0xFF, то вторую нельзя записать.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 7 2017, 15:03
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 7 2017, 22:19
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Сергей Борщ @ Feb 7 2017, 17:03) *
что угодно писать можно только в ячейку, в которой 0xFFFF. В ячейку, содержащую любое другое число можно записать только ноль. Если вы уже записали 0x11FF, то поверх вы можете записать только ноль.

А флешь-память STM32 разве не имеет избыточного блочного кодирования для исправления ошибок? Типа ECC.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 8 2017, 05:42
Сообщение #6


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



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

А разве хоть какой-нибудь микроконтроллер имеет такую флэш-память?
Go to the top of the page
 
+Quote Post
makc
сообщение Feb 8 2017, 06:04
Сообщение #7


Гуру
******

Группа: Админы
Сообщений: 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
В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 8 2017, 06:56
Сообщение #8


Гуру
******

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



QUOTE (jcxz @ Feb 8 2017, 00:19) *
А флешь-память STM32 разве не имеет избыточного блочного кодирования для исправления ошибок?
Видимо имеет. Иначе что мешало бы записать любое число с заменой единчных битов на нулевые? Другое дело, что контроль охватывает не 16, а два байта.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 8 2017, 07:08
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



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

LPC поголовно такие.
Go to the top of the page
 
+Quote Post
KRS
сообщение Feb 8 2017, 08:14
Сообщение #10


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Причем у LPC вообще на флешу шина 128 бит - так что там меньше 16 байт вообще не записать из-за контрольной суммы...
Go to the top of the page
 
+Quote Post
Eskimos
сообщение Feb 8 2017, 08:19
Сообщение #11





Группа: Участник
Сообщений: 6
Регистрация: 19-11-10
Пользователь №: 61 022



Спасибо за ответы. Видимо такая запись не осуществима, буду искать другой выход из ситуации
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 8 2017, 09:53
Сообщение #12


Гуру
******

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



QUOTE (Eskimos @ Feb 8 2017, 10:19) *
Видимо
То есть даже цитата из документации от производителя оставляет у вас какие-то сомнения?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 8 2017, 14:03
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



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

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

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

Вот и я о том же.
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Feb 8 2017, 21:12
Сообщение #14


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



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

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

Сообщение отредактировал Genadi Zawidowski - Feb 8 2017, 21:14
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 9 2017, 04:59
Сообщение #15


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



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

Очевидно, надо искать в руководстве по программированию.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 14th August 2025 - 05:59
Рейтинг@Mail.ru


Страница сгенерированна за 0.01678 секунд с 7
ELECTRONIX ©2004-2016