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

 
 
> Вопросы по тактированию STM32F100, Не совпадают частоты тактирования кварцем и RC-генератором
allsettingsdone
сообщение May 14 2013, 12:30
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 22-01-13
Пользователь №: 75 284



Здравствуйте, начал подробно разбираться со способами тактирования STM. Написал функцию для простоты которая позволяет выбрать источник тактирования и менять множитель частоты, НО возник момент когда я тактирую мк от внутреннего RC генератора 8 МГц - то программа работает медленней чем если бы тактировал от кварца 8 МГц (смотрел на осциллографе частоту дрыгания ногами в цикле с "for(volatile uint32_t i=10; i>0; i--) {}"). И вот в случае тактирования мк от кварца 8 МГц длительность импульса - 3 мкс, а если выбрать тактирование от внутреннего RC генератора с частотой опять таки 8 Мгц - то длительность импульса будет уже 8 мкс!!! (компилирую в Keil со вторым уровнем оптимизации). И ещё совершенно не получается изменять частоту тактирования при помощи ФАПЧ (PLL). Прилагается проект в Keil. Он сам небольшой, функция называется init_clk(uint32_t clk_sourse, uint32_t PLL_status, uint32_t PLL_freq).
Прикрепленные файлы
Прикрепленный файл  test0_delay.zip ( 180.11 килобайт ) Кол-во скачиваний: 12
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
allsettingsdone
сообщение May 14 2013, 15:50
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 22-01-13
Пользователь №: 75 284



Да вроде бы никаких делителей я не менял на других шинах, и те что есть не делил. Что касается измерения на ножке, то я вывожу прямоугольные импульсы на PC8 | PC9 (на светодиоды на STM32F100DISCOVERY), и в настройках порта выставлена частота тактирования = 50MHz (GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;)
Вот код функции:
CODE

//=======для выбора параметров тактирования в функции init_clk=======
#define HSI 0
#define HSE 1
#define PLL_on 0
#define PLL_off 1

void init_clk(uint32_t clk_sourse, uint32_t PLL_status, uint32_t PLL_freq)
{
if(PLL_status == PLL_on) //если мк тактируется от PLL
{
if(clk_sourse == HSE) //если источником сигнала PLL является HSE
{
RCC->CFGR2 &= ~RCC_CFGR2_PREDIV1; //предочистка делителя HSE
RCC->CFGR2 |= RCC_CFGR2_PREDIV1_DIV1; //делить частоту HSE на 1

RCC->CFGR |= RCC_CFGR_PLLSRC; //источником сигнала для PLL выбран HSE
RCC->CR &= ~RCC_CR_PLLON; //отключить генератор PLL
RCC->CFGR &= ~RCC_CFGR_PLLMULL; //очистить PLLMULL
switch(PLL_freq)
{
case(2): RCC->CFGR |= RCC_CFGR_PLLMULL2; //коэфициент умножения = 2
case(3): RCC->CFGR |= RCC_CFGR_PLLMULL3; //коэфициент умножения = 3
case(4): RCC->CFGR |= RCC_CFGR_PLLMULL4; //коэфициент умножения = 4
case(5): RCC->CFGR |= RCC_CFGR_PLLMULL5; //коэфициент умножения = 5
case(6): RCC->CFGR |= RCC_CFGR_PLLMULL6; //коэфициент умножения = 6
case(7): RCC->CFGR |= RCC_CFGR_PLLMULL7; //коэфициент умножения = 7
case(8): RCC->CFGR |= RCC_CFGR_PLLMULL8; //коэфициент умножения = 8
case(9): RCC->CFGR |= RCC_CFGR_PLLMULL9; //коэфициент умножения = 9
case(10): RCC->CFGR |= RCC_CFGR_PLLMULL10; //коэфициент умножения = 10
case(11): RCC->CFGR |= RCC_CFGR_PLLMULL11; //коэфициент умножения = 11
case(12): RCC->CFGR |= RCC_CFGR_PLLMULL12; //коэфициент умножения = 12
case(13): RCC->CFGR |= RCC_CFGR_PLLMULL13; //коэфициент умножения = 13
case(14): RCC->CFGR |= RCC_CFGR_PLLMULL14; //коэфициент умножения = 14
case(15): RCC->CFGR |= RCC_CFGR_PLLMULL15; //коэфициент умножения = 15
case(16): RCC->CFGR |= RCC_CFGR_PLLMULL16; //коэфициент умножения = 16
}
RCC->CR |= RCC_CR_PLLON; //включить генератор PLL
while((RCC->CR & RCC_CR_PLLRDY)==0) {} //ожидание готовности PLL
RCC->CFGR &= ~RCC_CFGR_SW; //очистка битов выбора источника тактового сигнала
RCC->CFGR |= RCC_CFGR_SW_PLL; //выбрать источником тактового сигнала PLL
while((RCC->CFGR&RCC_CFGR_SWS)!=0x08){} //ожидание переключения на PLL
}
else //если источником сигнала PLL является HSI
{
RCC->CFGR &= ~RCC_CFGR_PLLSRC; //источником сигнала для PLL выбран HSI с делением на 2
RCC->CR &= ~RCC_CR_PLLON; //отключить генератор PLL
RCC->CFGR &= ~RCC_CFGR_PLLMULL; //очистить PLLMULL
switch(PLL_freq)
{
case(2): RCC->CFGR |= RCC_CFGR_PLLMULL2; //коэфициент умножения = 2
case(3): RCC->CFGR |= RCC_CFGR_PLLMULL3; //коэфициент умножения = 3
case(4): RCC->CFGR |= RCC_CFGR_PLLMULL4; //коэфициент умножения = 4
case(5): RCC->CFGR |= RCC_CFGR_PLLMULL5; //коэфициент умножения = 5
case(6): RCC->CFGR |= RCC_CFGR_PLLMULL6; //коэфициент умножения = 6
case(7): RCC->CFGR |= RCC_CFGR_PLLMULL7; //коэфициент умножения = 7
case(8): RCC->CFGR |= RCC_CFGR_PLLMULL8; //коэфициент умножения = 8
case(9): RCC->CFGR |= RCC_CFGR_PLLMULL9; //коэфициент умножения = 9
case(10): RCC->CFGR |= RCC_CFGR_PLLMULL10; //коэфициент умножения = 10
case(11): RCC->CFGR |= RCC_CFGR_PLLMULL11; //коэфициент умножения = 11
case(12): RCC->CFGR |= RCC_CFGR_PLLMULL12; //коэфициент умножения = 12
case(13): RCC->CFGR |= RCC_CFGR_PLLMULL13; //коэфициент умножения = 13
case(14): RCC->CFGR |= RCC_CFGR_PLLMULL14; //коэфициент умножения = 14
case(15): RCC->CFGR |= RCC_CFGR_PLLMULL15; //коэфициент умножения = 15
case(16): RCC->CFGR |= RCC_CFGR_PLLMULL16; //коэфициент умножения = 16
}
RCC->CR |= RCC_CR_PLLON; //включить генератор PLL
while((RCC->CR & RCC_CR_PLLRDY)==0) {} //ожидание готовности PLL
RCC->CFGR &= ~RCC_CFGR_SW; //очистка битов выбора источника тактового сигнала
RCC->CFGR |= RCC_CFGR_SW_PLL; //выбрать источником тактового сигнала PLL
while((RCC->CFGR&RCC_CFGR_SWS)!=0x08){} //ожидание переключения на PLL
}
}
else //если мк тактируется не от PLL
{
if(clk_sourse == HSE) //если мк тактируется от внешнего генератора HSE
{
RCC->CR |= RCC_CR_HSEON; //включить генератор HSE
while((RCC->CR & RCC_CR_HSERDY)==0) //ожидание готовности HSE
RCC->CFGR &= ~RCC_CFGR_SW; //очистка битов выбора источника тактового сигнала
RCC->CFGR |= RCC_CFGR_SW_HSE; //выбрать источником тактового сигнала генератор HSE
}
else //если мк тактируется от внутреннего генератора HSI
{
RCC->CR |= RCC_CR_HSION; //включить генератор HSI
while((RCC->CR & RCC_CR_HSIRDY)==0) {} //ожидание готовности HSI
RCC->CFGR &= ~RCC_CFGR_SW; //очистка битов выбора источника тактового сигнала
RCC->CFGR |= RCC_CFGR_SW_HSI; //выбрать источником тактового сигнала генератор HSI
}
}
}


Вот так к примеру я вызываю функцию: init_clk(HSI,PLL_off,1); //тактирование от генератора HSI, ФАПЧ выключен, коэффициент умножения ФАПЧ = 1 (все равно в данном случае не используется)

Сообщение отредактировал allsettingsdone - May 14 2013, 15:51
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 19th August 2025 - 10:44
Рейтинг@Mail.ru


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