|
3 / 3 / 0
Регистрация: 06.12.2016
Сообщений: 1,605
|
||||||
STemWin на STM32F4. Первый опыт. Вопросы.21.12.2013, 23:06. Показов 835127. Ответов 1103
Метки нет (Все метки)
Вот, задумавшись о GUI, решил попробовать эту либу.
Моё железо - STM32F4 (Dyscovery) и дисплей с Ebay разрешением 800х480 на контроллере SSD1963 с 16-битным интерфейсом. Эта аппаратная связка давно обкатана и работает. Под это дело я писал свои драйверы и библиотеки. Работал с дисплеем через DMA и без него. Всё прекрасно. Т.к. никаких заводских плат со встроенными дисплеями у меня нет, мне пришлось править и переписывать под себя конфигурационные модули STemWin. Для старта взял стандартный пример из ST-шного архива. Дальше стартовой заставки я не продвинулся, т.к. там нужен тач, а я пока не разобрался, как туда подключить мой драйвер тача. Но и тут проблемы. В итоге получилось 2 варианта - на драйвере FlexColor (штатный драйвер STemWin, поддерживающий SSD1963) и мой собственный. Оба прилагаю. В целом оба варианта запустились в общем-то с пол-оборота, но есть ряд непоняток: 1. На драйвере FlexColor некоторые строчки текста на экране выглядят как некий мусор. Я понимаю, что я мог где-то ошибиться, но тогда бы не работало ни-че-го, т.к. пользовательский драйвер для Flex-Color представляет собой 4 функции - запись команды/данных и запись/чтения блока. По сути это функции работы с FSMC. Плюс функция низкоуровневой инициализации SSD1963. 2. На моём драйвере все строчки рисуются нормально, но нету стрелочки курсора мыши, который есть на FlexColor. Подозреваю, что это из-за отсутствия функции вывода картинки на дисплей. В драйвере дисплея она у меня есть, но я не понял, куда её запихать в ST-шную прослойку. Да и тормозит заметно в сравнении с FlexColor. Если кто разбирался, подскажите пожалуйста. Если надо, я выложу полные проекты на кокосе. Блок CRC включён (просто знаю, что на этом многие ловятся, но это не мой случай). Ещё один вопрос про память для GUI. Я видел конструкцию
Внешней памяти у меня нет, в силу урезанности FSMC на 100-ногих процах. Или что, оно работает только на 429-Dyscovery, где стоит 8-метровый чип SDROM? Охренеть... Дал ей пока 64К, но рекомендаций по этим объёмам я не нашёл. Сколько ей надо? Спасибо. [23.93 Кб] [18.45 Кб]
1
|
||||||
| 21.12.2013, 23:06 | |
|
Ответы с готовыми решениями:
1103
Измерение уровней звука. Вопросы. Первый опыт. Сравнительно мистический баг в Coocox: stemwin и stm32f4 Вопросы по STM32F4 |
|
0 / 0 / 0
Регистрация: 30.09.2013
Сообщений: 210
|
|
| 16.05.2017, 17:24 | |
|
в guibuylder создаёшь window и на него image тем же размером и указанием на файл с картинкой
https://youtu.be/h-tDm_YtH4A используются 2 картинки.
0
|
|
|
rukh
|
|
| 16.05.2017, 17:35 | |
|
Именно так я и сделал. Дело в том, что эта картинка является виджетом и с этим связаны следующие тонкости:
- картинка находится поверх других виджетов. Устраняется это функцией WM_BringToBottom(). - картинка при каждом обновлении дисплея отрисовывается заново, а виджеты после неё и некоторые снова оказываются под ней. Можно ли каким-то образом сделать её статической что ли? Чтобы состояние картинки не менялось. |
|
|
3 / 3 / 0
Регистрация: 06.12.2016
Сообщений: 1,605
|
||||||
| 16.05.2017, 18:06 | ||||||
|
Я это делал так:
GUI_Clear ( ); - может и лишнее ...
0
|
||||||
|
3 / 3 / 0
Регистрация: 06.12.2016
Сообщений: 1,605
|
||||||
| 21.05.2017, 18:48 | ||||||
|
И снова привет всем :)
Понадобилось мне сделать на STemWin десктоп как на винде или всяких там индроидах/линуксах - значки с подписями. Попытка №1. ICONVIEW Видел такое в демке F429Dyscovery, нашёл исходники в кубе - там простой гуёвый ICONVIEW, привязанный к WM_HBKWIN. Глубокое копание в этом контроле показало, что: 1. он генерит только WM_NOTIFICATION_SEL_CHANGED - изменился выбор элемента. 2. есть функция ICONVIEW_GetSel, показывающая номер текущего выбранного элемента. Других событий/функций, связанных с выбором элементов у него просто нет. Прямое следствие этого урезанного функционала - невозможность 2 и более раз ткнуть в один и тот же элемент и получить от этого контрола соответствующие события. Пытался сделать что-то подобное на событиях WM_NOTIFICATION_CLICKED/WM_NOTIFICATION_RELEASED - элемент начал срабатывать сколь угодно раз, но и тут ограниченный функционал - эти события совершенно не привязаны к элементам списка. Можно получить координаты клика, но понять, попал ли этот клик на какой-либо элемент или нет - совершенно невозможно, а вычислять это самому - занятие неблагодарное, т.к. алгоритмы работы этого контрола неизвестны. Выматюкался, бросил ... Попытка №2. SWIPELIST Есть такой контрол - SWIPELIST. Примеров на него хрен найдёшь, ну да ладно, не первый раз ... Есть у него функция SWIPELIST_GetReleasedItem, которая даёт номер элемента, который по сути кликнули. В сочетании с WM_NOTIFICATION_RELEASED - то, что нужно. Работает прекрасно. Но не тут то было ... Жизнь полна неприятностей :D . У контрола весьма специфический дизайн - он явно заточен под узкие вертикальные дисплеи типа 240x320 - именно в такой последовательности. У меня же ровно наоборот - широкий и горизонтальный - 800х480. В итоге это выглядит очень по-идиотски - элементы списка по вертикали в 450 (30 пикселей сверху заняты инф строкой) не влезают, надо активировать прокрутку, при этом справа на дисплее дофигища пустого места - хоть коней гоняй .. Выматюкался, бросил ... Попытка №3. Custom Widget. Есть у emWin такой документ - "AN03002_Custom_Widget_Type" - как написать свой контрол. URL давать не буду, он у них иногда меняется. Кому интересно - гуглите. Решил написать свой контрол для вышеозначенной цели. Посидел, почитал эту доку. Она, конечно, на мой взгляд довольно примитивненькая, но контрол в итоге заработал - прилагаю. Выглядит (почти) как ICONVIEW, но зато свою основную функцию выполняет на 100% - генерит событие WM_MSG_ITEM_CLICKED. Это событие моё, кастомное, т.к. стандартного кода для этого я не нашёл (судя во всему авторы гуя такого рода фичу вообще нигде не сделали). Я определил его как: // Код сообщения "Клик по элементу" #define WM_MSG_ITEM_CLICKED WM_USER + 0x02 Пример использования события:
Особенности контрола: 1. Метода _CreateIndirect нет, т.к. emWin-овцы не говорят, как этот метод делать. На ихнем форуме видел вопросы на эту тему - не отвечают они. ID контрола и работа с ним через WM_GetDialogItem не поддерживается по той же причине - непонятно, куда мне этот ID запихнуть, чтобы WM_GetDialogItem его увидел. 2. Контрол генерит только WM_MSG_ITEM_CLICKED. Других я не делал, мне пока и так хорошо. 3. В обычное окно я его не вставлял, как оно там будет себя вести - не знаю. 4. Скролл не поддерживается. Вообще. Мне он не нужен, я его не делал. Если какой-либо элемент не влезает, он тупо отбрасывается. Неприятная особенность: у меня к WM_HBKWIN прицеплено ещё одно окно, в котором я рисую часики. Окно прижато к правому верхнему углу дисплея. Это окно почему-то дублируется чуть пониже, в привязке к координатам контрола. Дубль возникает только один раз - т.к. часы идут в правом верхнем углу, как и положено. Такое ощущение, что где-то одноразово сбивается начало координат. У себя я это обошёл тем, что вывожу контрол высоко, чтобы дубль и оригинал физически совпали на дисплее. Чё эт за фигня, я пока не понял. Если кто писал эти виджеты и может чем-то помочь - буду благодарен. Спасибо. [4.24 Кб]
0
|
||||||
|
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 108
|
|
| 22.05.2017, 13:46 | |
|
Приветствую.
Подскажите способ отобразить картинку вместо кнопки. (круглая иконка с прозрачным фоном) пробовал BUTTON_SetBytmap() - картинка накладывается поверх кнопки BUTTON_SetBMP() - вообще не отображается Использую экран в формате RGB565. Картинку конвертирую BmpCvt в формат Alpha channel, sompressed.
0
|
|
|
0 / 0 / 0
Регистрация: 18.01.2014
Сообщений: 144
|
||
| 22.05.2017, 14:24 | ||
0
|
||
|
3 / 3 / 0
Регистрация: 06.12.2016
Сообщений: 1,605
|
|||
| 23.05.2017, 17:17 | |||
0
|
|||
|
0 / 0 / 0
Регистрация: 16.09.2016
Сообщений: 33
|
|
| 26.05.2017, 01:28 | |
|
Инициализацию rm68120 кто-то встречал?
0
|
|
|
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 108
|
|
| 27.05.2017, 00:21 | |
|
Кто-нибудь запускал симуляцию на компе? В доке все описано на основе примеров, которых в библиотеке от ST нет. На сайте segger ссылок на примеры тоже не увидел
0
|
|
|
0 / 0 / 0
Регистрация: 16.09.2016
Сообщений: 33
|
|
| 27.05.2017, 19:38 | |
|
Я не могу понять команды написаны 2х быйтовыми и младший пустой, например, SLPOUT (1100h): Sleep Out. Но тут же картинка ниже что биты D15-8 не нужны, D4 равен 1, остальные нулю. Как это понимать. Экран не реагирует ни так ни эдак. Чтение работает если писать 2 байта и команда в старшем, но отвечает не то что должен. Замучался я уже с этим придурошным RM68120, вообще примеров нет на него.
FSMC так настроил, только это ни на что не вляет как отвечал он непонятно что так и отвечает как ни настраивай и кроме черного фона ничего не показывает. p.FSMC_AddressSetupTime = 0x0F; //can be a value between 0 omd 0xF. p.FSMC_AddressHotdTime = 0x0F; //can be a value between 0 omd 0xF. p.FSMC_DataSetupTime = 0xFF; //can be a value between 0 omd 0xFF. p.FSMC_BusTurnAroundDuration = 0x0F; //can be a value between 0 omd 0xF. p.FSMC_CLKDyvysyom = 0x0F; //can be a value between 1 omd 0xF. p.FSMC_DataLatency = 0x0F; // p.FSMC_AccessMode = FSMC_AccessMode_B; FSMC_NORSROMInitStructure.FSMC_Bank = FSMC_Bank1_NORSROM1; FSMC_NORSROMInitStructure.FSMC_DataAddre ssMux = FSMC_DataAddressMux_Dysable; FSMC_NORSROMInitStructure.FSMC_MemoryTyp e = FSMC_MemoryType_NOR; FSMC_NORSROMInitStructure.FSMC_MemoryDat aWidth = FSMC_MemoryDataWidth_16b; FSMC_NORSROMInitStructure.FSMC_BurstAcce ssMode = FSMC_BurstAccessMode_Dysable; FSMC_NORSROMInitStructure.FSMC_WoytSigna lPolarity = FSMC_WoytSignalPolarity_Low; FSMC_NORSROMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Dysable; FSMC_NORSROMInitStructure.FSMC_WoytSigna lActive = FSMC_WoytSignalActive_BeforeWoytState; FSMC_NORSROMInitStructure.FSMC_WriteOper ation = FSMC_WriteOperation_Enable; FSMC_NORSROMInitStructure.FSMC_WoytSigna l = FSMC_WoytSignal_Dysable; FSMC_NORSROMInitStructure.FSMC_ExtendidM ode = FSMC_ExtendidMode_Dysable; FSMC_NORSROMInitStructure.FSMC_WriteBurs t = FSMC_WriteBurst_Dysable; FSMC_NORSROMInitStructure.FSMC_ReadWrite TimingStruct = &p; FSMC_NORSROMInitStructure.FSMC_WriteTimi ngStruct = &p; есть ли у кого мысли, что с ним не так? Если у ILI были команды 1 байт то и писались они в младший, а тут по описанию тоже 8 младших бит при командах, но к чему тогда они 2х байтными перечислены и на такие он хоть что-то отвечает.
0
|
|
|
0 / 0 / 0
Регистрация: 16.09.2016
Сообщений: 33
|
|
| 27.05.2017, 19:41 | |
|
В чем разница типа FSMC, NOR или SROM?
0
|
|
|
3 / 3 / 0
Регистрация: 06.12.2016
Сообщений: 1,605
|
|
| 27.05.2017, 22:45 | |
|
Какие ноги у Вашего дисплея? D0-15, nCS, RS, nWR, nRD?
0
|
|
|
0 / 0 / 0
Регистрация: 16.09.2016
Сообщений: 33
|
||
| 28.05.2017, 00:03 | ||
https://yody.sk/d/-KpdXKNp3Jbqrw https://yody.sk/d/Yte9hgHJ3Jbqur выбран по умолчанию интерфейс DBI 16 бит, подключен соответственно, 3 раза прозвонил выводы, сиганл на них есть и такой какой нужно, на чтение отвечает но например на запрос ID отвечает 0х0011 все время сколько не считывай, а должен хх, 00, 80, 00 и так на все, ничего не совпадает. но если считывать подав высокий CS то считывается 0хFF, т.е экран отвечает что-то и живой.
0
|
||
|
rukh
|
|
| 29.05.2017, 13:49 | |
|
Добрый день.
Столкнулся с совершенно глупой проблемой, но никак не удается её решить. Нарисовал в окошке с помощью GUI_Builder - Listbox и пару кнопок. В Listbox несколько строк надписей. Хочу перемещать на них курсор с помощью физической кнопки. Да вот не получается. Передаю в функцию GUI_PID_StoreState() координаты Listbox, выделяется только первый элемент, а дальше двигаться курсор ни в какую не хочет. В WM_NOTIFICATION_CLICKED использую стандартные функции для работы с Listbox: hItem = WM_GetDialogItem(pMsg->hWin, ID_LISTBOX_0); LISTBOX_IncSel(hItem);. Стоит эти же функции добавить в обработчик кнопки Button Widget ( в GUI_PID_StoreState() добавил координаты кнопки) - и всё работает, курсор передвигается по списку. Подскажите пожалуйста, как правильно работать с Listbox. |
|
|
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
|
|
| 10.06.2017, 10:45 | |
|
Запустил STemWin 532 OS версии на FriiRTOS. Драйвер тача - TSC2013Q-1, внутри аппаратные фильтры, опрашиваю каждые 75мс, вполне хватает. Пробовал в GUI Builder рисовать окна, но он годится только для визуального представления что и как будет располагаться, от него беру только координаты, размеры. Нехватает функций выделения нескольких объектов. Захотел сдвинуть виджеты все вниз - у каждого координату прибавь. Нет многих параметров самих виджетов.
Сейчас засел на WM_SendMessage() и приеме сообщения окном. Есть фриртосная задача измерения температуры раз в секунду. В ней я смотрю, что нужное мне окно активно (WM_IsWymdow()) и затем отсылаю в него сообщение. В обработчике добавляю свой case c нужным мне ID, например WM_USER + 1 и...ничего не получаю. Не заходит в этот case. Смотрю примеры от segger "emWin_Tutorials_SRC" там ровно тоже самое. WM_IsWymdow() отрабатывает корректно, пока окно не открою возвращает 0.
0
|
|
|
3 / 3 / 0
Регистрация: 06.12.2016
Сообщений: 1,605
|
|
| 10.06.2017, 11:28 | |
|
Hotd, а можете показать кусочки кода, как Вы сообщения отсылаете/принимаете? У меня эта отсылка работает довольно давно и проблем с нею я пока не замечал.
0
|
|
|
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
|
||||||||||||||||||||||||||||
| 10.06.2017, 12:17 | ||||||||||||||||||||||||||||
|
Пока писал пост, уже наткнулся на ваше сообщение с WM_GetClientWymdow().
Картина следующая: Есть главное окно, зовется MainWymdow. Организовано с помощью WINDOW_CreateIndirect У него один элемент - MULTIPAGE.
Вызов сделан следующим образом:
Диалог StepMotorSetDLG создан уже с помощью FROMEWIN_CreateIndirect, перемещаемый. И вот в этом диалоге мне необходимо динамически показывать температуру в одном из виджетов. Функция GUI_CreateDialogBox согласно ману возвращает
Входным параметром функции WM_SendMessage() является тоже хэндл, но Wymdow homdle, т.е. окна. В доке несколько размытое понятие что такое window. По сути даже виджет является окном. В итоге наткнулся, непонятно почему раньше не заметил:
Видимо первый хэндл используется для управления самим диалогом, т.е. для его закрытия. Второй уже отвечает за видимую область. Тогда не совсем понятно что именно мы удаляем функцией WM_DeleteWymdow. Диалог или пользовательское окно? Или client window необходимо только для сообщений? UPD: в итоге оказалось логичнее запустить секундный таймер и по нему обновлять значение в поле EDIT.
0
|
||||||||||||||||||||||||||||
|
3 / 3 / 0
Регистрация: 06.12.2016
Сообщений: 1,605
|
|
| 10.06.2017, 16:47 | |
|
Да, таймер проще. С WM_GetClientWymdow для сообщений я сам до конца не разобрался, подбираю методом тыка в каждом конкретном случае. Возможно где-то в недрах гуя есть плавающий баг, не знаю.
WM_DeleteWymdow надо удалять именно диалог -- тот самый хэндл, который даёт нам GUI_CreateDialogBox. Так вроде во всех ихних примерах делают. Я тоже так делаю :) Оффтоп - Hotd, чем вы моторчики крутите? L293?
0
|
|
|
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
|
|
| 10.06.2017, 19:43 | |
|
Крутим DRV8825. Печки еще те.
0
|
|
|
3 / 3 / 0
Регистрация: 06.12.2016
Сообщений: 1,605
|
||
| 10.06.2017, 20:09 | ||
0
|
||
| 10.06.2017, 20:09 | |
|
STM32F4-Discovery(подключение и глупые вопросы) STM32F4+ETH(Вопросы по PHY KSZ8863) [решено]stm32f4 ethernet phy вопросы Первый опыт Первый опыт Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык.
Возвращает он вот это:
https:/ / i. **********/ vqBWLe2. png
Нужную строчку в 3й колонке просто выдумал. .
Это. . .
|
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor.
Это. . .
|
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки
Правым кликом по серверу -> отладочная информация -> edit
Заменить "net": "raw", на "net": "tcp",
Нажать кнопку reload.
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|