

murmur
Участник*-
Content Count
594 -
Joined
-
Last visited
Community Reputation
0 ОбычныйAbout murmur
-
Rank
Знающий
Recent Profile Visitors
-
DMA2D - копирование прямоугольной области
murmur posted a topic in В помощь начинающему
Друзья, контроллер STM32F7, рисуется у меня картинка - сначала фон на весь экран, потом мелкий фрагмент. Хочу предварительно сохранить фон где-нибудь за пределами графической области, а потом вставлять оттуда при случае. Для того, чтобы понять принцип DMA2D копирования в режиме Memory-to-Memory, написала простенький код. который сначала делит экран на 4 области и раскрашивает каждую разными цветами, затем копирует одну область экрана в другую. Все это в цикле, переменные на лету меняю в отдладчике, дабы не перепрошивать каждый раз uint32_t offset=0x00000000; uint32_t source_addr=0xD0000000; uint32_t dest_addr=0xD00F0000; uint16_t width=500; uint16_t height=450; while(1) { TFT_FillRectangle(0,0,511,299,0xFF0000); // левый верхний - в красный цвет TFT_FillRectangle(512,0,1024,299,0x00FF00); //правый верхний - в зеленый TFT_FillRectangle(0,300,511,600,0x0000FF); //левый нижний - в синий TFT_FillRectangle(512,300,1024,600,0xFFFF00); //правый нижний - в желтый HAL_Delay(500); // Смотрим hdma2d.Init.Mode = DMA2D_M2M; hdma2d.Init.ColorMode = DMA2D_OUTPUT_RGB888; hdma2d.Init.OutputOffset =offset; if(HAL_DMA2D_Init(&hdma2d) == HAL_OK)// Настраиваем { if(HAL_DMA2D_Start(&hdma2d, source_addr, dest_addr, width, height) == HAL_OK) // копируем { HAL_DMA2D_PollForTransfer(&hdma2d, 10); } } HAL_Delay(500); } С указанными начальными данными полоса из верхней области экрана, шириной во весь экран, копируется куда-то вниз. Параметры source_addr, dest_addr, width, height мне интуитивно понятны. Но так и не получилось скопировать ограниченную прямоугольную область. Подскажите, как этой функцией скопировать прямоугольник размерами 100х100 из координат 50,50 в координаты 400,400 ? -
WS2811 - уменьшает Duty Cycle на Dout
murmur replied to murmur's topic in В помощь начинающему
То есть, программатор отключать после отключения основного питания? -
WS2811 - уменьшает Duty Cycle на Dout
murmur replied to murmur's topic in В помощь начинающему
Накаркали! Контроллер сгорел. Я не знаю от чего, возможно из-за кривизны рук - гирлянда могла платы контактом коснуться, проводки, переменный резистор. Но.... хотелось бы все-таки понять ваш намек на опасность сгорания - он о чем? О согласовании путем перевода в OD и подтяжки от 5 вольт? Смотрите, как сделала я - перевела ногу в OD, резистор 300 ом к 5 вольтам. Но на плате у меня 5 вольт нет, я их взяла от китайского свистка ST-link V2 - там 5 вольт наружу выведено. Блок питания у меня высокоамперный (при КЗ на проводах плавится изоляция). Так вот в моем случае расплавился провод GND, ведущий от ST-Link к плате. На плате больше ничего не сгорело, только контроллер. Могла быть причиной примененная мной схема согласования, раз уж вы об этом завели речь? У меня такое уже бывало несколько раз, это не может быть как-то связано с взаимодействием земель компьютера и контроллера? -
WS2811 - уменьшает Duty Cycle на Dout
murmur replied to murmur's topic in В помощь начинающему
Гре...ные китайцы. По даташиту, если на SET единица, то это LowSpeed, если висит в воздухе - HighSpeed. Распознав висящий в воздухе пин и прочитав даташит, я решила, что это великая задумка - включить режим HighSpeed. Но все оказалось по китайски просто - видать поставили микросхемы из рисовой муки, не поддерживающие HighSpeed. А раз не поддерживающие, то и вывод SET можно оставить в воздухе. Это то меня и сбило с толку - я поставила половинные тайминги. Изменила тайминги на обычные, все заработало как часы. Вот только R,G и B у них действительно перепутаны. Что до пуллап-резистора - схема работает в широких его пределах, но красивая и идеологически правильная осциллограмма получается только при 300 ом. -
WS2811 - уменьшает Duty Cycle на Dout
murmur replied to murmur's topic in В помощь начинающему
То есть, приведено к интуитивно-логически понятному формату, единица - это закрытый транзистор? Эмиттерный повторитель... по количеству деталей проще одногейтовый согласователь))) А по поводу осциллограммы - у меня переменный резистор на 10 к. И такая осциллограмма появляется при очень узком диапазоне сопротивлений, так что даже руками трудно выставить.... может резистор гнилой.... Устала что-то.... к черту все до завтрашнего дня... То есть, даем команду опустить на 100 мкс, и на 51 мкс диоды обновятся? Или зажгутся? Пока идет программирование, они выдают предыдущее состояние или гаснут? -
WS2811 - уменьшает Duty Cycle на Dout
murmur replied to murmur's topic in В помощь начинающему
И не работает..... Ни с OpenDrain ни с PushPull Взяла 5 вольт от программатора, прицепила резистор. Ножку вот так GPIO_InitStruct.Pin = LED_DATA_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); Получила осциллограмму Светодиода беспорядочно мерцают. Первая мысль - из за заваленных фронтов опять сбои чтения. Но..! Во первых, светодиод моргают одним и тем же цветом (то есть нет случайных ошибок чтения), во вторых цвет смещен. То есть, если писать 255,0,0 - горит не красный, а синий, если 0,0,255 - не синий, а зеленый. Может глянете код выше - там где то собака порылась? Вопрос - после того как записалось - линию в ноль на 50 мкс, а дальше - ее нужно в единицу? Когда гореть должно начать? После прошествия 50 мкс или после 50 мкс и перевода в единицу? Второй вопрос - уже по STM. Если бит установить в единицу, то транзистор открывается и притягивает линию к земле? Или закрывается и отпускает? Эх... похоже проблема нерешаема на OPENDRAIN Вот - все уже опробовано до нас http://we.easyelectronics.ru/STM32/gpio-vyhod-v-rezhime-opendrain.html -
WS2811 - уменьшает Duty Cycle на Dout
murmur replied to murmur's topic in В помощь начинающему
Так.... поставила первое, что попалось под руку - 5.1 к. Выход настроила так GPIO_InitStruct.Pin = LED_DATA_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); Получила такую осциллограмму Верхняя точка - 3.3 вольт. Кто виноват? Резистор поменьше надо? -
WS2811 - уменьшает Duty Cycle на Dout
murmur replied to murmur's topic in В помощь начинающему
не более 50 см. в данный момент 10 см Так ведь вот чего Din и VDD рядом -
WS2811 - уменьшает Duty Cycle на Dout
murmur replied to murmur's topic in В помощь начинающему
Господа, а финт ушами с OpenDrain и подтяжкой пройдет? -
WS2811 - уменьшает Duty Cycle на Dout
murmur replied to murmur's topic in В помощь начинающему
Так звоны делают свое дело. И там не 5 вольт надо, а 0.7 от VDD. Переключила выход на VERY_HIGH - светодиод замигали веселее. Скажите, а в качестве меры согласования уровней можно включить выход в OPEN_DRAIN и подтянуть резистором к 5 вольтам? Будет работать? -
WS2811 - уменьшает Duty Cycle на Dout
murmur replied to murmur's topic in В помощь начинающему
вот жеж черт.... stm32.... -
WS2811 - уменьшает Duty Cycle на Dout
murmur replied to murmur's topic in В помощь начинающему
А в чем проблема? 600/(600+650)=48% -
WS2811 - уменьшает Duty Cycle на Dout
murmur replied to murmur's topic in В помощь начинающему
-
WS2811 - уменьшает Duty Cycle на Dout
murmur replied to murmur's topic in В помощь начинающему
Говоря "реально", вы имеете в виду какой-то иной способ измерения, нежели осциллографирование? На всякий случай код. Не смейтесь над его "наколенностью", в будущем переделаю на таймер, возможно прикручу DMA, но пока так. На значения задержек тоже не обращайте внимание - на скорую руку переделан код микросекундной задержки, а там свои тонкости со временем выполнения кода, могу только уверить, что по осциллографу реальные задержки соответствуют паспортным (в HighSpeed) -
WS2811 - уменьшает Duty Cycle на Dout
murmur replied to murmur's topic in В помощь начинающему
Расчетный - 48% То что указано как 47% - мерялось с экрана, думаю 1% можно пренебречь. Еще странность. Схемотехника ленты вроде бы такая. Питание по даташиту - 6-7 вольт Если замерять на VDD - получается 4.6 вольт. Хотя на входе 12 вольт.... Это как и почему? Микросхема с резистором образуют делитель? Вот для наглядности: На входе: На выходе: