PLL на STM32F103RCT

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Foxek
Первый раз сказал Мяу!
Сообщения: 35
Зарегистрирован: Сб дек 28, 2013 20:31:22

PLL на STM32F103RCT

Сообщение Foxek »

Добрый день. Настраиваю PLL от внутреннего осциллятора(HSI), но сколько бы я не менял коэффициенты, частота не меняется. Пробовал проверять и миганием дидов, и просмотром частоты на выходe MCO. Привожу свой код. Найди пожалуйста ошибку.

Код: Выделить всё

RCC->CR |= RCC_CR_HSION;
while(!(RCC_CR_HSIRDY));

RCC->CFGR&= ~(RCC_CFGR_PPRE2|RCC_CFGR_PPRE1|RCC_CFGR_HPRE);
RCC->CFGR|=(RCC_CFGR_PPRE1_2|RCC_CFGR_PPRE2_2|RCC_CFGR_HPRE_3);

FLASH->ACR |= FLASH_ACR_PRFTBE;
FLASH->ACR |= FLASH_ACR_LATENCY_2; 

RCC->CFGR&= ~(RCC_CFGR_PLLMULL|RCC_CFGR_PLLSRC);
RCC->CFGR|=RCC_CFGR_PLLMULL_1;
RCC->CR|=RCC_CR_PLLON;
while((RCC->CR & RCC_CR_PLLRDY) == 0){};
RCC->CFGR |= RCC_CFGR_SW_1;


RCC->APB2ENR |= (RCC_APB2ENR_AFIOEN | RCC_APB2ENR_IOPAEN);
GPIOA->CRH|=(GPIO_CRH_MODE8|GPIO_CRH_CNF8_1);

RCC->CFGR|=RCC_CFGR_MCO_2;


Аватара пользователя
Pavel_1978
Опытный кот
Сообщения: 830
Зарегистрирован: Пт ноя 16, 2007 11:21:37

Re: PLL на STM32F103RCT

Сообщение Pavel_1978 »

Какую частоту хотите получить на выходе PLL?
ОТ внутреннего генератора получить частоту больше 64МГц не получится так как на вход PLL поступает 4МГц.

Код: Выделить всё

//********************************************************************************
//Function: настройкa системы тактирования контроллера STM32F103xx              //
//          источник сигнала - внутренний RC генератор через умножитель         //
//********************************************************************************
void InitClk()
{
  //Частота  SystemCoreClock выше 24 MHz - разрешить буфер предварительной выборки FLASH
  FLASH->ACR|=  FLASH_ACR_PRFTBE;        //Включить буфер предварительной выборки
  FLASH->ACR&= ~FLASH_ACR_LATENCY;       //Очистить FLASH_ACR_LATENCY
  FLASH->ACR |= FLASH_ACR_LATENCY_1;     //Пропускать 1 такт

  //Настройка PLL
  RCC->CFGR  &= ~RCC_CFGR_PLLSRC;        //Источником сигнала для PLL выбран HSI с делением на 2
  RCC->CR   &= ~RCC_CR_PLLON;            //Отключить генератор PLL
  RCC->CFGR &= ~RCC_CFGR_PLLMULL;        //Очистить PLLMULL
  RCC->CFGR |=  RCC_CFGR_PLLMULL12;      //Коефициент умножения = 12
  RCC->CR   |=  RCC_CR_PLLON;            //Включить генератор PLL
  while((RCC->CR & RCC_CR_PLLRDY)==0) {} //Ожидание готовности PLL

  //Переключиться на тактирование от PLL
  RCC->CFGR &= ~RCC_CFGR_SW;             //Очистка битов выбора источника тактового сигнала
  RCC->CFGR |=  RCC_CFGR_SW_PLL;         //Выбрать источником тактового сигнала PLL
  while((RCC->CFGR&RCC_CFGR_SWS)!=0x08){}//Ожидание переключения на PLL
  //Настроить делитель для шины APB1
  RCC->CFGR &= ~RCC_CFGR_PPRE1;          //Очистка битов предделителя "APB1 Prescaler"
  RCC->CFGR |=  RCC_CFGR_PPRE1_DIV2;     //Установить "APB1 Prescaler" равным 2

  //Настроить делитель для ADC
  RCC->CFGR &= ~CFGR_ADCPRE;             //Очистка битов предделителя "ADC Prescaler"
  RCC->CFGR |=  CFGR_ADCPRE_DIV4;        //Установить "ADC Prescaler" равным 4

}
Вложения
Тактирование от HSI RC.JPG
(57.63 КБ) 496 скачиваний
Foxek
Первый раз сказал Мяу!
Сообщения: 35
Зарегистрирован: Сб дек 28, 2013 20:31:22

Re: PLL на STM32F103RCT

Сообщение Foxek »

Мне и не нужно больше 64. Мне нужно чтобы она хотябы как то менялась. И после этого как на mco выводить? Sysclk или pll на mco?
Foxek
Первый раз сказал Мяу!
Сообщения: 35
Зарегистрирован: Сб дек 28, 2013 20:31:22

Re: PLL на STM32F103RCT

Сообщение Foxek »

Как проверить? Верна ли настройка?
Foxek
Первый раз сказал Мяу!
Сообщения: 35
Зарегистрирован: Сб дек 28, 2013 20:31:22

Re: PLL на STM32F103RCT

Сообщение Foxek »

Не работает почему то данный вариант. Проверяю светодиодом. Он не моргает чаще
ЛеонидК
Встал на лапы
Сообщения: 85
Зарегистрирован: Чт янв 08, 2009 22:06:13
Откуда: Киев

Re: PLL на STM32F103RCT

Сообщение ЛеонидК »

Примерно так:

void InitClk()
{
RCC->CR |= RCC_CR_HSION; //Включить генератор HSI
while((RCC->CR & RCC_CR_HSIRDY)==0) {} //Ожидание готовности HSI
//
//Настройка PLL
RCC->CFGR &= ~RCC_CFGR_PLLSRC; //Источником сигнала для PLL выбран HSI с делением на 2
RCC->CR &= ~RCC_CR_PLLON; //Отключить генератор PLL
RCC->CFGR &= ~RCC_CFGR_PLLMULL; //Очистить PLLMULL
RCC->CFGR |= RCC_CFGR_PLLMULL2; //Коефициент умножения
RCC->CR |= RCC_CR_PLLON; //Включить генератор PLL
while((RCC->CR & RCC_CR_PLLRDY)==0) {} //Ожидание готовности PLL
//
//Переключиться на тактирование от PLL
RCC->CFGR &= ~RCC_CFGR_SW; //Очистка битов выбора источника тактового сигнала
RCC->CFGR |= RCC_CFGR_SW_PLL; //Выбрать источником тактового сигнала PLL
while((RCC->CFGR&RCC_CFGR_SWS)!=0x08){} //Ожидание переключения на PLL
//
//Настроить делитель для AHB
RCC->CFGR &= ~RCC_CFGR_HPRE; //Очистка битов предделителя "AHB Prescaler"
RCC->CFGR |= RCC_CFGR_HPRE_DIV1; //Установить "AHB Prescaler"
//
//Настроить делитель для шины APB1
RCC->CFGR &= ~RCC_CFGR_PPRE1; //Очистка битов предделителя "APB1 Prescaler"
RCC->CFGR |= RCC_CFGR_PPRE1_DIV1; //Установить "APB1 Prescaler"
//
//Настроить делитель для шины APB2
RCC->CFGR &= ~RCC_CFGR_PPRE2; //Очистка битов предделителя "APB2 Prescaler"
RCC->CFGR |= RCC_CFGR_PPRE2_DIV1; //Установить "APB2 Prescaler"
//
//Настроить делитель для ADC
RCC->CFGR &= ~RCC_CFGR_ADCPRE; //Очистка битов предделителя "ADC Prescaler"
RCC->CFGR |= RCC_CFGR_ADCPRE_DIV2; //Установить "ADC Prescaler" равным 2
//
//Настроить делитель для шины USB
RCC->CFGR &= ~RCC_CFGR_USBPRE; //Предделитель для USB равен 1
}
Artem148
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Сб мар 29, 2014 18:04:50

PLL на STM32F401C-Discovery

Сообщение Artem148 »

Всем доброго времени суток!

Столкнулся с похожей проблемой; Использую CooCox CoIDE и отладочную плату STM32F401C-Discovery;

Код: Выделить всё


void PLL_init(void)
{
   RCC_DeInit();

   RCC_PLLCmd(DISABLE);

   while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);

   RCC_HCLKConfig(RCC_SYSCLK_Div1);

   RCC_PCLK1Config(RCC_HCLK_Div2);
   RCC_PCLK2Config(RCC_HCLK_Div1);

   RCC_PLLConfig(RCC_PLLSource_HSI, 16, 336, 4, 7);

   RCC_PLLCmd(ENABLE);

   while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

   RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

   while (RCC_GetSYSCLKSource() != 0x08);
}



Уважаемые знатоки, прошу ткнуть носом в ошибку!
Заранее спасибо!

P.S. Если быть более точным, то микроконтроллер виснет после

Код: Выделить всё

  RCC->CFGR = tmpreg; 
(последняя команда "RCC_SYSCLKConfig" в "stm32f4xx_rcc.с")

Спойлерфункция RCC_SYSCLKConfig из stm32f4xx_rcc.с;

Код: Выделить всё


void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource)
{
  uint32_t tmpreg = 0;

  /* Check the parameters */
  assert_param(IS_RCC_SYSCLK_SOURCE(RCC_SYSCLKSource));

  tmpreg = RCC->CFGR;

  /* Clear SW[1:0] bits */
  tmpreg &= ~RCC_CFGR_SW;

  /* Set SW[1:0] bits according to RCC_SYSCLKSource value */
  tmpreg |= RCC_SYSCLKSource;

  /* Store the new value */
  RCC->CFGR = tmpreg;
}



P.P.S:
1) Не важно какой источник у ФАПЧ - внешний кварц или внутренний RC.
2) Параметры, использующиеся для настройки ФАПЧ, тоже не играют значения - результат одинаковый.
3) После этого (см. скрин [отладчик + дисассемблер]) мк "уходит в глубочайший запой" и не на что не отвечает.

Снимок.PNG
Скрин
(220.16 КБ) 739 скачиваний
Ответить

Вернуться в «ARM»