Top.Mail.Ru
Уведомления
Очистить все

[Закреплено] STM32 для начинающих

Страница 20 / 21
(@aleksej-6)
Level 3

@aveal 

Да это хорошо )

Шаг сделал в перёд (за месяц) и снова тупик.. 

Считывать несколько байт с SD карты получается. Сохранение происходит в буфере (readBuff), который располагается в оперативной памяти МК:

f_read(&MyFile, readBuff, sizeof(readBuff)-1, (UINT *)&bytesRead); //

 

А если необходимо прочитать и сохранить объём например 1 мегабайт ? Это несколько секторов (например по 512) и оперативки не хватит .. Как увеличивать сектора не понимаю.. И так понял, придётся переписывать информацию по частям, с SD карты в буфер в оперативно памяти МК. С помощью функции f_read нельзя указывать адрес SDRAM (честно говоря это выше "моего понимания"..., тут надо знать "основы" ) )

Не нашёл примеров с считыванием и сохранением больших объёмов данных (с SD карты), сохранять в конечном случае нужно в буфере SDRAM. 

ОтветитьЦитата
Размещено : 07.03.2025 14:09
(@aleksej-6)
Level 3
 
Указываем от куда читать и в цикле читаем страницы: 
 
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);
  }
 
Вроде так 
 
ОтветитьЦитата
Размещено : 08.03.2025 14:21
(@aleksej-6)
Level 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 символах). А нужно одно значение (и наверное нулевое ))

Я чего то  не понимаю.. При выводе этой же картинки из оперативной памяти всё прекрасно работало (запятые и одинарные промежутки между значениями я отфильтровывал). 

Что я делаю не так и чего мне нужно сделать - не могу понять ..

 

ОтветитьЦитата
Размещено : 09.03.2025 04:05
Aveal
(@aveal)
Top level Admin

Запись от: @aleksej-6

 
Указываем от куда читать и в цикле читаем страницы: 
 
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 сразу читать.

 

ОтветитьЦитата
Создатель темы Размещено : 10.03.2025 17:39
Aveal
(@aveal)
Top level Admin

Запись от: @aleksej-6

Доходит очень медленно, до меня..

Как пишут, при считывании большого объёма команду "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 символы, соответствующие тексту. Можно, конечно, вручную конвертировать... но лучше сразу в бинарном виде хранить.

 

ОтветитьЦитата
Создатель темы Размещено : 10.03.2025 17:41
(@aleksej-6)
Level 3

@aveal 

Да, так и сделал, Спасибо !

С FAT.. - даже и знал чего это такое, главное понять как это устроено ) Когда на компе тыкаешь - открыть картинку, начинаешь понимать сколько в этот один "тык" труда вложено !

По поводу своей задачи с выводом картинки на 7" экран (stm32h7iit6) задачу решил. Фото конвертировал в *jpg в обычном фотошопе, сохранил на sd. Частота вывода (кадров) получилась более 10 Гц (потом измеряю).

Фото нужно для "подложки" выводимой информации, так гораздо красивее получается )  

По поводу вывода на экран, я так понял - главное установить частоты тактирования SDRAM и LTDS. При определённых частотах работает идеально (иначе полосы на экране). И буферы в SDRAM хранить как рекомендовано в разных банках с одинаковым смещением от начала. Используемые буферы - 3 штуки. Один  для хранения "подложки" (фото), два других для перерисовки и вывода на экран (поочерёдный вывод, один выводим, другой рисуем).  

ОтветитьЦитата
Размещено : 11.03.2025 03:28
(@volt_mk)
New member

Добрый день!

Не стал создавать отдельную тему, авось ответят и тут...

Недавно увлёкся программированием 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 обязательно должна быть в шестнадцатеричной системе счисления... 

 

ОтветитьЦитата
Размещено : 23.03.2025 16:10
Aveal
(@aveal)
Top level Admin

@volt_mk Добрый день!

Без разницы, по сути это просто форма записи, значения, например, 0x55 и 85 идентичны.

ОтветитьЦитата
Создатель темы Размещено : 24.03.2025 12:32
(@volt_mk)
New member

@aveal Спасибо!

ОтветитьЦитата
Размещено : 24.03.2025 12:40
Aveal
(@aveal)
Top level Admin

@volt_mk Если что - обращайтесь )

ОтветитьЦитата
Создатель темы Размещено : 24.03.2025 12:49
(@yarik737)
New member

Доброго времени суток. Я знакомлюсь с stm32, в моём случае черная плата с чипом stm32f401. На данном сайте обнаружил для себя интересные статьи о настройках таймеров и работы с ними. Работа с таймерами меня заинтересовала так как я хочу считывать ШИМ сигнал в котором закодированы данные датчика, а именно магнитный датчик угла поворота AS5600. Он имеет протокол i2c, аналоговый выход, и выход шим с предустановленной частотой 115 Гц. Насколько я понял производитель чипа разбивает период на 4351 частей, из которых в начале 128 части всегда высокого уровня, в конце периода 128 частей всегда низкого уровня. Остальная часть периода заполняется в соответствии с положением угла поворота датчика. Ели я правильно посчитал то получается 115 Гц = 8695.652173913 микросекунд / 4351 количество частей периода = одна часть периода равняется 1,99854106 микросекунд. Вопрос в том что я не понимаю как подобрать предделитель таймера чтобы один тик был равен 1,99854106 микросекунд . Буду признателен любому совету

ОтветитьЦитата
Размещено : 03.04.2025 10:15
Aveal
(@aveal)
Top level Admin

@yarik737 Добрый день, у меня есть пример с датчиком AS5048 (ссылка), там почти то же самое, что с AS5600, в целом можно по аналогичной схеме реализовать.

ОтветитьЦитата
Создатель темы Размещено : 03.04.2025 11:12
(@yarik737)
New member

@aveal спасибо за ссылку. Если бы я ее нашел в поисковике вопрос бы не задавал). Единственное уточнить хотел датчик as5048 14бит но через шим 12 бит это иза погрешности самого шим сигнала? Да и датчик as5048 работает на частоте +-1кГц а датчик as5600 может работать на частотах 115,230,460,920 Гц то есть у второго погрешность будет больше. Я правильно понимаю?

ОтветитьЦитата
Размещено : 03.04.2025 12:24
Aveal
(@aveal)
Top level Admin

@yarik737 у as5048 в принципе в режиме ШИМ разрешающая способность 12 бит.

По поводу частот as5600 - погрешность будет зависеть от погрешности измерения. Если частота ниже, временные интервалы длиннее - их проще измерить, но в целом на 920 Гц вполне можно работать с нормальной точностью. Мне кажется тут больше вопрос в скорости реакции, на 115 Гц мы будем получать новое значение с датчика каждые 8.7 мс, тут уже от задачи зависит, приемлемо или нет.

ОтветитьЦитата
Создатель темы Размещено : 03.04.2025 13:44
(@yarik737)
New member

Всё разобрался просто запутался с битами 12 и 14. Внимательно просмотрел даташит все понял

ОтветитьЦитата
Размещено : 03.04.2025 13:45
Страница 20 / 21
Поделиться: