Здравствуйте, Владимир. Спасибо Вам огромное за то, что делитесь своим опытом в разработке ПО для STM32. Данное видео помогло мне структурировать в голове работу с конфигурацией и сохранением ее во FLASH микроконтроллера. Теперь программа для разрабатываемого устройства стала гораздо читабельнее, стало проще ее модифицировать в случае добавления новых параметров в конфигурацию. Всего Вам доброго.
@VladimirMedintsev4 жыл бұрын
И Вам за добрые слова спасибо.
@space_games3 жыл бұрын
спасибо, все работает, сделал себе генератор импульсов с автосохранением 😎
@raven88672 жыл бұрын
Спасибо Вам за полезную информацию !С Новым Годом!
@akovalev3413 жыл бұрын
Хороший пример, возьму на заметку.
@ЕвгенийСторожев-ч3т6 жыл бұрын
Уточню 1:38: страниц 256. От 0 страницы и до 255 всего с нулевой 256 блоков.
@efimefimefim5 жыл бұрын
У себя использую попеременное хранение настроек в двух секторах. Один сектор заполнился, записываю на второй, потом первый стираю и записываю туда. Так исключается возможность остаться без настроек при отключении питания в момент, когда началось стирание/запись.
@VladimirMedintsev5 жыл бұрын
Да это хороший вариант и не только потому, что делает резервную копию данных, но еще и потому, что продлевается жизнь flash.
@aleksandrkozlov92866 жыл бұрын
Добрый вечер, Большое спасибо за оперативность! очень актуально! Надеюсь будет затронуты вопросы с сохранением структур с разношерстными параметрами(char,int,вложенные структуры) про упаковку структур , чтение после перегрузки из памяти с заполнением обратно этой структуры, и еще вопрос интересует про эмуляцию EEPROM. Грубо говоря имеется typedef struct{ int param1; char str1[128]; char str2[256]; uint32_t param4; }; Как мне ее записать всё в память, а после считать. Думаю , что просто делается, но пока никак. Заранее спасибо
@VladimirMedintsev6 жыл бұрын
Вообще-то паковать ничего не надо. Если вы объявляете структурную переменную то ее элементы уже лежат в памяти один за другим. После этого используете union и совмещаете вашу структуру в памяти с массивом который можете перенести во FLASH. Это не стоило того чтобы создавать видео. Просто удивлен был что вы не смогли этого сделать. Ну я не умничаю, просто это к микроконтроллерам не относится это язык СИ.
@aleksandrkozlov92866 жыл бұрын
@@VladimirMedintsev Извиняюсь за глупые вопросы изучаю СИ, но пока опыта мало,. Вроде бы Если делать в структуре то члены располагаются не подряд, а в зависимости от их типа.пример Int будет занимать ячейку с адресом кратным 4м, а char будет занимать ячейку с адресом кратным 2м, связи с этим в памятя возможны пустые ячейки, если не использовать дерективы pragm Но это не точно, если что поправьте пожалуйста, хочу разобраться! , используете union и совмещаете вашу структуру в памяти с массивом который можете перенести во FLASH, блин а можно поподобнеее пример? typedef struct preset { int i; char param1[128]; } union uBruf { preset sBuf; uint32_t buf[] };
@VladimirMedintsev6 жыл бұрын
Если взять к примеру вашу структуру: typedef struct{ int param1; char str1[128]; char str2[256]; uint32_t param4; }; то в памяти все элементы структуры будут располагаться друг за другом. Разумеется в соответствии со своими размерами. Описанный мной способ позволяет абстрагироваться от этих размеров и прочего ненужного и сохраниться. Если и для сохранения и для чтения вы используете одну и ту же структуру данных то все будет работать. Могу одно сказать к микроконтроллерам это отношения не имеет а по СИ видео полный интернет. Хотя если честно я советовал бы книжку.
@aleksandrkozlov92866 жыл бұрын
@@VladimirMedintsev Спасибо большое за видео!!! после просмотра стало яснее , из книг читаю Кернигана , но бывает вопросы вроде простые , но решение сразу на ум не приходит. Продолжайте в том же духе , на русско язычном ютубе всего 2-3 канала про stm32.
@VladimirMedintsev6 жыл бұрын
Я не знаю пока еще как скоро мне это надоест.
@dmitriibannikovasx3 жыл бұрын
Когда кто-то говорил что AVR не проще, они просто другие... В авр для записи в ипром всего 1 функция с двумя параметрами (куда записывать и какие данные)
@VladimirMedintsev3 жыл бұрын
И о чем это говорит? Наверное о том, что в STM32 десятки различных чипов с разной организацией памяти и по этой причине некоторые функции выглядят непривычно. Но вы ведь можете и сами написать функцию в которой будет два параметра. И пожалуйста, будет все как раньше. Но вообще вы же поймите. Это я вот подписался и рекламирую STM, вы то их использовать не обязаны, вам же не платят.
@serggorod14232 жыл бұрын
Где было это видео 3 года...когда я тонул в примерах на указатели типа указатили на вид типа_флеш... обидно точто подписан 2мя устройствами... и нигде не всплвло.!!!! почему А?¿? Жаль что не для адептов садо_cmsis....
@NIKOLAY_PSHONIA2 жыл бұрын
Владимир спасибо за труды. Вопрос прога занимает 24кб у STM32F4 флеша 512кб. посмотрел стлинком флеш память а там все разбросано. и немогу 16кб - один сектор найти - нужно впихивать в разные сектора по куску. Как то компилятору можно указать или что сделать что бы 16кб сектор не трогал ???
@AE075G Жыл бұрын
На счёт сектора в любом месте не подскажу, но полагаю, можно перенести адрес, с которого начинается прошивка чуть подальше от начала. Если нашли решение, напишите и мне, пожалуйста.
@АлександрСпицын-х1я5 жыл бұрын
Спасибо! В цикле сравнения сделать бы break после первого несовпадения. И наверное можно не ставить таймаут после записи во флешу слова, там внутри HAL_FLASH_Program есть ожидание завершения последней операции с флешой.
@VladimirMedintsev5 жыл бұрын
Ну на самом деле это же код выдран из рабочего проекта и немного адаптирован для обьяснений. И отсутствие break это желание узнать какое количество байт конфигурации обновилось. Можно же обновлять конфигурацию только по достижении определенного процента изменений. А наличие HAL_Delay внесено с той же целью, затянуть процесс во времени и отдать больше времени на выполнение других задач. Есть там у нас просто одна прожорливая по времени задача. В любом случае это не меняет сути показанного.
@Ololoshize3 жыл бұрын
@@VladimirMedintsev osDelay. :)
@serggorod14232 жыл бұрын
static....EraseInitStruct она вроде так глобальная переменная... 1)для чего мы ещё делаем ее всегда-существующей? 2)почему мы создаём ее не указателем на структуру с инициализацией адресом страницы памяти, а переменной_структуры в hip-е всегда занимающей место? 3)она ли используется как эталонная-сравнения из RAM vs Flash(другими словами,раз она уже отела ОЗУ, ни в ней ли хранятся все 2к данных ОЗУ)? ПС. спасибо за подробный ответ...может какие-то ответы и глупые на ваш взгляд...но только дурак не учится.
@serggorod14232 жыл бұрын
Глобальная переменная и Статик переменная по любому хранятся в куче, или глобальная объявленная в Мейн может попасть в начало стека?¿?
@ArtemKAD15 ай бұрын
Зачем искать ключ если у вас есть контрольная сумма? Сразу проверяйте целостность и если содержимое развалено восстанавливайте заводские значения.
@МихаилТиунов-с7д3 жыл бұрын
1. Вопрос. Запись во FLASH у Вас производится с некоего начального адреса до КОНЦА СТРАНИЦЫ. А надо ли ? Все таки структура конфигурации явно короче 2K. 2. Запись производится в цикле while. При этом - если HAL_FLASH_Program перестанет возвращать HAL_OK - произойдет зависание т.к. l_Address перестанет увеличиваться. 3. Применение ключа не гарантирует проверку на сбой памяти - сбой может произойти в какой-то другой области. Надо бы контрольную сумму
@VladimirMedintsev3 жыл бұрын
Дык это не больше чем пример... На самом деле от этого алгоритма вообще давно убежали уже. Мы чутка изменили подход к хранению конфигураций и теперь их несколько.
@МихаилТиунов-с7д3 жыл бұрын
@@VladimirMedintsev Да. Я почитал коментарии под видео и понял что зря задал свои вопросы...
@aleksandrzakutnyy44506 жыл бұрын
спасибо. а есть документация о создании встроенной базы данных на флэше?
@VladimirMedintsev6 жыл бұрын
Скорее всего я просто не понял ваш вопрос. Но вот сложности что-либо хранить я не вижу совсем. Хоть файловую систему хоть базу данных. Все упирается только в скорость и количество циклов записи.
@aleksandrzakutnyy44506 жыл бұрын
я имею ввиду может есть рекомендации от st по созданию субд на флэш для микроконтроллеров как раз с учетом ограничения циклов записи с индексацией. или других источников
@VladimirMedintsev6 жыл бұрын
@@aleksandrzakutnyy4450 Хорошо, давайте по другому вопрос поставим. Как вы себе мыслите два понятия СУБД (систему управления базами данных) и микроконтроллер в одном предложении. Я именно это не понял. Если имеется в виду хранение записей, то пример я показал. Если их индексацию, то это не сложно сделать и алгоритмы известны. А вот СУБД я еще раз не понимаю. Пожалуйста, если не сложно, просто приведите пример задачи которую вы хотите решить.
@ZYagudin3 жыл бұрын
Если мы записываем считанные данные в data32, то как мы проверяем в условии MagicNum? Данные автоматически переносятся по атрибутам?
@VladimirMedintsev3 жыл бұрын
Это видимо вопрос учебнику языка Си.
@ZYagudin3 жыл бұрын
@@VladimirMedintsev ладно, спасибо
@led-avto Жыл бұрын
Подскажите, как организовать обновление прошивки, через программу виндовс? Хочу сделать ПО в windows forms для отправки настроек и обновления прошивки через vcp. Есть ли у вас примеры как это реализовать?
@VladimirMedintsev Жыл бұрын
Достаточно просто. Напишите свой загрузчик в микроконтроллер и по USB обновляйтесь. Вы же можете как Mass storage устройство в Windows показать.
@led-avto Жыл бұрын
@@VladimirMedintsev есть видео по обновлению через usb и по? Не пойму как читать прошивку, которая лежит на хдд. Или это по делает, и оно же отправляет данные по vcp, а загрузчик уже пишет во флэшь? а шифрование? Ваше видео не доступно на эту тему?
@VladimirMedintsev Жыл бұрын
@serb8405 С шифрованием еще проще. На это можно использовать готовые функции.
@led-avto Жыл бұрын
@@VladimirMedintsev дайте пример пожалуйста... или видосик запишите, думаю полезно многим...
@VladimirMedintsev Жыл бұрын
@@led-avto Да вроде же есть на моем канале про все это ролики и про шифрование и про загрузчик и про передачу управления. Все снято и находится на этом канале.
@ArthurIslamRU6 жыл бұрын
Здравствуйте, Спасибо. А почему вы не используете в коде инкремент переменной на 1 как ++ Или это только для наглядности новичкам?
@VladimirMedintsev6 жыл бұрын
Я не профессиональный программист и реально так пишу. Мне самому так понятнее, тем более компилятор потом оптимизирует на свой вкус.
@spookee53015 жыл бұрын
Владимир, добрый день, запись во флеш останавливает выполнение остальной программы? Ранее я пытался сохранять во флеш и наблюдал такой эффект (возможно делал что-то принципиально неправильно). Присутствует ли он у вас? upd: FreeRTOS использовал, сохраняет одна задача, останавливаются все
@VladimirMedintsev5 жыл бұрын
Операция записи во flash память сама по себе длительная. Разумеется если вы будете записывать 2-3 килобайта то эта операция займет какое-то время. Однако сейчас линейным программированием уже никто и не занимается. А при использовании freertos просто выносите запись в отдельную низкоприоритетную задачу и не будет никакой задержки. Если использовали freertos и все тормозилось, значит приоритеты настроены не правильно. Проверять приоритеты и пройтись по коду чтобы нигде не было hal_delay.
@Илья-м3с5 жыл бұрын
Владимир, добрый день, очень полезное видео, можно ли выложить проект?
@VladimirMedintsev5 жыл бұрын
Скажите честно зачем вам этот проект? Там ведь 5 строчек кода. Вы же сами можете их набрать. Более того процессор наверняка отличается. Т.е. Вам придется мои библиотеки выпиливать а свои вставлять это дольше.
@Илья-м3с5 жыл бұрын
Когда научусь заполнять структуры будет просто, но сейчас проще попрвить чужой проект.
@YuriyIY6 жыл бұрын
Возникло три вопроса. 1. А по таймингам не измеряли? Сколько времени займёт цикл чтения/записи? Чисто для интереса. Сам не пробовал, но читал, что достаточно долго. И, если EEPROM анлочен, то нельзя выполнять другие операции, пока не залочим. 2. Связан с количеством циклов перезаписи. Допустим, что мы превысили количество циклов перезаписи и переместили структуру в другой блок. Как программа узнАет, при следующем включении питания МК, что данные теперь на новом месте? Адрес начала чтения данных жестко вшит в тело программы. Или я где-то чего-то не понял? 3. Вытекает из второго. А не проще для целей автосохранения конфигурации использовать внешний EEPROM по I2C? Стоят копейки, а девайс, как вы говорите, сложный. А хранение основной конфы сделать в EEPROM МК. Меняться он будет раз в полгода, так что, можно не заморачиваться с количеством циклов перезаписи. Столько люди не живут, сколько девайс сможет работать. :-) Или изменить алгоритм. К примеру, на питание поставить достаточно большой кондер, и контролировать отдельным входом наличие питания до кондера. Если питание пропало, вызываем алярм по прерыванию питания, где стопорим все задачи, пишем конфиг в EEPROM и отпускаем все задачи пока не разрядится кондер.
@VladimirMedintsev6 жыл бұрын
1. Нет не измерял. Не видел в этом смысла т.к. тайминги есть в даташите. 2. Этот кусок кода приведен для примера, там много чего нету, там нет проверок на результат операций, да много чего я убрал из реального кода чтобы пример не перегружать. По сути узнать просто. Читаем блок, смотрим на счетчик количества записей. К примеру если он больше какого-то числа то читаем следующий в памяти блок. Т.е. страница +1. При записи точно так же. Перед самой записью если счетчик больше или равен, то пишем в новый блок. 3. Внешний EEPROM или вообще любая внешняя микросхема: занимают место на плате, потребляют дополнительный ток, имеют цену, требуют пайки и прочее и прочее. В серийных изделиях это уже перестает быть копейками. К тому же ресурс не выше, интерфейсы процессора так же будут задействованы и в итоге вы ничего не выигрываете. Просто посмотрите на проблему немного шире. Зачем вам паять какую-то микросхему и использовать гораздо более низкоскоростные интерфейсы, чем внутренние, тратить ноги процессора и прочее если у вас есть лишние килобайты встроенной памяти? Кстати, там ведь я не раз подчеркивал что используется RTOS. А это значит что остальные задачи они не останавливались ожидает записи и сохранения конфигурации только текущая задача. Именно по этому временем записи можно пренебречь. Про прерывание по пропаданию питания я не буду комментировать (особенно посчитав энергопотребление EEPROM в момент записи) т.к. в данном примере в этом просто нет необходимости. Можно код написать так, чтобы не было необходимости.
@YuriyIY6 жыл бұрын
Щитова. :-) Я просто кумекаю, как бы сократить количество записей для увеличения срока эксплуатации девайса. :-) Тайминги надо глянуть, конечно. Я в нете натыкался на инфу. А там напишут. Как будет мотивация, разберусь. Спасибо за видео, познавательно было. :-) Было бы здорово, если бы вы еще рассказали, как определить, сколько страниц занимает сама прошивка, чтоб начать использовать следующие страницы для хранения конфигов.
@TubeYouSimark6 жыл бұрын
Добрый день. Я до недавнего времени тоже использовал внешний EEPROM, а в последнем проекте даже закладывал FRAM (т.к. хотел хранить счётчики наработки). Но у FRAM есть большой гемор (по крайней мере читал на форумах), а именно при недостаточном питании (или во время его пропадании) нельзя читать данные, иначе они могут испортится. Причем портятся таким образом, что контрольной суммой это не решить (портятся данные по разным адресам). Счетчики перенес RTC Backup регистры и забыл. Но не так давно от внешних микросхем отказался, встроенная flash великолепно работает. Я так же использую FreeRTOS и также делаю это в фоновом режиме. Но плюс ко всему: 1. Я обязательно защищаю блок контрольной суммой crc32, по этой причине не вижу никакого смыла в MAGIC_KEY, т.к. если память пустая crc32 точно не совпадает, пиши дефолтные. 2. Немного затратно с точки зрения flash памяти, но я сохраняю сразу две копии переменных в разных секторах с перерывом в 1000мс. Т.е. у меня получается, что, если во время сохранения пропало питание, одна из копий настроек выживет. В худшем варианте, останется предыдущая конфигурация.
@VladimirMedintsev6 жыл бұрын
@@YuriyIY Количество записей и так будет не большим. Вы же не собираетесь менять конфигурацию раз в секунду. С размером прошивки, а кто мешает вам написать и откомпилировать код и посмотреть сколько он занимает?
@VladimirMedintsev6 жыл бұрын
@@TubeYouSimark 1. На самом деле MAGIC_KEY я оставил для примера, чтобы в видео про FLASH не говорить про CRC. Вы наверняка видели что в структуре сектора там есть отведенное для CRC место. Я специально его не затирал. Но MAGIC_KEY несет еще одну приятную функцию. Это у меня еще и номер прошивки. Таким образом самодельный бутлоадер узнает совпадает ли структура хранения данных и при необходимости корректирует ну и еще кучу всего на этот номер завязано. Кроме того многие этот прием не знают. 2. Да это очень удобно. При старте смотреть где правильная контрольная сумма ту конфигурацию и читать. И удобно и надежно.
@ilyakolesov15725 жыл бұрын
Добрый день, подскажите пожалуйста, как мне записать во флешь память значение переменной float, с int32_t проблем нет с чтением и записью, буду очень признателен! stm32f103
@VladimirMedintsev5 жыл бұрын
Размер который в памяти занимает переменная определенного типа вычислить легко. Ну например sizeof(), получить на нее указатель и таким образом узнать где в памяти она находится тоже элементарно. Для этого в языке созданы указатели. Осталось считать uint8 по необходимому адресу... Это не вопрос имкроконтроллера. Смотрите книги по языку C.
@ilyakolesov15725 жыл бұрын
@@VladimirMedintsev Уменя вопрос по записи числа float формате, при записи в флешь все, что после точки анулируется и соответственно при чтении остаются данные только до точки(целое число).
@VladimirMedintsev5 жыл бұрын
Я отлично понял ваш вопрос и дал на него максимально подробный ответ. Перепечатывать сюда всю главу руководства Си по типам данных у меня желания нету. В памяти все переменные хранятся одинаково. А по типам uint или float это уже как их интерпретировать. Я в предыдущем сообщении правильно указал что делать. У вас сейчас проблема не с микроконтроллером и его памятью. Вам надо разобраться с языком Си.
@ilyakolesov15725 жыл бұрын
Vladimir Medintsev спасибо, я понял вас, я понял суть, чуть недопонял вашего ответа
@konstantingolinskiy49445 жыл бұрын
запись переменной типа float if( HAL_FLASH_Program( FLASH_TYPEPROGRAM_WORD, currentAddres, *(uint32_t*)&D ) == HAL_OK) // D переменная типа float чтение переменной типа float float DD = *(float*)currentAddres; // currentAddres адрес памяти куда записали переменную D
@arakeldesign5 жыл бұрын
Владимир, подскажите пожалуйста, на сколько код под STM32 больше чем код под AVR, если не использовать HAL, а писать на CMSIS?
@VladimirMedintsev5 жыл бұрын
По моему мнению он меньше процентов на 25. Это за счет более оптимальных инструкций. Ну и самое главное. В stm нет такой проблемы как в avr с размером памяти ее в разы больше. Код более оптимальный. Именно по этой причине я и говорю что архитектура avr безнадежно устарела.
@arakeldesign5 жыл бұрын
Vladimir Medintsev понял вас, спасибо. Просто сколько я встречал информации везде писали что на STM32 код занимает больше места. Но я так понимаю это все при использовании HAL
@VladimirMedintsev5 жыл бұрын
@@arakeldesign Код на процессорах ARM более компактный. В большей степени это зависит не от используемых библиотек типа CMSIS или HAL, а от того с какими опциями вы компилируете и насколько аккуратный код пишете. В любом случае вопрос не актуален т.к. можно выбрать процессор хоть с мегабайтом памяти.
@arakeldesign5 жыл бұрын
Vladimir Medintsev для меня актуален, так как нужно подобрать контролер маленького размера и в паябелельном корпусе.
@VladimirMedintsev5 жыл бұрын
Ну это реально не проблема. Я не знаю другие ваши требования к процессору, но вот к примеру: STM32F303CCT - 256 kB FLASH и 48 kB RAM - 8x8 mm корпус - примерно 200 рублей STM32L433KCU - 256 kB FLASH и 64 kB RAM - 5x5 mm корпус - примерно 380 рублей паяются элементарно феном без каких-либо проблем. Я буду более чем удивлен если вам хоть на 40% удастся загрузить их. И что-то мне подсказывает что такие мощные вам вообще не нужны. Т.к. если переходить с AVR, то можно слегка обалдеть от доступных мощностей.
@ZYagudin3 жыл бұрын
Почему мы каждый раз увеличиваем адрес на 4? Почему не на 1?
@VladimirMedintsev3 жыл бұрын
Так микроконтроллер же 32 битный...
@ZYagudin3 жыл бұрын
@@VladimirMedintsev не совсем понимаю, как высчитывать смещение
@vlad3c3 жыл бұрын
@@ZYagudin если в кратце, то это особенность 32 битной архитектуры. адресация памяти идёт побайтно, т.е. каждый байт имеет свой адрес 0х0,1,2,3..., но ширина команды в мк 32 бита( thumb не берём в расчет) и на эту ширину выровнены адреса. 32 бита это 4 байта или же слово, величина смещения... для более глубокого понимания вопроса советую почитать учебник "цифровая схемотехника и архитектура компьютера" там детально расстраиваются вопросы как работают процессоры, мк, как организована память и т.д. (лучшее что я читал по изучению мк)
@ZYagudin3 жыл бұрын
@@vlad3c Спасибо большое
@alexanderfox46783 жыл бұрын
Здравствуйте, может кто подскажет, использую микроконтроллер 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 отдать не могу, с ним тоже все работает отлично.
@VladimirMedintsev3 жыл бұрын
В прерывании определяйте от какого точно таймера пришло и с ним только и работайте.
@space_games3 жыл бұрын
а что за osDelay?
@arzamas19883 жыл бұрын
Функция операционной системы, которая тормозит задачу на Х ms.
@space_games3 жыл бұрын
@@arzamas1988 у меня ее нету, наверно библиотека нужна какая-то..
@dazzershell3 жыл бұрын
Куб загружает в проект свою версию обертки над фри-ртос, но можно писать vTaskDelay, должно работать.
@arzamas19883 жыл бұрын
@@space_games нужно включить интеграцию операционной системы FreeRTOS
@space_games3 жыл бұрын
@@arzamas1988 ок, уже по-другому сделал
@dmitryt29884 жыл бұрын
Добрый день! Если не сложно, поясните, пожалуйста, момент с чтением данных. Нигде не могу найти четкого ответа. Почему при чтении необходимо указывать "_IO"(везде пишут именно *(_IO uint32_t*) и никогда *(uint32_t*) )? Как я понял это volatile. И если просто создать указатель на 32-х битную переменную и прочитать значении по нему, то тоже все корректно считывается. К чему может привести не использования данного ключевого слова при чтении из flash? Ведь данные там не могут неявно измениться,те мы сами их туда записываем и читаем.
@VladimirMedintsev4 жыл бұрын
Когда в своей программе вы используете переменные вы можете преобразовывать их тип используя конструкции типа eight = (uint8_t)double. В этом случае компилятор имеет право оптимизировать работу и использование переменных так как считает нужным. Бывают случаи когда мы обращаемся к переменной не явно, например по ссылке. В этом случае мы должны указать компилятору что такая переменная может изменятся не явно и мы ее определяем как volatile uint32_t. С регистром и с памятью то же самое. Эти значения могут изменяться процессором когда ему будет угодно. И в библиотеке cmsis есть дефайн #define __IO volatile /*!< Defines 'read / write' permissions */. Ну а относительно мы сами их туда записываем и читаем. А как быть с DMA? Мы ведь в этом не участвуем. DMA сама и записывает и читает. Ну и еще куча аналогичных примеров.
@dmitryt29884 жыл бұрын
@@VladimirMedintsev Спасибо. Само преобразование и зачем компилятору указывать на переменные которые могут не явно измениться я понимаю. Как раз не мог понять зачем с флэшем это делать, не мог ситуацию придумать и даже про dma не подумал. Спасибо за ответ!
@beerbear91826 жыл бұрын
лучше уж выкладывать видео как обычно. эти "премьеры" только сбивают с толку
@VladimirMedintsev6 жыл бұрын
Зато увеличивают количество подписчиков и просмотров.
@beerbear91826 жыл бұрын
@@VladimirMedintsev ну, ежели так, потерпим
@VladimirMedintsev6 жыл бұрын
Спасибо вам огромное. Я не долго буду с этой функцией играться.
@00ASpid006 жыл бұрын
Я уже обрадовался, что сейчас интересное услышу, ан нет, только завтра.
@solomonsergey78623 жыл бұрын
Хорошо, но пары вещей не хватает. 1. Как переключиться на другой сектор? 2. Что делать, если надо перезаписать только часть данных в секторе? Я понимаю, что вопрос нубский, но и видео не для профи. Спасибо за понимание.
@VladimirMedintsev3 жыл бұрын
1. Указать его адрес. 2. Скопировать необходимое в память или другой сектор.
@solomonsergey78623 жыл бұрын
@@VladimirMedintsev 1. да, я разобрался. У меня TM32F746. У него последние сектора просто огромные. Я не мог поверить, что перед записью 16 байт я должен стереть 128 килобайт. 2. Пишут что если один раз стер сектор, то в те места сектора, которые ещё не писал, можно писать. Не пробовали ничего такого?
@VladimirMedintsev3 жыл бұрын
В смысле не пробовали ничего такого? Я все пробовал.
@solomonsergey78623 жыл бұрын
@@VladimirMedintsev И как, получилось стереть сектор один раз и потом писать в разные места сектора не очищая его ещё раз? У меня не вышло.
@VladimirMedintsev3 жыл бұрын
А у меня вышло и даже видео есть где я рассказываю о хранении лога именно по этому принципу.
@user-tr3kg3ei4p3 жыл бұрын
Автор, вы в курсе про padding в структурах ? если в структуре есть поле не кратное ячейкам памяти (по даташиту пол слова, слово и двойное слово, а слово - 32 бита), то данное поле структуры (char array[2048-8]) будет дополнено пустыми байтами для кратности машинному слову. Либо тут компилятор за вас это решает и делает поле меньше, чем 2040 байт, либо вы ещё не писали ничего в последние байты вашей структуры и не словили unexpected behaviour.
@VladimirMedintsev3 жыл бұрын
Я в курсе. Не совсем понятно как это должно влиять на рассказанное в видео.
@user-tr3kg3ei4p3 жыл бұрын
@@VladimirMedintsev видео справочное по хранению в памяти. А мне как-то пришлось записывать много данных в память и с этой особенностью структур столкнулся лично. Плюс ещё хорошо бы учитывать номер страницы, на которой считается количество сделанных записей. Ведь в stm32 количество гарантированных записей всего 10 тысяч и страница, которую уже много раз писали, не должна использоваться больше. В вашем примере эта особенность уберегла бы новичков от возможных проблем. Вас хвалят и благодарят за пример. И мне у вас есть что посмотреть. Спасибо за контент вам. Мне лично лень делать труд по записи и монтажу видео. Но я хочу, чтобы было доступно больше полезных советов для разработчиков встраиваемой электроники.
@ibrag20125 жыл бұрын
А як не напоротися на сторінку із прошивкою?
@VladimirMedintsev5 жыл бұрын
Друже, я колись вчив українську мову. Але я не кажу українською. Мені якось на суржику простіше.
@ibrag20125 жыл бұрын
@@VladimirMedintsev та я російкою розумію тільки писати не вмію. Отже: наскільки зрозумів код програми в тому ж флеші, якщо його переписувати то можна переписати основне тіло (робочої) програми а як від цього захиститися не уявляю.
@VladimirMedintsev5 жыл бұрын
@@ibrag2012 После того, как вы поместили свою программу в память (flash) микроконтроллера и сделали все чтобы отдать готовое устройство заказчику вы можете воспользоваться утилитой CubeProgrammer и отключить интерфейс программирования и отладки. После этого программатор использовать уже не получится. И программу прочитать-изменить тоже. А значит ваше устройство в безопасности.
@anatoliinavrockiy86075 жыл бұрын
@@VladimirMedintsev он хотел сказать что раз пространство адресов прошивки и условного eeprom совпадает, то можно случайно попасть в место прошивки и затереть основную программу своими настройками. Я сам только перехожу с avr на stm32 и мне этот вопрос тоже интересен. Как правильно выбрать страницу памяти чтобы случайно не попасть на свой исполняемый код?
@VladimirMedintsev5 жыл бұрын
@@anatoliinavrockiy8607 Я отлично понял что он хотел спросить. Только у stm32 в отличии от avr памяти сильно больше. Выделите последний сектор под свою конфигурацию и пользуйтесь. Тут физически тяжело создать настолько большую программу чтобы она всю flash собой заняла. Ну а уж если параноя одолевать кого-нибудь будет, то можно воспользоваться командами линковщику и четко дать ему понять что сектор от 0хХХХХХХХХ и до 0хХХХХХХХ занимать нельзя и будете его свободно использовать. Просто это не относится непосредственно к теме данного видео. Не задумывались, например, почему никто не публикует в интернете полный код загрузчика под stm32? Просто к таким технологиям человек должен сам придти.