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

Кто любит RISC в жизни, заходим, не стесняемся.
Adrift
Вымогатель припоя
Сообщения: 553
Зарегистрирован: Вт окт 01, 2024 15:22:33

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

Сообщение Adrift »

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

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

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

[uquote="Adrift",url="/forum/viewtopic.php?p=4647645#p4647645"]HSIRDY нельзя установить, он ReadOnly.[/uquote]

Вот и я о том же. Если не устанавливать эти биты в регистре, то контроллер сидит в бесконечном ожидании появления этих битов. А если установить, то всё нормально работает. Какого хрена? Они ведь вообще не должны устанавливаться. Вот что это за непредсказуемое поведение такое?
По всем признакам это я должен был что-то напутать и затупить. Но вроде ничего не напутал. Да как так то?

Т.е. пока я HSIRDY не поставил, у меня программа даже бит HSIRDY не видела, он ведь должен постоянно быть, когда HSI работает, разве нет?
Если я где-то ошибаюсь, прошу от меня этого не скрывать. Заранее очень признателен :)
Реклама
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=4647656#p4647656"]Выложи минимальную версию проекта, может поможет )[/uquote]
Да особо не хочется своим говнокодом мозги людям засорять. Вот фрагмент запуска тактовой частоты. Пока биты RDY не устанавливаю - ничего не запускается, зависает в циклах while (...).

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

void InitRCC (void) {
	dummy_loop(100000);
        RCC->CR = ( 16 << RCC_CR_HSITRIM_Pos ) | ( 1 << RCC_CR_HSIRDY_Pos ) | ( 1 << RCC_CR_HSION_Pos );
        FLASH->ACR |= ( 7 << FLASH_ACR_LATENCY_Pos );      // Увеличиваем задержку чтения из Flash перед повышением тактовой частоты
        for ( Iteration1 = 0; Iteration1 < 100000; Iteration1++ );
        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 ); // Настраивааем умножитель тактовой частоты
        for ( Iteration1 = 0; Iteration1 < 100000; Iteration1++ );
        RCC->CR |= ( 1 << RCC_CR_PLLRDY_Pos ) | ( 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++ );
}
Прошу прощения за выравнивание, там где-то пробелы, где-то TABы...
Если я где-то ошибаюсь, прошу от меня этого не скрывать. Заранее очень признателен :)
Реклама
Эиком - электронные компоненты и радиодетали
veso74
Поставщик валерьянки для Кота
Сообщения: 1915
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

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

Сообщение veso74 »

Уберите паузы. Они здесь не нужны.

Как меняете бит R не понятно :). (read-only (r) Software can only read these bits).
В отладчике выведите RCC_CR до и после строки и приведите их, если возможно. (Не знаем в какой среде пишете код).

Уверены, что строки относятся к выбранному МК? Если да, то ето что значит:

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

RCC->PLLCFGR = ( 2 << 28 ) | ... 
Для быстрой информации:
Изображение

Поэтому и предложил: запуститье F407 в Cube с Hall, если МК там работает, тогда нестыковки только программные.
Реклама
Ледокот
Открыл глаза
Сообщения: 71
Зарегистрирован: Пт апр 22, 2011 18:41:48
Контактная информация:

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

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

[uquote="veso74",url="/forum/viewtopic.php?p=4647671#p4647671"]Уберите паузы. Они здесь не нужны.

Как меняете бит R не понятно :). (read-only (r) Software can only read these bits).
В отладчике выведите RCC_CR до и после строки и приведите их, если возможно. (Не знаем в какой среде пишете код).

Уверены, что строки относятся к выбранному МК? Если да, то ето что значит:

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

RCC->PLLCFGR = ( 2 << 28 ) | ... 
Для быстрой информации:
Изображение

Поэтому и предложил: запуститье F407 в Cube с Hall, если МК там работает, тогда нестыковки только программные.[/uquote]

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

RCC->PLLCFGR=(2<<28) | ...
Следует из следующих двух утверждений Reference Manual:
1. Reset value: 0x2400 3010
2. Bits 31:28 Reserved, must be kept at reset value.

Далее, среда Eclipse, компилятор и средства отладки из состава GCC.
Похоже, что нестыковки программные, да. Потому что у меня есть другая отладочная плата на контроллере той же серии, и там поведение программы такое же. Но откуда, блин, они берутся, я не пойму! Дело ведь не в CMSIS, при желании МК можно и без него инициализировать, и умножитель запустить. Дело в битах регистра, которые себя ведут как-то странно.
Если я где-то ошибаюсь, прошу от меня этого не скрывать. Заранее очень признателен :)
Реклама
veso74
Поставщик валерьянки для Кота
Сообщения: 1915
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

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

Сообщение veso74 »

Проще: перепишите откуда-нибудь рабочую настройку запуска генератора HSI/HSE и PPL, а в процессе работы потом будете уточнять, что на что влияет и настройте параметры по мере необходимости.

SPL начинается с:

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

  /* Reset the RCC clock configuration to the default reset state ------------*/
  /* Set HSION bit */
  RCC->CR |= (uint32_t)0x00000001;

  /* Reset CFGR register */
  RCC->CFGR = 0x00000000;

  /* Reset HSEON, CSSON and PLLON bits */
  RCC->CR &= (uint32_t)0xFEF6FFFF;

  /* Reset PLLCFGR register */
  RCC->PLLCFGR = 0x24003010;

  /* Reset HSEBYP bit */
  RCC->CR &= (uint32_t)0xFFFBFFFF;
а затем следует настройка PLL.
Ледокот
Открыл глаза
Сообщения: 71
Зарегистрирован: Пт апр 22, 2011 18:41:48
Контактная информация:

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

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

[uquote="veso74",url="/forum/viewtopic.php?p=4647704#p4647704"]Проще: перепишите откуда-нибудь рабочую настройку запуска генератора HSI/HSE и PPL, а в процессе работы потом будете уточнять, что на что влияет и настройте параметры по мере необходимости.

SPL начинается с:

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

  /* Reset the RCC clock configuration to the default reset state ----------*/
  /* Set HSION bit */
  RCC->CR |= (uint32_t)0x00000001;

  /* Reset CFGR register */
  RCC->CFGR = 0x00000000;

  /* Reset HSEON, CSSON and PLLON bits */
  RCC->CR &= (uint32_t)0xFEF6FFFF;

  /* Reset PLLCFGR register */
  RCC->PLLCFGR = 0x24003010;

  /* Reset HSEBYP bit */
  RCC->CR &= (uint32_t)0xFFFBFFFF;
а затем следует настройка PLL.[/uquote]

Спасибо! Вставил приведённый Вами код в начало функции InitRCC() и убрал установку битов RDY. Программа тут же зависла в ожидании установки бита HSIRDY, т.е. даже встроенный осциллятор не заработал. Вернул установку битов RDY - инициализация тактовой частоты прошла успешно.
Если я где-то ошибаюсь, прошу от меня этого не скрывать. Заранее очень признателен :)
Adrift
Вымогатель припоя
Сообщения: 553
Зарегистрирован: Вт окт 01, 2024 15:22:33

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

Сообщение Adrift »

[uquote="Ледокот",url="/forum/viewtopic.php?p=4647661#p4647661"]Да особо не хочется своим говнокодом мозги людям засорять.[/uquote]
Как раз наоборот, помимо продемонстрированной функции настройки частоты никакой твой код и не нужен, но без проекта я не могу с уверенностью сказать, что там не наговнокоден стартап или скрипт линкера. Почему-то же HSI отключен в начале функции... Эту InitRCC() мы уже видели в начале темы 4 дня назад, то что ты сейчас в нее добавил установку read-only флагов ничего принципиально не меняет, зато видно старание с которым все замечания по коду были успешно проигнорированы )
jcxz
Мудрый кот
Сообщения: 1731
Зарегистрирован: Вт авг 15, 2017 10:51:13

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

Сообщение jcxz »

[uquote="Ледокот",url="/forum/viewtopic.php?p=4647661#p4647661"]Да особо не хочется своим говнокодом мозги людям засорять. Вот фрагмент запуска тактовой частоты. Пока биты RDY не устанавливаю - ничего не запускается, зависает в циклах while (...).[/uquote]Биты RDY вы устанавливать не можете. Что бы ни писали в регистр. Так как они - readonly.

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

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

void InitRCC (void) {
	dummy_loop(100000);
        RCC->CR = ( 16 << RCC_CR_HSITRIM_Pos ) | ( 1 << RCC_CR_HSIRDY_Pos ) | ( 1 << RCC_CR_HSION_Pos );
[/uquote]Зачем меняете HSITRIM? Почему именно 16 туда пишете?
И где цикл ожидания установки HSIRDY и сброса HSERDY и PLLRDY после этой строки?
Вы (возможно) переключили эти биты, но не дожидаетесь их фактического переключения (поллингом соответствующих битов RDY).
И значение поля HSITRIM имхо - нужно сохранять исходное (которое уже было в этом поле). При любой записи в этот регистр.

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

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

        FLASH->ACR |= ( 7 << FLASH_ACR_LATENCY_Pos );      // Увеличиваем задержку чтения из Flash перед повышением тактовой частоты
[/uquote]Опять - где ожидание фактической установки записанного в ACR значения?

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

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

        for ( Iteration1 = 0; Iteration1 < 100000; Iteration1++ );
[/uquote]Бессмысленная строка. Компилятор вправе её выкинуть. Что и сделает с большой вероятностью.

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

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

        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) {} // Ожидаем готовности умножителя тактовой частоты
[/uquote]Это можно делать одним циклом - ждать сразу оба флага. 2 цикла не нужны.

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

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

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

[uquote="jcxz",url="/forum/viewtopic.php?p=4647832#p4647832"]Дальше смотреть не стал[/uquote]
1. Цикл установки HSIRDY мне не нужен, т.к. от него и так ядро тактируется. HSION и HSIRDY здесь используются только для эксперимента.
2. Ожидание готовности осцилляторов ниже.
3. Одной строкой проверить готовность осцилляторов, конечно, можно, но вот смотреть, какой из осцилляторов не хочет приходить в готовность, удобно, когда осцилляторы проверяются по отдельности. Какая строка в режиме отладки подсвечивается - тот и висит.
4. Посмотрел я на Ваши вопросы, полез в документацию на МК, и что-то не нашёл там требований "сбрасывать такие-то биты и ожидать установки таких-то". В принципе, поэтому мне не нравится STM32F4..., какой-то он слишком капризный.
Более того, код, который я пытаюсь скормить микроконтроллеру, взят из примеров из Интернета. Понятно, что это не гарантия качества, но блин, и на Stackoverflow, и на российских ресурсах все предлагают что-то, что на моём контроллере не запускается и зависает в ожидании флагов готовности.
6. Компилятор "имеет право выкинуть" только если оптимизация включена. У меня выключена.
Если я где-то ошибаюсь, прошу от меня этого не скрывать. Заранее очень признателен :)
veso74
Поставщик валерьянки для Кота
Сообщения: 1915
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

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

Сообщение veso74 »

Попробовали len_blink_all из https://radiokot.ru/forum/viewtopic.php ... 4#p4645934 ? Загрузите HEX и отслеживайте частотомеру частоту к RA8. Там MCO. Просто чтобы узнать, работает ли множитель аппаратно в вашем МК. Если работает, извлеките код из HAL (до CMSIS) и оптимизируйте самостоятельно. На МК F4xx ничего нет - работает, даже made in China. На данный момент протестировал несколько типах, почти до 2*Fmax все ОК, работают. Вы просто упорно не хотите пробовать рабочие коды. Хочете свои. А если не работает аппаратно, даже только PLL (тесты уже 6 дней) просто отрезжите пины и выбросьте MK в мусор. (Уже жалею, что писал в теме ...).
Вложения
stm32f407zgt6_blinks.zip
(1018.96 КБ) 71 скачивание
Adrift
Вымогатель припоя
Сообщения: 553
Зарегистрирован: Вт окт 01, 2024 15:22:33

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

Сообщение Adrift »

[uquote="Ледокот",url="/forum/viewtopic.php?p=4648461#p4648461"]В принципе, поэтому мне не нравится STM32F4..., какой-то он слишком капризный.[/uquote]
Если старенький и относительно простой F4 - слишком капризный, то в сторону H5/U5/H7 лучше даже не смотреть )
tonyk
Это не хвост, это антенна
Сообщения: 1320
Зарегистрирован: Вт ноя 19, 2019 06:10:18

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

Сообщение tonyk »

Ледокот писал(а):В принципе, поэтому мне не нравится STM32F4..., какой-то он слишком капризный.
Код, который я привёл как пример в начале этой темы, работает на F411, F407 и F446, меняются только коэффициенты P, Q, M, N и (вроде, лень проверять) задержка на доступ к памяти. Код проверен на платах Nucleo и Discovery, так что не_надо свистеть тут про капризность F4.

А у вас точно STM32F407? Помнится, были у 3.14здоглазых МК, ну очень похожие на 407-от от СТМ. И отличались китайцы настройкой тактирования.
ТС так и не показал ни схему, ни артикулы кварца с конденсаторами, ни топологию платы.

Давно бы уже купили в более-менее нормальном магазине на Алике плату и отладили свой код на ней.
https://aliexpress.ru/item/100500605165 ... 47dcHfAfMa

Ну или вот такой вариант:
https://aliexpress.ru/item/100500368747 ... 2cb0B7fQyE
Ледокот
Открыл глаза
Сообщения: 71
Зарегистрирован: Пт апр 22, 2011 18:41:48
Контактная информация:

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

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

[uquote="Adrift",url="/forum/viewtopic.php?p=4648480#p4648480"][uquote="Ледокот",url="/forum/viewtopic.php?p=4648461#p4648461"]В принципе, поэтому мне не нравится STM32F4..., какой-то он слишком капризный.[/uquote]
Если старенький и относительно простой F4 - слишком капризный, то в сторону H5/U5/H7 лучше даже не смотреть )[/uquote]

Ну, на G473-м довольно неплохо всё у меня получилось. А вот с F407 что-то какая-то хрень получается. Именно с тактированием. Впрочем, возможно, проблема в контрафактном МК. Ещё раз, тот код, который на нескольких сайтах позиционируется как рабочий, у меня не работает. Флаги готовности не выставляются, ни по HSE, ни по PLL, ни по HSI.

Добавлено after 4 minutes 6 seconds:
[uquote="tonyk",url="/forum/viewtopic.php?p=4648496#p4648496"]
Ледокот писал(а):В принципе, поэтому мне не нравится STM32F4..., какой-то он слишком капризный.
Код, который я привёл как пример в начале этой темы, работает на F411, F407 и F446, меняются только коэффициенты P, Q, M, N и (вроде, лень проверять) задержка на доступ к памяти. Код проверен на платах Nucleo и Discovery, так что не_надо свистеть тут про капризность F4.

А у вас точно STM32F407? Помнится, были у 3.14здоглазых МК, ну очень похожие на 407-от от СТМ. И отличались китайцы настройкой тактирования.
ТС так и не показал ни схему, ни артикулы кварца с конденсаторами, ни топологию платы.

Давно бы уже купили в более-менее нормальном магазине на Алике плату и отладили свой код на ней.
https://aliexpress.ru/item/100500605165 ... 47dcHfAfMa

Ну или вот такой вариант:
https://aliexpress.ru/item/100500368747 ... 2cb0B7fQyE[/uquote]

У меня STM34F407ZGT6. Ну, может он и не капризный, у меня ведь нерепрезентативная выборка ) Да и раздражение на него накопилось.
За код спасибо. Я его пробовал и до того, как создать тему, и после пробовал. Ведёт он себя точно так же, как и мой код - зависает в цикле ожидания флага готовности. Как и ещё несколько вариантов инициализации, которые я видел в Сети.
Кстати, у меня ведь ещё один проект есть, вроде даже на таком же МК, и инициализацию RCC я там такую же применял, и там всё работало... Просто логика происходящего не ясна.

Отладочная плата у меня есть такая: https://aliexpress.ru/item/1005004862596606.html. На ней Ваш код инициализации RCC не заработал.
Если я где-то ошибаюсь, прошу от меня этого не скрывать. Заранее очень признателен :)
tonyk
Это не хвост, это антенна
Сообщения: 1320
Зарегистрирован: Вт ноя 19, 2019 06:10:18

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

Сообщение tonyk »

Ледокот писал(а): Просто логика происходящего не ясна.
Схему, топологию платы и артикулы элементов покажите.
jcxz
Мудрый кот
Сообщения: 1731
Зарегистрирован: Вт авг 15, 2017 10:51:13

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

Сообщение jcxz »

[uquote="Ледокот",url="/forum/viewtopic.php?p=4648461#p4648461"]1. Цикл установки HSIRDY мне не нужен, т.к. от него и так ядро тактируется. HSION и HSIRDY здесь используются только для эксперимента.[/uquote]Завтра приделаете к проекту bootloader, который будет переключаться на HSE и запускать PLL. А потом передавать управление в основную программу. Лучше писать универсальный код. По возможности. Впрочем - дело ваше.
[uquote="Ледокот",url="/forum/viewtopic.php?p=4648461#p4648461"]6. Компилятор "имеет право выкинуть" только если оптимизация включена. У меня выключена.[/uquote]Корректный код следует писать так, чтобы включение/выключение оптимизации не портило корректность его выполнения. Только скорость и объём.
[uquote="Ледокот",url="/forum/viewtopic.php?p=4648461#p4648461"]Ещё раз, тот код, который на нескольких сайтах позиционируется как рабочий, у меня не работает. Флаги готовности не выставляются, ни по HSE, ни по PLL, ни по HSI.[/uquote]Вы в который уже раз это пишете, но так ни разу и не привели тот код, который не работает. Не исходник, а именно код выполняемый CPU. Что такое "листинг" знаете?
И желательно - с полной оптимизацией.
По исходнику гадать - что там у вас в реальности выполняется - не имеет смысла.

[uquote="Ледокот",url="/forum/viewtopic.php?p=4647661#p4647661"]FLASH->ACR |= ( 7 << FLASH_ACR_LATENCY_Pos ); // Увеличиваем задержку чтения из Flash перед повышением тактовой частоты[/uquote]Здесь у вас ещё один баг. Зачем для этого регистра применяете операцию '|='?
В его составе есть write-only бит, в который вы пишете случайное значение. Нарушая требование даташита.
В своём проекте на F429 я пишу его так:

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

for (FLASH.ACR = 0; FLASH.ACR << 28; ); //FLASH - set Zero wait state
Для F407 будет:

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

for (FLASH.ACR = 0; FLASH.ACR << 29; ); //FLASH - set Zero wait state
Это при тактировании от HSI и выключенном PLL.

[uquote="Ледокот",url="/forum/viewtopic.php?p=4648461#p4648461"]4. Посмотрел я на Ваши вопросы, полез в документацию на МК, и что-то не нашёл там требований "сбрасывать такие-то биты и ожидать установки таких-то".[/uquote]Ядро Cortex-M4 может иметь write-buffer. А это значит, что когда вы выполняете например:
RCC->CR = ( 16 << RCC_CR_HSITRIM_Pos ) | ( 1 << RCC_CR_HSIRDY_Pos ) | ( 1 << RCC_CR_HSION_Pos );
а после неё:
FLASH->ACR |= ( 7 << FLASH_ACR_LATENCY_Pos );
то из-за наличия write-buffer к моменту чтения FLASH->ACR предыдущая запись RCC->CR может реально ещё не выполниться. Так как записываемое значение находится ещё в этом буфере. В других местах - аналогично.
Вот для этого и нужны чтения.
write-buffer описан в доке на ядро Cortex-M, а не в мануале STM32F4xx.

Ожидание установки ACR написано в мануале:
1. Program the new number of wait states to the LATENCY bits in the FLASH_ACR
register
2. Check that the new number of wait states is taken into account to access the Flash
memory by reading the FLASH_ACR register.
...
veso74
Поставщик валерьянки для Кота
Сообщения: 1915
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

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

Сообщение veso74 »

Сегодня получил модуль FK407M2-ZGT6 на МК STM32F407ZGT6. Кварц smd 8 MHz.
Попробовал blink, МК и плата - ОК. Попробовал hex из свое сообщение. Нет MCO (PA8) (должно было быть 168 MHz).

Читаем документацию ( у меня так, как всегда: действия предшествуют чтению :music: ):
The selected clock to output onto MCO must not exceed 100 MHz (the maximum I/O speed).
Понизил выходную частоту PLLCLK/4. Частотомер к PA8 (MCO1): 42.000580 MHz -> PLLCLK = 168.002320 MHz. Попробуйте код у себя, хотя бы попробуйте hex, хотя бы выясним, работает ли аппаратно PLL в вашем МК: blink на PC13 (1 s), HSE с кварц 8 MHz, PLLCLK = 168 MHz, на RA8 (MCO1) -> 42 MHz.

Изображение
Вложения
407_blink.zip
(863.57 КБ) 54 скачивания
Ответить

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