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

STM32H743. Нет ли у меня какой ошибки в тактировании?

Друзья, в ходе работы с контроллером STM32H743 образовались две некритические проблемы, которые я до поры отложил в долгий ящик.  Это срыв развертки дисплея и медленная скорость работы с QSPI.

При работе с дисплеем грешил на тайминги, на сам дисплей и прочее, пока не обратил внимание на тот факт, что подозрительно похожи частоты, на которых начинаются проблемы как с QSPI, так и с дисплеем. Это 34-35 МГц.  То есть, на этой частоте QSPI в режиме MappedMode не выдает данные, а при установке такой частоты пиксельклока срывается, а потом и вовсе пропадает развертка.

Похоже, что  у обеих этих проблем есть общий корень.

К сожалению, моему осциллографу не по силам такие частоты, я уже решился приобрести хороший, но в руках он у меня окажется не скоро.  

Поэтому возникает мысль, а может у меня есть ошибка, которую видно невооруженным глазом.

Посмотрите на мое тактирование - не в нем ли проблемы? Может я режимы несовместимые выбрал или еще что-то.....

QSPI тактируется от PLL2R  (210 МГЦ, далее prescaler 5, итого частота 210/(5+1)=35 МГц)

Pixelclock тактируется от PLL3R

 

 

xeB7CNiG.png?download=1

 

 

Код настройки тактирования такой 

	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();
  }
  
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Io compensation cell ?

HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1)

Scale0?

 


 
Изменено пользователем GenaSPB

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сейчас попробую. 

Да, ЕЩЕ ОДНА НЕМАЛОВАЖНАЯ ДЕТАЛЬ!

В F746 камне такая же проблема была с дисплеем, но QSPI работало нормально. В 746 камне QSPI тактировалось жестко от AHB.

В H743  камне QSPI переехала на PLL1, PLL2 и проблема появилась. Правда она еще и от HCLK3 может тактироваться, но я пробовал, проблема та же.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1)
Изменено пользователем GenaSPB

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вставил код

	 /*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 - не помогло.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

21 минуту назад, MementoMori сказал:

В F746 камне такая же проблема была с дисплеем

В смысле дисплей работает на 35 МГц? На LTDC или как?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дисплей работает на LTDC.

Настраиваю частоту Pixelclock.  Выше 35 МГц  - сначала линии съезжают относительно друг друга по горизонтали, изображение дергается, а потом и вовсе корежится и пропадает. 

 

Сам дисплей по даташиту требует 40-62 МГЦ, по факту он заводится уже на 25МГц и прекрасно работает, только мерцает. Попытка поднять частоту приводит к срыву развертки. Пробовал на 3-х разных дисплеях, частота срыва одна и та же. Так что подозреваю проблемы клока со стороны контроллера.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, MementoMori сказал:

Дисплей работает на LTDC.

Тоже заказал и еще не пришел дисплей для 743IIT6-го.

 

2 часа назад, MementoMori сказал:

Сам дисплей по даташиту требует 40-62 МГЦ

А что такой диапазон частот большой? Конкретной частоты нет что ли? DMA2D в коде, при этих мерцаниях и срывах, используется?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, AleksBak said:

что такой диапазон частот большой?

См. Даташит. Почему так - не знаю, но, полагаю, что это хорошо. 

 

1 hour ago, AleksBak said:

DMA2D в коде, при этих мерцаниях и срывах, используется

Дма тут ни причём. Уж на срыв тактирования qspi он точно не влияет. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

у меня была похожая проблема, у меня дело было в низкой скорости gpio, было Low, поставил medium помогло

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

PLL там конденсаторы нужны. У вас схема нормально сделана, по руководству? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 minutes ago, ViKo said:

PLL там конденсаторы нужны. У вас схема нормально сделана, по руководству? 

Да, по руководству

gNLoy9k0.png?download=1

 

Трассировка

 

nl0veVIk.png?download=1

 

MNRYBYT0.png?download=1

 

Давайте так, если не в порядке конденсаторы или что либо, влияющее на PLL - как должно проявляться?  У меня просадок и пульсаций на VCAP нет. Напряжение на VCAP 1.3 вольт.

Я заказал себе таки осциллограф HANTEK (мой нынешний выше 100 кГц не воспринимает), приедет - посмотрю что на линиях клока есть при превышении частот. Если клока тупо нет или он дефективен, тогда понятно - проблемы с PLL. А если он есть - тогда я даже и не знаю что думать....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 minutes ago, MementoMori said:

Да, по руководству

.......

Трассировка

.......

Уж очень далеко С25 и С26 от ножек.

Да и 1206 нет необходимости ставить. Для таких номиналов 0603 вполне доступны и ставить их вплотную к ножкам микроконтроллера.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...