MementoMori 4 22 августа, 2020 Опубликовано 22 августа, 2020 · Жалоба Друзья, в ходе работы с контроллером STM32H743 образовались две некритические проблемы, которые я до поры отложил в долгий ящик. Это срыв развертки дисплея и медленная скорость работы с QSPI. При работе с дисплеем грешил на тайминги, на сам дисплей и прочее, пока не обратил внимание на тот факт, что подозрительно похожи частоты, на которых начинаются проблемы как с QSPI, так и с дисплеем. Это 34-35 МГц. То есть, на этой частоте QSPI в режиме MappedMode не выдает данные, а при установке такой частоты пиксельклока срывается, а потом и вовсе пропадает развертка. Похоже, что у обеих этих проблем есть общий корень. К сожалению, моему осциллографу не по силам такие частоты, я уже решился приобрести хороший, но в руках он у меня окажется не скоро. Поэтому возникает мысль, а может у меня есть ошибка, которую видно невооруженным глазом. Посмотрите на мое тактирование - не в нем ли проблемы? Может я режимы несовместимые выбрал или еще что-то..... QSPI тактируется от PLL2R (210 МГЦ, далее prescaler 5, итого частота 210/(5+1)=35 МГц) Pixelclock тактируется от PLL3R Код настройки тактирования такой void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; /** Supply configuration update enable */ HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY); /** Configure the main internal regulator output voltage */ __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {} /** Macro to configure the PLL clock source */ __HAL_RCC_PLL_PLLSOURCE_CONFIG(RCC_PLLSOURCE_HSE); /** Initializes the CPU, AHB and APB busses clocks */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = 8; RCC_OscInitStruct.PLL.PLLN = 400; RCC_OscInitStruct.PLL.PLLP = 2; RCC_OscInitStruct.PLL.PLLQ = 2; RCC_OscInitStruct.PLL.PLLR = 2; RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_0; RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE; RCC_OscInitStruct.PLL.PLLFRACN = 0; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /** Initializes the CPU, AHB and APB busses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2 |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2; RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2; RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2; RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) { Error_Handler(); } PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC|RCC_PERIPHCLK_UART7 |RCC_PERIPHCLK_SPI3|RCC_PERIPHCLK_SDMMC |RCC_PERIPHCLK_ADC|RCC_PERIPHCLK_I2C1 |RCC_PERIPHCLK_QSPI|RCC_PERIPHCLK_FMC; PeriphClkInitStruct.PLL2.PLL2M = 8; PeriphClkInitStruct.PLL2.PLL2N = 426; PeriphClkInitStruct.PLL2.PLL2P = 2; PeriphClkInitStruct.PLL2.PLL2Q = 2; PeriphClkInitStruct.PLL2.PLL2R = 2; PeriphClkInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_0; // Диапазон 1-2 МГц PeriphClkInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE; PeriphClkInitStruct.PLL2.PLL2FRACN = 0; PeriphClkInitStruct.PLL3.PLL3M = 8; PeriphClkInitStruct.PLL3.PLL3N = 280; PeriphClkInitStruct.PLL3.PLL3P = 2; PeriphClkInitStruct.PLL3.PLL3Q = 2; PeriphClkInitStruct.PLL3.PLL3R = 8; PeriphClkInitStruct.PLL3.PLL3RGE = RCC_PLL3VCIRANGE_0; //Диапазон 1-2 МГц PeriphClkInitStruct.PLL3.PLL3VCOSEL = RCC_PLL3VCOWIDE; PeriphClkInitStruct.PLL3.PLL3FRACN = 0; PeriphClkInitStruct.FmcClockSelection = RCC_FMCCLKSOURCE_PLL; PeriphClkInitStruct.QspiClockSelection = RCC_QSPICLKSOURCE_PLL2; PeriphClkInitStruct.SdmmcClockSelection = RCC_SDMMCCLKSOURCE_PLL; PeriphClkInitStruct.Spi123ClockSelection = RCC_SPI123CLKSOURCE_PLL; PeriphClkInitStruct.Usart234578ClockSelection = RCC_USART234578CLKSOURCE_D2PCLK1; PeriphClkInitStruct.I2c123ClockSelection = RCC_I2C123CLKSOURCE_D2PCLK1; PeriphClkInitStruct.AdcClockSelection = RCC_ADCCLKSOURCE_PLL2; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) { Error_Handler(); } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 22 августа, 2020 Опубликовано 22 августа, 2020 (изменено) · Жалоба Io compensation cell ? HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1) Scale0? Изменено 22 августа, 2020 пользователем GenaSPB Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 22 августа, 2020 Опубликовано 22 августа, 2020 · Жалоба Сейчас попробую. Да, ЕЩЕ ОДНА НЕМАЛОВАЖНАЯ ДЕТАЛЬ! В F746 камне такая же проблема была с дисплеем, но QSPI работало нормально. В 746 камне QSPI тактировалось жестко от AHB. В H743 камне QSPI переехала на PLL1, PLL2 и проблема появилась. Правда она еще и от HCLK3 может тактироваться, но я пробовал, проблема та же. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 22 августа, 2020 Опубликовано 22 августа, 2020 · Жалоба Хотя scale0 может нужно для 480 МГц а у Вас 400 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 22 августа, 2020 Опубликовано 22 августа, 2020 · Жалоба 1 minute ago, GenaSPB said: Хотя scale0 может нужно для 480 МГц а у Вас 400 Это где? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 22 августа, 2020 Опубликовано 22 августа, 2020 (изменено) · Жалоба HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1) Изменено 22 августа, 2020 пользователем GenaSPB Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 22 августа, 2020 Опубликовано 22 августа, 2020 · Жалоба Вставил код /*activate CSI clock mondatory for I/O Compensation Cell*/ __HAL_RCC_CSI_ENABLE() ; /* Enable SYSCFG clock mondatory for I/O Compensation Cell */ __HAL_RCC_SYSCFG_CLK_ENABLE() ; /* Enables the I/O Compensation Cell */ HAL_EnableCompensationCell(); поигрался со scale0, scale1 - не помогло. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AleksBak 0 22 августа, 2020 Опубликовано 22 августа, 2020 · Жалоба 21 минуту назад, MementoMori сказал: В F746 камне такая же проблема была с дисплеем В смысле дисплей работает на 35 МГц? На LTDC или как? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 22 августа, 2020 Опубликовано 22 августа, 2020 · Жалоба Дисплей работает на LTDC. Настраиваю частоту Pixelclock. Выше 35 МГц - сначала линии съезжают относительно друг друга по горизонтали, изображение дергается, а потом и вовсе корежится и пропадает. Сам дисплей по даташиту требует 40-62 МГЦ, по факту он заводится уже на 25МГц и прекрасно работает, только мерцает. Попытка поднять частоту приводит к срыву развертки. Пробовал на 3-х разных дисплеях, частота срыва одна и та же. Так что подозреваю проблемы клока со стороны контроллера. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AleksBak 0 22 августа, 2020 Опубликовано 22 августа, 2020 · Жалоба 2 часа назад, MementoMori сказал: Дисплей работает на LTDC. Тоже заказал и еще не пришел дисплей для 743IIT6-го. 2 часа назад, MementoMori сказал: Сам дисплей по даташиту требует 40-62 МГЦ А что такой диапазон частот большой? Конкретной частоты нет что ли? DMA2D в коде, при этих мерцаниях и срывах, используется? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 22 августа, 2020 Опубликовано 22 августа, 2020 · Жалоба 1 hour ago, AleksBak said: что такой диапазон частот большой? См. Даташит. Почему так - не знаю, но, полагаю, что это хорошо. 1 hour ago, AleksBak said: DMA2D в коде, при этих мерцаниях и срывах, используется Дма тут ни причём. Уж на срыв тактирования qspi он точно не влияет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dr.v 0 23 августа, 2020 Опубликовано 23 августа, 2020 · Жалоба у меня была похожая проблема, у меня дело было в низкой скорости gpio, было Low, поставил medium помогло Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 23 августа, 2020 Опубликовано 23 августа, 2020 · Жалоба PLL там конденсаторы нужны. У вас схема нормально сделана, по руководству? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 23 августа, 2020 Опубликовано 23 августа, 2020 · Жалоба 11 minutes ago, ViKo said: PLL там конденсаторы нужны. У вас схема нормально сделана, по руководству? Да, по руководству Трассировка Давайте так, если не в порядке конденсаторы или что либо, влияющее на PLL - как должно проявляться? У меня просадок и пульсаций на VCAP нет. Напряжение на VCAP 1.3 вольт. Я заказал себе таки осциллограф HANTEK (мой нынешний выше 100 кГц не воспринимает), приедет - посмотрю что на линиях клока есть при превышении частот. Если клока тупо нет или он дефективен, тогда понятно - проблемы с PLL. А если он есть - тогда я даже и не знаю что думать.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 63 23 августа, 2020 Опубликовано 23 августа, 2020 · Жалоба 2 minutes ago, MementoMori said: Да, по руководству ....... Трассировка ....... Уж очень далеко С25 и С26 от ножек. Да и 1206 нет необходимости ставить. Для таких номиналов 0603 вполне доступны и ставить их вплотную к ножкам микроконтроллера. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться