Энкодер на stm32f405 для новичка

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Мудрый кот
Сообщения: 1799
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

linux_rulezz писал(а): Пт июл 03, 2026 01:34:35в мышах на среднюю кнопку, которую нажимаешь куда чаще правой, ставят самый дешёвый микрик! Я уже пару десятков мышей выкинул, у которых отказала эта важная для любой работы кнопка!
Давно известно: Скупой платит дважды.
Вместо того, чтобы купить нормальную мышу, можно конечно "экономить" и покупать их десятками.
Реклама
Опытный кот
Аватара пользователя
Сообщения: 740
Зарегистрирован: Пн сен 15, 2025 08:43:23
Откуда: Маленький СССР посреди недругов

Сообщение linux_rulezz »

"Нормальную" - это какую? Я покупаю по 100-150 рублей, вполне себе нормальные…
Windows must die!
Контактная информация:
Реклама
Мудрый кот
Сообщения: 1799
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

linux_rulezz писал(а): Пт июл 03, 2026 09:34:36Я покупаю по 100-150 рублей
Вот именно! :)))
О чём я и говорил.

PS: На заметку "экономистам": Дешманские ещё и гораздо быстрее выжирают батарейки. Делая "выгоду" от "экономии" ещё более сомнительной.
Опытный кот
Аватара пользователя
Сообщения: 740
Зарегистрирован: Пн сен 15, 2025 08:43:23
Откуда: Маленький СССР посреди недругов

Сообщение linux_rulezz »

jcxz писал(а): Пт июл 03, 2026 09:36:11гораздо быстрее выжирают батарейки
Какие еще батарейки? Зачем мыше батарейки, если она от USB питается?
Windows must die!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Мудрый кот
Сообщения: 1799
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

linux_rulezz писал(а): Пт июл 03, 2026 10:05:06Какие еще батарейки? Зачем мыше батарейки, если она от USB питается?
Ужас! :facepalm: Не думал что маразм "экономия" зашла так далеко. :dont_know:

Может у вас они (мыши) ещё и шариковые??? :)))
Слышали когда-нить об оптических мышах?
Реклама
Опытный кот
Аватара пользователя
Сообщения: 740
Зарегистрирован: Пн сен 15, 2025 08:43:23
Откуда: Маленький СССР посреди недругов

Сообщение linux_rulezz »

"Шариковые" сейчас найти сложно. Приходится убогие "оптические" покупать…
Windows must die!
Контактная информация:
Реклама
Нашел транзистор. Понюхал.
Сообщения: 151
Зарегистрирован: Пт май 20, 2022 22:19:02
Откуда: Ижевск

Сообщение Ифторик »

Пытаюсь сейчас файлы с CD карты прочитать с помощью библиотеки fatfs через интерфейс CDIO, никак не могу понять в чем проблема, получилось только узнать размер файлов и общий объем флешки, а текст никак не хочет отображаться, я понял если была бы балиберда из разных символов - значит кодировка/распознавание символов не верное, но имена все одинаковые, почему?
Если с счетчиком(энкодером) я могу делать грязь на регистрах, то плешка слишком мудреная со своими 512 битами, не хочется залезать совсем глубоко в битовую передачу.

Код в майне (сократил, чтоб не было громоздко)

Код: Выделить всё

HAL_SD_CardInfoTypeDef CDinfo; //инициализация структуры
HAL_SD_GetCardInfo(&hsd, &CDinfo); //получаем системную информацию
snprintf(iClass, sizeof(iClass)+6, "Class-%lu", CDinfo.Class);	//конвертируем CDinfo.Class в массив символов iClass[64]
str_dot_out(310, 130, iClass, strlen(iClass), 0, 1, SystemFont); //выводим на экран iClass[64]
f_mount(&SDFatFS, (TCHAR const*)SDPath, 1); //монтируем диск
List_Files(""); //получаем список файлов

функция получения списка файлов:
Спойлер

Код: Выделить всё

FRESULT List_Files(const char* path) {
 FRESULT res;
 DIR dir;
 static FILINFO fno;
 res = f_opendir(&dir, path);
 int loc = 0; //приращение расположения на экране
 char fileNameCDi[256]; //имя файла
 char fileSizeCDi[256]; //размер файла
 char errorCDi[8]; //ошибка чтения - если ноль, то ошибки нет
 if (res == FR_OK)
 {
	while (f_readdir(&dir, &fno) == FR_OK & fno.fname[0] != 0)
	{
		HAL_Delay (100);
		if (fno.fattrib & AM_DIR) //папка
		{
			snprintf(fileNameCDi, sizeof(fileNameCDi), "DIR-%hu", fno.fname); //конвертируем fno.fname в массив символов fileNameCDi
			str_dot_out(10, 70+loc, fileNameCDi, strlen(fileNameCDi), 0, 0, SystemFont); //выводим на экран
		}
		else //файл
		{
			snprintf(fileSizeCDi, sizeof(fileSizeCDi), "File-%lu;_%lubyte", fno.fname, fno.fsize);
			str_dot_out(10, 70+loc, fileSizeCDi, strlen(fileSizeCDi), 0, 0, SystemFont); //выводим на экран
		}
		loc = loc+20; //шаг расположения
		}
		str_dot_out(10, 70+loc, "end", 3, 0, 0, SystemFont); //список закончился, выводим на экран end
		f_closedir(&dir);
	}
	snprintf(errorCDi, sizeof(errorCDi), "error_%lu", res); 
	str_dot_out(10, 50, errorCDi, sizeof(errorCDi), 0, 0, SystemFont); //выводим на экран ошибку
	return res;
 }
Вложения
SD to LCD.jpg
(69.61 КБ) 11 скачиваний
Нашел транзистор. Понюхал.
Сообщения: 151
Зарегистрирован: Пт май 20, 2022 22:19:02
Откуда: Ижевск

Сообщение Ифторик »

Я разобрался, fno.fname записывается символами по 16 бит, а для вывода на экран нужен восьмибитный char
Вместо команды snprintf я ввел так:

Код: Выделить всё

for (int i = 0; i < 32; i++)
{
fileNameCDi[i] = (char)fno.fname[i];
}
snprintf
я думал что так тоже можно записать:

Код: Выделить всё

fileNameCDi[i] = fno.fname[i];
типа старшие биты удалятся, младшие останутся, ну логично же.
Мучитель микросхем
Сообщения: 407
Зарегистрирован: Чт май 07, 2026 00:30:38

Сообщение Zapolyarny »

Ифторик писал(а): Вт июл 07, 2026 19:36:13 я думал что так тоже можно записать:

Код: Выделить всё

fileNameCDi[i] = fno.fname[i];
типа старшие биты удалятся, младшие останутся, ну логично же.
Неявное приведение типов - плохая практика. Где-то оно отработает корректно, а где-то (и это чаще всего) доставит массу проблем. Кроме того, такая запись предполагает, что типы одинаковы, то есть, в Вашем случае стало плохо читаться, так как требуется дополнительная информация об их неравенстве. В общем, так делать нельзя.
Нашел транзистор. Понюхал.
Сообщения: 151
Зарегистрирован: Пт май 20, 2022 22:19:02
Откуда: Ижевск

Сообщение Ифторик »

Я использовал фукцию snprintf чтоб превратить обычную переменную в массив данных char для вывода на дисплей, но похоже тут опять никакой магии я не нашел, я же конечно не явно прировнял два массива, а через эту функцию.
В топку закинул и думал что оно само там разберется))
Вымогатель припоя
Сообщения: 691
Зарегистрирован: Пн фев 16, 2026 17:30:02

Сообщение Rapra »

Помогаю пользоваться ИИ-ботом, по четвергам - бесплатно

Изображение

Так что Линукс Эдуардович отчасти был прав!
Мучитель микросхем
Сообщения: 407
Зарегистрирован: Чт май 07, 2026 00:30:38

Сообщение Zapolyarny »

Rapra писал(а): Чт июл 09, 2026 14:04:02 Так что Линукс Эдуардович отчасти был прав!
В помойку Линукса Эдуардовича. Не думаю, что форумы создавались для подобного поведения.
Мудрый кот
Сообщения: 1799
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

Ифторик писал(а): Вт июл 07, 2026 19:36:13Вместо команды snprintf я ввел так:

Код: Выделить всё

for (int i = 0; i < 32; i++)
{
fileNameCDi[i] = (char)fno.fname[i];
}
snprintf
Это говнокод. Так делать нельзя.

Если нужны имена файлов в однобайтовом (ASCII) режиме, то следует просто перевести FatFS в режим ASCII. Вместо Unicode. FatFS всё умеет.
Нашел транзистор. Понюхал.
Сообщения: 151
Зарегистрирован: Пт май 20, 2022 22:19:02
Откуда: Ижевск

Сообщение Ифторик »

Да, я понимаю, читать все символы через эту шляпу...(Я ж на одном списке файлов не остановлюсь), но просто если переткнуть настройки на ASCII не вдаваясь в подробности, то выпадает куча ошибок, пока не понял из-за чего и даже ошибки не читал, надо поковырять в эту сторону как время будет
Опытный кот
Аватара пользователя
Сообщения: 740
Зарегистрирован: Пн сен 15, 2025 08:43:23
Откуда: Маленький СССР посреди недругов

Сообщение linux_rulezz »

Ифторик писал(а): Пт июл 10, 2026 09:38:32пока не понял из-за чего
Копипастишь, небось, в хрюникоде?
// Запретил бы нафиг все кодировки, выходящие за пределы семи бит!
Windows must die!
Контактная информация:
Нашел транзистор. Понюхал.
Сообщения: 151
Зарегистрирован: Пт май 20, 2022 22:19:02
Откуда: Ижевск

Сообщение Ифторик »

Гугл неплохо справляется с написанием кода, но я стараюсь так не делать, я не ИИ тренерую, а себя же, а то что юникод я поменять не могу, это из-за того что в кубеМХ проект генерирую по модулям, потом каждый модуль отдельно вставляю себе, вот и ломаются иногда системные библиотеки, очень мерзенькие эти ошибки, по этому я их не смотрел, уже сталкивался, надо генерировать fatfs с нужными мне настройками сразу
Вымогатель припоя
Сообщения: 691
Зарегистрирован: Пн фев 16, 2026 17:30:02

Сообщение Rapra »

linux_rulezz писал(а): Пт июл 10, 2026 12:03:45 // Запретил бы нафиг все кодировки, выходящие за пределы семи бит!
i ostanemsa my bez russkih bukv, potomu chto v 128 kodov russkie bukvy ne pomeschajutsa
Нашел транзистор. Понюхал.
Сообщения: 151
Зарегистрирован: Пт май 20, 2022 22:19:02
Откуда: Ижевск

Сообщение Ифторик »

Можно я поделюсь немного своими странными мыслями, куда то я уже далеко от изначальной темы ухожу.
Решил помучать новый stm32h743, никак понять не могу как на этом выводить информацию на дисплей, в даташите написано что нужно выключать и включать SPI после обнуления счетчика кадров (кадр - 8 бит в данном случае), но включение и отключение суммарно занимают по времени 1.3-1.5мкс на частотах SPI 60мгц и ЦПУ 240мгц, задержка зависит только от частоты процессора, скорость передачи на stm32h7 равноценна частотам SPI 15мгц на stm32f4 (очень грубо), а от частоты процессора скорость почти не зависит, особенно с ДМА. Если вдруг на эту паузу процессор тратит ресурсы для повторной инициализации SPI, то это вообще треш какой то, как с этим вообще работать то? Указывать максимальное количество кадров и обновлять их по прерыванию?
Если использовать бесконечную передачу с количеством кадров 0 (как на stm32f4), то тогда тактирование никогда не останавливается, это не годится, наверное этот режим для очень крупных передач, явно не для дисплеев.
Своими скудными знаниями вывел самую оптимальную форму для передачи, но это получается что нужно после каждого символа отключать SPI и включать.
Проанализировал аналогичную функцию в хале HAL_SPI_TransmitReceive(); там тот же алгоритм только со чтением еще.

Код: Выделить всё

void Paramert_init(uint8_t Parametr, uint8_t* Data, uint16_t Lenght)
{
	lcd_wr_cmd(Parametr);
	if (Lenght!=0)
	{
		SPI_LCD->CR2 = Lenght; //запись количества кадров
		SPI_LCD->CR1 |= SPI_CR1_SPE; //включить SPI
		SPI_LCD->CR1 |= SPI_CR1_CSTART; //запись 1 в бит CSTART, запуск передачи данных
		for (int i = 0; i < Lenght; i++)
		{
			while ((SPI_LCD->SR & SPI_SR_TXP)==0); //ждем свободного места
			*(volatile uint8_t *)&SPI_LCD->TXDR |= Data[i];
		}
		while ((SPI_LCD->SR & SPI_SR_EOT)==0); //ждать завершения
		SPI_LCD->IFCR = SPI_IFCR_EOTC | SPI_IFCR_TXTFC | SPI_IFCR_UDRC | SPI_IFCR_OVRC | SPI_IFCR_TSERFC;
		SPI_LCD->CR1 &= ~(0x1UL << (0U)); //выключить SPI
	}
	else lcd_wr_cmd(Parametr); //команда без данных
}
включение i и d кеша сильно ускорило время переключения, может еще чего странного есть
(с фатфс из предыдущего сообщения я полностью разобрался)
Вымогатель припоя
Сообщения: 691
Зарегистрирован: Пн фев 16, 2026 17:30:02

Сообщение Rapra »

На кой вам этот H743? Это ж всё равно что космический корабль для вас. Там одна только система тактирования и питания чего стоит. Ваш предел - F411, да и то с натяжкой.
И 60 МГц SPI для дисплея - тоже нафик вот? Большие дисплеи в H743 предпочитают работать на LTDC, а не на SPI.
Ифторик писал(а): Сб авг 15, 2026 18:32:10 скорость передачи на stm32h7 равноценна частотам SPI 15мгц на stm32f4 (очень грубо), а от частоты процессора скорость почти не зависит, особенно с ДМА.
Нет, это не так.
Вообще, SPI1, SPI2 и SPI3 по умолчанию тактируются от PLL1, выход Q.
Ифторик писал(а): Сб авг 15, 2026 18:32:10 написано что нужно выключать и включать SPI после обнуления счетчика кадров (кадр - 8 бит в данном случае) ... процессор тратит ресурсы для повторной инициализации SPI,
Это не так. Вы просто не разобрались в теме.
Ифторик писал(а): Сб авг 15, 2026 18:32:10 SPI_LCD->TXDR |= Data[ i];
Ну да. Операция OR с write-only регистром - чисто штоп поржать.

Изображение
Нашел транзистор. Понюхал.
Сообщения: 151
Зарегистрирован: Пт май 20, 2022 22:19:02
Откуда: Ижевск

Сообщение Ифторик »

Знаю про космический корабль, это просто интиресно, но двухядерный уже взять не рискнул, я его целый день просто включить не мог когда впервые в руки взял, оказывается тайминги для памяти нужно указывать взависимости от напряжения питания, ужас.
СПИ потому что пины экономятся и на макетке удобнее. Мне скорость не нужна, дисплей я использую как показометр грязи внутри типа вывода счетчика из таймера, чтоб не мучатся от отладчиком, юартом и прочей шалупенью.
У меня SPI4, согласен, надо было 2 или 3 взять. Я имел ввиду задержка включения SPI зависит от частоты процессора, не от частоты шины APB2, это плохо. Такой мощный проц, а буксует на включении периферии. Я практически наизусть выучил главу в референсмануале с транзакциями, да, там не обязательно включать и выключать SPI, а только рекомендуется, по этому можно попробовать просто флаги очищать и вписывать кадры повторно
Ответить

Вернуться в «ARM»