Страница 3 из 4
Re: Энкодер на stm32f405 для новичка
Добавлено: Пт июл 03, 2026 09:33:26
jcxz
linux_rulezz писал(а): Пт июл 03, 2026 01:34:35в мышах на среднюю кнопку, которую нажимаешь куда чаще правой, ставят самый дешёвый микрик! Я уже пару десятков мышей выкинул, у которых отказала эта важная для любой работы кнопка!
Давно известно:
Скупой платит дважды.
Вместо того, чтобы купить нормальную мышу, можно конечно "экономить" и покупать их десятками.
Re: Энкодер на stm32f405 для новичка
Добавлено: Пт июл 03, 2026 09:34:36
linux_rulezz
"Нормальную" - это какую? Я покупаю по 100-150 рублей, вполне себе нормальные…
Re: Энкодер на stm32f405 для новичка
Добавлено: Пт июл 03, 2026 09:36:11
jcxz
linux_rulezz писал(а): Пт июл 03, 2026 09:34:36Я покупаю по 100-150 рублей
Вот именно!
О чём я и говорил.
PS: На заметку "экономистам": Дешманские ещё и гораздо быстрее выжирают батарейки. Делая "выгоду" от "экономии" ещё более сомнительной.
Re: Энкодер на stm32f405 для новичка
Добавлено: Пт июл 03, 2026 10:05:06
linux_rulezz
jcxz писал(а): Пт июл 03, 2026 09:36:11гораздо быстрее выжирают батарейки
Какие еще батарейки? Зачем мыше батарейки, если она от USB питается?
Re: Энкодер на stm32f405 для новичка
Добавлено: Пт июл 03, 2026 10:28:24
jcxz
linux_rulezz писал(а): Пт июл 03, 2026 10:05:06Какие еще батарейки? Зачем мыше батарейки, если она от USB питается?
Ужас!

Не думал что
маразм "экономия" зашла так далеко.
Может у вас они (мыши) ещё и шариковые???
Слышали когда-нить об оптических мышах?
Re: Энкодер на stm32f405 для новичка
Добавлено: Пт июл 03, 2026 11:56:12
linux_rulezz
"Шариковые" сейчас найти сложно. Приходится убогие "оптические" покупать…
Re: Энкодер на stm32f405 для новичка
Добавлено: Пн июл 06, 2026 23:44:01
Ифторик
Пытаюсь сейчас файлы с 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;
}
Re: Энкодер на stm32f405 для новичка
Добавлено: Вт июл 07, 2026 19:36:13
Ифторик
Я разобрался, fno.fname записывается символами по 16 бит, а для вывода на экран нужен восьмибитный char
Вместо команды snprintf я ввел так:
Код: Выделить всё
for (int i = 0; i < 32; i++)
{
fileNameCDi[i] = (char)fno.fname[i];
}
snprintf
я думал что так тоже можно записать:
типа старшие биты удалятся, младшие останутся, ну логично же.
Re: Энкодер на stm32f405 для новичка
Добавлено: Чт июл 09, 2026 11:14:19
Zapolyarny
Ифторик писал(а): Вт июл 07, 2026 19:36:13
я думал что так тоже можно записать:
типа старшие биты удалятся, младшие останутся, ну логично же.
Неявное приведение типов - плохая практика. Где-то оно отработает корректно, а где-то (и это чаще всего) доставит массу проблем. Кроме того, такая запись предполагает, что типы одинаковы, то есть, в Вашем случае стало плохо читаться, так как требуется дополнительная информация об их неравенстве. В общем, так делать нельзя.
Re: Энкодер на stm32f405 для новичка
Добавлено: Чт июл 09, 2026 13:23:57
Ифторик
Я использовал фукцию snprintf чтоб превратить обычную переменную в массив данных char для вывода на дисплей, но похоже тут опять никакой магии я не нашел, я же конечно не явно прировнял два массива, а через эту функцию.
В топку закинул и думал что оно само там разберется))
Re: Энкодер на stm32f405 для новичка
Добавлено: Чт июл 09, 2026 14:04:02
Rapra
Помогаю пользоваться ИИ-ботом, по четвергам - бесплатно
Так что Линукс Эдуардович отчасти был прав!
Re: Энкодер на stm32f405 для новичка
Добавлено: Чт июл 09, 2026 16:01:10
Zapolyarny
Rapra писал(а): Чт июл 09, 2026 14:04:02
Так что Линукс Эдуардович отчасти был прав!
В помойку Линукса Эдуардовича. Не думаю, что форумы создавались для подобного поведения.
Re: Энкодер на stm32f405 для новичка
Добавлено: Пт июл 10, 2026 01:26:45
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 всё умеет.
Re: Энкодер на stm32f405 для новичка
Добавлено: Пт июл 10, 2026 09:38:32
Ифторик
Да, я понимаю, читать все символы через эту шляпу...(Я ж на одном списке файлов не остановлюсь), но просто если переткнуть настройки на ASCII не вдаваясь в подробности, то выпадает куча ошибок, пока не понял из-за чего и даже ошибки не читал, надо поковырять в эту сторону как время будет
Re: Энкодер на stm32f405 для новичка
Добавлено: Пт июл 10, 2026 12:03:45
linux_rulezz
Ифторик писал(а): Пт июл 10, 2026 09:38:32пока не понял из-за чего
Копипастишь, небось, в хрюникоде?
// Запретил бы нафиг все кодировки, выходящие за пределы семи бит!
Re: Энкодер на stm32f405 для новичка
Добавлено: Пт июл 10, 2026 12:33:19
Ифторик
Гугл неплохо справляется с написанием кода, но я стараюсь так не делать, я не ИИ тренерую, а себя же, а то что юникод я поменять не могу, это из-за того что в кубеМХ проект генерирую по модулям, потом каждый модуль отдельно вставляю себе, вот и ломаются иногда системные библиотеки, очень мерзенькие эти ошибки, по этому я их не смотрел, уже сталкивался, надо генерировать fatfs с нужными мне настройками сразу
Re: Энкодер на stm32f405 для новичка
Добавлено: Пт июл 10, 2026 15:46:20
Rapra
linux_rulezz писал(а): Пт июл 10, 2026 12:03:45
// Запретил бы нафиг все кодировки, выходящие за пределы семи бит!
i ostanemsa my bez russkih bukv, potomu chto v 128 kodov russkie bukvy ne pomeschajutsa
Re: Энкодер на stm32f405 для новичка
Добавлено: Сб авг 15, 2026 18:32:10
Ифторик
Можно я поделюсь немного своими странными мыслями, куда то я уже далеко от изначальной темы ухожу.
Решил помучать новый 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 кеша сильно ускорило время переключения, может еще чего странного есть
(с фатфс из предыдущего сообщения я полностью разобрался)
Re: Энкодер на stm32f405 для новичка
Добавлено: Вс авг 16, 2026 07:36:17
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 регистром - чисто штоп поржать.

Re: Энкодер на stm32f405 для новичка
Добавлено: Вс авг 16, 2026 09:17:59
Ифторик
Знаю про космический корабль, это просто интиресно, но двухядерный уже взять не рискнул, я его целый день просто включить не мог когда впервые в руки взял, оказывается тайминги для памяти нужно указывать взависимости от напряжения питания, ужас.
СПИ потому что пины экономятся и на макетке удобнее. Мне скорость не нужна, дисплей я использую как показометр грязи внутри типа вывода счетчика из таймера, чтоб не мучатся от отладчиком, юартом и прочей шалупенью.
У меня SPI4, согласен, надо было 2 или 3 взять. Я имел ввиду задержка включения SPI зависит от частоты процессора, не от частоты шины APB2, это плохо. Такой мощный проц, а буксует на включении периферии. Я практически наизусть выучил главу в референсмануале с транзакциями, да, там не обязательно включать и выключать SPI, а только рекомендуется, по этому можно попробовать просто флаги очищать и вписывать кадры повторно