38 / 31 / 9
Регистрация: 29.03.2019
Сообщений: 345
|
||||||||||||||||||||||||||
1 | ||||||||||||||||||||||||||
FLASH память (внешняя)13.06.2019, 17:48. Показов 61527. Ответов 19
Метки stm32 w25q16 (Все метки)
Товарищи! Подскажите пожалуйста..
Хочу приконнектить внешнюю память winbond w25q16 к микроконтроллеру stm32f103c8t6 используя HAL если отправляю команды для получения ID устройства, то он мне все присылает, то есть (0xef и 0x14) как указано в даташите.. когда работаю с данными сначала всегда снимаю защиту с микросхемы
но когда пытаюсь записать данные то ничего в буфере не меняется...
0
|
13.06.2019, 17:48 | |
Ответы с готовыми решениями:
19
stm32+ внешняя память(flash, fram, eeprom) Внешняя память на 256 мб для STM32 Flash память контроллера Как разделить FLASH и RAM память |
Почетный модератор
11525 / 4320 / 448
Регистрация: 12.06.2008
Сообщений: 12,412
|
|
14.06.2019, 00:09 | 2 |
Сообщение было отмечено northcitizen как решение
Решение
После любой записи или очистки нужно вычитывать статусный регистр (команда 0x5) и проверять нулевой бит (busy). Если этот бит равен 1, то надо проверять снова... и так до тех пор, пока он не упадёт в ноль. Использовать фиксированную задержку ненадёжно. Судя по даташиту, chip erase может исполняться до 1 секунды. А в функции Flash_Write_Data() у вас даже задержки нет.
1
|
38 / 31 / 9
Регистрация: 29.03.2019
Сообщений: 345
|
|
14.06.2019, 11:24 [ТС] | 3 |
Humanoid, Спасибо, Вам! Работает! Я счастлив!
0
|
38 / 31 / 9
Регистрация: 29.03.2019
Сообщений: 345
|
|
16.06.2019, 18:10 [ТС] | 4 |
Humanoid, подскажите, пожалуйста, как сделать запись логов на флешку. Думаю, что неправильный подход у меня.. Смотрите, вот, например, я хочу записать какие то параметры(данные) во флеш память. С помощью кода выше я записываю данные в формате hex. А, потом когда надо будет, просто вытаскиваю и из hex преобразовываю в txt. Это типа парсер еще нужен, чтобы разделить все красиво?
0
|
Почетный модератор
11525 / 4320 / 448
Регистрация: 12.06.2008
Сообщений: 12,412
|
|
16.06.2019, 20:43 | 5 |
Hex - это всего лишь способ представления числа. Например, латинская "а", шестнадцатеричное 0x61 или десятичное 97 - это всё одно и тоже число. И почему сразу не записывать текст?
Если я неправильно вас понял, то покажите, как именно вы записываете лог и в каком формате.
1
|
38 / 31 / 9
Регистрация: 29.03.2019
Сообщений: 345
|
|
16.06.2019, 21:19 [ТС] | 6 |
Humanoid, Спасибо за ответ! Только я еще ничего не записал... Зато я знаю, что буду записывать. Я планирую взять данные от GPS приемника, и записать во внешний флеш(только координаты). Данные приходят и я через UART их принимаю. Выделяю в принятых сообщениях координаты и тут должен отправить их во флеш. С Вашего ответа, я понял, что можно отправить данные, например, используя printf()(данные мне то приходят в текстовом виде с приемника согласно протоколу NMEA). В конечном итоге мне нужен файл, который будет содержать данные координат в текстовом виде.
0
|
Почетный модератор
11525 / 4320 / 448
Регистрация: 12.06.2008
Сообщений: 12,412
|
||||||
17.06.2019, 23:35 | 7 | |||||
Сообщение было отмечено northcitizen как решение
Решение
Тоже задумываю похожий проект. Хочу сделать трекер для велосипеда, что бы сохранять маршрут, по которому ездил. А потом дома по USB прочитаю этот список сохранённых координат и подзаряжу аккумулятор.
Скорее всего, буду записывать так: 1. Объявлю структуру, в которой будет хранится координата. Скорее всего, это будет метка времени типа uint32_t и пара координат типа double. Возможно, пересмотрю, что бы размер был степенью двойки (например, 32 байта). Например, можно добавить качество сигнала и т.п. 2. Переменная будет представлять собой массив таких структур. 3. Координаты буду накапливать в памяти, пока не наберётся данных на 256 байт (это размер страницы для W25Q64, которую я использую). 4. Как только накопилось 256 байт, то сохраняю их во флешку и отправляю процессор в спячку до того, как придут следующие координаты. Например, так:
1
|
38 / 31 / 9
Регистрация: 29.03.2019
Сообщений: 345
|
|
21.06.2019, 15:26 [ТС] | 8 |
Humanoid, Кстати, есть еще одна флешка 25Q64FV. Решил завести ее на Миландр 1986BE94T. Завелась(по крайней мере получил ID производителя и микросхемы). Так, что обращайтесь, если нужно
Добавлено через 1 час 18 минут В принципе допилил. Данные записываются. Читаются. Отличие 25Q64FV от 25Q16, то что в 25Q16 не использовал ResetEnable = 0x66 и сам Reset = 0x99.
0
|
38 / 31 / 9
Регистрация: 29.03.2019
Сообщений: 345
|
||||||
29.06.2019, 20:25 [ТС] | 9 | |||||
Получается, вы записываете по странице? а как мне сделать если у меня функция записи такая
И я этот адрес могу увеличивать до размеров флеш памяти?
0
|
Почетный модератор
11525 / 4320 / 448
Регистрация: 12.06.2008
Сообщений: 12,412
|
|
30.06.2019, 01:46 | 11 |
Нет, на 256. Адрес указывается в байтах.
И у вас аргумент length (который с опечаткой - все последние буквы перепутаны местами) имеет тип uint8_t... число 256 этой функции передать не получится. Тоже думал на счёт программной кнопки включения/выключения, но решил не заморачиваться. Потерять 8 секунд - это не проблема. Плату уже развёл для механического выключателя и переделывать теперь лень
1
|
38 / 31 / 9
Регистрация: 29.03.2019
Сообщений: 345
|
|
01.07.2019, 10:09 [ТС] | 12 |
Humanoid,
А, как вы переводите процессор в режим сна? Если мы не переведем его в сон, то можем записать незаполненный буфер?
0
|
Почетный модератор
11525 / 4320 / 448
Регистрация: 12.06.2008
Сообщений: 12,412
|
|
01.07.2019, 11:10 | 13 |
Сообщение было отмечено northcitizen как решение
Решение
Самое простое - это ARM-инструкция WFI, которая отключает процессор до тех пор, пока не придёт какое-нибудь прерывание. При этом энергопотребление значительно снижается. В качестве прерывания для пробуждения можно использовать сигнал от навигационного модуля, который раз в секунду даёт импульс. Такой сигнал есть у многих навигационных модулей. Но инструкция WFI отправляет в спячку только процессор, а остальная периферия продолжает работать. Но у STM32L151 (я их буду использовать) есть ещё более экономичные режимы сна, когда весь микроконтроллер почти ничего не потребляет. А вообще спячка нужна, что бы уменьшить энергопотребление и продлить время работы от батарейки.
Нет. Просто устройство не знает о том, что мы вот-вот щёлкнем выключатель и выключим питание. Такая проблема всегда есть при использовании кеширования. Например, если вы работаете с компьютером, а потом вдруг выдернули вилку из розетки и компьютер выключился. В этом случае вы так же потеряете последние данные, которые операционная система держала в оперативной памяти и ещё не успела сохранить на диск. Варианта два: 1. Не накапливать данные в буфере, а сразу сохранять их на флешку по мере поступления. Я не хочу этого делать, так как планирую держать флешку в выключенном состоянии как можно дольше для экономии заряда аккумулятора. 2. Использовать программную кнопку выключения (как предлагал Rius). В этом случае когда мы нажимаем на кнопку выключения, то подаём сигнал на микроконтроллер, а тот уже сохраняет все данные на флешку и подаёт сигнал на транзистор, что бы выключить питание самому себе. По такому же принципу работают современные компьютеры. 3. Смириться с тем, что несколько последних записей во время выключения питания будут потеряны. Я для себя выбрал этот вариант.
1
|
38 / 31 / 9
Регистрация: 29.03.2019
Сообщений: 345
|
|||||||||||||||||||||
05.07.2019, 16:33 [ТС] | 14 | ||||||||||||||||||||
Humanoid, Подскажите, пожалуйста, что делаю не так..
Пишу функцию записи данных во флеш память так(как вы показали):
Хотя структуру сделал __packed Добавлено через 56 минут структуру GPSFixData тоже сделал __packed.
пишу по байту Добавлено через 38 минут _SayHello, Не посмотрите, если найдется несколько минут..?
0
|
Почетный модератор
11525 / 4320 / 448
Регистрация: 12.06.2008
Сообщений: 12,412
|
|||||||||||
05.07.2019, 19:04 | 15 | ||||||||||
Кажется, вы тут цикл забыли сделать. Сейчас вы только один байт записываете. А переменную p увеличиваете неограниченно. Скорее всего, поэтому она и пишет всю память подряд, так как не ограничена размером массива ts. Вообще, что такое p? Наверное, нужно:
1
|
38 / 31 / 9
Регистрация: 29.03.2019
Сообщений: 345
|
||||||
05.07.2019, 19:30 [ТС] | 16 | |||||
С помощью p я иду по адресу флеш памяти. Это сделано для тестовго режима. В конечном итоге, я сделаю, чтобы переменная p ограничивалась размером флеш памяти
Спасибо вам! Я исправил! теперь данные обновляются каждую секунду(но почему, то иногда быстрее...)
0
|
38 / 31 / 9
Регистрация: 29.03.2019
Сообщений: 345
|
|||||||||||
13.07.2019, 16:40 [ТС] | 17 | ||||||||||
Humanoid, Из за чего может быть, такое, что при записи структуры через
Структура так выглядит:
0
|
38 / 31 / 9
Регистрация: 29.03.2019
Сообщений: 345
|
|
13.07.2019, 18:29 [ТС] | 19 |
Спасибо вам!!!!!
Добавлено через 49 минут Humanoid, А, если у нас координата вида FPSFixData.Latitude = 03259.498, чтобы ее привести к виду 32.991633 (59.498/60= 0.991633..) я должен взять из переменной FPSFixData.Latitude элементы с третего по последний преобразовать в int и /60?? Или это не адекватно?
0
|
38 / 31 / 9
Регистрация: 29.03.2019
Сообщений: 345
|
||||||||||||||||
14.07.2019, 19:40 [ТС] | 20 | |||||||||||||||
вот так можно преобразовать из nmea в градусы. У меня получилось.
Humanoid, но возникла проблема. Теперь float не записать адекватно в
160618 ШлoB F”тA с этим пока не знаю, что делать... Добавлено через 10 минут надо, как то побайтно, что ли передавать
0
|
14.07.2019, 19:40 | |
14.07.2019, 19:40 | |
Помогаю со студенческими работами здесь
20
Внешняя память PIC: как нарастить внутреннюю память данных? Внешняя память программ Внешняя память данных. Внешняя оперативная память Внешняя память для AVR? Flash память Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |