Да это хорошо )
Шаг сделал в перёд (за месяц) и снова тупик..
Считывать несколько байт с SD карты получается. Сохранение происходит в буфере (readBuff), который располагается в оперативной памяти МК:
f_read(&MyFile, readBuff, sizeof(readBuff)-1, (UINT *)&bytesRead); //
А если необходимо прочитать и сохранить объём например 1 мегабайт ? Это несколько секторов (например по 512) и оперативки не хватит .. Как увеличивать сектора не понимаю.. И так понял, придётся переписывать информацию по частям, с SD карты в буфер в оперативно памяти МК. С помощью функции f_read нельзя указывать адрес SDRAM (честно говоря это выше "моего понимания"..., тут надо знать "основы" ) )
Не нашёл примеров с считыванием и сохранением больших объёмов данных (с SD карты), сохранять в конечном случае нужно в буфере SDRAM.
Доходит очень медленно, до меня..
Как пишут, при считывании большого объёма команду "f_lseek" использовать не обязательно. Там "само" всё подсчитывается )
Считывать получается. Вопрос в другом. Задача: вывести картинку в формате *bmp или сохранённый массив на экран lsd. Данные картинки находятся в виде (при открытии записанного на sd карту файла с расширением *txt):
0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x20, 0x00,
0x00, 0x00, 0x08, 0x61, итд...
При считывании с карты памяти, например значения 0x00 - получаем 4 значения (48 120 48 48 в asci символах). А нужно одно значение (и наверное нулевое ))
Я чего то не понимаю.. При выводе этой же картинки из оперативной памяти всё прекрасно работало (запятые и одинарные промежутки между значениями я отфильтровывал).
Что я делаю не так и чего мне нужно сделать - не могу понять ..
Указываем от куда читать и в цикле читаем страницы:while (SD_DataSize > cur_read_Id){cur_read_byte += 512;sd_1 = f_lseek(&MyFile, cur_read_byte); // указатель на начало адреса чтения, с которого// начинаем читатьsd_1 = f_read(&MyFile, readBuff, 512, (UINT *)&bytesRead); ////memcpy((void*)(ext_sdram_lsd_buffer_3 + cur_read_byte), readBuff, 512);}Вроде так
Тут можно тогда в ext_sdram_lsd_buffer_3 сразу читать.
Доходит очень медленно, до меня..
Как пишут, при считывании большого объёма команду "f_lseek" использовать не обязательно. Там "само" всё подсчитывается )
Считывать получается. Вопрос в другом. Задача: вывести картинку в формате *bmp или сохранённый массив на экран lsd. Данные картинки находятся в виде (при открытии записанного на sd карту файла с расширением *txt):
0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x20, 0x00,
0x00, 0x00, 0x08, 0x61, итд...При считывании с карты памяти, например значения 0x00 - получаем 4 значения (48 120 48 48 в asci символах). А нужно одно значение (и наверное нулевое ))
Я чего то не понимаю.. При выводе этой же картинки из оперативной памяти всё прекрасно работало (запятые и одинарные промежутки между значениями я отфильтровывал).
Что я делаю не так и чего мне нужно сделать - не могу понять ..
Ну да, все логично, считываются ASCII символы, соответствующие тексту. Можно, конечно, вручную конвертировать... но лучше сразу в бинарном виде хранить.
Да, так и сделал, Спасибо !
С FAT.. - даже и знал чего это такое, главное понять как это устроено ) Когда на компе тыкаешь - открыть картинку, начинаешь понимать сколько в этот один "тык" труда вложено !
По поводу своей задачи с выводом картинки на 7" экран (stm32h7iit6) задачу решил. Фото конвертировал в *jpg в обычном фотошопе, сохранил на sd. Частота вывода (кадров) получилась более 10 Гц (потом измеряю).
Фото нужно для "подложки" выводимой информации, так гораздо красивее получается )
По поводу вывода на экран, я так понял - главное установить частоты тактирования SDRAM и LTDS. При определённых частотах работает идеально (иначе полосы на экране). И буферы в SDRAM хранить как рекомендовано в разных банках с одинаковым смещением от начала. Используемые буферы - 3 штуки. Один для хранения "подложки" (фото), два других для перерисовки и вывода на экран (поочерёдный вывод, один выводим, другой рисуем).
Добрый день!
Не стал создавать отдельную тему, авось ответят и тут...
Недавно увлёкся программированием stm32 микроконтроллеров и назрело несколько вопросов:
1) Есть ли разница для компилятора: uint32_t Temp = 0; и uint32_t Temp = 0x00000000;
2) Возможно ли складывать, либо вычитать числа в десятичной системе счисления и шестнадцатеричной?
Например: uint32_t Temp = 0x0000ffff; for(uint8_t i = 0; i < 8; i++){Temp += i;}
Компилятор на такие конструкции не ругается, да и программа работает... Тут, я так думаю, вопрос эстетики...
Спасибо за ответ!
P.S. Переменная Temp обязательно должна быть в шестнадцатеричной системе счисления...
@volt_mk Добрый день!
Без разницы, по сути это просто форма записи, значения, например, 0x55 и 85 идентичны.
Доброго времени суток. Я знакомлюсь с stm32, в моём случае черная плата с чипом stm32f401. На данном сайте обнаружил для себя интересные статьи о настройках таймеров и работы с ними. Работа с таймерами меня заинтересовала так как я хочу считывать ШИМ сигнал в котором закодированы данные датчика, а именно магнитный датчик угла поворота AS5600. Он имеет протокол i2c, аналоговый выход, и выход шим с предустановленной частотой 115 Гц. Насколько я понял производитель чипа разбивает период на 4351 частей, из которых в начале 128 части всегда высокого уровня, в конце периода 128 частей всегда низкого уровня. Остальная часть периода заполняется в соответствии с положением угла поворота датчика. Ели я правильно посчитал то получается 115 Гц = 8695.652173913 микросекунд / 4351 количество частей периода = одна часть периода равняется 1,99854106 микросекунд. Вопрос в том что я не понимаю как подобрать предделитель таймера чтобы один тик был равен 1,99854106 микросекунд . Буду признателен любому совету
@aveal спасибо за ссылку. Если бы я ее нашел в поисковике вопрос бы не задавал). Единственное уточнить хотел датчик as5048 14бит но через шим 12 бит это иза погрешности самого шим сигнала? Да и датчик as5048 работает на частоте +-1кГц а датчик as5600 может работать на частотах 115,230,460,920 Гц то есть у второго погрешность будет больше. Я правильно понимаю?
@yarik737 у as5048 в принципе в режиме ШИМ разрешающая способность 12 бит.
По поводу частот as5600 - погрешность будет зависеть от погрешности измерения. Если частота ниже, временные интервалы длиннее - их проще измерить, но в целом на 920 Гц вполне можно работать с нормальной точностью. Мне кажется тут больше вопрос в скорости реакции, на 115 Гц мы будем получать новое значение с датчика каждые 8.7 мс, тут уже от задачи зависит, приемлемо или нет.
Всё разобрался просто запутался с битами 12 и 14. Внимательно просмотрел даташит все понял