Professional Documents
Culture Documents
Lab 3
Lab 3
40 kHz low speed внатрешен RC осцилатор (LSI RC) со кој може да се тактираат
независната watchdog периферија и опционално RTC периферијата која служи
за автоматско будење на микроконтролерот од Stop или Standby режим на
работа.
32 kHz low speed надворешен кристал (LSE кристал) кој опционално го тактира
real-time тактот (RTCCLK).
Секој извор на такт сигнал може да се вклучи или исклучи независно кога не се
користи со цел да се оптимизира потрошувачката на енергија.
Различни прескалери можат да се користат за да се конфигурира фреквенцијата
на AHB (Advance High-Performance Bus) магистралата, high speed магистралата за
периферијата (APB2 Advance Peripheral Bus) и low speed магистралата за периферијата
(APB1 Advance Peripheral Bus). Максималната фреквенција на AHB и APB2 домените е
72 MHz, додека пак максималната фреквенција на APB1 доменот е 36 MHz.
Сите периферни тактови се добиваат од тактовите на магистралите (HCLK од
AHB, PCLK1 од APB1 и PCLK2 од APB2) со исклучок на:
Тактот за RTC може да се добие од LSE, LSI или од HSE тактот поделен со 32
Тактот за IWDG периферијата секогаш е тактирана од внатрешниот LSI такт.
HSE такт
High-speed екстерниот такт сигнал (HSE) може да биде генериран од два такт
извори:
HSI такт
Калибрација
Фреквенцијата на RC осцилаторот може да варира од еден чип до друг што се
должи на варијациите во процесот на производство, ова е причината зошто секој чип е
фабрички калибриран од ST на 1% точност на температура од 25°C. По ресетирањето
фабричката калибрациона вредност се вчитува во HSICAL[7:0] битовите во Clock
Control регистарот. Ако апликацијата е подложна на температурни или напонски
варијации тие можат да влијаат на RC брзината. Ние можеме да ја калибрираме
дополнително HIS фреквенцијата во апликацијата со користење на HSITRIM[4:0]
битовите во Clock Control регистарот (RCC_CR). Флегот HSIRDY во Clock Control
регистарот (RCC_CR) претставува индикатор за тоа дали HSI RC осцилаторот е
стабилен или не. При стартување HSI RC излезниот такт не се пушта се додека овој бит
не се сетира од страна на хардверот. HSI RC осцилаторот може да се вклучи или
исклучи со користење на HSION битот во Clock Control регистарот (RCC_CR). HSI
сигналот исто така може да се користи како backup извор (помошен извор) ако HSE
кристалниот осцилатор падне.
Прекин може да се генерира кога PLL јамката е спремна ако тоа го овозможиме во
Clock Interrupt регистарот (RCC_CIR). Излезната PLL фреквенција мора да ја
поставиме во границите од 16-72 MHz.
LSE такт
LSE кристалот е 32.768 kHz low speed надворешен кристален или керамички
резонатор. Придобивките од него се обезбедувањето на такт со висока прецизност но
со ниска потрошувачка на енергија за real time clock периферијата (RTC) која што
служи за мерење на времето (часовник/календар) или други фунции кои работат со
тајминзи. LSE кристалот може да се вклучи или исклучи со користење на LSEON битот
во Backup domain control регистарот (RCC_BDCR). Јачината на тактирањето може да се
промени за време на работата на микроконтролерот со користење на LSEDRV[1:0]
битовите во Backup domain control регистарот (RCC_BDCR) за да се обезбеди
компромис помеѓу робусноста и краткото време на стартување на една страна и
ниската потрошувачка од другата страна. LSERDDY флегот во Backup domain control
регистарот (RCC_BDCR) претставува индикатор за тоа дали LSE кристалот е стабилен
или не. При стартување излезниот такт од LSE кристалот не се пушта се додека овој
вит не се сетира од страна на хардверот. Дополнително може да се генерира прекин ако
тоа е овозможено во Clock Interrupt регистарот (RCC_CIR).
LSI такт
LSI RC функционира како такт извор со ниска потрошувачка кој што може да
работи и во Stop и во Standby режим за независната IWDT периферија и RTC
периферијата. Такт фреквенцијата е околу 40KHz или помеѓу 30KHz и 50KHz. LSI RC
периферијата може да се вклучи или исклучи со користење на LSION битот во Control
Status регистарот (RCC_CSR). Флегот LSIRDY во Control Status регистарот (RCC_CSR)
претставува индикатор дали LSI осцилаторот е стабилен или не. При стартување
тактот не се поврзува се додека овој бит не е сетиран од хардверот. Прекин може да се
генерира ако е овозможено во Clock interrupt регистарот (RCC_CIR).
Три различни такт извори можат да се користат како системски такт (SYSCLK):
HSI осцилатор
HSE осцилатор
PLL
По системското ресетирање HSI осцилаторот е селектиран како системски такт.
Во CooCox во нашиот случај по ресетирањето како системски такт е ставен
5 LSE такт | Никола Јовановски
March 4, 2016 ЛАБОРАТОРИСКА ВЕЖБА 3 RCC
Кога изворот на такт се користи директно како системски такт или преку PLL не
е возможно да се изврши исклучување на соодветниот извор. За да се исклучи еден
извор на такт било тоа дали е HSI или HSE кој се користи директно или преку PLL
како системски такт потребно е најпрво да се направи промена системскиот такт
односно на изворот кој ќе се користи како системски такт. Промената на изворот на
системски такт се прави со промена на SW (System Clock switch) битовите во Clock
configuration регистарот (RCC_CFGR). По промената на изворот на системски такт,
изворот кој веќе не се користи како извор на системски такт можеме да го исклучиме.
Префрлувањето од еден такт извор на друг може да се случи само ако целниот
такт извор е потполно стабилизиран по вклучувањето односно ако се работи за PLL
јамката по вклучувањето е заклучена односно locked (PLLRDY битот од Clock control
регистарот е сетиран од страна на хардверот). Ако се избере нов извор на такт за
промена кој е вклучен но сеуште не е стабилизиран префрлањето ќе се случи кога
изворот на такт ќе биде потполно спремен. Битовите HSIRDY, HSERDY и PLLRDY од
Clock Control регистарот претставуваат индикатор за тоа кој такт извор е спремен
(стабилизиран) кој не е, а битовите SWS (System clock switch status) од Clock
Configuration регистарот (RCC_CFGR) претставуваат индикатор за тековниот извор на
системски такт. На слика 3 е претставен изгледот на clock control регистарот со додаток
објаснување на соодветните битови, додека пак на слика 4 е претставен изгледот на
clock configuration регистарот со додаток објаснување на битовите.
1: Clock detector ON (Clock detector ON if the HSE oscillator is ready, OFF if not).
Bit 18 HSEBYP: HSE crystal oscillator bypass
Set and cleared by software to bypass the oscillator with an external clock. The external clock
must be enabled with the HSEON bit set, to be used by the device. The HSEBYP bit can be
written only if the HSE oscillator is disabled.
0: HSE crystal oscillator not bypassed
1: HSE crystal oscillator bypassed with external clock
Bit 17 HSERDY: HSE clock ready flag
Set by hardware to indicate that the HSE oscillator is stable. This bit needs 6 cycles of the HSE
oscillator clock to fall down after HSEON reset.
0: HSE oscillator not ready
1: HSE oscillator ready
Задачи
Решение:
#include "cmsis_lib/include/stm32f30x_gpio.h"
#include "cmsis_lib/include/stm32f30x_rcc.h"
int main(void)
{
uint32_t diodeOn = (1 << 8); //Promenliva vo koja cuvame
//koja e slednata dioda koja
//treba da se vkluci
uint32_t i; //Brojac za for jamka za
//docnenje
/***********************Clock configuration************************/
RCC -> CFGR &= ~(0xF << 4); //Delitelot za AHB taktot
//postavigo na 1
RCC -> CFGR &= ~(0x3 << 8); //Postavi go taktot na APB1
//magistralata
RCC -> CFGR |= (0x1 << 10); //na SYSCLK / 2
RCC -> CFGR &= ~(0x3 << 11); //Postavi go taktot na APB2
//magistralata
RCC -> CFGR |= (0x1 << 13); //na SYSCLK / 2
/******************************GPIO configuration******************/
while(1)
{
GPIOE -> ODR |= diodeOn; //Vkluci ja soodvetnata dioda
diodeOn = diodeOn << 1; //Postavi sledna dioda koja ke
//treba da se vkluci
if(diodeOn & (1 << 16)) //Ako e vklucena poslednata
{ //dioda
}
}
Решение:
#include "cmsis_lib/include/stm32f30x_gpio.h"
#include "cmsis_lib/include/stm32f30x_rcc.h"
int main(void)
{
RCC->CFGR &= ~(0x1 << 16); //Izberi PLL source takt HSI/2
RCC->CFGR &= ~(0xF << 18);
RCC->CFGR |= (0xE << 18); //Setiraj go faktorot na
//mnozenje na PLL 16
//(16*(8MHz/2)) = 64MHz
RCC->CR |= (0x1 << 24); //Ovozmozigo PLL
while (!(RCC->CR & (0x1 << 25))); //Cekaj dodeka PLL se
//stabilizira
RCC-> CFGR &= ~(0x3); //Switch na sistemskiot
//takt od HSI vo PLL
RCC-> CFGR |= 0x2;
while ((RCC -> CFGR & 0xC) != 0x8 ); //Cekaj dodeka se
//napravi promenata na
//sistemskiot takt
RCC -> CFGR &= ~(0xF << 4); //Delitelot za AHB taktot
//postavigo na 1
RCC -> CFGR &= ~(0x3 << 8); //Postavi go taktot na APB1
//magistralata
RCC -> CFGR |= (0x1 << 10); //na SYSCLK / 2
RCC -> CFGR &= ~(0x7 << 11); //Postavi go taktot na APB2
//magistralata na SYSCLK / 1
while(1)
{
GPIOE -> ODR |= diodeOn; //Vkluci ja soodvetnata dioda
diodeOn = diodeOn << 1; //Postavi sledna dioda koja ke
//treba da se vkluci
if(diodeOn & (1 << 16)) //Ako e vklucena poslednata dioda
{
diodeOn = (1 << 8); //Vratise na prvata dioda
}
for(i = 0; i < 100000; i++); //Ednostavna jamka za docnenje
GPIOE -> ODR &= ~(0xFF << 8); //Iskluci ja vklucenata dioda
//(isklucigi site)
}
}
Решение:
Бидејќи по default CooCox го поставува за системски такт тактот кој го добива
од PLL јамката, а како извор за PLL јамката се користи надворешниот такт од ST
линкот тоа значи дека надворешниот такт е вклучен и веќе стабилизиран па
преостанува само да се направи префрлање од PLL јамката на HSE. Во спротивно би
требало да се сетираат HSE и HSEBYPASS битовите и да се чека да се стабилизира
тактот па да се направи префрлањето од тековниот такт на HSE тактот.
#include "cmsis_lib/include/stm32f30x_gpio.h"
#include "cmsis_lib/include/stm32f30x_rcc.h"
int main(void)
{
RCC -> CFGR &= ~(0x1 << 7); //Setiraj go delitelot za AHB
//na 1 odnosno AHB taktot ==
//sistemskiot takt
while(1)
{
GPIOE -> ODR &= ~(0xFF << 8); //Iskluci gi diodite
GPIOE -> ODR |= (0xAA << 8); //Vkluci gi diodite LD3, LD7,
//LD10, LD6
for(i = 0; i < 100000; i++); //Ednostavna jamka za docnenje
GPIOE -> ODR &= ~(0xFF << 8); //Iskluci gi diodite
GPIOE -> ODR |= (0xAA << 7); //Vkluci gi diodite LD4, LD5,
//LD9, LD8
for(i = 0; i < 100000; i++); //Ednostavna jamka za docnenje
}
}
Решение:
#include "cmsis_lib/include/stm32f30x_gpio.h"
#include "cmsis_lib/include/stm32f30x_rcc.h"
int main(void)
{
uint32_t i; //Brojac za for jamka za docnenje
RCC -> CFGR &= ~(0x1 << 7); //Setiraj go delitelot za AHB
//na 1 odnosno AHB taktot ==
//sistemskiot takt
RCC_GetClocksFreq(&clock1);
while(1)
{
GPIOE -> ODR &= ~(0xFF << 8); //Iskluci gi diodite
GPIOE -> ODR |= (0xAA << 8); //Vkluci gi diodite LD3, LD7,
//LD10, LD6
for(i = 0; i < 100000; i++); //Ednostavna jamka za docnenje
GPIOE -> ODR &= ~(0xFF << 8); //Iskluci gi diodite
GPIOE -> ODR |= (0xAA << 7); //Vkluci gi diodite LD4, LD5,
//LD9, LD8
for(i = 0; i < 100000; i++); //Ednostavna jamka za docnenje
}
}
Решение:
Функцијата RCC_DeInit(); е дел од stm32f30x_rcc.h библиотеката. Оваа
функција ги исклучува HSE и PLL јамката и како системски такт го поставува HSI.
Дополнително тактовите на AHB, APB1 и APB2 магистралите ги поставува исто на
HSI тактот без делители.
#include "cmsis_lib/include/stm32f30x_gpio.h"
#include "cmsis_lib/include/stm32f30x_rcc.h"
int main(void)
{
uint32_t i; //Brojac za for jamka za docnenje
RCC_DeInit();
/* HCLK = SYSCLK */
RCC->CFGR &= ~(0xF << 4) ; //Postavuvanje na AHB
//prescalerot na 1
/* PCLK2 = HCLK */
RCC->CFGR &= ~(0xF << 11); //Postavuvanje na APB2
//prescalerot na 1
/* PCLK1 = HCLK */
RCC->CFGR |= (0x1 << 10); //Postavuvanje na APB1
//prescalerot na 2
//vlezniot takt vo
//PLL
/* Enable PLL */
RCC->CR |= (0x1 << 24); //Vkluci PLL
while(1)
{
if(GPIOA -> IDR & 0x1) //Ako kopceto e pritisnato
{
FLASH->ACR |= 0x10 | 0x02; //Vkluci Prefetch buffer i
//namesti latencija na 2
}
else
{
FLASH->ACR &= ~(0x1 << 4) ; //Iskluci latencija
}
GPIOE -> ODR &= ~(0xFF << 8); //Iskluci gi diodite
GPIOE -> ODR |= (0xAA << 8); //Vkluci gi diodite LD3, LD7,
//LD10, LD6
for(i = 0; i < 1000000; i++); //Ednostavna jamka za docnenje
GPIOE -> ODR &= ~(0xFF << 8); //Iskluci gi diodite
GPIOE -> ODR |= (0xAA << 7); //Vkluci gi diodite LD4, LD5,
//LD9, LD8
for(i = 0; i < 1000000; i++); //Ednostavna jamka za docnenje
}
}