Не запускается умножитель тактовой частоты STM32F407ZGT6

Кто любит RISC в жизни, заходим, не стесняемся.
Ледокот
Открыл глаза
Сообщения: 71
Зарегистрирован: Пт апр 22, 2011 18:41:48
Контактная информация:

Не запускается умножитель тактовой частоты STM32F407ZGT6

Сообщение Ледокот »

Уважаемые коллеги, всем здравствуйте! :)

Возникла проблема с настройкой умножителя тактовой частоты микроконтроллера STM32F407ZGT6. После включения бита PLL_ON в регистре PLL_CFGR не происходит установка бита PLL_RDY в этом же регистре.
При этом раньше код работал, а потом вдруг перестал. На всякий случай проосциллографировал напряжение на выводах питания - всё в пределах нормы. Что ещё может мешать ему настроить PLL - ума не приложу.

Настраиваю от HSI. HSE тоже имеется, но он тоже не запускается, возможно, по той же причине, что и PLL (в данный момент HSE не запущен и на выводах микроконтроллера, подключенных к HSE, осциллограф показывает GND)

Изначальное под подозрением был вышедший из за воздействия статического (или какого-то другого) электричества микроконтроллер, но после перепайки ничего не изменилось.

Код настройки прилагаю.

Код: Выделить всё

void InitRCC (void) {
	dummy_loop(100000);
	// Увеличиваем задержку чтения из Flash перед повышением тактовой частоты
	FLASH->ACR |= ( 7 << FLASH_ACR_LATENCY_Pos );
	for ( Iteration1 = 0; Iteration1 < 100000; Iteration1++ );
 	// Настраивааем умножитель тактовой частоты
	RCC->PLLCFGR = ( 2 << 28 ) | ( 8 << RCC_PLLCFGR_PLLM_Pos ) | ( 96 << RCC_PLLCFGR_PLLN_Pos ) | ( 0 << RCC_PLLCFGR_PLLP_Pos) | ( 4 << RCC_PLLCFGR_PLLQ_Pos );
	for ( Iteration1 = 0; Iteration1 < 100000; Iteration1++ );
	RCC->CR |= ( 1 << RCC_CR_PLLON_Pos ); // Включаем умножитель тактовой частоты
	for ( Iteration1 = 0; Iteration1 < 100000; Iteration1++ );

	/********************************************/
	/* ЗДЕСЬ ПРОИСХОДИТ ЗАВИСАНИЕ ПРОГРАММЫ !!! */
	/********************************************/
	while (((RCC->CR)&(1<<RCC_CR_PLLRDY_Pos)) == 0) {} // Ожидаем готовности умножителя тактовой частоты <--- ЗДЕСЬ ПРОИСХОДИТ ЗАВИСАНИЕ ПРОГРАММЫ

	for ( Iteration1 = 0; Iteration1 < 100000; Iteration1++ );
	// Switch clock source from HSI16 on PLL
	RCC->CFGR = ( 2 << RCC_CFGR_SW_Pos ); // Переключаем тактирование ядра с HSI16 на PLL
	for ( Iteration1 = 0; Iteration1 < 100000; Iteration1++ );
	RCC->AHB1ENR |= ( 1 << RCC_AHB1ENR_GPIOAEN_Pos) | ( 1 << RCC_AHB1ENR_GPIOBEN_Pos )| ( 1 << RCC_AHB1ENR_GPIOCEN_Pos) | ( 1 << RCC_AHB1ENR_GPIODEN_Pos ) | ( 1 << RCC_AHB1ENR_GPIOEEN_Pos ) | ( 1 << RCC_AHB1ENR_GPIOFEN_Pos ) | ( 1 << RCC_AHB1ENR_CCMDATARAMEN_Pos );
	for ( Iteration1 = 0; Iteration1 < 100000; Iteration1++ );
	RCC->APB1ENR |= ( 1 << RCC_APB1ENR_TIM4EN_Pos ) | ( 1 << RCC_APB1ENR_TIM3EN_Pos) | ( 1 << RCC_APB1ENR_TIM2EN_Pos ) | ( 1 << RCC_APB1ENR_DACEN_Pos );
	for ( Iteration1 = 0; Iteration1 < 100000; Iteration1++ );
	RCC->APB2ENR = ( 1 << RCC_APB2ENR_ADC1EN_Pos ) | ( 1 << RCC_APB2ENR_ADC2EN_Pos ) | ( 1 << RCC_APB2ENR_ADC3EN_Pos );
	for ( Iteration1 = 0; Iteration1 < 100000; Iteration1++ );
}
З.Ы. Прошу прощения за созданные четыре темы - я не виноват. При создании темы получал сообщение вроде "Ошибка выполнения SQL-запроса, попробуйте ещё раз бла-бла-бла". Ну я и пробовал ещё раз. Как теперь удалить три лишние сообщения не знаю.
Если я где-то ошибаюсь, прошу от меня этого не скрывать. Заранее очень признателен :)
Реклама
tonyk
Это не хвост, это антенна
Сообщения: 1320
Зарегистрирован: Вт ноя 19, 2019 06:10:18

Re: Не запускается умножитель тактовой частоты STM32F407ZGT6

Сообщение tonyk »

У меня сделано так:
Спойлер

Код: Выделить всё

////////////////////////////////////////////////////////////////////////////////

int __low_level_init(void)
{
    __disable_irq();

    // Настройка FLASH
    FLASH -> ACR = \
        FLASH_ACR_PRFTEN    |
        FLASH_ACR_ICEN      |
        FLASH_ACR_DCEN      |
        FLASH_ACR_LATENCY_5WS;

    // Тактирование ------------------------------------------------------------
    // Включаем HSE = 8 MHz
    RCC -> CR = _VAL2FLD( RCC_CR_HSITRIM, 16 ) | RCC_CR_HSION | RCC_CR_HSEON;

    while( !( RCC -> CR & RCC_CR_HSERDY ) )
    {};

    // Задаём источники тактирования и прескалеры SYSCLK = 168 МГц  USB = 48 МГц
    RCC -> PLLCFGR = \
        RCC_PLLCFGR_PLLSRC_HSE              |
        _VAL2FLD( RCC_PLLCFGR_PLLQ, 7 )     |
        _VAL2FLD( RCC_PLLCFGR_PLLN, 336 )   |
        _VAL2FLD( RCC_PLLCFGR_PLLM , 8 )    |
        RCC_PLLCFGR_PLLP_div2;

    RCC -> CR = \
        _VAL2FLD( RCC_CR_HSITRIM, 16 )  |
        RCC_CR_HSION |
        RCC_CR_HSEON |
        RCC_CR_PLLON;   //Включаем PLL

    while( !( RCC -> CR & RCC_CR_PLLRDY ) )
    {};

    // Переключаемся на PLL с установленнными ранее прескалерами
    RCC -> CFGR = \
        RCC_CFGR_MCO2_HSE               |
        RCC_CFGR_MCO2PRE_div1           |
        RCC_CFGR_MCO1PRE_div1           |
        RCC_CFGR_I2SSRC_PLLI2S          |
        RCC_CFGR_MCO1_HSE               |
        _VAL2FLD( RCC_CFGR_RTCPRE, 8 )  |
        //_VAL2FLD( RCC_CFGR_PPRE2, 0x04 )|   // /2
        //_VAL2FLD( RCC_CFGR_PPRE1, 0x05 )|   // /4
        RCC_CFGR_PPRE2_DIV1             |
        RCC_CFGR_PPRE1_DIV2             |
        RCC_CFGR_HPRE_DIV1              |
        RCC_CFGR_SW_PLL;

    SystemCoreClock = 168'000'000;

    RCC-> CR = \
        _VAL2FLD( RCC_CR_HSITRIM, 16 )  |
        RCC_CR_HSEON                    |
        RCC_CR_PLLON;                       // Выключаем HSI

    #ifdef __DEBUG_SRAM__
    
      SYSCFG->MEMRMP = 3;  //0x20000000 -> 0x00000000

    #endif
     
  return( 1 );
}

////////////////////////////////////////////////////////////////////////////////
Реклама
Adrift
Вымогатель припоя
Сообщения: 553
Зарегистрирован: Вт окт 01, 2024 15:22:33

Re: Не запускается умножитель тактовой частоты STM32F407ZGT6

Сообщение Adrift »

[uquote="Ледокот",url="/forum/viewtopic.php?p=4645665#p4645665"]

Код: Выделить всё

	FLASH->ACR |= ( 7 << FLASH_ACR_LATENCY_Pos );
	for ( Iteration1 = 0; Iteration1 < 100000; Iteration1++ );
[/uquote]
ACR по умолчанию равно трем, если, допустим, таким образом туда писать 4, то получим 7... Цикл бесполезен, оптимизатор его все равно выкинет, нужно проверять именно поле ACR до тех пор пока оттуда не станет читаться записанное значение.
Ледокот писал(а):

Код: Выделить всё

	RCC->PLLCFGR = ( 2 << 28 ) | ( 8 << RCC_PLLCFGR_PLLM_Pos ) | ( 96 << RCC_PLLCFGR_PLLN_Pos ) | ( 0 << RCC_PLLCFGR_PLLP_Pos) | ( 4 << RCC_PLLCFGR_PLLQ_Pos );
Что такое (2 << 28)? Последние 4 бита регистра - Reserved.
Ледокот писал(а):

Код: Выделить всё

	RCC->CR |= ( 1 << RCC_CR_PLLON_Pos );
Незачем постоянно единички сдвигать, есть же просто RCC_CR_PLLON или RCC_CR_PLLON_Msk.
Ледокот писал(а):

Код: Выделить всё

	RCC->CFGR = ( 2 << RCC_CFGR_SW_Pos ); // Переключаем тактирование ядра с HSI16 на PLL
	for ( Iteration1 = 0; Iteration1 < 100000; Iteration1++ );
Проверять нужно поле SWS, софтовая задежка при инициализации встречается довольно редко, а у тебя они повсеместно натыканы )
Ледокот писал(а):На всякий случай проосциллографировал напряжение на выводах питания - всё в пределах нормы.
Плата не самодельная случайно?
Ледокот
Открыл глаза
Сообщения: 71
Зарегистрирован: Пт апр 22, 2011 18:41:48
Контактная информация:

Re: Не запускается умножитель тактовой частоты STM32F407ZGT6

Сообщение Ледокот »

[uquote="tonyk",url="/forum/viewtopic.php?p=4645713#p4645713"]У меня сделано так:
Спойлер

Код: Выделить всё

////////////////////////////////////////////////////////////////////////////////

int __low_level_init(void)
{
    __disable_irq();

    // Настройка FLASH
    FLASH -> ACR = \
        FLASH_ACR_PRFTEN    |
        FLASH_ACR_ICEN      |
        FLASH_ACR_DCEN      |
        FLASH_ACR_LATENCY_5WS;

    // Тактирование ----------
    // Включаем HSE = 8 MHz
    RCC -> CR = _VAL2FLD( RCC_CR_HSITRIM, 16 ) | RCC_CR_HSION | RCC_CR_HSEON;

    while( !( RCC -> CR & RCC_CR_HSERDY ) )
    {};

    // Задаём источники тактирования и прескалеры SYSCLK = 168 МГц  USB = 48 МГц
    RCC -> PLLCFGR = \
        RCC_PLLCFGR_PLLSRC_HSE              |
        _VAL2FLD( RCC_PLLCFGR_PLLQ, 7 )     |
        _VAL2FLD( RCC_PLLCFGR_PLLN, 336 )   |
        _VAL2FLD( RCC_PLLCFGR_PLLM , 8 )    |
        RCC_PLLCFGR_PLLP_div2;

    RCC -> CR = \
        _VAL2FLD( RCC_CR_HSITRIM, 16 )  |
        RCC_CR_HSION |
        RCC_CR_HSEON |
        RCC_CR_PLLON;   //Включаем PLL

    while( !( RCC -> CR & RCC_CR_PLLRDY ) )
    {};

    // Переключаемся на PLL с установленнными ранее прескалерами
    RCC -> CFGR = \
        RCC_CFGR_MCO2_HSE               |
        RCC_CFGR_MCO2PRE_div1           |
        RCC_CFGR_MCO1PRE_div1           |
        RCC_CFGR_I2SSRC_PLLI2S          |
        RCC_CFGR_MCO1_HSE               |
        _VAL2FLD( RCC_CFGR_RTCPRE, 8 )  |
        //_VAL2FLD( RCC_CFGR_PPRE2, 0x04 )|   // /2
        //_VAL2FLD( RCC_CFGR_PPRE1, 0x05 )|   // /4
        RCC_CFGR_PPRE2_DIV1             |
        RCC_CFGR_PPRE1_DIV2             |
        RCC_CFGR_HPRE_DIV1              |
        RCC_CFGR_SW_PLL;

    SystemCoreClock = 168'000'000;

    RCC-> CR = \
        _VAL2FLD( RCC_CR_HSITRIM, 16 )  |
        RCC_CR_HSEON                    |
        RCC_CR_PLLON;                       // Выключаем HSI

    #ifdef __DEBUG_SRAM__
    
      SYSCFG->MEMRMP = 3;  //0x20000000 -> 0x00000000

    #endif
     
  return( 1 );
}

////////////////////////////////////////////////////////////////////////////////
[/uquote]

Спасибо за ответ! Прежде чем создавать свою тему, я пробовал Ваш код, наткнулся где-то в обсуждениях подобной проблемы здесь на форуме. На моей плате код ведёт себя точно так же, как и мой: при попытке запустить HSE зависает в цикле ожидания флага готовности HSE, а если не включать HSE и пытаться запуститься от HSI (я не забываю, что HSE 8 МГц, а HSI 16 МГц, и коэффициенты PLLN, PLLP, PLLM и PLLQ взял из CubeMX), то код зависает в цикле ожидания флага готовности PLL.

Сама неисправность начала проявляться после некоторых доработок схемы (доработки делал не я, как и схему, я только программу на неё пишу), до этого код работал нормально. Первое предположение было, что при доработке платы статикой выбило контроллер. Контроллер перепаяли на другой, но ничего не поменялось.

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

Судя по симптомам, либо что-то мешает работе RCC, либо микроконтроллер вышел из строя в части RCC. Но так, чтобы два контроллера подряд демонстрировали один и тот же отказ - сразу возникает подозрение на схему, а не на контроллер. Поэтому я и пошёл сюда с вопросом.
Если я где-то ошибаюсь, прошу от меня этого не скрывать. Заранее очень признателен :)
Реклама
Эиком - электронные компоненты и радиодетали
Adrift
Вымогатель припоя
Сообщения: 553
Зарегистрирован: Вт окт 01, 2024 15:22:33

Re: Не запускается умножитель тактовой частоты STM32F407ZGT6

Сообщение Adrift »

Ледокот писал(а):Но так, чтобы два контроллера подряд демонстрировали один и тот же отказ - сразу возникает подозрение на схему, а не на контроллер. Поэтому я и пошёл сюда с вопросом.
Ну и. Схема где? )
Реклама
Ледокот
Открыл глаза
Сообщения: 71
Зарегистрирован: Пт апр 22, 2011 18:41:48
Контактная информация:

Re: Не запускается умножитель тактовой частоты STM32F407ZGT6

Сообщение Ледокот »

[uquote="Adrift",url="/forum/viewtopic.php?p=4645740#p4645740"]Плата не самодельная случайно?[/uquote]
Плата самодельная, но делал не я ))) В общем-то, её делал вполне приличный схемотехник, но специализирующийся не на STM-ках, поэтому мог что-то налажать. Более того, проблемы начались после того, как плата была отдана мной схемотехнику на доработку. И после доработки умножитель перестал запускаться. Да и внешний кварц не стартует (вообще я умножитель запускал он встроенного, но тут решил проверить, будет ли HSE запускаться - не запускается). А вернуть плату человеку со словами "ты тут что-то делал, и перестало работать, вот и разбирайся" - как-то неправильно, яжпрограммист, нужно понять, что там стряслось с МК. Контроллер уже заменяли - ничего не поменялось. Пока подумываю своими руками перепаять, с соблюдением всех антистатических мероприятий.

[uquote="Adrift",url="/forum/viewtopic.php?p=4645740#p4645740"]ACR по умолчанию равно трем, если, допустим, таким образом туда писать 4, то получим 7...[/uquote]
Согласен, как-то не подумал об этом, спасибо! Но в данном случае на работу не влияет.
[uquote="Adrift",url="/forum/viewtopic.php?p=4645740#p4645740"]Цикл бесполезен, оптимизатор его все равно выкинет[/uquote]
Чтобы это не произошло, я выкинул оптимизатор ))
[uquote="Adrift",url="/forum/viewtopic.php?p=4645740#p4645740"]Нужно проверять именно поле ACR до тех пор пока оттуда не станет читаться записанное значение.[/uquote]
Спасибо.
[uquote="Adrift",url="/forum/viewtopic.php?p=4645740#p4645740"]Что такое (2 << 28)? Последние 4 бита регистра - Reserved.[/uquote]
По ReferenceManual эти старшие 4 бита регистра имеют значение 0x2
[uquote="Adrift",url="/forum/viewtopic.php?p=4645740#p4645740"]Незачем постоянно единички сдвигать, есть же просто RCC_CR_PLLON или RCC_CR_PLLON_Msk.[/uquote]
Да, Вы правы, переучиваюсь и всё никак не переучусь, до этого вместо CMSIS пользовался своими библиотеками
[uquote="Adrift",url="/forum/viewtopic.php?p=4645740#p4645740"]Проверять нужно поле SWS, софтовая задежка при инициализации встречается довольно редко, а у тебя они повсеместно натыканы )[/uquote]
Я недавно перешёл на STM, и, честно говоря, мне он кажется очень капризным. Кое-где софтовая задержка ему нужна, а запоминать, где нужна, а где не нужна, мне сейчас немного некогда ))) Поэтому на каждое изменение регистра я леплю софтовую задержку.
Последний раз редактировалось Ледокот Ср ноя 06, 2024 16:59:21, всего редактировалось 2 раза.
Если я где-то ошибаюсь, прошу от меня этого не скрывать. Заранее очень признателен :)
Реклама
veso74
Поставщик валерьянки для Кота
Сообщения: 1915
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

Re: Не запускается умножитель тактовой частоты STM32F407ZGT6

Сообщение veso74 »

В начало попробуйте (быстрым способом) узнать, работает ли МК (хардуер). Вариант: с безусловно рабочим кодом через STM32CubeIDE, по NSI, с/без PLL, вн. кварц, с/без PLL, мигание на всех пинах. При обходе светодиодов пинов мигают или нет. Тогда все ОК, попробуйте через CMSIS в ваших методах запустить генератор, PLL и т.д. Знаю, что не нравится Cube, но хотя бы для теста. В противном случае есть больше неизвестных - что не работает: МК, код к его и т.д. (частично пользуюсь переводчиком).
---
(Не пользуйтесь такой задержкой: for (Iteration1 = 0; Iteration1 < 100000; ... . Ни к чему хорошему не приведет. Следите за флагами в регистах. У каждого модуля в МК их много).
Adrift
Вымогатель припоя
Сообщения: 553
Зарегистрирован: Вт окт 01, 2024 15:22:33

Re: Не запускается умножитель тактовой частоты STM32F407ZGT6

Сообщение Adrift »

[uquote="Ледокот",url="/forum/viewtopic.php?p=4645908#p4645908"]Плата самодельная, но делал не я ))) В общем-то, её делал вполне приличный схемотехник, но специализирующийся не на STM-ках, поэтому мог что-то налажать.[/uquote]
PLL запитывается от аналогового питания, может тут накосячили. Возможно конденсаторы на VCAP не поставили, или поставили, но на 100nF.
Ледокот
Открыл глаза
Сообщения: 71
Зарегистрирован: Пт апр 22, 2011 18:41:48
Контактная информация:

Re: Не запускается умножитель тактовой частоты STM32F407ZGT6

Сообщение Ледокот »

[uquote="veso74",url="/forum/viewtopic.php?p=4645910#p4645910"]В начало попробуйте (быстрым способом) узнать, работает ли МК (хардуер). Вариант: с безусловно рабочим кодом через STM32CubeIDE, по NSI, с/без PLL, вн. кварц, с/без PLL, мигание на всех пинах. При обходе светодиодов пинов мигают или нет. Тогда все ОК, попробуйте через CMSIS в ваших методах запустить генератор, PLL и т.д. Знаю, что не нравится Cube, но хотя бы для теста. В противном случае есть больше неизвестных - что не работает: МК, код к его и т.д. (частично пользуюсь переводчиком).
---
(Не пользуйтесь такой задержкой: for (Iteration1 = 0; Iteration1 < 100000; ... . Ни к чему хорошему не приведет. Следите за флагами в регистах. У каждого модуля в МК их много).[/uquote]

Спасибо за ответ.
Если не запускать PLL, то контроллер работает (только очень медленно)
Подготовить в CubeMX проект с инициализацией и попробовать его запустить я пробовал, но не вышло ничего - среда ругнулась на какой-то незагруженный модуль, а для загрузки предложила регистрироваться на сайте, в общем, после осциллографирования я этим займусь, если не найдётся явная ошибка. Код-то рабочий (и он даже работал).

Добавлено after 59 seconds:
[uquote="Adrift",url="/forum/viewtopic.php?p=4645918#p4645918"]PLL запитывается от аналогового питания, может тут накосячили. Возможно конденсаторы на VCAP не поставили, или поставили, но на 100nF.[/uquote]

Аналоговое питание вроде ничего...
Оба VCAP на 3,3 мкФ 10% 25 Вольт.
Если я где-то ошибаюсь, прошу от меня этого не скрывать. Заранее очень признателен :)
veso74
Поставщик валерьянки для Кота
Сообщения: 1915
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

Re: Не запускается умножитель тактовой частоты STM32F407ZGT6

Сообщение veso74 »

STM32F407ZGT6 HSI, PLL ON, SYSCLK 168 MHz, blink GPIOA 100ms (без некоторых выводов)
PA0: WKUP
PA8: MCO -> HSI для теста, включите частотомер
PA13: SWDIO
PA14: SWCLK

(Не могу протестировать, нет модуля с этим МК).
Вложения
blinks.zip
(4.97 КБ) 83 скачивания
tonyk
Это не хвост, это антенна
Сообщения: 1320
Зарегистрирован: Вт ноя 19, 2019 06:10:18

Re: Не запускается умножитель тактовой частоты STM32F407ZGT6

Сообщение tonyk »

Ледокот писал(а):я пробовал Ваш код
Тогда, вероятно, дело в "железе".
Была проблема с запуском на плохо отмытой плате.
Проверьте запуск HSE. Я не заметил у вас его запуска и ожидания готовности. Это нужно делать перед настройкой PLL.

Код: Выделить всё

    RCC -> CR = _VAL2FLD( RCC_CR_HSITRIM, 16 ) | RCC_CR_HSION | RCC_CR_HSEON;

    while( !( RCC -> CR & RCC_CR_HSERDY ) )
    {};
Ну и флаги готовности HSI, HSE и PLL посмотрите.
Ледокот
Открыл глаза
Сообщения: 71
Зарегистрирован: Пт апр 22, 2011 18:41:48
Контактная информация:

Re: Не запускается умножитель тактовой частоты STM32F407ZGT6

Сообщение Ледокот »

[uquote="tonyk",url="/forum/viewtopic.php?p=4645960#p4645960"]Проверьте запуск HSE.[/uquote]

Пробовал. Отдельно пробовал и HSE запускать. Не запускается. Т.е. флаг HSE_RDY не устанавливается после установки флага HSE_ON.
Вроде бы понятно, что проблема в аппаратуре. Но вот чем она вызвана - не пойму.
Говорят, что vcap_1 и vcap_2 могут влиять. В схеме заложены 3,3 мкФ 10% 25В. Я не знаю, насколько это нормальные параметры.
Если я где-то ошибаюсь, прошу от меня этого не скрывать. Заранее очень признателен :)
Adrift
Вымогатель припоя
Сообщения: 553
Зарегистрирован: Вт окт 01, 2024 15:22:33

Re: Не запускается умножитель тактовой частоты STM32F407ZGT6

Сообщение Adrift »

[uquote="Ледокот",url="/forum/viewtopic.php?p=4645969#p4645969"]В схеме заложены 3,3 мкФ 10% 25В. Я не знаю, насколько это нормальные параметры.[/uquote]
Должно быть 2.2uF, но вряд ли это критично настолько, чтоб PLL вообще не завелся. А кроме стабильного питания даже не знаю на что думать...
tonyk
Это не хвост, это антенна
Сообщения: 1320
Зарегистрирован: Вт ноя 19, 2019 06:10:18

Re: Не запускается умножитель тактовой частоты STM32F407ZGT6

Сообщение tonyk »

Ледокот писал(а):Т.е. флаг HSE_RDY не устанавливается после установки флага HSE_ON.
Проблема не в PLL, а в HSE.
Проверяйте кварц, отмывку флюса с платы в районе кварца, нагрузочные конденсаторы кварца, схему подключения кварца. Не лишнем будет показать схему и трассировку.
Adrift
Вымогатель припоя
Сообщения: 553
Зарегистрирован: Вт окт 01, 2024 15:22:33

Re: Не запускается умножитель тактовой частоты STM32F407ZGT6

Сообщение Adrift »

[uquote="tonyk",url="/forum/viewtopic.php?p=4645976#p4645976"]Проблема не в PLL, а в HSE.[/uquote]
При чем тут HSE, у него PLL тактируется от HSI.
Ледокот
Открыл глаза
Сообщения: 71
Зарегистрирован: Пт апр 22, 2011 18:41:48
Контактная информация:

Re: Не запускается умножитель тактовой частоты STM32F407ZGT6

Сообщение Ледокот »

[uquote="Adrift",url="/forum/viewtopic.php?p=4645978#p4645978"]При чем тут HSE, у него PLL тактируется от HSI.[/uquote]
Хм, там в цепи питания Vdda (аналоговое питание, если я правильно понял) последовательно воткнута индуктивность. За ней два конденсатора... Попробую-ка я эту индуктивность зашунтировать... Есть подозрения, что там какие-то колебания нехорошие появляются.
Если я где-то ошибаюсь, прошу от меня этого не скрывать. Заранее очень признателен :)
Аватара пользователя
GARMIN
Держит паяльник хвостом
Сообщения: 954
Зарегистрирован: Вс дек 02, 2012 16:58:33
Откуда: от туда
Контактная информация:

Re: Не запускается умножитель тактовой частоты STM32F407ZGT6

Сообщение GARMIN »

Я не считал множители, но PLL имеет определённый диапазон рабочих частот, довольно узкий. Проверьте по даташиту, на какую частоту вы загоняете PLL, и находится ли она в допустимых пределах.
linkov1959
Держит паяльник хвостом
Сообщения: 923
Зарегистрирован: Пн сен 10, 2018 19:16:28

Re: Не запускается умножитель тактовой частоты STM32F407ZGT6

Сообщение linkov1959 »

GARMIN, раньше работало, когда схему кто-то доработал перестало работать.
Ледокот
Открыл глаза
Сообщения: 71
Зарегистрирован: Пт апр 22, 2011 18:41:48
Контактная информация:

Re: Не запускается умножитель тактовой частоты STM32F407ZGT6

Сообщение Ледокот »

[uquote="GARMIN",url="/forum/viewtopic.php?p=4646003#p4646003"]Я не считал множители, но PLL имеет определённый диапазон рабочих частот, довольно узкий. Проверьте по даташиту, на какую частоту вы загоняете PLL, и находится ли она в допустимых пределах.[/uquote]
Проверял, когда писал код. Потом на всякий случай запустил CubeMX и настроил в нём сигналы тактовой частоты, подсмотрев значение битовых полей PLLM, PLLN, PLLP и PLLQ.
Если я где-то ошибаюсь, прошу от меня этого не скрывать. Заранее очень признателен :)
Ледокот
Открыл глаза
Сообщения: 71
Зарегистрирован: Пт апр 22, 2011 18:41:48
Контактная информация:

Re: Не запускается умножитель тактовой частоты STM32F407ZGT6

Сообщение Ледокот »

Всё чудесатее и чудесатее.

Поэкспериментировал с кодом. Попробовал такой код:

Код: Выделить всё

        RCC->CR = ( 16 << RCC_CR_HSITRIM_Pos ) | ( 1 << RCC_CR_HSION_Pos );
        while (((RCC->CR)&(RCC_CR_HSIRDY_Msk)) == 0) {} // Ожидаем готовности внутреннего осциллятора
И контроллер виснет на второй строчке. Ок, пробую устанавливать бит HSIRDY принудительно:

Код: Выделить всё

        RCC->CR = ( 1 << RCC_CR_HSERDY_Pos ) | ( 1 << RCC_CR_HSEON_Pos ) | ( 16 << RCC_CR_HSITRIM_Pos ) | ( 1 << RCC_CR_HSIRDY_Pos ) | ( 1 << RCC_CR_HSION_Pos );
        while (((RCC->CR)&(RCC_CR_HSIRDY_Msk)) == 0) {} // Ожидаем готовности внутреннего осциллятора
        while (((RCC->CR)&(RCC_CR_HSERDY_Msk)) == 0) {} // Ожидаем готовности внешнего осциллятора
И всё нормально начинает работать, зависания во второй и третьей строчках нет, программа идёт дальше.
По той же схеме устанавливаю множители/делители умножителя тактовой частоты и бит готовности умножителя:

Код: Выделить всё

        RCC->PLLCFGR = ( 2 << 28 ) | ( 8 << RCC_PLLCFGR_PLLM_Pos ) | ( 96 << RCC_PLLCFGR_PLLN_Pos ) | ( 0 << RCC_PLLCFGR_PLLP_Pos) | ( 4 << RCC_PLLCFGR_PLLQ_Pos );
        RCC->CR |= ( 1 << RCC_CR_PLLRDY_Pos ) | ( 1 << RCC_CR_PLLON_Pos );
        while (((RCC->CR)&(1<<RCC_CR_PLLRDY_Pos)) == 0) {} // Ожидаем готовности умножителя тактовой частоты
И всё работает нормально, последующий код выполняется, контроллер работает на своих 96 МГц, все счастливы.

Вот что это было? Контрафактный микроконтроллер? Или я дебил?
Если я где-то ошибаюсь, прошу от меня этого не скрывать. Заранее очень признателен :)
Ответить

Вернуться в «ARM»