| Форум РадиоКот https://radiokot.ru/forum/ |
|
| PLL на STM32F103RCT https://radiokot.ru/forum/viewtopic.php?f=59&t=104228 |
Страница 1 из 1 |
| Автор: | Foxek [ Ср май 21, 2014 14:58:31 ] |
| Заголовок сообщения: | PLL на STM32F103RCT |
Добрый день. Настраиваю 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 [ Ср май 21, 2014 16:13:02 ] | ||
| Заголовок сообщения: | Re: PLL на STM32F103RCT | ||
Какую частоту хотите получить на выходе 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 }
|
|||
| Автор: | Foxek [ Ср май 21, 2014 16:40:31 ] |
| Заголовок сообщения: | Re: PLL на STM32F103RCT |
Мне и не нужно больше 64. Мне нужно чтобы она хотябы как то менялась. И после этого как на mco выводить? Sysclk или pll на mco? |
|
| Автор: | Foxek [ Ср май 21, 2014 20:52:38 ] |
| Заголовок сообщения: | Re: PLL на STM32F103RCT |
Как проверить? Верна ли настройка? |
|
| Автор: | Foxek [ Чт май 22, 2014 01:01:35 ] |
| Заголовок сообщения: | Re: PLL на STM32F103RCT |
Не работает почему то данный вариант. Проверяю светодиодом. Он не моргает чаще |
|
| Автор: | ЛеонидК [ Пн май 26, 2014 16:50:53 ] |
| Заголовок сообщения: | 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 [ Ср сен 03, 2014 19:09:46 ] |
| Заголовок сообщения: | PLL на STM32F401C-Discovery |
Всем доброго времени суток! Столкнулся с похожей проблемой; Использую 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) После этого (см. скрин [отладчик + дисассемблер]) мк "уходит в глубочайший запой" и не на что не отвечает. Вложение:
|
|
| Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|


