Перейти к содержанию
    

adrvyho

Участник
  • Постов

    20
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о adrvyho

  • Звание
    Участник
    Участник
  • День рождения 28.12.1987

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array
  1. Здравствуйте. Удалось справиться с проблемой? Подобно вашему инициализирую модуль, но запускаю от ppi по таймеру. EVENTS_END не происходит, хотя EVENTS_DONE срабатывают. Такое ощущение, что DMA не передаёт результат в буфер
  2. меню в emWin

    Тоже столкнулся с какой-то стеной в создании подменю в виджете Меню(экран создавал с помощью GUIBuilder) - меню создаются, реагируют на нажатие, но не обрабатываются. Такое ощущение, что что-то не так с ID_CODE дополнительно добавляемых меню. Возьмите демо пример в STM32Cube_FW_F4 для вашей отладочной платы \Projects\ваша плата\Applications\STemWin\STemWin_SampleDemo также для комфортной (хоть и крайне ограниченной) расстановки виджетов используйте GUIBuilder (в папке с проектами Cube я не находил, нашел в архиве STemWin_Library_V1.2.0) - он компилирует сишный файл, который удобно добавляется в проект StemWin. Другое дело, что в интернете крайне мало информации по добавлению функций к виджетам, чьих настроек нет в GUIBuilder (пока столкнуся с подменю в меню, но думаю, есть ещё камни)
  3. LTDC + ChromART в STM

    В точку!!! Огромное спасибо!!! ЧтоГдеКогда отдыхает! Лучшего подарка на день рождения я и придумать не мог!!!)) Reset действительно звонится с sdnwe, причем контроллер припаян нормально, видимо косяк платы, причём где-то под микроконтроллером))) А может ли в самом контролере замкнуть соседние ноги? Ура!!!! Заработало!!!! Дело было в косяке платы, слава богу, что контактов, а не переходного отверстия, что под микроконтроллером) Всем огромное спасибо за помощь, особеннно Uriy!!!
  4. LTDC + ChromART в STM

    Дело в том, что при наличии и отсутствии строчки pLayerCfg.FBStartAdress =(uint32_t)0xD0000000; ситуации следующие: При отсутствующей: Напряжение питания Линия reset При наличии строчки питание абсолютно не проседает, не прыгает, всё те же 3,301В, а в линии reset следующая картина: Попробовал адресовать видеобуфер на внутреннюю память - в линии reset всё спокойно, картинка отображается как надо. SDRAM выпаяна с STM32F429Discovery, подключена к контроллеру также. Стоит ли грешить на разводку платы- уж думаю, не влияет ли то, что микросхема sdram находиться под микроконтроллером, с обратной стороны платы?...
  5. LTDC + ChromART в STM

    Частота AHB 168 МГц Настройки я как только не менял, даже научным перебором попробовал). То, что осталось от моих рвений: void MX_FMC_Init(void) { FMC_SDRAM_TimingTypeDef SdramTiming; /** Perform the SDRAM1 memory initialization sequence // 168/2= 84 MHz, */ hsdram1.Instance = FMC_SDRAM_DEVICE; /* hsdram1.Init */ hsdram1.Init.SDBank = FMC_SDRAM_BANK2; hsdram1.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_8; hsdram1.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_12; hsdram1.Init.MemoryDataWidth = FMC_SDRAM_MEM_BUS_WIDTH_16; hsdram1.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4; hsdram1.Init.CASLatency = FMC_SDRAM_CAS_LATENCY_3; hsdram1.Init.WriteProtection = FMC_SDRAM_WRITE_PROTECTION_DISABLE; hsdram1.Init.SDClockPeriod = FMC_SDRAM_CLOCK_PERIOD_2; hsdram1.Init.ReadBurst = FMC_SDRAM_RBURST_ENABLE; hsdram1.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_2; /* SdramTiming */ SdramTiming.LoadToActiveDelay = 0x02; //TMRD SdramTiming.ExitSelfRefreshDelay = 0x07; //TXSR SdramTiming.SelfRefreshTime = 0x04; //TRAS SdramTiming.RowCycleDelay = 0x07; //TRC>TRFC SdramTiming.WriteRecoveryTime = 0x03; //TWR, TWR>=TRAS-TRCD, TWR>=TRC-TRCD-TRP SdramTiming.RPDelay = 0x02; // TRP SdramTiming.RCDDelay = 0x02; // TRCD if (HAL_SDRAM_Init(&hsdram1, &SdramTiming) != HAL_OK) { Error_Handler(); } /* Program the SDRAM external device */ SDRAM_Initialization_Sequence(&hsdram1, &command); /* Write data to the SDRAM memory */ for (uwIndex = 0; uwIndex < BUFFER_SIZE; uwIndex++) { aTxBuffer[uwIndex]=0xA102; *(uint32_t*) (SDRAM_BANK_ADDR + uwIndex*2)=aTxBuffer[uwIndex]; for (uint16_t ii=0;ii<10;ii++); } HAL_SDRAM_Read_16b(&hsdram1, (uint32_t*)SDRAM_BANK_ADDR, aTxBuffer, BUFFER_SIZE); /* Read back data from the SDRAM memory */ for (uwIndex = 0; uwIndex < BUFFER_SIZE; uwIndex++) { aRxBuffer[uwIndex] =*(uint32_t*) (SDRAM_BANK_ADDR + uwIndex*2); } //HAL_SDRAM_Write_16b(&hsdram1, (uint32_t*)SDRAM_BANK_ADDR, aRxBuffer, BUFFER_SIZE); HAL_Delay (10); /*##-3- Checking data integrity ############################################*/ for (uwIndex = 0; (uwIndex < BUFFER_SIZE) && (uwWriteReadStatus == 0); uwIndex++) { if (aRxBuffer[uwIndex] != aTxBuffer[uwIndex]) { uwWriteReadStatus++; } } if (uwWriteReadStatus) { /* KO */ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15,1); } else { /* OK */ } } void SDRAM_Initialization_Sequence(SDRAM_HandleTypeDef *hsdram, FMC_SDRAM_CommandTypeDef *Command) { __IO uint32_t tmpmrd =0; /* Step 3: Configure a clock configuration enable command */ Command->CommandMode = FMC_SDRAM_CMD_CLK_ENABLE; Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK2; Command->AutoRefreshNumber = 1; Command->ModeRegisterDefinition = 0; /* Send the command */ HAL_SDRAM_SendCommand(hsdram, Command, 0x1000); /* Step 4: Insert 100 ms delay */ HAL_Delay(100); /* Step 5: Configure a PALL (precharge all) command */ Command->CommandMode = FMC_SDRAM_CMD_PALL; Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK2; Command->AutoRefreshNumber = 1; Command->ModeRegisterDefinition = 0; /* Send the command */ HAL_SDRAM_SendCommand(hsdram, Command, 0x1000); /* Step 6 : Configure a Auto-Refresh command */ Command->CommandMode = FMC_SDRAM_CMD_AUTOREFRESH_MODE; Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK2; Command->AutoRefreshNumber = 8; Command->ModeRegisterDefinition = 0; /* Send the command */ HAL_SDRAM_SendCommand(hsdram, Command, 0x1000); /* Step 7: Program the external memory mode register */ tmpmrd = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_2 | SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL | SDRAM_MODEREG_CAS_LATENCY_3 | SDRAM_MODEREG_OPERATING_MODE_STANDARD | SDRAM_MODEREG_WRITEBURST_MODE_SINGLE; Command->CommandMode = FMC_SDRAM_CMD_LOAD_MODE; Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK2; Command->AutoRefreshNumber = 1; Command->ModeRegisterDefinition = tmpmrd; /* Send the command */ HAL_SDRAM_SendCommand(hsdram, Command, 0x1000); /* Step 8: Set the refresh rate counter */ /* (15.62 us x Freq) - 20 */ /* Set the device refresh counter */ HAL_SDRAM_ProgramRefreshRate(hsdram, 0x0569); } Пардоньте за жаргон. Резетами в линии я называю импульсы низкого уровня на линии reset микроконтроллера. Смотрю осциллоскопом (фото выше прилагал). То есть, когда я включаю инициализацию видеобуфера - с периодичностью 20 мс линия reset прижимается к земле; выключаю объявление видеобуфера - в линии reset спокойные 3.3В Хорошая мысль! Тоже думал, будто видеобуфер добегает до конца, стукается об стенку и перезагружается)) (уж извиняюсь, с помощью простых аналогий пытаюсь понять суть сложных вещей). На всякий случай вот код инициализации экрана, может здесь, конечно, накосячил #define LCD_LAYER1_WIDTH 790 #define LCD_LAYER1_HEIGHT 470 void MX_LTDC_Init(void) { LTDC_LayerCfgTypeDef pLayerCfg; LTDC_LayerCfgTypeDef pLayerCfg1; hltdc.Instance = LTDC; hltdc.Init.HSPolarity = LTDC_HSPOLARITY_AL; hltdc.Init.VSPolarity = LTDC_VSPOLARITY_AL; hltdc.Init.DEPolarity = LTDC_DEPOLARITY_AL; hltdc.Init.PCPolarity = LTDC_PCPOLARITY_IPC; hltdc.Init.HorizontalSync = 47; hltdc.Init.VerticalSync = 2; hltdc.Init.AccumulatedHBP = 87; hltdc.Init.AccumulatedVBP = 31; hltdc.Init.AccumulatedActiveW = 887; hltdc.Init.AccumulatedActiveH = 511; hltdc.Init.TotalWidth = 927; hltdc.Init.TotalHeigh = 524; hltdc.Init.Backcolor.Blue = 255; hltdc.Init.Backcolor.Green = 255; hltdc.Init.Backcolor.Red = 255; if (HAL_LTDC_Init(&hltdc) != HAL_OK) { Error_Handler(); } pLayerCfg.WindowX0 = 5; pLayerCfg.WindowX1 = 795; pLayerCfg.WindowY0 = 5; pLayerCfg.WindowY1 = 475; pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_RGB565; pLayerCfg.Alpha = 255; pLayerCfg.Alpha0 = 0; pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA; pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA; pLayerCfg.FBStartAdress =(uint32_t)0xD0000000; pLayerCfg.ImageWidth = LCD_LAYER1_WIDTH; pLayerCfg.ImageHeight = LCD_LAYER1_HEIGHT; pLayerCfg.Backcolor.Blue = 0; pLayerCfg.Backcolor.Green = 0; pLayerCfg.Backcolor.Red = 255; if (HAL_LTDC_ConfigLayer(&hltdc, &pLayerCfg, 0) != HAL_OK) { Error_Handler(); } }
  6. LTDC + ChromART в STM

    Тест памяти делаю после инициализации - заполняю буфер Tx, перевожу его в SDRAM, считываю, сравниваю - не проходит, дэбагер при отключенном указателе на видеобуфер запускается, в SDRAM следующая картина То есть, вроде как всё заполняется, но то тут, то там соскакивают ячейки, потом восстанавливаются. Напряжение 3,282-3,298В, сила тока 0,4 А при включенном экране, контроллере и SDRAM, что для микросхемы-стабилизатора TPS63060 - треть нагрузки
  7. LTDC + ChromART в STM

    Скачивал в своё время несколько программ для конвертации - Display's module image converter, Image2Code, Bitmap Converter, но ни в одной не видел ARGB4444 - сам использую RGB565 Модуль LTDC был проверен первым делом - background заливается без искажений нужным цветом, слои активируются в тех габаритах, как говорят. С flash на этой плате не запускал, только на предыдущей - слишком уж долго программа прошивается) Дебагер, к сожалению, обрывается, видимо из-за резетов в линии (это если видеобуфер объявлен в LTDC, без него в линии все прекрасно). Вывел на экран инкремент переменной раз в секунду - плюсуется 32 раза и выводится восьмёрка и залитый символ (при этом резеты присутствуют);дежурный светодиод при этом продолжает мерцать раз в секунду. Какая-то чертовщина, короче - резеты в линии, при этом картинка из SDRAM выводится практически идеально(присутствуют небольшие побочки), текст и числа на экран выводятся, переменная инкрементируется 32 раза, но при этом не обнуляется (то есть вроде как программа не перезапускается). Покопался в errdata, ревизия контроллера 3, если не ошибаюсь (ID 0x2BA01477), так что по идее, проблем с FMC и обращением к динамической, а потом статической памяти быть не должно...
  8. LTDC + ChromART в STM

    Ещё раз прошу помощи у Умов по поводу своей писанины. Переделал плату, поставил stm32f429b 208ногий и sdram is42s16800 - 16Мб, произвёл успешную инициализацию всех модулей с помощью cube (уж извиняюсь за ламерство, но уж слишком много всего инициализировать). Инициализировал видеобуфер на sdram (0xD0000000), вроде бы даже заполнил нужные области и вывел текст. Но микроконтроллер постоянно прижимает резет, картинка выводится, но дёргается, заливается с искажениями. Аппаратно всё проверил, перепаял все пины и конденсаторы. Когда отключаю инициализацию буфера слоя экрана - резеты прекращаются. Частота микроконтроллера - 168 Мгц тайминги озу следующие Код инициализации SDRAM void MX_FMC_Init(void) { FMC_SDRAM_TimingTypeDef SdramTiming; /** Perform the SDRAM1 memory initialization sequence // 168/2= 84 MHz, */ hsdram1.Instance = FMC_SDRAM_DEVICE; /* hsdram1.Init */ hsdram1.Init.SDBank = FMC_SDRAM_BANK2; hsdram1.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_8; hsdram1.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_12; hsdram1.Init.MemoryDataWidth = FMC_SDRAM_MEM_BUS_WIDTH_16; hsdram1.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4; hsdram1.Init.CASLatency = FMC_SDRAM_CAS_LATENCY_2; hsdram1.Init.WriteProtection = FMC_SDRAM_WRITE_PROTECTION_DISABLE; hsdram1.Init.SDClockPeriod = FMC_SDRAM_CLOCK_PERIOD_2; hsdram1.Init.ReadBurst = FMC_SDRAM_RBURST_DISABLE; hsdram1.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_1; /* SdramTiming */ SdramTiming.LoadToActiveDelay = 0x02; //TMRD SdramTiming.ExitSelfRefreshDelay = 0x06; //TXSR SdramTiming.SelfRefreshTime = 0x04; //TRAS SdramTiming.RowCycleDelay = 0x06; //TRC>TRFC SdramTiming.WriteRecoveryTime = 0x02; //TWR, TWR>=TRAS-TRCD, TWR>=TRC-TRCD-TRP SdramTiming.RPDelay = 0x02; // TRP SdramTiming.RCDDelay = 0x02; // TRCD if (HAL_SDRAM_Init(&hsdram1, &SdramTiming) != HAL_OK) { Error_Handler(); } /* Program the SDRAM external device */ SDRAM_Initialization_Sequence(&hsdram1, &command); } void SDRAM_Initialization_Sequence(SDRAM_HandleTypeDef *hsdram, FMC_SDRAM_CommandTypeDef *Command) { __IO uint32_t tmpmrd =0; /* Step 3: Configure a clock configuration enable command */ Command->CommandMode = FMC_SDRAM_CMD_CLK_ENABLE; Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK2; Command->AutoRefreshNumber = 1; Command->ModeRegisterDefinition = 0; /* Send the command */ HAL_SDRAM_SendCommand(hsdram, Command, 0x1000); /* Step 4: Insert 100 ms delay */ HAL_Delay(100); /* Step 5: Configure a PALL (precharge all) command */ Command->CommandMode = FMC_SDRAM_CMD_PALL; Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK2; Command->AutoRefreshNumber = 1; Command->ModeRegisterDefinition = 0; /* Send the command */ HAL_SDRAM_SendCommand(hsdram, Command, 0x1000); /* Step 6 : Configure a Auto-Refresh command */ Command->CommandMode = FMC_SDRAM_CMD_AUTOREFRESH_MODE; Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK2; Command->AutoRefreshNumber = 4; Command->ModeRegisterDefinition = 0; /* Send the command */ HAL_SDRAM_SendCommand(hsdram, Command, 0x1000); /* Step 7: Program the external memory mode register */ tmpmrd = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_2 | SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL | SDRAM_MODEREG_CAS_LATENCY_2 | SDRAM_MODEREG_OPERATING_MODE_STANDARD | SDRAM_MODEREG_WRITEBURST_MODE_SINGLE; Command->CommandMode = FMC_SDRAM_CMD_LOAD_MODE; Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK2; Command->AutoRefreshNumber = 1; Command->ModeRegisterDefinition = tmpmrd; /* Send the command */ HAL_SDRAM_SendCommand(hsdram, Command, 0x1000); /* Step 8: Set the refresh rate counter */ /* (15.62 us x Freq) - 20 */ /* Set the device refresh counter */ HAL_SDRAM_ProgramRefreshRate(hsdram, 1542); HAL_SDRAM_ProgramRefreshRate(hsdram, 671); } Работаю с памятью напрямую, без dma void LCD_PutPixel (uint16_t x, uint16_t y, uint16_t color) { TM_SDRAM_Write16((x+y*LCD_LAYER1_WIDTH)*2, color); } Уже всё голову в кровь разбил, перечитал кучу тем, а собрать всё воедино не получается. Может ошибка в инициализации sdram- использовал примеры для discovery с адаптацией под свою плату(там 8Мб, а у меня -- 16), но не пойму, где именно. Может встречался кто-то с подобной проблемой, или просто у кого мысли есть - был бы признателен. PS. Перепаял IS42 на микросхему с Discovery, перенастроил тайминги, результат аналогичный(
  9. Увольтесь-с, как можно обидеть конструктивной критикой, тем более в форуме) Просто делюсь личными шишками на голове от проб домашней 3d печати. Прототипирование - тоже неотъемлемый процесс, так сказать, жизненного цикла изделия, и 3д принтер, в настоящий момент, максимально удобный инструмент. Если партия небольшая - то можно на максимальных настройках печати и последующей финишной обработкой получить вполне продаваемые корпуса (можно, опять же, сделать двухкомпонентный корпус-я свой корпус с фотки снаружи хочу обтянуть резиновым пластиком). Теперь понятно, почему его в ашане не продают) - купил на южнопортовом авторынке пятилитровую канистру, там слова прекурсор никто не слышал) Кстати, хозяину на заметку - медицинский спирт в пятилитровых канистрах от товарища Брынцалова тоже можно легко купить в интернете по сходной цене в один Ярославль.
  10. Ну во-первых, 3d принтер в первую очередь и нужен для прототипирования - при изготовлении серии изделий себестоимость слишком высока и время изготовления чересчур долгое. Во-вторых, существует технология финишной обработки ABS детали в парах ацетона - сам не делал, но в интернете достаточно всё хорошо описано - деталь получается глянцевой и более крепкой. В-третьих, можно играть с настройками печати. В-четвёртых, но не по важности - профессионализм и опыт печатающего - существует много ньюансов, связанных с конфигурацией детали, короблением и усадкой пластика, качеством первого слоя и прочими хренотенями (у меня первый месяц вообще почти ничего не получалось). Но, поверьте мне, несмотря на все трудности, принтер гораздо приятнее, чем подбор стандартного корпуса с вписыванием платы в его габариты и последующим вырезанием отверстий и окон, хоть и добавляется этап 3d моделирования.
  11. LTDC + ChromART в STM

    почему-то, когда они не нулевые, картинка вообще безобразная Пытался выставлять 380х280
  12. LTDC + ChromART в STM

    #define PIXELWIDHT 2 #define LCD_WIDTH 800 #define LCD_HEIGHT 480 #define HFP 40 #define HSYNC 48 #define HBP 40 #define VFP 13 #define VSYNC 3 #define VBP 29 #define ACTIVE_W (HSYNC + LCD_WIDTH + HBP - 1) #define ACTIVE_H (VSYNC + LCD_HEIGHT + VBP - 1) #define DISP_ACCUM_HORIZ_BACKPORCH (HSYNC + HBP - 1) #define DISP_ACCUM_VERT_BACKPORCH (VSYNC + VBP - 1) #define TOTAL_WIDTH (HSYNC + HBP + LCD_WIDTH + HFP - 1) #define TOTAL_HEIGHT (VSYNC + VBP + LCD_HEIGHT + VFP - 1) uint16_t aBufferResult[95000]; void Screen_Init(void) { LTDC_HandleTypeDef displayTypeDef; LTDC_LayerCfgTypeDef displayLayer1; LTDC_LayerCfgTypeDef displayLayer2; GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5| GPIO_PIN_6|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; GPIO_InitStruct.Alternate = 14; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_10| GPIO_PIN_11; HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1| GPIO_PIN_2|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_9|GPIO_PIN_10; HAL_GPIO_Init(GPIOI, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3| GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_1 4|GPIO_PIN_15; HAL_GPIO_Init(GPIOH, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_12; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_12, 1); __LTDC_CLK_ENABLE(); // PLL /* LCD clock configuration */ /* PLLSAI_VCO Input = HSE_VALUE/PLL_M = 1 MHz */ /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN = 192 MHz */ /* PLLLCDCLK = PLLSAI_VCO Output/PLLSAIR = 192/5 = 38.4 MHz */ /* LTDC clock frequency = PLLLCDCLK / LTDC_PLLSAI_DIVR_4 = 38.4/4 = 9.6MHz */ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC; PeriphClkInitStruct.PLLSAI.PLLSAIN = 192; PeriphClkInitStruct.PLLSAI.PLLSAIR = 5; PeriphClkInitStruct.PLLSAIDivR = RCC_PLLSAIDIVR_4; HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct); // enable clock for LTDC RCC->APB2ENR |= RCC_APB2ENR_LTDCEN; // LTDC HAL_LTDC_Init(&displayTypeDef); displayTypeDef.Instance = LTDC; displayTypeDef.Init.HSPolarity = LTDC_HSPOLARITY_AL; displayTypeDef.Init.VSPolarity = LTDC_VSPOLARITY_AL; displayTypeDef.Init.DEPolarity = LTDC_DEPOLARITY_AL; displayTypeDef.Init.PCPolarity = LTDC_PCPOLARITY_IPC; displayTypeDef.Init.HorizontalSync = HSYNC-1; displayTypeDef.Init.VerticalSync = VSYNC-1; displayTypeDef.Init.AccumulatedHBP = DISP_ACCUM_HORIZ_BACKPORCH; displayTypeDef.Init.AccumulatedVBP = DISP_ACCUM_VERT_BACKPORCH; displayTypeDef.Init.AccumulatedActiveW = ACTIVE_W; displayTypeDef.Init.AccumulatedActiveH = ACTIVE_H; displayTypeDef.Init.TotalWidth = TOTAL_WIDTH; displayTypeDef.Init.TotalHeigh = TOTAL_HEIGHT; displayTypeDef.Init.Backcolor.Blue = 200; displayTypeDef.Init.Backcolor.Green = 0; displayTypeDef.Init.Backcolor.Red = 200; HAL_LTDC_Init(&displayTypeDef); // Layer 1 displayLayer1.WindowX0 = 210; displayLayer1.WindowX1 = 590; displayLayer1.WindowY0 = 100; displayLayer1.WindowY1 = 380; displayLayer1.PixelFormat = LTDC_PIXEL_FORMAT_ARGB4444; displayLayer1.Alpha = 255; displayLayer1.Alpha0 = 250; displayLayer1.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA; displayLayer1.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA; displayLayer1.FBStartAdress = (uint32_t)&aBufferResult; displayLayer1.ImageWidth = 0; displayLayer1.ImageHeight = 0; displayLayer1.Backcolor.Blue = 250; displayLayer1.Backcolor.Green = 0; displayLayer1.Backcolor.Red = 200; HAL_LTDC_ConfigLayer(&displayTypeDef, &displayLayer1, 0); } static void DMA2D_Config(void) { __HAL_RCC_DMA2D_CLK_ENABLE(); /* Register to memory mode with ARGB4444 as colorMode */ Dma2dHandle.Init.Mode = DMA2D_R2M; Dma2dHandle.Init.ColorMode = DMA2D_ARGB4444; Dma2dHandle.Init.OutputOffset = 0x0; Dma2dHandle.XferCpltCallback = TransferComplete; Dma2dHandle.XferErrorCallback = TransferError; Dma2dHandle.Instance = DMA2D; /* DMA2D Initialization */ if(HAL_DMA2D_Init(&Dma2dHandle) != HAL_OK) { } } static void _DMA_Fill(void * pDst, int xSize, int ySize, int OffLine, uint32_t ColorIndex) { DMA2D->CR = 0x00030000UL | (1 << 9); // Register to memory and TCIE DMA2D->OCOLR = ColorIndex; // Color to be used DMA2D->OMAR = (uint32_t)pDst; // Destination address DMA2D->OOR = OffLine; // Destination line offset DMA2D->OPFCCR = 4; // Defines the number of pixels to be transfered DMA2D->NLR = ((uint32_t)xSize << 16) | ySize; // Size configuration of area to be transfered DMA2D->CR |= 1; // Start operation // // Wait until transfer is done // while (DMA2D->CR & DMA2D_CR_START) { //__WFI(); // Sleep until next interrupt } _DMA_Fill(aBufferResult+10, 10, 10, 0, 0x1F0A); _DMA_Fill(aBufferResult+200, 20, 2, 0, 0x1C01); _DMA_Fill(aBufferResult+300, 50, 20, 0, 0xF0F0);
  13. Ну, во-первых, смотря чем печатать. Допустим, PLA пластик не пахнет, другое дело, что для корпусов он не особо годиться. Есть марки ABS, которые тоже не шибко пахнут, тем более, если печатать на нижней границе температуры плавления. Во-вторых, из металлоконструкции от палатки и полиэтилена сооружается вполне приемлемый бокс для принтера, с вытяжкой в форточку. Планирую маленький принтер дома в таком боксе тоже поставить - в жилых домах электричество дешевле. P.S. Извиняюсь, за оффтоп))
  14. LTDC + ChromART в STM

    Именно так и сделал - задал массив aBufferResult при инициализации слоя 1, сделал заполнение 2х областей. Дык, всё равно заливаются линии, а не области! Видимо, прокладка между рулём и сиденьем износилась) Подскажите, пожалуйста, как корректно задать видеобуфер - видимо я это совсем через пень-колоду делаю.
  15. Ну не совсем дома - в гараже) С вытяжкой хорошей, в боксе
×
×
  • Создать...