|
Проблемы тактирования STM32VL Discovery., Слетает настройка системной частоты при PREDIV1 со значением 8 и выше. |
|
|
|
Jan 18 2016, 12:34
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 20-06-07
Пользователь №: 28 581

|
Всем доброго дня! Взял отладку STM32VL Discovery (на STM32F100RBT6). Работаю с блоком RCC: беру частоту с внешнего кварца 8МГц (HSE) пропускаю через предделитель PREDIV1 и умножаю в блоке PLLMUL. Показания системной частоты SYSCLK снимаю осциллографом на выводе MCO (ножка PA8) см. рис.
Так вот частота SYSCLK выдается предсказуемо до тех пор пока предделитель PREDIV1 установлен в значении от 1 до 7. А вот если PREDIV1 в значении от 8 и выше (до 16), то программа не выполняется до конца и зацикливается на строчке: while (!(RCC->CR & RCC_CR_PLLRDY));// Ожидание готовности PLL. В этот момент контроллер тактируется от внутреннего генератора (HSI), поэтому на выводе MCO вижу частоту 8МГц. В чем может быть проблема? Вот сам код: CODE #include "stm32f10x.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h"
void init_PLL ( unsigned long int HSE_PREDIV,unsigned long int PLLMUL,unsigned long int HSI_OR_HSE) { // Проверяем тактируемся ли мы от HSI (), если мы уже сцеплины с HSI тогда можно начать подготовку двух других блоков HSE и PLL if((RCC->CFGR&RCC_CFGR_SWS) != RCC_CFGR_SWS_HSI)// МК тактируется не от HSI { RCC->CIR |= RCC_CIR_HSIRDYC; // сброс флага RCC_CR_HSIRDY RCC->CR |= RCC_CR_HSION; // Запуск HSI while (!(RCC->CR & RCC_CR_HSIRDY));// Ожидание готовности HSI. RCC->CFGR &= ~(RCC_CFGR_SW_0|RCC_CFGR_SW_1); // Переключаем на HSI while ((RCC->CFGR&RCC_CFGR_SWS) != RCC_CFGR_SWS_HSI); // Ожидание переключения на HSI. }
RCC->CR &= ~RCC_CR_PLLON; // ВЫКЛЮЧАЕМ PLL.
if(HSI_OR_HSE){ //определяем что заводить в PLL RCC->CFGR |= RCC_CFGR_PLLSRC_PREDIV1; // заводить в блок PLL HSE RCC->CFGR2 = HSE_PREDIV; //заносим делитель } else RCC->CFGR &= ~RCC_CFGR_PLLSRC_PREDIV1; // заводить в блок PLL HSI
RCC->CFGR &= ~RCC_CFGR_PLLMULL; // Очистить биты PLLMULL RCC->CFGR |= PLLMUL; //Устанавливаем значение множителя PLLMULL RCC->CIR |= RCC_CIR_PLLRDYC; // сброс флага RCC_CR_PLLRDY RCC->CR |= RCC_CR_PLLON; // Запустить PLL.
while (!(RCC->CR & RCC_CR_PLLRDY));// Ожидание готовности PLL.
RCC->CFGR &=~RCC_CFGR_SW; // Очистить биты SW0 и SW1 RCC->CFGR |= RCC_CFGR_SW_PLL; //(Выбираем PLL источником для SYSCLK)
while ((RCC->CFGR&RCC_CFGR_SWS)!=RCC_CFGR_SWS_PLL); // Ожидание переключения на PLL. }
int main(void) { RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // Разрешение тактирования I/O порта A ( 0x00000004 ) GPIOA->CRH = 0x0000000B; // Вывод PA8 в альтернативную функцию (CNF0= 0; CNF1= 1; MODE0= 0; MODE1= 1; ) RCC->CFGR |= RCC_CFGR_MCO_SYSCLK; // Выбрать ситемный тактовый сигнал ( 0x04000000 )
init_PLL ( RCC_CFGR2_PREDIV1_DIV7, RCC_CFGR_PLLMULL2, RCC_CFGR_PLLSRC_PREDIV1);
while (1){ }; }
Сообщение отредактировал IgorKossak - Jan 18 2016, 14:15
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!
Прикрепленные файлы
main.txt ( 2.08 килобайт )
Кол-во скачиваний: 3
|
|
|
|
|
Jan 18 2016, 13:23
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 20-06-07
Пользователь №: 28 581

|
Цитата(scifi @ Jan 18 2016, 15:43)  Если делитель равен 8, то на вход PLL поступает 1 МГц. Вроде бы вписывается в разрешённый диапазон (от 1 до 24 МГц), но на самом краю. Естественно, делители 9, 10 и т.д. выводят входную частоту PLL за разрешённый диапазон. Кто знает, может быть PLL не может стабилизироваться с входной частотой 1 МГц? Это без труда можно себе представить. Я полагаю 1..24МГц это гарантированный диапазон и PLL должен бы с ним нормально работать во всем диапазоне температур. А при комнатной температуре нижняя планка вполне могла бы опуститься до значения значительно ниже 1МГц. Но, возможно, Вы правы. Благодарю за ответ.
|
|
|
|
|
Jan 19 2016, 05:02
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 20-06-07
Пользователь №: 28 581

|
Цитата(scifi @ Jan 18 2016, 17:49)  Можно ещё на питание посмотреть. PLL запитывается от Vdda. Если там чрезмерные помехи, то не исключены сбои. Я перед Vdda ставлю ферритовую бусину (ferrite bead) на всякий случай. Ну и соблюдать рекомендованные ёмкости по питанию, близко к чипу и т.д. А, забыл, это же отладка, там с питанием всё нормально должно быть. Т.к. эта проблема появляется при PREDIV1=8, что уменьшает частоту на входе PLL до 1 МГц то, видимо, как Вы и писали, блок PLL просто не заводится. Отладку уж трогать не буду, но если чего сам на STM32 сделаю, увеличю значение кварца и посмотрю как себя будет вести контроллер при PREDIV1. Спасибо scifi!
|
|
|
|
|
Jan 19 2016, 11:16
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 20-06-07
Пользователь №: 28 581

|
Цитата(ViKo @ Jan 19 2016, 10:27)  1. Можно запустить МК, не дожидаясь захвата частоты ФАПЧ, посмотреть, как она дергается. Интересно. 2. Диапазон 1 - сколько-то МГц должен быть оговорен при определенных условиях, нужно удостовериться, что они удовлетворены. Сначала сигнала на выходе МСО нет. Затем разрешается МСО и частота на выводе РА8 - 25МГц, потом выбирается источник тактирования HSI и частота устанавливается на 8МГц. Затем программа зацикливается и ожидает готовность включения PLL, частота на РА8 при этом не меняется и равна 8МГц. Это картина при PREDIV1 >= 8. Т.е. когда частота на входе PLL очевидно равна 1МГц и меньше.
|
|
|
|
|
Jan 19 2016, 12:52
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 20-06-07
Пользователь №: 28 581

|
Цитата(ViKo @ Jan 19 2016, 14:34)  Закомментируйте строку while (!(RCC->CR & RCC_CR_PLLRDY));// Ожидание готовности PLL Небось, не сгорит микроконтроллер Чисто посмотреть, естественно. Дергаться, наверное, будет. Не, не помогает.. Программа доходит до оператора while, но частота не меняется. Бит PLLON=1, PLLRDY=0, SW=10, SWS=00. Т.е. задание на включение PLL и тактрирование от PLL контроллер получает, но в эти состояния не входит.
|
|
|
|
|
Jan 19 2016, 13:30
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
В руководстве так написано: Цитата Bits 1:0 SW: System clock switch Set and cleared by software to select SYSCLK source. Set by hardware to force HSI selection when leaving Stop and Standby mode or in case of failure of the HSE oscillator used directly or indirectly as system clock (if the Clock Security System is enabled). 00: HSI selected as system clock 01: HSE selected as system clock 10: PLL selected as system clock 11: not allowed Вроде, стабильность PLL не упоминается. Цитата(mkru @ Jan 19 2016, 15:52)  Не, не помогает.. Программа доходит до оператора while, но частота не меняется. Какого while, если вы его закомментировали?
|
|
|
|
|
Jan 19 2016, 14:43
|

Частый гость
 
Группа: Участник
Сообщений: 101
Регистрация: 2-05-15
Из: Россия, Омск
Пользователь №: 86 474

|
Посмотрите в Reference Manual, секция 6, пункт 6.2.3, сноска: Note: The PLL output frequency must be in the range of 16-24 MHz. Проверьте, укладывается ли в вашем случае выходная частота в заявленые 16-24МГц. Если нет - скорее всего, PLL просто не может синхронизироваться. Документ: Код RM0041 Reference manual STM32F100xx advanced ARM-based 32-bit MCUs Упс. Не заметил комментария =(
Сообщение отредактировал AlanDrakes - Jan 19 2016, 14:44
|
|
|
|
|
Jan 20 2016, 06:08
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 20-06-07
Пользователь №: 28 581

|
Цитата(AlanDrakes @ Jan 19 2016, 17:43)  Посмотрите в Reference Manual, секция 6, пункт 6.2.3, сноска: Note: The PLL output frequency must be in the range of 16-24 MHz. Проверьте, укладывается ли в вашем случае выходная частота в заявленые 16-24МГц. Если нет - скорее всего, PLL просто не может синхронизироваться. Если это сигнал PLLCLK, то я не учитывал значение этой частоты. Крайний рабочий диапазон при предделителе PREDIV1=7, частота кварца 8МГц, и PLLMUL=2 получается, что сигнал PLLCLK=2,3МГц, что значительно меньше рекомендованной в Reference Manual. Вывел на МСО сигнал PLLCLK_Div2. При значении PREDIV1=8..16МГц, на выходе МСО частота 1,11МГц, что не много отличается от должного при PREDIV1=8 (должно быть 1МГц) и значительно при PREDIV1=16 (должно быть 0,5МГц). При PREDIV1=7 и ниже, значение расчетное. Все таки мне кажется это проблема из-за ограничения частоты на входе PLL (1..24 МГц), а не на выходе (16..24 МГц). Но все равно, нужно придерживаться рекомендуемых параметров о которых я не знал. Спасибо всем за помощь! С тактированием более менее разобрался, пора взяться за изучение таймеров.
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|