STM32 Хранение данных и конфигурации во FLASH памяти.

Поділитися
Вставка
  • Опубліковано 2 лют 2025

КОМЕНТАРІ • 125

  • @АнтонБеляев-н9у
    @АнтонБеляев-н9у 4 роки тому +1

    Здравствуйте, Владимир. Спасибо Вам огромное за то, что делитесь своим опытом в разработке ПО для STM32. Данное видео помогло мне структурировать в голове работу с конфигурацией и сохранением ее во FLASH микроконтроллера. Теперь программа для разрабатываемого устройства стала гораздо читабельнее, стало проще ее модифицировать в случае добавления новых параметров в конфигурацию. Всего Вам доброго.

    • @VladimirMedintsev
      @VladimirMedintsev  4 роки тому

      И Вам за добрые слова спасибо.

  • @space_games
    @space_games 3 роки тому +1

    спасибо, все работает, сделал себе генератор импульсов с автосохранением 😎

  • @raven8867
    @raven8867 3 роки тому

    Спасибо Вам за полезную информацию !С Новым Годом!

  • @akovalev341
    @akovalev341 3 роки тому

    Хороший пример, возьму на заметку.

  • @NIKOLAY_PSHONIA
    @NIKOLAY_PSHONIA 2 роки тому

    Владимир спасибо за труды. Вопрос прога занимает 24кб у STM32F4 флеша 512кб. посмотрел стлинком флеш память а там все разбросано. и немогу 16кб - один сектор найти - нужно впихивать в разные сектора по куску. Как то компилятору можно указать
    или что сделать что бы 16кб сектор не трогал ???

    • @AE075G
      @AE075G Рік тому

      На счёт сектора в любом месте не подскажу, но полагаю, можно перенести адрес, с которого начинается прошивка чуть подальше от начала. Если нашли решение, напишите и мне, пожалуйста.

  • @efimefimefim
    @efimefimefim 5 років тому +1

    У себя использую попеременное хранение настроек в двух секторах. Один сектор заполнился, записываю на второй, потом первый стираю и записываю туда. Так исключается возможность остаться без настроек при отключении питания в момент, когда началось стирание/запись.

    • @VladimirMedintsev
      @VladimirMedintsev  5 років тому

      Да это хороший вариант и не только потому, что делает резервную копию данных, но еще и потому, что продлевается жизнь flash.

  • @aleksandrkozlov9286
    @aleksandrkozlov9286 6 років тому +2

    Добрый вечер, Большое спасибо за оперативность! очень актуально!
    Надеюсь будет затронуты вопросы с сохранением структур с разношерстными параметрами(char,int,вложенные структуры) про упаковку структур , чтение после перегрузки из памяти с заполнением обратно этой структуры, и еще вопрос интересует про эмуляцию EEPROM.
    Грубо говоря имеется
    typedef struct{
    int param1;
    char str1[128];
    char str2[256];
    uint32_t param4;
    };
    Как мне ее записать всё в память, а после считать. Думаю , что просто делается, но пока никак. Заранее спасибо

    • @VladimirMedintsev
      @VladimirMedintsev  6 років тому +1

      Вообще-то паковать ничего не надо. Если вы объявляете структурную переменную то ее элементы уже лежат в памяти один за другим.
      После этого используете union и совмещаете вашу структуру в памяти с массивом который можете перенести во FLASH. Это не стоило того чтобы создавать видео. Просто удивлен был что вы не смогли этого сделать. Ну я не умничаю, просто это к микроконтроллерам не относится это язык СИ.

    • @aleksandrkozlov9286
      @aleksandrkozlov9286 6 років тому +1

      @@VladimirMedintsev Извиняюсь за глупые вопросы изучаю СИ, но пока опыта мало,.
      Вроде бы Если делать в структуре то члены располагаются не подряд, а в зависимости от их типа.пример
      Int будет занимать ячейку с адресом кратным 4м, а char будет занимать ячейку с адресом кратным 2м, связи с этим в памятя возможны пустые ячейки, если не использовать дерективы pragm
      Но это не точно, если что поправьте пожалуйста, хочу разобраться!
      , используете union и совмещаете вашу структуру в памяти с массивом который можете перенести во FLASH, блин а можно поподобнеее пример?
      typedef struct preset {
      int i;
      char param1[128];
      }
      union uBruf {
      preset sBuf;
      uint32_t buf[]
      };

    • @VladimirMedintsev
      @VladimirMedintsev  6 років тому +1

      Если взять к примеру вашу структуру:
      typedef struct{
      int param1;
      char str1[128];
      char str2[256];
      uint32_t param4;
      };
      то в памяти все элементы структуры будут располагаться друг за другом. Разумеется в соответствии со своими размерами. Описанный мной способ позволяет абстрагироваться от этих размеров и прочего ненужного и сохраниться. Если и для сохранения и для чтения вы используете одну и ту же структуру данных то все будет работать.
      Могу одно сказать к микроконтроллерам это отношения не имеет а по СИ видео полный интернет. Хотя если честно я советовал бы книжку.

    • @aleksandrkozlov9286
      @aleksandrkozlov9286 6 років тому

      @@VladimirMedintsev Спасибо большое за видео!!! после просмотра стало яснее , из книг читаю Кернигана , но бывает вопросы вроде простые , но решение сразу на ум не приходит.
      Продолжайте в том же духе , на русско язычном ютубе всего 2-3 канала про stm32.

    • @VladimirMedintsev
      @VladimirMedintsev  6 років тому

      Я не знаю пока еще как скоро мне это надоест.

  • @ЕвгенийСторожев-ч3т
    @ЕвгенийСторожев-ч3т 6 років тому +1

    Уточню 1:38: страниц 256. От 0 страницы и до 255 всего с нулевой 256 блоков.

  • @ArthurIslamRU
    @ArthurIslamRU 6 років тому

    Здравствуйте, Спасибо.
    А почему вы не используете в коде инкремент переменной на 1 как ++
    Или это только для наглядности новичкам?

    • @VladimirMedintsev
      @VladimirMedintsev  6 років тому +2

      Я не профессиональный программист и реально так пишу. Мне самому так понятнее, тем более компилятор потом оптимизирует на свой вкус.

  • @aleksandrzakutnyy4450
    @aleksandrzakutnyy4450 6 років тому

    спасибо. а есть документация о создании встроенной базы данных на флэше?

    • @VladimirMedintsev
      @VladimirMedintsev  6 років тому

      Скорее всего я просто не понял ваш вопрос. Но вот сложности что-либо хранить я не вижу совсем.
      Хоть файловую систему хоть базу данных. Все упирается только в скорость и количество циклов записи.

    • @aleksandrzakutnyy4450
      @aleksandrzakutnyy4450 6 років тому

      я имею ввиду может есть рекомендации от st по созданию субд на флэш для микроконтроллеров как раз с учетом ограничения циклов записи с индексацией. или других источников

    • @VladimirMedintsev
      @VladimirMedintsev  6 років тому

      @@aleksandrzakutnyy4450 Хорошо, давайте по другому вопрос поставим. Как вы себе мыслите два понятия СУБД (систему управления базами данных) и микроконтроллер в одном предложении. Я именно это не понял. Если имеется в виду хранение записей, то пример я показал. Если их индексацию, то это не сложно сделать и алгоритмы известны. А вот СУБД я еще раз не понимаю. Пожалуйста, если не сложно, просто приведите пример задачи которую вы хотите решить.

  • @led-avto
    @led-avto Рік тому

    Подскажите, как организовать обновление прошивки, через программу виндовс? Хочу сделать ПО в windows forms для отправки настроек и обновления прошивки через vcp. Есть ли у вас примеры как это реализовать?

    • @VladimirMedintsev
      @VladimirMedintsev  Рік тому +1

      Достаточно просто. Напишите свой загрузчик в микроконтроллер и по USB обновляйтесь. Вы же можете как Mass storage устройство в Windows показать.

    • @led-avto
      @led-avto Рік тому

      @@VladimirMedintsev есть видео по обновлению через usb и по? Не пойму как читать прошивку, которая лежит на хдд. Или это по делает, и оно же отправляет данные по vcp, а загрузчик уже пишет во флэшь? а шифрование? Ваше видео не доступно на эту тему?

    • @VladimirMedintsev
      @VladimirMedintsev  Рік тому

      @serb8405 С шифрованием еще проще. На это можно использовать готовые функции.

    • @led-avto
      @led-avto Рік тому

      @@VladimirMedintsev дайте пример пожалуйста... или видосик запишите, думаю полезно многим...

    • @VladimirMedintsev
      @VladimirMedintsev  Рік тому

      @@led-avto Да вроде же есть на моем канале про все это ролики и про шифрование и про загрузчик и про передачу управления. Все снято и находится на этом канале.

  • @АлександрСпицын-х1я

    Спасибо! В цикле сравнения сделать бы break после первого несовпадения. И наверное можно не ставить таймаут после записи во флешу слова, там внутри HAL_FLASH_Program есть ожидание завершения последней операции с флешой.

    • @VladimirMedintsev
      @VladimirMedintsev  5 років тому +1

      Ну на самом деле это же код выдран из рабочего проекта и немного адаптирован для обьяснений. И отсутствие break это желание узнать какое количество байт конфигурации обновилось. Можно же обновлять конфигурацию только по достижении определенного процента изменений. А наличие HAL_Delay внесено с той же целью, затянуть процесс во времени и отдать больше времени на выполнение других задач. Есть там у нас просто одна прожорливая по времени задача.
      В любом случае это не меняет сути показанного.

    • @Ololoshize
      @Ololoshize 3 роки тому

      @@VladimirMedintsev osDelay. :)

  • @МихаилТиунов-с7д
    @МихаилТиунов-с7д 3 роки тому

    1. Вопрос. Запись во FLASH у Вас производится с некоего начального адреса до КОНЦА СТРАНИЦЫ. А надо ли ? Все таки структура конфигурации явно короче 2K.
    2. Запись производится в цикле while. При этом - если HAL_FLASH_Program перестанет возвращать HAL_OK - произойдет зависание т.к. l_Address перестанет увеличиваться.
    3. Применение ключа не гарантирует проверку на сбой памяти - сбой может произойти в какой-то другой области. Надо бы контрольную сумму

    • @VladimirMedintsev
      @VladimirMedintsev  3 роки тому

      Дык это не больше чем пример... На самом деле от этого алгоритма вообще давно убежали уже. Мы чутка изменили подход к хранению конфигураций и теперь их несколько.

    • @МихаилТиунов-с7д
      @МихаилТиунов-с7д 3 роки тому +1

      @@VladimirMedintsev Да. Я почитал коментарии под видео и понял что зря задал свои вопросы...

  • @spookee5301
    @spookee5301 6 років тому

    Владимир, добрый день, запись во флеш останавливает выполнение остальной программы? Ранее я пытался сохранять во флеш и наблюдал такой эффект (возможно делал что-то принципиально неправильно). Присутствует ли он у вас?
    upd: FreeRTOS использовал, сохраняет одна задача, останавливаются все

    • @VladimirMedintsev
      @VladimirMedintsev  6 років тому +2

      Операция записи во flash память сама по себе длительная. Разумеется если вы будете записывать 2-3 килобайта то эта операция займет какое-то время.
      Однако сейчас линейным программированием уже никто и не занимается. А при использовании freertos просто выносите запись в отдельную низкоприоритетную задачу и не будет никакой задержки.
      Если использовали freertos и все тормозилось, значит приоритеты настроены не правильно. Проверять приоритеты и пройтись по коду чтобы нигде не было hal_delay.

  • @ZYagudin
    @ZYagudin 3 роки тому

    Если мы записываем считанные данные в data32, то как мы проверяем в условии MagicNum? Данные автоматически переносятся по атрибутам?

    • @VladimirMedintsev
      @VladimirMedintsev  3 роки тому

      Это видимо вопрос учебнику языка Си.

    • @ZYagudin
      @ZYagudin 3 роки тому

      @@VladimirMedintsev ладно, спасибо

  • @YuriyIY
    @YuriyIY 6 років тому

    Возникло три вопроса.
    1. А по таймингам не измеряли? Сколько времени займёт цикл чтения/записи? Чисто для интереса. Сам не пробовал, но читал, что достаточно долго. И, если EEPROM анлочен, то нельзя выполнять другие операции, пока не залочим.
    2. Связан с количеством циклов перезаписи. Допустим, что мы превысили количество циклов перезаписи и переместили структуру в другой блок. Как программа узнАет, при следующем включении питания МК, что данные теперь на новом месте? Адрес начала чтения данных жестко вшит в тело программы. Или я где-то чего-то не понял?
    3. Вытекает из второго. А не проще для целей автосохранения конфигурации использовать внешний EEPROM по I2C? Стоят копейки, а девайс, как вы говорите, сложный. А хранение основной конфы сделать в EEPROM МК. Меняться он будет раз в полгода, так что, можно не заморачиваться с количеством циклов перезаписи. Столько люди не живут, сколько девайс сможет работать. :-)
    Или изменить алгоритм. К примеру, на питание поставить достаточно большой кондер, и контролировать отдельным входом наличие питания до кондера. Если питание пропало, вызываем алярм по прерыванию питания, где стопорим все задачи, пишем конфиг в EEPROM и отпускаем все задачи пока не разрядится кондер.

    • @VladimirMedintsev
      @VladimirMedintsev  6 років тому

      1. Нет не измерял. Не видел в этом смысла т.к. тайминги есть в даташите.
      2. Этот кусок кода приведен для примера, там много чего нету, там нет проверок на результат операций, да много чего я убрал из реального кода чтобы пример не перегружать. По сути узнать просто. Читаем блок, смотрим на счетчик количества записей. К примеру если он больше какого-то числа то читаем следующий в памяти блок. Т.е. страница +1. При записи точно так же. Перед самой записью если счетчик больше или равен, то пишем в новый блок.
      3. Внешний EEPROM или вообще любая внешняя микросхема: занимают место на плате, потребляют дополнительный ток, имеют цену, требуют пайки и прочее и прочее. В серийных изделиях это уже перестает быть копейками. К тому же ресурс не выше, интерфейсы процессора так же будут задействованы и в итоге вы ничего не выигрываете. Просто посмотрите на проблему немного шире. Зачем вам паять какую-то микросхему и использовать гораздо более низкоскоростные интерфейсы, чем внутренние, тратить ноги процессора и прочее если у вас есть лишние килобайты встроенной памяти?
      Кстати, там ведь я не раз подчеркивал что используется RTOS. А это значит что остальные задачи они не останавливались ожидает записи и сохранения конфигурации только текущая задача. Именно по этому временем записи можно пренебречь.
      Про прерывание по пропаданию питания я не буду комментировать (особенно посчитав энергопотребление EEPROM в момент записи) т.к. в данном примере в этом просто нет необходимости. Можно код написать так, чтобы не было необходимости.

    • @YuriyIY
      @YuriyIY 6 років тому

      Щитова. :-) Я просто кумекаю, как бы сократить количество записей для увеличения срока эксплуатации девайса. :-) Тайминги надо глянуть, конечно. Я в нете натыкался на инфу. А там напишут. Как будет мотивация, разберусь. Спасибо за видео, познавательно было. :-) Было бы здорово, если бы вы еще рассказали, как определить, сколько страниц занимает сама прошивка, чтоб начать использовать следующие страницы для хранения конфигов.

    • @TubeYouSimark
      @TubeYouSimark 6 років тому +4

      Добрый день.
      Я до недавнего времени тоже использовал внешний EEPROM, а в последнем проекте даже закладывал FRAM (т.к. хотел хранить счётчики наработки). Но у FRAM есть большой гемор (по крайней мере читал на форумах), а именно при недостаточном питании (или во время его пропадании) нельзя читать данные, иначе они могут испортится. Причем портятся таким образом, что контрольной суммой это не решить (портятся данные по разным адресам). Счетчики перенес RTC Backup регистры и забыл.
      Но не так давно от внешних микросхем отказался, встроенная flash великолепно работает. Я так же использую FreeRTOS и также делаю это в фоновом режиме. Но плюс ко всему:
      1. Я обязательно защищаю блок контрольной суммой crc32, по этой причине не вижу никакого смыла в MAGIC_KEY, т.к. если память пустая crc32 точно не совпадает, пиши дефолтные.
      2. Немного затратно с точки зрения flash памяти, но я сохраняю сразу две копии переменных в разных секторах с перерывом в 1000мс. Т.е. у меня получается, что, если во время сохранения пропало питание, одна из копий настроек выживет. В худшем варианте, останется предыдущая конфигурация.

    • @VladimirMedintsev
      @VladimirMedintsev  6 років тому

      @@YuriyIY Количество записей и так будет не большим. Вы же не собираетесь менять конфигурацию раз в секунду.
      С размером прошивки, а кто мешает вам написать и откомпилировать код и посмотреть сколько он занимает?

    • @VladimirMedintsev
      @VladimirMedintsev  6 років тому

      @@TubeYouSimark 1. На самом деле MAGIC_KEY я оставил для примера, чтобы в видео про FLASH не говорить про CRC. Вы наверняка видели что в структуре сектора там есть отведенное для CRC место. Я специально его не затирал. Но MAGIC_KEY несет еще одну приятную функцию. Это у меня еще и номер прошивки. Таким образом самодельный бутлоадер узнает совпадает ли структура хранения данных и при необходимости корректирует ну и еще кучу всего на этот номер завязано. Кроме того многие этот прием не знают.
      2. Да это очень удобно. При старте смотреть где правильная контрольная сумма ту конфигурацию и читать. И удобно и надежно.

  • @Илья-м3с
    @Илья-м3с 6 років тому

    Владимир, добрый день, очень полезное видео, можно ли выложить проект?

    • @VladimirMedintsev
      @VladimirMedintsev  6 років тому

      Скажите честно зачем вам этот проект? Там ведь 5 строчек кода. Вы же сами можете их набрать. Более того процессор наверняка отличается. Т.е. Вам придется мои библиотеки выпиливать а свои вставлять это дольше.

    • @Илья-м3с
      @Илья-м3с 6 років тому

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

  • @serggorod1423
    @serggorod1423 2 роки тому

    static....EraseInitStruct она вроде так глобальная переменная...
    1)для чего мы ещё делаем ее всегда-существующей?
    2)почему мы создаём ее не указателем на структуру с инициализацией адресом страницы памяти, а переменной_структуры в hip-е всегда занимающей место?
    3)она ли используется как эталонная-сравнения из RAM vs Flash(другими словами,раз она уже отела ОЗУ, ни в ней ли хранятся все 2к данных ОЗУ)?
    ПС. спасибо за подробный ответ...может какие-то ответы и глупые на ваш взгляд...но только дурак не учится.

    • @serggorod1423
      @serggorod1423 2 роки тому

      Глобальная переменная и Статик переменная по любому хранятся в куче, или глобальная объявленная в Мейн может попасть в начало стека?¿?

  • @dmitriibannikovasx
    @dmitriibannikovasx 3 роки тому

    Когда кто-то говорил что AVR не проще, они просто другие... В авр для записи в ипром всего 1 функция с двумя параметрами (куда записывать и какие данные)

    • @VladimirMedintsev
      @VladimirMedintsev  3 роки тому +4

      И о чем это говорит? Наверное о том, что в STM32 десятки различных чипов с разной организацией памяти и по этой причине некоторые функции выглядят непривычно. Но вы ведь можете и сами написать функцию в которой будет два параметра. И пожалуйста, будет все как раньше.
      Но вообще вы же поймите. Это я вот подписался и рекламирую STM, вы то их использовать не обязаны, вам же не платят.

  • @arakeldesign
    @arakeldesign 6 років тому

    Владимир, подскажите пожалуйста, на сколько код под STM32 больше чем код под AVR, если не использовать HAL, а писать на CMSIS?

    • @VladimirMedintsev
      @VladimirMedintsev  6 років тому

      По моему мнению он меньше процентов на 25. Это за счет более оптимальных инструкций. Ну и самое главное. В stm нет такой проблемы как в avr с размером памяти ее в разы больше. Код более оптимальный. Именно по этой причине я и говорю что архитектура avr безнадежно устарела.

    • @arakeldesign
      @arakeldesign 6 років тому

      Vladimir Medintsev понял вас, спасибо. Просто сколько я встречал информации везде писали что на STM32 код занимает больше места. Но я так понимаю это все при использовании HAL

    • @VladimirMedintsev
      @VladimirMedintsev  6 років тому

      @@arakeldesign Код на процессорах ARM более компактный. В большей степени это зависит не от используемых библиотек типа CMSIS или HAL, а от того с какими опциями вы компилируете и насколько аккуратный код пишете. В любом случае вопрос не актуален т.к. можно выбрать процессор хоть с мегабайтом памяти.

    • @arakeldesign
      @arakeldesign 6 років тому

      Vladimir Medintsev для меня актуален, так как нужно подобрать контролер маленького размера и в паябелельном корпусе.

    • @VladimirMedintsev
      @VladimirMedintsev  6 років тому

      Ну это реально не проблема. Я не знаю другие ваши требования к процессору, но вот к примеру:
      STM32F303CCT - 256 kB FLASH и 48 kB RAM - 8x8 mm корпус - примерно 200 рублей
      STM32L433KCU - 256 kB FLASH и 64 kB RAM - 5x5 mm корпус - примерно 380 рублей
      паяются элементарно феном без каких-либо проблем.
      Я буду более чем удивлен если вам хоть на 40% удастся загрузить их.
      И что-то мне подсказывает что такие мощные вам вообще не нужны. Т.к. если переходить с AVR, то можно слегка обалдеть от доступных мощностей.

  • @serggorod1423
    @serggorod1423 2 роки тому

    Где было это видео 3 года...когда я тонул в примерах на указатели типа указатили на вид типа_флеш...
    обидно точто подписан 2мя устройствами... и нигде не всплвло.!!!! почему А?¿?
    Жаль что не для адептов садо_cmsis....

  • @ilyakolesov1572
    @ilyakolesov1572 5 років тому

    Добрый день, подскажите пожалуйста, как мне записать во флешь память значение переменной float, с int32_t проблем нет с чтением и записью, буду очень признателен! stm32f103

    • @VladimirMedintsev
      @VladimirMedintsev  5 років тому

      Размер который в памяти занимает переменная определенного типа вычислить легко. Ну например sizeof(), получить на нее указатель и таким образом узнать где в памяти она находится тоже элементарно. Для этого в языке созданы указатели. Осталось считать uint8 по необходимому адресу... Это не вопрос имкроконтроллера. Смотрите книги по языку C.

    • @ilyakolesov1572
      @ilyakolesov1572 5 років тому

      @@VladimirMedintsev Уменя вопрос по записи числа float формате, при записи в флешь все, что после точки анулируется и соответственно при чтении остаются данные только до точки(целое число).

    • @VladimirMedintsev
      @VladimirMedintsev  5 років тому

      Я отлично понял ваш вопрос и дал на него максимально подробный ответ. Перепечатывать сюда всю главу руководства Си по типам данных у меня желания нету. В памяти все переменные хранятся одинаково. А по типам uint или float это уже как их интерпретировать. Я в предыдущем сообщении правильно указал что делать. У вас сейчас проблема не с микроконтроллером и его памятью. Вам надо разобраться с языком Си.

    • @ilyakolesov1572
      @ilyakolesov1572 5 років тому

      Vladimir Medintsev спасибо, я понял вас, я понял суть, чуть недопонял вашего ответа

    • @konstantingolinskiy4944
      @konstantingolinskiy4944 5 років тому

      запись переменной типа float if( HAL_FLASH_Program( FLASH_TYPEPROGRAM_WORD, currentAddres, *(uint32_t*)&D ) == HAL_OK) // D переменная типа float
      чтение переменной типа float float DD = *(float*)currentAddres; // currentAddres адрес памяти куда записали переменную D

  • @ZYagudin
    @ZYagudin 3 роки тому

    Почему мы каждый раз увеличиваем адрес на 4? Почему не на 1?

    • @VladimirMedintsev
      @VladimirMedintsev  3 роки тому +1

      Так микроконтроллер же 32 битный...

    • @ZYagudin
      @ZYagudin 3 роки тому

      @@VladimirMedintsev не совсем понимаю, как высчитывать смещение

    • @vlad3c
      @vlad3c 3 роки тому +1

      @@ZYagudin если в кратце, то это особенность 32 битной архитектуры. адресация памяти идёт побайтно, т.е. каждый байт имеет свой адрес 0х0,1,2,3..., но ширина команды в мк 32 бита( thumb не берём в расчет) и на эту ширину выровнены адреса. 32 бита это 4 байта или же слово, величина смещения...
      для более глубокого понимания вопроса советую почитать учебник "цифровая схемотехника и архитектура компьютера" там детально расстраиваются вопросы как работают процессоры, мк, как организована память и т.д. (лучшее что я читал по изучению мк)

    • @ZYagudin
      @ZYagudin 3 роки тому

      @@vlad3c Спасибо большое

  • @ArtemKAD1
    @ArtemKAD1 7 місяців тому +1

    Зачем искать ключ если у вас есть контрольная сумма? Сразу проверяйте целостность и если содержимое развалено восстанавливайте заводские значения.

  • @dmitryt2988
    @dmitryt2988 4 роки тому

    Добрый день! Если не сложно, поясните, пожалуйста, момент с чтением данных. Нигде не могу найти четкого ответа. Почему при чтении необходимо указывать "_IO"(везде пишут именно *(_IO uint32_t*) и никогда *(uint32_t*) )? Как я понял это volatile. И если просто создать указатель на 32-х битную переменную и прочитать значении по нему, то тоже все корректно считывается. К чему может привести не использования данного ключевого слова при чтении из flash? Ведь данные там не могут неявно измениться,те мы сами их туда записываем и читаем.

    • @VladimirMedintsev
      @VladimirMedintsev  4 роки тому

      Когда в своей программе вы используете переменные вы можете преобразовывать их тип используя конструкции типа eight = (uint8_t)double. В этом случае компилятор имеет право оптимизировать работу и использование переменных так как считает нужным. Бывают случаи когда мы обращаемся к переменной не явно, например по ссылке. В этом случае мы должны указать компилятору что такая переменная может изменятся не явно и мы ее определяем как volatile uint32_t. С регистром и с памятью то же самое. Эти значения могут изменяться процессором когда ему будет угодно. И в библиотеке cmsis есть дефайн #define __IO volatile /*!< Defines 'read / write' permissions */.
      Ну а относительно мы сами их туда записываем и читаем. А как быть с DMA? Мы ведь в этом не участвуем. DMA сама и записывает и читает. Ну и еще куча аналогичных примеров.

    • @dmitryt2988
      @dmitryt2988 4 роки тому

      @@VladimirMedintsev Спасибо. Само преобразование и зачем компилятору указывать на переменные которые могут не явно измениться я понимаю. Как раз не мог понять зачем с флэшем это делать, не мог ситуацию придумать и даже про dma не подумал. Спасибо за ответ!

  • @beerbear9182
    @beerbear9182 6 років тому +6

    лучше уж выкладывать видео как обычно. эти "премьеры" только сбивают с толку

    • @VladimirMedintsev
      @VladimirMedintsev  6 років тому

      Зато увеличивают количество подписчиков и просмотров.

    • @beerbear9182
      @beerbear9182 6 років тому +2

      @@VladimirMedintsev ну, ежели так, потерпим

    • @VladimirMedintsev
      @VladimirMedintsev  6 років тому +1

      Спасибо вам огромное. Я не долго буду с этой функцией играться.

    • @00ASpid00
      @00ASpid00 6 років тому +2

      Я уже обрадовался, что сейчас интересное услышу, ан нет, только завтра.

  • @user-tr3kg3ei4p
    @user-tr3kg3ei4p 3 роки тому

    Автор, вы в курсе про padding в структурах ?
    если в структуре есть поле не кратное ячейкам памяти (по даташиту пол слова, слово и двойное слово, а слово - 32 бита), то данное поле структуры (char array[2048-8]) будет дополнено пустыми байтами для кратности машинному слову.
    Либо тут компилятор за вас это решает и делает поле меньше, чем 2040 байт, либо вы ещё не писали ничего в последние байты вашей структуры и не словили unexpected behaviour.

    • @VladimirMedintsev
      @VladimirMedintsev  3 роки тому

      Я в курсе. Не совсем понятно как это должно влиять на рассказанное в видео.

    • @user-tr3kg3ei4p
      @user-tr3kg3ei4p 3 роки тому +1

      @@VladimirMedintsev видео справочное по хранению в памяти. А мне как-то пришлось записывать много данных в память и с этой особенностью структур столкнулся лично.
      Плюс ещё хорошо бы учитывать номер страницы, на которой считается количество сделанных записей. Ведь в stm32 количество гарантированных записей всего 10 тысяч и страница, которую уже много раз писали, не должна использоваться больше. В вашем примере эта особенность уберегла бы новичков от возможных проблем.
      Вас хвалят и благодарят за пример. И мне у вас есть что посмотреть. Спасибо за контент вам. Мне лично лень делать труд по записи и монтажу видео. Но я хочу, чтобы было доступно больше полезных советов для разработчиков встраиваемой электроники.

  • @space_games
    @space_games 3 роки тому

    а что за osDelay?

    • @arzamas1988
      @arzamas1988 3 роки тому

      Функция операционной системы, которая тормозит задачу на Х ms.

    • @space_games
      @space_games 3 роки тому

      @@arzamas1988 у меня ее нету, наверно библиотека нужна какая-то..

    • @dazzershell
      @dazzershell 3 роки тому

      Куб загружает в проект свою версию обертки над фри-ртос, но можно писать vTaskDelay, должно работать.

    • @arzamas1988
      @arzamas1988 3 роки тому

      @@space_games нужно включить интеграцию операционной системы FreeRTOS

    • @space_games
      @space_games 3 роки тому

      @@arzamas1988 ок, уже по-другому сделал

  • @solomonsergey7862
    @solomonsergey7862 3 роки тому

    Хорошо, но пары вещей не хватает. 1. Как переключиться на другой сектор? 2. Что делать, если надо перезаписать только часть данных в секторе? Я понимаю, что вопрос нубский, но и видео не для профи. Спасибо за понимание.

    • @VladimirMedintsev
      @VladimirMedintsev  3 роки тому +1

      1. Указать его адрес.
      2. Скопировать необходимое в память или другой сектор.

    • @solomonsergey7862
      @solomonsergey7862 3 роки тому

      @@VladimirMedintsev 1. да, я разобрался. У меня TM32F746. У него последние сектора просто огромные. Я не мог поверить, что перед записью 16 байт я должен стереть 128 килобайт. 2. Пишут что если один раз стер сектор, то в те места сектора, которые ещё не писал, можно писать. Не пробовали ничего такого?

    • @VladimirMedintsev
      @VladimirMedintsev  3 роки тому

      В смысле не пробовали ничего такого? Я все пробовал.

    • @solomonsergey7862
      @solomonsergey7862 3 роки тому

      @@VladimirMedintsev И как, получилось стереть сектор один раз и потом писать в разные места сектора не очищая его ещё раз? У меня не вышло.

    • @VladimirMedintsev
      @VladimirMedintsev  3 роки тому

      А у меня вышло и даже видео есть где я рассказываю о хранении лога именно по этому принципу.

  • @alexanderfox4678
    @alexanderfox4678 4 роки тому

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

    • @VladimirMedintsev
      @VladimirMedintsev  4 роки тому

      В прерывании определяйте от какого точно таймера пришло и с ним только и работайте.

  • @ibrag2012
    @ibrag2012 5 років тому +1

    А як не напоротися на сторінку із прошивкою?

    • @VladimirMedintsev
      @VladimirMedintsev  5 років тому +5

      Друже, я колись вчив українську мову. Але я не кажу українською. Мені якось на суржику простіше.

    • @ibrag2012
      @ibrag2012 5 років тому

      @@VladimirMedintsev та я російкою розумію тільки писати не вмію. Отже: наскільки зрозумів код програми в тому ж флеші, якщо його переписувати то можна переписати основне тіло (робочої) програми а як від цього захиститися не уявляю.

    • @VladimirMedintsev
      @VladimirMedintsev  5 років тому +2

      @@ibrag2012 После того, как вы поместили свою программу в память (flash) микроконтроллера и сделали все чтобы отдать готовое устройство заказчику вы можете воспользоваться утилитой CubeProgrammer и отключить интерфейс программирования и отладки. После этого программатор использовать уже не получится. И программу прочитать-изменить тоже. А значит ваше устройство в безопасности.

    • @anatoliinavrockiy8607
      @anatoliinavrockiy8607 5 років тому +3

      @@VladimirMedintsev он хотел сказать что раз пространство адресов прошивки и условного eeprom совпадает, то можно случайно попасть в место прошивки и затереть основную программу своими настройками. Я сам только перехожу с avr на stm32 и мне этот вопрос тоже интересен. Как правильно выбрать страницу памяти чтобы случайно не попасть на свой исполняемый код?

    • @VladimirMedintsev
      @VladimirMedintsev  5 років тому

      @@anatoliinavrockiy8607 Я отлично понял что он хотел спросить. Только у stm32 в отличии от avr памяти сильно больше. Выделите последний сектор под свою конфигурацию и пользуйтесь. Тут физически тяжело создать настолько большую программу чтобы она всю flash собой заняла. Ну а уж если параноя одолевать кого-нибудь будет, то можно воспользоваться командами линковщику и четко дать ему понять что сектор от 0хХХХХХХХХ и до 0хХХХХХХХ занимать нельзя и будете его свободно использовать. Просто это не относится непосредственно к теме данного видео.
      Не задумывались, например, почему никто не публикует в интернете полный код загрузчика под stm32? Просто к таким технологиям человек должен сам придти.