Страница 1 из 1
PLL на STM32F103RCT
Добавлено: Ср май 21, 2014 14:58:31
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;
Re: PLL на STM32F103RCT
Добавлено: Ср май 21, 2014 16:13:02
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
}
Re: PLL на STM32F103RCT
Добавлено: Ср май 21, 2014 16:40:31
Foxek
Мне и не нужно больше 64. Мне нужно чтобы она хотябы как то менялась. И после этого как на mco выводить? Sysclk или pll на mco?
Re: PLL на STM32F103RCT
Добавлено: Ср май 21, 2014 20:52:38
Foxek
Как проверить? Верна ли настройка?
Re: PLL на STM32F103RCT
Добавлено: Чт май 22, 2014 01:01:35
Foxek
Не работает почему то данный вариант. Проверяю светодиодом. Он не моргает чаще
Re: PLL на STM32F103RCT
Добавлено: Пн май 26, 2014 16:50:53
ЛеонидК
Примерно так:
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
}
PLL на STM32F401C-Discovery
Добавлено: Ср сен 03, 2014 19:09:46
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_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) После этого (см. скрин [отладчик + дисассемблер]) мк "уходит в глубочайший запой" и не на что не отвечает.