Наверное хочу странного, но голову уже сломал.. Есть контроллер stm32F401RE - 512КБ флеши, которые порезаны на сегменты так: 4*16кб, 64кб, 3*128кб. И тут внезапно понадобилось сохранять некоторые параметры. Конечно первое что приходит в голову - сохранять во внутренней флеши по кольцу в паре секторов, неактивный сектор стирать, Ну, все знают. И обычно это делается в последних страницах флеши. НО! у этого контроллера последние страницы - по 128К.. Жаба душит отдавать под несколько не особо часто изменяемых параметров (8байт) аж половину флеши.. А если первые сектора отдать под еепром, но тогда надо каким то образом сказать компилятору что у него жизнь начинается с 0х08010000. Но как? в линкер-скрипте прописал что флеш начинается с 0х0801000 FLASH (rx) : ORIGIN = 0x08010000, LENGTH = 512K-64K , в system_stm32f4xx.c прописал VECT_TAB_OFFSET 0x10000. И... И тишина. Что еще нужно сделать? Или нельзя такое провернуть? Плата разведена, некоторое количество уже изготовлено -> прилепить внешнюю микруху еепром нельзя.
Комментарии: 24
Firelander
в первых 8 байтах флеши должен лежать reset vector и msp. Можешь ручками их туда записать, просто первые 8 байт с адреса 0x08010000 записать в адрес 0x08000000
Anonim
А можно флеш разбить на два сегмента - 16К с 0x80000000, потом дырка 3*16К для "еепром", и потом вся остальная флеш? и как это объяснить линкеру? или подавится таким извратом?
Firelander
теоретически можно. Но подобным извратом не занимался, ничего сказать не могу
Anonim
а как хоть примерно можно попробовать линкеру это рассказать? хоть направление как их объединить хотя наверное можно объявить массив 48к прибитый по адресу прямо в исходнике.. вроде такое можно провернуть, кажется..
Firelander
да, обычно можно. Компилерозависимо
Nikolay
попробуйте поискать как настраивается линкер для работы с bootloader'ом.
Hardegor
можно писать 8 байт каждый раз в новое место, когда кончится 128кбайт( или сколько выделишь) все стереть и заново писать...
Firelander
да, тоже хотел предложить. Я бы сказал что это лучший вариант чем мучиться с переносом начала прошивки в дальние области памяти
Maxim
Ресет-вектор в итоговом бинарнике передвинулся в итоге?
Serg
А как понять, где это новое место? Если есть батарейка RTC, то можно использовать RTC backup registers
Nikolay
Переменная-указатель, которая и хранит позицию нового места. Вот только ее тоже придется каждый раз переписывать :)
Anonim
батарейки нет.
Firelander
при включении сканировать память и находить последнюю записанную ячейку, сохранять позицию в переменную и дальше писать
Anonim
начальным поиском. например двоичным. Я, например, знаю, что у меня пишется вся структура, и последнее слово не может быть FF. Вот с этим шагом и ищем. хотя жалкие 16кб можно и вообще в лоб for (i=0; i<16384; i++)
Hardegor
Добавить контрольную сумму в конце. и проверять. Или просто прочитать 0xFFFFFFFFF....
Maxim
Читать 0xFF не поможет, если рубанут питание при записи. Так что сумма нужна
Michael
Подскажите плиз, с электроникой особо не связан. Можно ли бытовыми средствами или компонентами зарядить и разрядить аккумулятор от блютус-гарнитуры (3.7v) 350926.После замены новый держит чуть лучше, но все равно гарнитура отключается не разрядившись до конца (на 20-30 процентах вместо 50). В самой гарнитуре она заряжается током в 5-6 миллиампер (показания USB-тестера), я заказал ещё 3, и хотелось бы не запаивая их проверить на столе - зарядить-разрядить несколько раз и померять ёмкость. То есть, зарядить обычным "кубиком" ограничив ток, и разрядить например резистором за минут 30, наблюдая показания мультиметра. На самом аккумуляторе есть небольшая логика (быть может это котроллер батареи), и возможно на него можно подать напряжения напрямую, но экспериментировать не стал. Заранее спасибо за помощь. Аккумулятор вот такой: https://www.aliexpress.com/item/33021686928.html?spm=a2g0s.9042311.0.0.27424c4dwAdEZJ
Max
Я в этом не эксперт, но что-то немного знаю. Про "разрядить" Вы сами ответили - резистором. Можно с разными резисторами провести эксперименты, получив кривую разряда для отдельного значения тока разряда. С зарядом все сложнее, но я бы отталкивался от того, что пишут в даташите на батарею: там должна быть charge curve. Или по тому, как гарнитура заряжает. В крайнем случае - посмотреть какая кривая заряда в Гугле для LiPo. Так же по параметрам батареи можно купить дешёвый модуль заряда, который на всякие арудино клеят, он сам разберётся с зарядом. В теории можно и потенциометром ограничивать ток заряда, и подкручивать в процессе, пока мультиметр не покажет нужное напряжение и нулевой ток
Anonim
У меня последнее слово структуры - как раз CRC. И сканирование по ней - просто первый этап. Потом при чтении она проверяется и если эта ячейка битая - читается предыдущая.
Hardegor
Однако количество байт известно :) Так то да, еще делают преамбулу, где пишут количество байт в сохраняемых константах - вдруг завтра добавите 2 дополнительных байта? Короче, всё как при передачи данных по каналам связи :)
Serg
// Первые 48K - boot __disable_irq(); NVIC_SetVectorTable(0x08000000, 0xC000); __enable_irq(); Тоже вот так начинал настройки хранить. В первых секторах флеша МК. Пока настройки не разрослись. Теперь отдельная SPI флешка, на ней littlefs и файлы настроек в JSON
Anonim
Это все конечно хорошо, но железка уже изготовлена, добавить флешку нельзя.
Serg
Выше написал, как сместить начало прошивки
Anonim
телега глюкнула, и получилось цитирование не тому. да и как можно заметить чуть выше, я в общем-то примерно так и сделал..