STM32 Хранение данных и конфигурации во FLASH памяти.
ฝัง
- เผยแพร่เมื่อ 25 ธ.ค. 2024
- Видео для начинающих. Рассказывается об алгоритмах организации хранения текущей конфигурации и пользовательских данных во FLASH памяти процессора.
------------------------------------------
Поддержать автора канала можно перейдя по ссылке:
yoomoney.ru/to...
Или просто отправив перевод на Yandex.кошелек:
4100116547550395
А также переводом по номеру карты Сбер:
4279-3000-1033-0561
------------------------------------------
Здравствуйте, Владимир. Спасибо Вам огромное за то, что делитесь своим опытом в разработке ПО для STM32. Данное видео помогло мне структурировать в голове работу с конфигурацией и сохранением ее во FLASH микроконтроллера. Теперь программа для разрабатываемого устройства стала гораздо читабельнее, стало проще ее модифицировать в случае добавления новых параметров в конфигурацию. Всего Вам доброго.
И Вам за добрые слова спасибо.
спасибо, все работает, сделал себе генератор импульсов с автосохранением 😎
Хороший пример, возьму на заметку.
Спасибо Вам за полезную информацию !С Новым Годом!
Уточню 1:38: страниц 256. От 0 страницы и до 255 всего с нулевой 256 блоков.
У себя использую попеременное хранение настроек в двух секторах. Один сектор заполнился, записываю на второй, потом первый стираю и записываю туда. Так исключается возможность остаться без настроек при отключении питания в момент, когда началось стирание/запись.
Да это хороший вариант и не только потому, что делает резервную копию данных, но еще и потому, что продлевается жизнь flash.
Добрый вечер, Большое спасибо за оперативность! очень актуально!
Надеюсь будет затронуты вопросы с сохранением структур с разношерстными параметрами(char,int,вложенные структуры) про упаковку структур , чтение после перегрузки из памяти с заполнением обратно этой структуры, и еще вопрос интересует про эмуляцию EEPROM.
Грубо говоря имеется
typedef struct{
int param1;
char str1[128];
char str2[256];
uint32_t param4;
};
Как мне ее записать всё в память, а после считать. Думаю , что просто делается, но пока никак. Заранее спасибо
Вообще-то паковать ничего не надо. Если вы объявляете структурную переменную то ее элементы уже лежат в памяти один за другим.
После этого используете union и совмещаете вашу структуру в памяти с массивом который можете перенести во FLASH. Это не стоило того чтобы создавать видео. Просто удивлен был что вы не смогли этого сделать. Ну я не умничаю, просто это к микроконтроллерам не относится это язык СИ.
@@VladimirMedintsev Извиняюсь за глупые вопросы изучаю СИ, но пока опыта мало,.
Вроде бы Если делать в структуре то члены располагаются не подряд, а в зависимости от их типа.пример
Int будет занимать ячейку с адресом кратным 4м, а char будет занимать ячейку с адресом кратным 2м, связи с этим в памятя возможны пустые ячейки, если не использовать дерективы pragm
Но это не точно, если что поправьте пожалуйста, хочу разобраться!
, используете union и совмещаете вашу структуру в памяти с массивом который можете перенести во FLASH, блин а можно поподобнеее пример?
typedef struct preset {
int i;
char param1[128];
}
union uBruf {
preset sBuf;
uint32_t buf[]
};
Если взять к примеру вашу структуру:
typedef struct{
int param1;
char str1[128];
char str2[256];
uint32_t param4;
};
то в памяти все элементы структуры будут располагаться друг за другом. Разумеется в соответствии со своими размерами. Описанный мной способ позволяет абстрагироваться от этих размеров и прочего ненужного и сохраниться. Если и для сохранения и для чтения вы используете одну и ту же структуру данных то все будет работать.
Могу одно сказать к микроконтроллерам это отношения не имеет а по СИ видео полный интернет. Хотя если честно я советовал бы книжку.
@@VladimirMedintsev Спасибо большое за видео!!! после просмотра стало яснее , из книг читаю Кернигана , но бывает вопросы вроде простые , но решение сразу на ум не приходит.
Продолжайте в том же духе , на русско язычном ютубе всего 2-3 канала про stm32.
Я не знаю пока еще как скоро мне это надоест.
Владимир спасибо за труды. Вопрос прога занимает 24кб у STM32F4 флеша 512кб. посмотрел стлинком флеш память а там все разбросано. и немогу 16кб - один сектор найти - нужно впихивать в разные сектора по куску. Как то компилятору можно указать
или что сделать что бы 16кб сектор не трогал ???
На счёт сектора в любом месте не подскажу, но полагаю, можно перенести адрес, с которого начинается прошивка чуть подальше от начала. Если нашли решение, напишите и мне, пожалуйста.
Спасибо! В цикле сравнения сделать бы break после первого несовпадения. И наверное можно не ставить таймаут после записи во флешу слова, там внутри HAL_FLASH_Program есть ожидание завершения последней операции с флешой.
Ну на самом деле это же код выдран из рабочего проекта и немного адаптирован для обьяснений. И отсутствие break это желание узнать какое количество байт конфигурации обновилось. Можно же обновлять конфигурацию только по достижении определенного процента изменений. А наличие HAL_Delay внесено с той же целью, затянуть процесс во времени и отдать больше времени на выполнение других задач. Есть там у нас просто одна прожорливая по времени задача.
В любом случае это не меняет сути показанного.
@@VladimirMedintsev osDelay. :)
Здравствуйте, Спасибо.
А почему вы не используете в коде инкремент переменной на 1 как ++
Или это только для наглядности новичкам?
Я не профессиональный программист и реально так пишу. Мне самому так понятнее, тем более компилятор потом оптимизирует на свой вкус.
Когда кто-то говорил что AVR не проще, они просто другие... В авр для записи в ипром всего 1 функция с двумя параметрами (куда записывать и какие данные)
И о чем это говорит? Наверное о том, что в STM32 десятки различных чипов с разной организацией памяти и по этой причине некоторые функции выглядят непривычно. Но вы ведь можете и сами написать функцию в которой будет два параметра. И пожалуйста, будет все как раньше.
Но вообще вы же поймите. Это я вот подписался и рекламирую STM, вы то их использовать не обязаны, вам же не платят.
Подскажите, как организовать обновление прошивки, через программу виндовс? Хочу сделать ПО в windows forms для отправки настроек и обновления прошивки через vcp. Есть ли у вас примеры как это реализовать?
Достаточно просто. Напишите свой загрузчик в микроконтроллер и по USB обновляйтесь. Вы же можете как Mass storage устройство в Windows показать.
@@VladimirMedintsev есть видео по обновлению через usb и по? Не пойму как читать прошивку, которая лежит на хдд. Или это по делает, и оно же отправляет данные по vcp, а загрузчик уже пишет во флэшь? а шифрование? Ваше видео не доступно на эту тему?
@serb8405 С шифрованием еще проще. На это можно использовать готовые функции.
@@VladimirMedintsev дайте пример пожалуйста... или видосик запишите, думаю полезно многим...
@@led-avto Да вроде же есть на моем канале про все это ролики и про шифрование и про загрузчик и про передачу управления. Все снято и находится на этом канале.
Владимир, добрый день, запись во флеш останавливает выполнение остальной программы? Ранее я пытался сохранять во флеш и наблюдал такой эффект (возможно делал что-то принципиально неправильно). Присутствует ли он у вас?
upd: FreeRTOS использовал, сохраняет одна задача, останавливаются все
Операция записи во flash память сама по себе длительная. Разумеется если вы будете записывать 2-3 килобайта то эта операция займет какое-то время.
Однако сейчас линейным программированием уже никто и не занимается. А при использовании freertos просто выносите запись в отдельную низкоприоритетную задачу и не будет никакой задержки.
Если использовали freertos и все тормозилось, значит приоритеты настроены не правильно. Проверять приоритеты и пройтись по коду чтобы нигде не было hal_delay.
спасибо. а есть документация о создании встроенной базы данных на флэше?
Скорее всего я просто не понял ваш вопрос. Но вот сложности что-либо хранить я не вижу совсем.
Хоть файловую систему хоть базу данных. Все упирается только в скорость и количество циклов записи.
я имею ввиду может есть рекомендации от st по созданию субд на флэш для микроконтроллеров как раз с учетом ограничения циклов записи с индексацией. или других источников
@@aleksandrzakutnyy4450 Хорошо, давайте по другому вопрос поставим. Как вы себе мыслите два понятия СУБД (систему управления базами данных) и микроконтроллер в одном предложении. Я именно это не понял. Если имеется в виду хранение записей, то пример я показал. Если их индексацию, то это не сложно сделать и алгоритмы известны. А вот СУБД я еще раз не понимаю. Пожалуйста, если не сложно, просто приведите пример задачи которую вы хотите решить.
Возникло три вопроса.
1. А по таймингам не измеряли? Сколько времени займёт цикл чтения/записи? Чисто для интереса. Сам не пробовал, но читал, что достаточно долго. И, если EEPROM анлочен, то нельзя выполнять другие операции, пока не залочим.
2. Связан с количеством циклов перезаписи. Допустим, что мы превысили количество циклов перезаписи и переместили структуру в другой блок. Как программа узнАет, при следующем включении питания МК, что данные теперь на новом месте? Адрес начала чтения данных жестко вшит в тело программы. Или я где-то чего-то не понял?
3. Вытекает из второго. А не проще для целей автосохранения конфигурации использовать внешний EEPROM по I2C? Стоят копейки, а девайс, как вы говорите, сложный. А хранение основной конфы сделать в EEPROM МК. Меняться он будет раз в полгода, так что, можно не заморачиваться с количеством циклов перезаписи. Столько люди не живут, сколько девайс сможет работать. :-)
Или изменить алгоритм. К примеру, на питание поставить достаточно большой кондер, и контролировать отдельным входом наличие питания до кондера. Если питание пропало, вызываем алярм по прерыванию питания, где стопорим все задачи, пишем конфиг в EEPROM и отпускаем все задачи пока не разрядится кондер.
1. Нет не измерял. Не видел в этом смысла т.к. тайминги есть в даташите.
2. Этот кусок кода приведен для примера, там много чего нету, там нет проверок на результат операций, да много чего я убрал из реального кода чтобы пример не перегружать. По сути узнать просто. Читаем блок, смотрим на счетчик количества записей. К примеру если он больше какого-то числа то читаем следующий в памяти блок. Т.е. страница +1. При записи точно так же. Перед самой записью если счетчик больше или равен, то пишем в новый блок.
3. Внешний EEPROM или вообще любая внешняя микросхема: занимают место на плате, потребляют дополнительный ток, имеют цену, требуют пайки и прочее и прочее. В серийных изделиях это уже перестает быть копейками. К тому же ресурс не выше, интерфейсы процессора так же будут задействованы и в итоге вы ничего не выигрываете. Просто посмотрите на проблему немного шире. Зачем вам паять какую-то микросхему и использовать гораздо более низкоскоростные интерфейсы, чем внутренние, тратить ноги процессора и прочее если у вас есть лишние килобайты встроенной памяти?
Кстати, там ведь я не раз подчеркивал что используется RTOS. А это значит что остальные задачи они не останавливались ожидает записи и сохранения конфигурации только текущая задача. Именно по этому временем записи можно пренебречь.
Про прерывание по пропаданию питания я не буду комментировать (особенно посчитав энергопотребление EEPROM в момент записи) т.к. в данном примере в этом просто нет необходимости. Можно код написать так, чтобы не было необходимости.
Щитова. :-) Я просто кумекаю, как бы сократить количество записей для увеличения срока эксплуатации девайса. :-) Тайминги надо глянуть, конечно. Я в нете натыкался на инфу. А там напишут. Как будет мотивация, разберусь. Спасибо за видео, познавательно было. :-) Было бы здорово, если бы вы еще рассказали, как определить, сколько страниц занимает сама прошивка, чтоб начать использовать следующие страницы для хранения конфигов.
Добрый день.
Я до недавнего времени тоже использовал внешний EEPROM, а в последнем проекте даже закладывал FRAM (т.к. хотел хранить счётчики наработки). Но у FRAM есть большой гемор (по крайней мере читал на форумах), а именно при недостаточном питании (или во время его пропадании) нельзя читать данные, иначе они могут испортится. Причем портятся таким образом, что контрольной суммой это не решить (портятся данные по разным адресам). Счетчики перенес RTC Backup регистры и забыл.
Но не так давно от внешних микросхем отказался, встроенная flash великолепно работает. Я так же использую FreeRTOS и также делаю это в фоновом режиме. Но плюс ко всему:
1. Я обязательно защищаю блок контрольной суммой crc32, по этой причине не вижу никакого смыла в MAGIC_KEY, т.к. если память пустая crc32 точно не совпадает, пиши дефолтные.
2. Немного затратно с точки зрения flash памяти, но я сохраняю сразу две копии переменных в разных секторах с перерывом в 1000мс. Т.е. у меня получается, что, если во время сохранения пропало питание, одна из копий настроек выживет. В худшем варианте, останется предыдущая конфигурация.
@@YuriyIY Количество записей и так будет не большим. Вы же не собираетесь менять конфигурацию раз в секунду.
С размером прошивки, а кто мешает вам написать и откомпилировать код и посмотреть сколько он занимает?
@@TubeYouSimark 1. На самом деле MAGIC_KEY я оставил для примера, чтобы в видео про FLASH не говорить про CRC. Вы наверняка видели что в структуре сектора там есть отведенное для CRC место. Я специально его не затирал. Но MAGIC_KEY несет еще одну приятную функцию. Это у меня еще и номер прошивки. Таким образом самодельный бутлоадер узнает совпадает ли структура хранения данных и при необходимости корректирует ну и еще кучу всего на этот номер завязано. Кроме того многие этот прием не знают.
2. Да это очень удобно. При старте смотреть где правильная контрольная сумма ту конфигурацию и читать. И удобно и надежно.
1. Вопрос. Запись во FLASH у Вас производится с некоего начального адреса до КОНЦА СТРАНИЦЫ. А надо ли ? Все таки структура конфигурации явно короче 2K.
2. Запись производится в цикле while. При этом - если HAL_FLASH_Program перестанет возвращать HAL_OK - произойдет зависание т.к. l_Address перестанет увеличиваться.
3. Применение ключа не гарантирует проверку на сбой памяти - сбой может произойти в какой-то другой области. Надо бы контрольную сумму
Дык это не больше чем пример... На самом деле от этого алгоритма вообще давно убежали уже. Мы чутка изменили подход к хранению конфигураций и теперь их несколько.
@@VladimirMedintsev Да. Я почитал коментарии под видео и понял что зря задал свои вопросы...
Где было это видео 3 года...когда я тонул в примерах на указатели типа указатили на вид типа_флеш...
обидно точто подписан 2мя устройствами... и нигде не всплвло.!!!! почему А?¿?
Жаль что не для адептов садо_cmsis....
Владимир, подскажите пожалуйста, на сколько код под STM32 больше чем код под AVR, если не использовать HAL, а писать на CMSIS?
По моему мнению он меньше процентов на 25. Это за счет более оптимальных инструкций. Ну и самое главное. В stm нет такой проблемы как в avr с размером памяти ее в разы больше. Код более оптимальный. Именно по этой причине я и говорю что архитектура avr безнадежно устарела.
Vladimir Medintsev понял вас, спасибо. Просто сколько я встречал информации везде писали что на STM32 код занимает больше места. Но я так понимаю это все при использовании HAL
@@arakeldesign Код на процессорах ARM более компактный. В большей степени это зависит не от используемых библиотек типа CMSIS или HAL, а от того с какими опциями вы компилируете и насколько аккуратный код пишете. В любом случае вопрос не актуален т.к. можно выбрать процессор хоть с мегабайтом памяти.
Vladimir Medintsev для меня актуален, так как нужно подобрать контролер маленького размера и в паябелельном корпусе.
Ну это реально не проблема. Я не знаю другие ваши требования к процессору, но вот к примеру:
STM32F303CCT - 256 kB FLASH и 48 kB RAM - 8x8 mm корпус - примерно 200 рублей
STM32L433KCU - 256 kB FLASH и 64 kB RAM - 5x5 mm корпус - примерно 380 рублей
паяются элементарно феном без каких-либо проблем.
Я буду более чем удивлен если вам хоть на 40% удастся загрузить их.
И что-то мне подсказывает что такие мощные вам вообще не нужны. Т.к. если переходить с AVR, то можно слегка обалдеть от доступных мощностей.
Если мы записываем считанные данные в data32, то как мы проверяем в условии MagicNum? Данные автоматически переносятся по атрибутам?
Это видимо вопрос учебнику языка Си.
@@VladimirMedintsev ладно, спасибо
Владимир, добрый день, очень полезное видео, можно ли выложить проект?
Скажите честно зачем вам этот проект? Там ведь 5 строчек кода. Вы же сами можете их набрать. Более того процессор наверняка отличается. Т.е. Вам придется мои библиотеки выпиливать а свои вставлять это дольше.
Когда научусь заполнять структуры будет просто, но сейчас проще попрвить чужой проект.
static....EraseInitStruct она вроде так глобальная переменная...
1)для чего мы ещё делаем ее всегда-существующей?
2)почему мы создаём ее не указателем на структуру с инициализацией адресом страницы памяти, а переменной_структуры в hip-е всегда занимающей место?
3)она ли используется как эталонная-сравнения из RAM vs Flash(другими словами,раз она уже отела ОЗУ, ни в ней ли хранятся все 2к данных ОЗУ)?
ПС. спасибо за подробный ответ...может какие-то ответы и глупые на ваш взгляд...но только дурак не учится.
Глобальная переменная и Статик переменная по любому хранятся в куче, или глобальная объявленная в Мейн может попасть в начало стека?¿?
Добрый день, подскажите пожалуйста, как мне записать во флешь память значение переменной float, с int32_t проблем нет с чтением и записью, буду очень признателен! stm32f103
Размер который в памяти занимает переменная определенного типа вычислить легко. Ну например sizeof(), получить на нее указатель и таким образом узнать где в памяти она находится тоже элементарно. Для этого в языке созданы указатели. Осталось считать uint8 по необходимому адресу... Это не вопрос имкроконтроллера. Смотрите книги по языку C.
@@VladimirMedintsev Уменя вопрос по записи числа float формате, при записи в флешь все, что после точки анулируется и соответственно при чтении остаются данные только до точки(целое число).
Я отлично понял ваш вопрос и дал на него максимально подробный ответ. Перепечатывать сюда всю главу руководства Си по типам данных у меня желания нету. В памяти все переменные хранятся одинаково. А по типам uint или float это уже как их интерпретировать. Я в предыдущем сообщении правильно указал что делать. У вас сейчас проблема не с микроконтроллером и его памятью. Вам надо разобраться с языком Си.
Vladimir Medintsev спасибо, я понял вас, я понял суть, чуть недопонял вашего ответа
запись переменной типа float if( HAL_FLASH_Program( FLASH_TYPEPROGRAM_WORD, currentAddres, *(uint32_t*)&D ) == HAL_OK) // D переменная типа float
чтение переменной типа float float DD = *(float*)currentAddres; // currentAddres адрес памяти куда записали переменную D
Зачем искать ключ если у вас есть контрольная сумма? Сразу проверяйте целостность и если содержимое развалено восстанавливайте заводские значения.
Добрый день! Если не сложно, поясните, пожалуйста, момент с чтением данных. Нигде не могу найти четкого ответа. Почему при чтении необходимо указывать "_IO"(везде пишут именно *(_IO uint32_t*) и никогда *(uint32_t*) )? Как я понял это volatile. И если просто создать указатель на 32-х битную переменную и прочитать значении по нему, то тоже все корректно считывается. К чему может привести не использования данного ключевого слова при чтении из flash? Ведь данные там не могут неявно измениться,те мы сами их туда записываем и читаем.
Когда в своей программе вы используете переменные вы можете преобразовывать их тип используя конструкции типа eight = (uint8_t)double. В этом случае компилятор имеет право оптимизировать работу и использование переменных так как считает нужным. Бывают случаи когда мы обращаемся к переменной не явно, например по ссылке. В этом случае мы должны указать компилятору что такая переменная может изменятся не явно и мы ее определяем как volatile uint32_t. С регистром и с памятью то же самое. Эти значения могут изменяться процессором когда ему будет угодно. И в библиотеке cmsis есть дефайн #define __IO volatile /*!< Defines 'read / write' permissions */.
Ну а относительно мы сами их туда записываем и читаем. А как быть с DMA? Мы ведь в этом не участвуем. DMA сама и записывает и читает. Ну и еще куча аналогичных примеров.
@@VladimirMedintsev Спасибо. Само преобразование и зачем компилятору указывать на переменные которые могут не явно измениться я понимаю. Как раз не мог понять зачем с флэшем это делать, не мог ситуацию придумать и даже про dma не подумал. Спасибо за ответ!
Почему мы каждый раз увеличиваем адрес на 4? Почему не на 1?
Так микроконтроллер же 32 битный...
@@VladimirMedintsev не совсем понимаю, как высчитывать смещение
@@ZYagudin если в кратце, то это особенность 32 битной архитектуры. адресация памяти идёт побайтно, т.е. каждый байт имеет свой адрес 0х0,1,2,3..., но ширина команды в мк 32 бита( thumb не берём в расчет) и на эту ширину выровнены адреса. 32 бита это 4 байта или же слово, величина смещения...
для более глубокого понимания вопроса советую почитать учебник "цифровая схемотехника и архитектура компьютера" там детально расстраиваются вопросы как работают процессоры, мк, как организована память и т.д. (лучшее что я читал по изучению мк)
@@vlad3c Спасибо большое
а что за osDelay?
Функция операционной системы, которая тормозит задачу на Х ms.
@@arzamas1988 у меня ее нету, наверно библиотека нужна какая-то..
Куб загружает в проект свою версию обертки над фри-ртос, но можно писать vTaskDelay, должно работать.
@@space_games нужно включить интеграцию операционной системы FreeRTOS
@@arzamas1988 ок, уже по-другому сделал
Автор, вы в курсе про padding в структурах ?
если в структуре есть поле не кратное ячейкам памяти (по даташиту пол слова, слово и двойное слово, а слово - 32 бита), то данное поле структуры (char array[2048-8]) будет дополнено пустыми байтами для кратности машинному слову.
Либо тут компилятор за вас это решает и делает поле меньше, чем 2040 байт, либо вы ещё не писали ничего в последние байты вашей структуры и не словили unexpected behaviour.
Я в курсе. Не совсем понятно как это должно влиять на рассказанное в видео.
@@VladimirMedintsev видео справочное по хранению в памяти. А мне как-то пришлось записывать много данных в память и с этой особенностью структур столкнулся лично.
Плюс ещё хорошо бы учитывать номер страницы, на которой считается количество сделанных записей. Ведь в stm32 количество гарантированных записей всего 10 тысяч и страница, которую уже много раз писали, не должна использоваться больше. В вашем примере эта особенность уберегла бы новичков от возможных проблем.
Вас хвалят и благодарят за пример. И мне у вас есть что посмотреть. Спасибо за контент вам. Мне лично лень делать труд по записи и монтажу видео. Но я хочу, чтобы было доступно больше полезных советов для разработчиков встраиваемой электроники.
Здравствуйте, может кто подскажет, использую микроконтроллер STM32WB55 + FreeRTOS на таймере 16, так же используется таймер 17, получаю ошибку при попытке стереть или записать страницу, поскольку прерывания обрабатываются по этим таймерам через одну и туже функцию
void TIM1_UP_TIM16_IRQHandler(void)
{
/* USER CODE BEGIN TIM1_UP_TIM16_IRQn 0 */
/* USER CODE END TIM1_UP_TIM16_IRQn 0 */
HAL_TIM_IRQHandler(&htim1);
HAL_TIM_IRQHandler(&htim16);
/* USER CODE BEGIN TIM1_UP_TIM16_IRQn 1 */
/* USER CODE END TIM1_UP_TIM16_IRQn 1 */
}
если закомментировать
//HAL_TIM_IRQHandler(&htim1);
все пишется отлично, что то конфликтует по Timebase, как правильно сконфигурировать? Операционной системе таймер 2 отдать не могу, с ним тоже все работает отлично.
В прерывании определяйте от какого точно таймера пришло и с ним только и работайте.
Хорошо, но пары вещей не хватает. 1. Как переключиться на другой сектор? 2. Что делать, если надо перезаписать только часть данных в секторе? Я понимаю, что вопрос нубский, но и видео не для профи. Спасибо за понимание.
1. Указать его адрес.
2. Скопировать необходимое в память или другой сектор.
@@VladimirMedintsev 1. да, я разобрался. У меня TM32F746. У него последние сектора просто огромные. Я не мог поверить, что перед записью 16 байт я должен стереть 128 килобайт. 2. Пишут что если один раз стер сектор, то в те места сектора, которые ещё не писал, можно писать. Не пробовали ничего такого?
В смысле не пробовали ничего такого? Я все пробовал.
@@VladimirMedintsev И как, получилось стереть сектор один раз и потом писать в разные места сектора не очищая его ещё раз? У меня не вышло.
А у меня вышло и даже видео есть где я рассказываю о хранении лога именно по этому принципу.
лучше уж выкладывать видео как обычно. эти "премьеры" только сбивают с толку
Зато увеличивают количество подписчиков и просмотров.
@@VladimirMedintsev ну, ежели так, потерпим
Спасибо вам огромное. Я не долго буду с этой функцией играться.
Я уже обрадовался, что сейчас интересное услышу, ан нет, только завтра.
А як не напоротися на сторінку із прошивкою?
Друже, я колись вчив українську мову. Але я не кажу українською. Мені якось на суржику простіше.
@@VladimirMedintsev та я російкою розумію тільки писати не вмію. Отже: наскільки зрозумів код програми в тому ж флеші, якщо його переписувати то можна переписати основне тіло (робочої) програми а як від цього захиститися не уявляю.
@@ibrag2012 После того, как вы поместили свою программу в память (flash) микроконтроллера и сделали все чтобы отдать готовое устройство заказчику вы можете воспользоваться утилитой CubeProgrammer и отключить интерфейс программирования и отладки. После этого программатор использовать уже не получится. И программу прочитать-изменить тоже. А значит ваше устройство в безопасности.
@@VladimirMedintsev он хотел сказать что раз пространство адресов прошивки и условного eeprom совпадает, то можно случайно попасть в место прошивки и затереть основную программу своими настройками. Я сам только перехожу с avr на stm32 и мне этот вопрос тоже интересен. Как правильно выбрать страницу памяти чтобы случайно не попасть на свой исполняемый код?
@@anatoliinavrockiy8607 Я отлично понял что он хотел спросить. Только у stm32 в отличии от avr памяти сильно больше. Выделите последний сектор под свою конфигурацию и пользуйтесь. Тут физически тяжело создать настолько большую программу чтобы она всю flash собой заняла. Ну а уж если параноя одолевать кого-нибудь будет, то можно воспользоваться командами линковщику и четко дать ему понять что сектор от 0хХХХХХХХХ и до 0хХХХХХХХ занимать нельзя и будете его свободно использовать. Просто это не относится непосредственно к теме данного видео.
Не задумывались, например, почему никто не публикует в интернете полный код загрузчика под stm32? Просто к таким технологиям человек должен сам придти.