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

  Рет қаралды 20,337

Vladimir Medintsev

Vladimir Medintsev

Күн бұрын

Пікірлер
@АнтонБеляев-н9у
@АнтонБеляев-н9у 4 жыл бұрын
Здравствуйте, Владимир. Спасибо Вам огромное за то, что делитесь своим опытом в разработке ПО для STM32. Данное видео помогло мне структурировать в голове работу с конфигурацией и сохранением ее во FLASH микроконтроллера. Теперь программа для разрабатываемого устройства стала гораздо читабельнее, стало проще ее модифицировать в случае добавления новых параметров в конфигурацию. Всего Вам доброго.
@VladimirMedintsev
@VladimirMedintsev 4 жыл бұрын
И Вам за добрые слова спасибо.
@space_games
@space_games 3 жыл бұрын
спасибо, все работает, сделал себе генератор импульсов с автосохранением 😎
@raven8867
@raven8867 2 жыл бұрын
Спасибо Вам за полезную информацию !С Новым Годом!
@akovalev341
@akovalev341 3 жыл бұрын
Хороший пример, возьму на заметку.
@ЕвгенийСторожев-ч3т
@ЕвгенийСторожев-ч3т 6 жыл бұрын
Уточню 1:38: страниц 256. От 0 страницы и до 255 всего с нулевой 256 блоков.
@efimefimefim
@efimefimefim 5 жыл бұрын
У себя использую попеременное хранение настроек в двух секторах. Один сектор заполнился, записываю на второй, потом первый стираю и записываю туда. Так исключается возможность остаться без настроек при отключении питания в момент, когда началось стирание/запись.
@VladimirMedintsev
@VladimirMedintsev 5 жыл бұрын
Да это хороший вариант и не только потому, что делает резервную копию данных, но еще и потому, что продлевается жизнь flash.
@aleksandrkozlov9286
@aleksandrkozlov9286 6 жыл бұрын
Добрый вечер, Большое спасибо за оперативность! очень актуально! Надеюсь будет затронуты вопросы с сохранением структур с разношерстными параметрами(char,int,вложенные структуры) про упаковку структур , чтение после перегрузки из памяти с заполнением обратно этой структуры, и еще вопрос интересует про эмуляцию EEPROM. Грубо говоря имеется typedef struct{ int param1; char str1[128]; char str2[256]; uint32_t param4; }; Как мне ее записать всё в память, а после считать. Думаю , что просто делается, но пока никак. Заранее спасибо
@VladimirMedintsev
@VladimirMedintsev 6 жыл бұрын
Вообще-то паковать ничего не надо. Если вы объявляете структурную переменную то ее элементы уже лежат в памяти один за другим. После этого используете union и совмещаете вашу структуру в памяти с массивом который можете перенести во FLASH. Это не стоило того чтобы создавать видео. Просто удивлен был что вы не смогли этого сделать. Ну я не умничаю, просто это к микроконтроллерам не относится это язык СИ.
@aleksandrkozlov9286
@aleksandrkozlov9286 6 жыл бұрын
@@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 жыл бұрын
Если взять к примеру вашу структуру: typedef struct{ int param1; char str1[128]; char str2[256]; uint32_t param4; }; то в памяти все элементы структуры будут располагаться друг за другом. Разумеется в соответствии со своими размерами. Описанный мной способ позволяет абстрагироваться от этих размеров и прочего ненужного и сохраниться. Если и для сохранения и для чтения вы используете одну и ту же структуру данных то все будет работать. Могу одно сказать к микроконтроллерам это отношения не имеет а по СИ видео полный интернет. Хотя если честно я советовал бы книжку.
@aleksandrkozlov9286
@aleksandrkozlov9286 6 жыл бұрын
@@VladimirMedintsev Спасибо большое за видео!!! после просмотра стало яснее , из книг читаю Кернигана , но бывает вопросы вроде простые , но решение сразу на ум не приходит. Продолжайте в том же духе , на русско язычном ютубе всего 2-3 канала про stm32.
@VladimirMedintsev
@VladimirMedintsev 6 жыл бұрын
Я не знаю пока еще как скоро мне это надоест.
@dmitriibannikovasx
@dmitriibannikovasx 3 жыл бұрын
Когда кто-то говорил что AVR не проще, они просто другие... В авр для записи в ипром всего 1 функция с двумя параметрами (куда записывать и какие данные)
@VladimirMedintsev
@VladimirMedintsev 3 жыл бұрын
И о чем это говорит? Наверное о том, что в STM32 десятки различных чипов с разной организацией памяти и по этой причине некоторые функции выглядят непривычно. Но вы ведь можете и сами написать функцию в которой будет два параметра. И пожалуйста, будет все как раньше. Но вообще вы же поймите. Это я вот подписался и рекламирую STM, вы то их использовать не обязаны, вам же не платят.
@serggorod1423
@serggorod1423 2 жыл бұрын
Где было это видео 3 года...когда я тонул в примерах на указатели типа указатили на вид типа_флеш... обидно точто подписан 2мя устройствами... и нигде не всплвло.!!!! почему А?¿? Жаль что не для адептов садо_cmsis....
@NIKOLAY_PSHONIA
@NIKOLAY_PSHONIA 2 жыл бұрын
Владимир спасибо за труды. Вопрос прога занимает 24кб у STM32F4 флеша 512кб. посмотрел стлинком флеш память а там все разбросано. и немогу 16кб - один сектор найти - нужно впихивать в разные сектора по куску. Как то компилятору можно указать или что сделать что бы 16кб сектор не трогал ???
@AE075G
@AE075G Жыл бұрын
На счёт сектора в любом месте не подскажу, но полагаю, можно перенести адрес, с которого начинается прошивка чуть подальше от начала. Если нашли решение, напишите и мне, пожалуйста.
@АлександрСпицын-х1я
@АлександрСпицын-х1я 5 жыл бұрын
Спасибо! В цикле сравнения сделать бы break после первого несовпадения. И наверное можно не ставить таймаут после записи во флешу слова, там внутри HAL_FLASH_Program есть ожидание завершения последней операции с флешой.
@VladimirMedintsev
@VladimirMedintsev 5 жыл бұрын
Ну на самом деле это же код выдран из рабочего проекта и немного адаптирован для обьяснений. И отсутствие break это желание узнать какое количество байт конфигурации обновилось. Можно же обновлять конфигурацию только по достижении определенного процента изменений. А наличие HAL_Delay внесено с той же целью, затянуть процесс во времени и отдать больше времени на выполнение других задач. Есть там у нас просто одна прожорливая по времени задача. В любом случае это не меняет сути показанного.
@Ololoshize
@Ololoshize 3 жыл бұрын
@@VladimirMedintsev osDelay. :)
@serggorod1423
@serggorod1423 2 жыл бұрын
static....EraseInitStruct она вроде так глобальная переменная... 1)для чего мы ещё делаем ее всегда-существующей? 2)почему мы создаём ее не указателем на структуру с инициализацией адресом страницы памяти, а переменной_структуры в hip-е всегда занимающей место? 3)она ли используется как эталонная-сравнения из RAM vs Flash(другими словами,раз она уже отела ОЗУ, ни в ней ли хранятся все 2к данных ОЗУ)? ПС. спасибо за подробный ответ...может какие-то ответы и глупые на ваш взгляд...но только дурак не учится.
@serggorod1423
@serggorod1423 2 жыл бұрын
Глобальная переменная и Статик переменная по любому хранятся в куче, или глобальная объявленная в Мейн может попасть в начало стека?¿?
@ArtemKAD1
@ArtemKAD1 5 ай бұрын
Зачем искать ключ если у вас есть контрольная сумма? Сразу проверяйте целостность и если содержимое развалено восстанавливайте заводские значения.
@МихаилТиунов-с7д
@МихаилТиунов-с7д 3 жыл бұрын
1. Вопрос. Запись во FLASH у Вас производится с некоего начального адреса до КОНЦА СТРАНИЦЫ. А надо ли ? Все таки структура конфигурации явно короче 2K. 2. Запись производится в цикле while. При этом - если HAL_FLASH_Program перестанет возвращать HAL_OK - произойдет зависание т.к. l_Address перестанет увеличиваться. 3. Применение ключа не гарантирует проверку на сбой памяти - сбой может произойти в какой-то другой области. Надо бы контрольную сумму
@VladimirMedintsev
@VladimirMedintsev 3 жыл бұрын
Дык это не больше чем пример... На самом деле от этого алгоритма вообще давно убежали уже. Мы чутка изменили подход к хранению конфигураций и теперь их несколько.
@МихаилТиунов-с7д
@МихаилТиунов-с7д 3 жыл бұрын
@@VladimirMedintsev Да. Я почитал коментарии под видео и понял что зря задал свои вопросы...
@aleksandrzakutnyy4450
@aleksandrzakutnyy4450 6 жыл бұрын
спасибо. а есть документация о создании встроенной базы данных на флэше?
@VladimirMedintsev
@VladimirMedintsev 6 жыл бұрын
Скорее всего я просто не понял ваш вопрос. Но вот сложности что-либо хранить я не вижу совсем. Хоть файловую систему хоть базу данных. Все упирается только в скорость и количество циклов записи.
@aleksandrzakutnyy4450
@aleksandrzakutnyy4450 6 жыл бұрын
я имею ввиду может есть рекомендации от st по созданию субд на флэш для микроконтроллеров как раз с учетом ограничения циклов записи с индексацией. или других источников
@VladimirMedintsev
@VladimirMedintsev 6 жыл бұрын
@@aleksandrzakutnyy4450 Хорошо, давайте по другому вопрос поставим. Как вы себе мыслите два понятия СУБД (систему управления базами данных) и микроконтроллер в одном предложении. Я именно это не понял. Если имеется в виду хранение записей, то пример я показал. Если их индексацию, то это не сложно сделать и алгоритмы известны. А вот СУБД я еще раз не понимаю. Пожалуйста, если не сложно, просто приведите пример задачи которую вы хотите решить.
@ZYagudin
@ZYagudin 3 жыл бұрын
Если мы записываем считанные данные в data32, то как мы проверяем в условии MagicNum? Данные автоматически переносятся по атрибутам?
@VladimirMedintsev
@VladimirMedintsev 3 жыл бұрын
Это видимо вопрос учебнику языка Си.
@ZYagudin
@ZYagudin 3 жыл бұрын
@@VladimirMedintsev ладно, спасибо
@led-avto
@led-avto Жыл бұрын
Подскажите, как организовать обновление прошивки, через программу виндовс? Хочу сделать ПО в windows forms для отправки настроек и обновления прошивки через vcp. Есть ли у вас примеры как это реализовать?
@VladimirMedintsev
@VladimirMedintsev Жыл бұрын
Достаточно просто. Напишите свой загрузчик в микроконтроллер и по USB обновляйтесь. Вы же можете как Mass storage устройство в Windows показать.
@led-avto
@led-avto Жыл бұрын
@@VladimirMedintsev есть видео по обновлению через usb и по? Не пойму как читать прошивку, которая лежит на хдд. Или это по делает, и оно же отправляет данные по vcp, а загрузчик уже пишет во флэшь? а шифрование? Ваше видео не доступно на эту тему?
@VladimirMedintsev
@VladimirMedintsev Жыл бұрын
@serb8405 С шифрованием еще проще. На это можно использовать готовые функции.
@led-avto
@led-avto Жыл бұрын
@@VladimirMedintsev дайте пример пожалуйста... или видосик запишите, думаю полезно многим...
@VladimirMedintsev
@VladimirMedintsev Жыл бұрын
@@led-avto Да вроде же есть на моем канале про все это ролики и про шифрование и про загрузчик и про передачу управления. Все снято и находится на этом канале.
@ArthurIslamRU
@ArthurIslamRU 6 жыл бұрын
Здравствуйте, Спасибо. А почему вы не используете в коде инкремент переменной на 1 как ++ Или это только для наглядности новичкам?
@VladimirMedintsev
@VladimirMedintsev 6 жыл бұрын
Я не профессиональный программист и реально так пишу. Мне самому так понятнее, тем более компилятор потом оптимизирует на свой вкус.
@spookee5301
@spookee5301 5 жыл бұрын
Владимир, добрый день, запись во флеш останавливает выполнение остальной программы? Ранее я пытался сохранять во флеш и наблюдал такой эффект (возможно делал что-то принципиально неправильно). Присутствует ли он у вас? upd: FreeRTOS использовал, сохраняет одна задача, останавливаются все
@VladimirMedintsev
@VladimirMedintsev 5 жыл бұрын
Операция записи во flash память сама по себе длительная. Разумеется если вы будете записывать 2-3 килобайта то эта операция займет какое-то время. Однако сейчас линейным программированием уже никто и не занимается. А при использовании freertos просто выносите запись в отдельную низкоприоритетную задачу и не будет никакой задержки. Если использовали freertos и все тормозилось, значит приоритеты настроены не правильно. Проверять приоритеты и пройтись по коду чтобы нигде не было hal_delay.
@Илья-м3с
@Илья-м3с 5 жыл бұрын
Владимир, добрый день, очень полезное видео, можно ли выложить проект?
@VladimirMedintsev
@VladimirMedintsev 5 жыл бұрын
Скажите честно зачем вам этот проект? Там ведь 5 строчек кода. Вы же сами можете их набрать. Более того процессор наверняка отличается. Т.е. Вам придется мои библиотеки выпиливать а свои вставлять это дольше.
@Илья-м3с
@Илья-м3с 5 жыл бұрын
Когда научусь заполнять структуры будет просто, но сейчас проще попрвить чужой проект.
@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 жыл бұрын
Добрый день. Я до недавнего времени тоже использовал внешний 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. Да это очень удобно. При старте смотреть где правильная контрольная сумма ту конфигурацию и читать. И удобно и надежно.
@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
@arakeldesign
@arakeldesign 5 жыл бұрын
Владимир, подскажите пожалуйста, на сколько код под STM32 больше чем код под AVR, если не использовать HAL, а писать на CMSIS?
@VladimirMedintsev
@VladimirMedintsev 5 жыл бұрын
По моему мнению он меньше процентов на 25. Это за счет более оптимальных инструкций. Ну и самое главное. В stm нет такой проблемы как в avr с размером памяти ее в разы больше. Код более оптимальный. Именно по этой причине я и говорю что архитектура avr безнадежно устарела.
@arakeldesign
@arakeldesign 5 жыл бұрын
Vladimir Medintsev понял вас, спасибо. Просто сколько я встречал информации везде писали что на STM32 код занимает больше места. Но я так понимаю это все при использовании HAL
@VladimirMedintsev
@VladimirMedintsev 5 жыл бұрын
@@arakeldesign Код на процессорах ARM более компактный. В большей степени это зависит не от используемых библиотек типа CMSIS или HAL, а от того с какими опциями вы компилируете и насколько аккуратный код пишете. В любом случае вопрос не актуален т.к. можно выбрать процессор хоть с мегабайтом памяти.
@arakeldesign
@arakeldesign 5 жыл бұрын
Vladimir Medintsev для меня актуален, так как нужно подобрать контролер маленького размера и в паябелельном корпусе.
@VladimirMedintsev
@VladimirMedintsev 5 жыл бұрын
Ну это реально не проблема. Я не знаю другие ваши требования к процессору, но вот к примеру: STM32F303CCT - 256 kB FLASH и 48 kB RAM - 8x8 mm корпус - примерно 200 рублей STM32L433KCU - 256 kB FLASH и 64 kB RAM - 5x5 mm корпус - примерно 380 рублей паяются элементарно феном без каких-либо проблем. Я буду более чем удивлен если вам хоть на 40% удастся загрузить их. И что-то мне подсказывает что такие мощные вам вообще не нужны. Т.к. если переходить с AVR, то можно слегка обалдеть от доступных мощностей.
@ZYagudin
@ZYagudin 3 жыл бұрын
Почему мы каждый раз увеличиваем адрес на 4? Почему не на 1?
@VladimirMedintsev
@VladimirMedintsev 3 жыл бұрын
Так микроконтроллер же 32 битный...
@ZYagudin
@ZYagudin 3 жыл бұрын
@@VladimirMedintsev не совсем понимаю, как высчитывать смещение
@vlad3c
@vlad3c 3 жыл бұрын
@@ZYagudin если в кратце, то это особенность 32 битной архитектуры. адресация памяти идёт побайтно, т.е. каждый байт имеет свой адрес 0х0,1,2,3..., но ширина команды в мк 32 бита( thumb не берём в расчет) и на эту ширину выровнены адреса. 32 бита это 4 байта или же слово, величина смещения... для более глубокого понимания вопроса советую почитать учебник "цифровая схемотехника и архитектура компьютера" там детально расстраиваются вопросы как работают процессоры, мк, как организована память и т.д. (лучшее что я читал по изучению мк)
@ZYagudin
@ZYagudin 3 жыл бұрын
@@vlad3c Спасибо большое
@alexanderfox4678
@alexanderfox4678 3 жыл бұрын
Здравствуйте, может кто подскажет, использую микроконтроллер 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 3 жыл бұрын
В прерывании определяйте от какого точно таймера пришло и с ним только и работайте.
@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 ок, уже по-другому сделал
@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 жыл бұрын
лучше уж выкладывать видео как обычно. эти "премьеры" только сбивают с толку
@VladimirMedintsev
@VladimirMedintsev 6 жыл бұрын
Зато увеличивают количество подписчиков и просмотров.
@beerbear9182
@beerbear9182 6 жыл бұрын
@@VladimirMedintsev ну, ежели так, потерпим
@VladimirMedintsev
@VladimirMedintsev 6 жыл бұрын
Спасибо вам огромное. Я не долго буду с этой функцией играться.
@00ASpid00
@00ASpid00 6 жыл бұрын
Я уже обрадовался, что сейчас интересное услышу, ан нет, только завтра.
@solomonsergey7862
@solomonsergey7862 3 жыл бұрын
Хорошо, но пары вещей не хватает. 1. Как переключиться на другой сектор? 2. Что делать, если надо перезаписать только часть данных в секторе? Я понимаю, что вопрос нубский, но и видео не для профи. Спасибо за понимание.
@VladimirMedintsev
@VladimirMedintsev 3 жыл бұрын
1. Указать его адрес. 2. Скопировать необходимое в память или другой сектор.
@solomonsergey7862
@solomonsergey7862 3 жыл бұрын
@@VladimirMedintsev 1. да, я разобрался. У меня TM32F746. У него последние сектора просто огромные. Я не мог поверить, что перед записью 16 байт я должен стереть 128 килобайт. 2. Пишут что если один раз стер сектор, то в те места сектора, которые ещё не писал, можно писать. Не пробовали ничего такого?
@VladimirMedintsev
@VladimirMedintsev 3 жыл бұрын
В смысле не пробовали ничего такого? Я все пробовал.
@solomonsergey7862
@solomonsergey7862 3 жыл бұрын
@@VladimirMedintsev И как, получилось стереть сектор один раз и потом писать в разные места сектора не очищая его ещё раз? У меня не вышло.
@VladimirMedintsev
@VladimirMedintsev 3 жыл бұрын
А у меня вышло и даже видео есть где я рассказываю о хранении лога именно по этому принципу.
@user-tr3kg3ei4p
@user-tr3kg3ei4p 3 жыл бұрын
Автор, вы в курсе про padding в структурах ? если в структуре есть поле не кратное ячейкам памяти (по даташиту пол слова, слово и двойное слово, а слово - 32 бита), то данное поле структуры (char array[2048-8]) будет дополнено пустыми байтами для кратности машинному слову. Либо тут компилятор за вас это решает и делает поле меньше, чем 2040 байт, либо вы ещё не писали ничего в последние байты вашей структуры и не словили unexpected behaviour.
@VladimirMedintsev
@VladimirMedintsev 3 жыл бұрын
Я в курсе. Не совсем понятно как это должно влиять на рассказанное в видео.
@user-tr3kg3ei4p
@user-tr3kg3ei4p 3 жыл бұрын
@@VladimirMedintsev видео справочное по хранению в памяти. А мне как-то пришлось записывать много данных в память и с этой особенностью структур столкнулся лично. Плюс ещё хорошо бы учитывать номер страницы, на которой считается количество сделанных записей. Ведь в stm32 количество гарантированных записей всего 10 тысяч и страница, которую уже много раз писали, не должна использоваться больше. В вашем примере эта особенность уберегла бы новичков от возможных проблем. Вас хвалят и благодарят за пример. И мне у вас есть что посмотреть. Спасибо за контент вам. Мне лично лень делать труд по записи и монтажу видео. Но я хочу, чтобы было доступно больше полезных советов для разработчиков встраиваемой электроники.
@ibrag2012
@ibrag2012 5 жыл бұрын
А як не напоротися на сторінку із прошивкою?
@VladimirMedintsev
@VladimirMedintsev 5 жыл бұрын
Друже, я колись вчив українську мову. Але я не кажу українською. Мені якось на суржику простіше.
@ibrag2012
@ibrag2012 5 жыл бұрын
@@VladimirMedintsev та я російкою розумію тільки писати не вмію. Отже: наскільки зрозумів код програми в тому ж флеші, якщо його переписувати то можна переписати основне тіло (робочої) програми а як від цього захиститися не уявляю.
@VladimirMedintsev
@VladimirMedintsev 5 жыл бұрын
@@ibrag2012 После того, как вы поместили свою программу в память (flash) микроконтроллера и сделали все чтобы отдать готовое устройство заказчику вы можете воспользоваться утилитой CubeProgrammer и отключить интерфейс программирования и отладки. После этого программатор использовать уже не получится. И программу прочитать-изменить тоже. А значит ваше устройство в безопасности.
@anatoliinavrockiy8607
@anatoliinavrockiy8607 5 жыл бұрын
@@VladimirMedintsev он хотел сказать что раз пространство адресов прошивки и условного eeprom совпадает, то можно случайно попасть в место прошивки и затереть основную программу своими настройками. Я сам только перехожу с avr на stm32 и мне этот вопрос тоже интересен. Как правильно выбрать страницу памяти чтобы случайно не попасть на свой исполняемый код?
@VladimirMedintsev
@VladimirMedintsev 5 жыл бұрын
@@anatoliinavrockiy8607 Я отлично понял что он хотел спросить. Только у stm32 в отличии от avr памяти сильно больше. Выделите последний сектор под свою конфигурацию и пользуйтесь. Тут физически тяжело создать настолько большую программу чтобы она всю flash собой заняла. Ну а уж если параноя одолевать кого-нибудь будет, то можно воспользоваться командами линковщику и четко дать ему понять что сектор от 0хХХХХХХХХ и до 0хХХХХХХХ занимать нельзя и будете его свободно использовать. Просто это не относится непосредственно к теме данного видео. Не задумывались, например, почему никто не публикует в интернете полный код загрузчика под stm32? Просто к таким технологиям человек должен сам придти.
Chain Game Strong ⛓️
00:21
Anwar Jibawi
Рет қаралды 41 МЛН
Quando eu quero Sushi (sem desperdiçar) 🍣
00:26
Los Wagners
Рет қаралды 15 МЛН
The Best Band 😅 #toshleh #viralshort
00:11
Toshleh
Рет қаралды 22 МЛН
STM32 + W25Q
1:05:11
Flexo Alex
Рет қаралды 10 М.
Адресация памяти STM32
36:29
it - самородок
Рет қаралды 1,8 М.