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

 
 
> Доступ к 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
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 24)
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
Genadi Zawidowsk...
сообщение Feb 9 2017, 09:46
Сообщение #16


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

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



Встроенный flash 105-го не корректируется (DocID13902 Rev 16).
Go to the top of the page
 
+Quote Post
scifi
сообщение Feb 9 2017, 10:33
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



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

Вообще-то это следует из той цитаты, которую привёл Сергей Борщ.
Там сказано, что значение 0x0000 можно записать поверх любого другого. Это сразу исключает ECC.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 9 2017, 10:40
Сообщение #18


Гуру
******

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



QUOTE (scifi @ Feb 9 2017, 12:33) *
Это сразу исключает ECC.
Я думал, что как раз наоборот. FFFF - стертая память, 0000 - полностью записанная, исправляющий код к этому числу тоже равен нулю и может быть записан поверх любого предыдущего, как и само число 0000 может быть записано поверх любого другого. Т.е. это допустимая комбинация, не приводящая к ошибке ECC. Все остальные "дозаписи" приводят к ошибке ECC и поэтому аппаратно запрещены.


--------------------
На любой вопрос даю любой ответ
"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
Obam
сообщение Feb 9 2017, 10:49
Сообщение #19


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Если мне не изменяет память, то (да, не F105) у L162 очищеная Flash - 00H. Навряд ли будет отличаться.


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
scifi
сообщение Feb 9 2017, 11:01
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Сергей Борщ @ Feb 9 2017, 13:40) *
исправляющий код к этому числу тоже равен нулю и может быть записан поверх любого предыдущего

Код ECC должен защищать блок размером побольше, чем 2 байта, иначе смысла нет. Не существует такой код ECC, у которого при обнулении любого 16-битного слова в коде биты только сбрасываются и не устанавливаются. Так что не получится.
Если же имеется в виду контрольная сумма, то это другое. ECC - error correcting code - код, исправляющий ошибки.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 9 2017, 11:38
Сообщение #21


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

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



Вот что написано в datasheet Reference manual на упомянутый выше STM32L0x1
Цитата
ECC (Error Correction Code): 6 bits stored for every word to recognize and correct just one error

Круто, исправляет одиночную ошибку в слове!
Похоже, ECC есть в МК с EEPROM памятью. Флэш тоже корректируется, а то.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 9 2017, 12:21
Сообщение #22


Гуру
******

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



QUOTE (scifi @ Feb 9 2017, 13:01) *
Код ECC должен защищать блок размером побольше, чем 2 байта, иначе смысла нет.
Почему смысла нет?
QUOTE (scifi @ Feb 9 2017, 13:01) *
Не существует такой код ECC, у которого при обнулении любого 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
scifi
сообщение Feb 9 2017, 12:49
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Сергей Борщ @ Feb 9 2017, 15:21) *
Почему смысла нет?

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

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

Имелся в виду случай, когда размер защищённого блока больше, чем гранулярность операции записи.
Go to the top of the page
 
+Quote Post
umup
сообщение Feb 13 2017, 12:11
Сообщение #24


Местный
***

Группа: Свой
Сообщений: 226
Регистрация: 2-06-06
Пользователь №: 17 720



а нельзя писать в 2 разных слова ? [CENSORED], или 2 байт жалко ?

Сообщение отредактировал IgorKossak - Feb 13 2017, 19:12
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Feb 14 2017, 07:14
Сообщение #25


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

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Цитата(umup @ Feb 13 2017, 15:11) *
а нельзя писать в 2 разных слова ? [CENSORED], или 2 байт жалко ?

Прочитайте, пожалуйста, вторую строку самого первого сообщения.
Оттуда вполне очевидно следует: НЕТ, НЕЛЬЗЯ, censored.


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd August 2025 - 00:11
Рейтинг@Mail.ru


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