|
Проблемы тактирования 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 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 МГц). Но все равно, нужно придерживаться рекомендуемых параметров о которых я не знал. Спасибо всем за помощь! С тактированием более менее разобрался, пора взяться за изучение таймеров.
|
|
|
|
|
Jan 20 2016, 12:40
|
Участник

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

|
Цитата(scifi @ Jan 20 2016, 10:07)  Гораздо вероятнее, что ограничение по выходной частоте. Сами же пишете, что гоняете его на частоте, которая почти на порядок ниже разрешённой. С другой стороны, какая разница? Соблюдайте требования даташита - и всё будет работать. Да, Вы опять правы. Проблема на выходе PLL. Установил PREDIV1=8 (на входе PLL=1МГц), а PLLMULL=16 (на выходе PLL=16МГц) - работает. А если PREDIV1=8 (на входе PLL=1МГц), а PLLMULL=2 (на выходе PLL=2МГц) - не работает.
|
|
|
|
Сообщений в этой теме
mkru Проблемы тактирования STM32VL Discovery. Jan 18 2016, 12:34 scifi Цитата(mkru @ Jan 18 2016, 15:34) Так вот... Jan 18 2016, 12:43 mkru Цитата(scifi @ Jan 18 2016, 15:43) Если д... Jan 18 2016, 13:23 scifi Можно ещё на питание посмотреть. PLL запитывается ... Jan 18 2016, 14:49 mkru Цитата(scifi @ Jan 18 2016, 17:49) Можно ... Jan 19 2016, 05:02 ViKo 1. Можно запустить МК, не дожидаясь захвата частот... Jan 19 2016, 07:27 mkru Цитата(ViKo @ Jan 19 2016, 10:27) 1. Можн... Jan 19 2016, 11:16 ViKo Закомментируйте строку
while (!(RCC->CR ... Jan 19 2016, 11:34 mkru Цитата(ViKo @ Jan 19 2016, 14:34) Закомме... Jan 19 2016, 12:52 scifi Цитата(ViKo @ Jan 19 2016, 14:34) Закомме... Jan 19 2016, 12:56 ViKo В руководстве так написано:
ЦитатаBits 1:0 SW: Sys... Jan 19 2016, 13:30 ViKo Нашел запись.
ЦитатаA switch from one clock source... Jan 19 2016, 14:31
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|