реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Проблемы тактирования STM32VL Discovery., Слетает настройка системной частоты при PREDIV1 со значением 8 и выше.
mkru
сообщение Jan 18 2016, 12:34
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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
 
Go to the top of the page
 
+Quote Post
scifi
сообщение Jan 18 2016, 12:43
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(mkru @ Jan 18 2016, 15:34) *
Так вот частота SYSCLK выдается предсказуемо до тех пор пока предделитель PREDIV1 установлен в значении от 1 до 7. А вот если PREDIV1 в значении от 8 и выше (до 16), то программа не выполняется до конца и зацикливается на строчке:
while (!(RCC->CR & RCC_CR_PLLRDY));// Ожидание готовности PLL.

Если делитель равен 8, то на вход PLL поступает 1 МГц. Вроде бы вписывается в разрешённый диапазон (от 1 до 24 МГц), но на самом краю. Естественно, делители 9, 10 и т.д. выводят входную частоту PLL за разрешённый диапазон. Кто знает, может быть PLL не может стабилизироваться с входной частотой 1 МГц? Это без труда можно себе представить.
Go to the top of the page
 
+Quote Post
mkru
сообщение Jan 18 2016, 13:23
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 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МГц. Но, возможно, Вы правы. Благодарю за ответ.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jan 18 2016, 14:49
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Можно ещё на питание посмотреть. PLL запитывается от Vdda. Если там чрезмерные помехи, то не исключены сбои. Я перед Vdda ставлю ферритовую бусину (ferrite bead) на всякий случай. Ну и соблюдать рекомендованные ёмкости по питанию, близко к чипу и т.д.
А, забыл, это же отладка, там с питанием всё нормально должно быть.
Go to the top of the page
 
+Quote Post
mkru
сообщение Jan 19 2016, 05:02
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 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!
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jan 19 2016, 07:27
Сообщение #6


Универсальный солдатик
******

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



1. Можно запустить МК, не дожидаясь захвата частоты ФАПЧ, посмотреть, как она дергается. Интересно.
2. Диапазон 1 - сколько-то МГц должен быть оговорен при определенных условиях, нужно удостовериться, что они удовлетворены.
Go to the top of the page
 
+Quote Post
mkru
сообщение Jan 19 2016, 11:16
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 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МГц и меньше.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jan 19 2016, 11:34
Сообщение #8


Универсальный солдатик
******

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



Закомментируйте строку
while (!(RCC->CR & RCC_CR_PLLRDY));// Ожидание готовности PLL
Небось, не сгорит микроконтроллер
Чисто посмотреть, естественно. Дергаться, наверное, будет.
Go to the top of the page
 
+Quote Post
mkru
сообщение Jan 19 2016, 12:52
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 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 контроллер получает, но в эти состояния не входит.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jan 19 2016, 12:56
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(ViKo @ Jan 19 2016, 14:34) *
Закомментируйте строку
while (!(RCC->CR & RCC_CR_PLLRDY));// Ожидание готовности PLL
Небось, не сгорит микроконтроллер
Чисто посмотреть, естественно. Дергаться, наверное, будет.

Не получится. Там блокировка. Если тактирующий сигнал не стабилен, то не переключится.
Зато можно выход PLL подключить к MCO и смотреть осциллографом там. Там-то нет блокировки, надеюсь.

Кстати, помимо выхода за диапазон входной частоты PLL нужно также следить за выходной частотой. Она должна быть в диапазоне 16-24 МГц.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jan 19 2016, 13:30
Сообщение #11


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 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, если вы его закомментировали?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jan 19 2016, 14:31
Сообщение #12


Универсальный солдатик
******

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



Нашел запись.
Цитата
A switch from one clock source to another occurs only if the target clock source is ready
(clock stable after startup delay or PLL locked). If a clock source which is not yet ready is
selected, the switch will occur when the clock source will be ready.

Да, так не включить.
Go to the top of the page
 
+Quote Post
AlanDrakes
сообщение Jan 19 2016, 14:43
Сообщение #13


Частый гость
**

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
mkru
сообщение Jan 20 2016, 06:08
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 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 МГц). Но все равно, нужно придерживаться рекомендуемых параметров о которых я не знал. Спасибо всем за помощь! С тактированием более менее разобрался, пора взяться за изучение таймеров.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jan 20 2016, 07:07
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(mkru @ Jan 20 2016, 09:08) *
Все таки мне кажется это проблема из-за ограничения частоты на входе PLL (1..24 МГц), а не на выходе (16..24 МГц).

Гораздо вероятнее, что ограничение по выходной частоте. Сами же пишете, что гоняете его на частоте, которая почти на порядок ниже разрешённой.
С другой стороны, какая разница? Соблюдайте требования даташита - и всё будет работать.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 12:09
Рейтинг@Mail.ru


Страница сгенерированна за 0.01489 секунд с 7
ELECTRONIX ©2004-2016