Всем привет! Есть МК 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
Dmytro
В кубе калькулировать пробовали?
Dimoon
нее, все через даташиты и CMSIS
Dmytro
Там же просто вбиваете все множители/делители, а на выходе вам показывают что в какие регистры записать. Удобно. Ещё и показывается где кто за пределы вышел
Dimoon
Попробую
Dmytro
Куб есть как автономный и как часть cube ide
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го семейства подобное есть Забавно.. Большинство косяков кто-то уже находил)
Dmitriy
Иди в чат по stm32 там помогут
Dimoon
а ссылочку можно?
Mikhail
А в переменной SystemCoreClock какое значение во время отладки?