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

 
 
> Проблемы тактирования 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
 
Start new topic
Ответов
ViKo
сообщение Jan 19 2016, 13:30
Сообщение #2


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

Группа: Модераторы
Сообщений: 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

Сообщений в этой теме
- 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   Нашел запись. ЦитатаA switch from one clock source...   Jan 19 2016, 14:31
- - AlanDrakes   Посмотрите в Reference Manual, секция 6, пункт 6.2...   Jan 19 2016, 14:43
- - mkru   Цитата(AlanDrakes @ Jan 19 2016, 17:43) П...   Jan 20 2016, 06:08
- - scifi   Цитата(mkru @ Jan 20 2016, 09:08) Все так...   Jan 20 2016, 07:07
- - mkru   Цитата(scifi @ Jan 20 2016, 10:07) Горазд...   Jan 20 2016, 12:40


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

 


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


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