Всем привет! Есть МК STM32F030CCT6, внешний кварц 16МГц, пытаюсь запустить его на 48МГц. Настройка следующая: PLL настраиваю на такт от HSE, предделитель PREDIV 2 (0x01), множитель PLLMUL 6 (0x04). По-идее 16/2*6=48МГц, однако получается 24 (смотрел осциллом MCO выход). Кварц точно на 16, проверял осциллом. Если предделитель PREDIV поставить 1 (0x00), то частота получается 48МГц. Кто-нибудь сталкивался с таким? Такое впечатление складывается, что частота HSE перед PLL где-то делится пополам...

Комментарии: 31

  1. Dmytro

    В кубе калькулировать пробовали?

    • Dimoon

      нее, все через даташиты и CMSIS

      • Dmytro

        Там же просто вбиваете все множители/делители, а на выходе вам показывают что в какие регистры записать. Удобно. Ещё и показывается где кто за пределы вышел

        • Dimoon

          Попробую

          • Dmytro

            Куб есть как автономный и как часть cube ide

  2. Anton

    У вас значение PLLNODIV = 0, в даташите об этом говорят "PLL is divided by 2 for MCO", что как бы намекает :)

    • Dimoon

      так... сейчас посмотрю У меня выбран 0100: System clock selected, PLLNODIV не влияет на это, ради проверки даже пощелкал сейчас

      • Anton

        Значит проверяйте значения PREDIV и PLLMUL...

        • Dimoon

          Вроде все так 0001: PREDIV input clock divided by 2 PLLMUL 0100: PLL input clock x 6 Ладно, попробую кубом проверить Кучу разных STM-ов перепрограммировал, но такой засады не было...

          • Anton

            Еще MCOPRE == 0x7, что судя по даташиту делит выход на 128... Что - то странное получается. На MCO в таком случае никак не может быть 24МГц...

            • Dimoon

              Кажется нашел, где собака зарыта, PLLSRC! В даташите указано, что это один бит, однако, у КУБа и IARа на этот счет другое мнение... Или в глаза долблюсь и чего-то не вижу, или ошибка в доках... см. выше Reference manual STM32F030x4/x6/x8/xC and STM32F070x6/xB advanced ARM®-based 32-bit MCUs. Мануал вроде тот, у меня F030CC даташит: тоже вроде все от него. Короче хз, сгенерировал в кубе код, проверил осциллом, все работает корректно. Начал сверять, в чем разница с моим вариантом и обнаружил приколы с PLLSRC. У кого есть время, посмотрите свежим взглядом доки, ошибка или я куда-то не туда

              • Anton

                Я с 030 не работал, но в 103ем PLLSRC это точно 1 бит и позиция та же... 16 бит. Вероятно тут так же. Описания регистров для всяких кейлов имеют довольно много косяков.

                • Dimoon

                  порылся в CMSIS и нашел вот такую пасхалку RCC_CFGR_PLLSRC_Pos (15U) RCC_CFGR_PLLSRC_Msk (0x3UL << RCC_CFGR_PLLSRC_Pos) /*!< 0x00018000 */ RCC_CFGR_PLLSRC RCC_CFGR_PLLSRC_Msk /*!< PLL entry clock source */ RCC_CFGR_PLLSRC_HSI_DIV2 (0x00000000U) /*!< HSI clock divided by 2 selected as PLL entry clock source */ RCC_CFGR_PLLSRC_HSI_PREDIV (0x00008000U) /*!< HSI/PREDIV clock selected as PLL entry clock source */ RCC_CFGR_PLLSRC_HSE_PREDIV (0x00010000U) /*!< HSE/PREDIV clock selected as PLL entry clock source */ Т.е. возможны 3 варианта: HSI clock divided by 2 selected as PLL HSI/PREDIV clock selected as PLL entry HSE/PREDIV clock selected as PLL entry Это я тактировался от встроенного генератора на 8 МГц и не понимал что происходит))) А вот поставил бы внешний кварц тоже на 8МГЦ и подставы бы так и не заметил, кек

                  • Anton

                    Видимо косяк тут... Эти хедеры генерятся с описания в XML формате, скорее всего изначально там был косяк.

                    • Dimoon

                      в хедерах или доках?

                      • Anton

                        Куб говоришь рабочий проект сгенерил? Какое значение он поставил в PLLSRC?

                        • Dimoon

                          0x02 скрин могу кинуть

                          • Anton

                            Ну то есть он поставил 1 в 16й бит... а у тебя 1 стоял в 15 бите, если использовались эти же хедеры...

                            • Dimoon

                              а, ну да

                              • Anton

                                Возможно описание в кубе совпадает с хедерами и из - за этого он сгенерил правильный код. Но косяк думаю в хедерах, там должен быть всего 1 бит 16, а не 16:15

                            • Dimoon

                              и кстати, поведение значений 0x00 0x01 совпадают с описанием с CMSIS HSI clock divided by 2 selected as PLL HSI/PREDIV clock selected as PLL entry HSE/PREDIV clock selected as PLL entry Если 0x00, то такт от HSI/2 и на PREDIV не реагирует. Если 0x01, то у меня получалось, что PLL тактировался от 8МГц и на PREDIV была реакция Куб туда поставил 0x02 и все заработало корректно короче, я склоняюсь к ошибке в доках

                              • Anton

                                Ну фиг знает, все возможно.

                                • Dimoon

                                  Короче, надо запомнить о такой особенности

                  • Ivdor

                    А конфиги от него?) А то например вот: Наверняка и для 0го семейства подобное есть Забавно.. Большинство косяков кто-то уже находил)

  3. Dmitriy

    Иди в чат по stm32 там помогут

    • Dimoon

      а ссылочку можно?

  4. Mikhail

    А в переменной SystemCoreClock какое значение во время отладки?

Не нашли ответ?

Вам также может быть интересно