You are on page 1of 20

March 4, 2016 ЛАБОРАТОРИСКА ВЕЖБА 3 RCC

Такт извори на STM32F303 микроконтролерот

Три различни такт извори можат да се користат за да го тактираат


микроконтролерот односно како системски такт (SYSCLK):

 High speed internal RC осцилатор 8Mhz (HIS)


 High speed external crystal осцилатор (HSE)
 Phase locked loop (PLL) такт

Микроконтролерот има дополнителни два такт извори:

 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) со исклучок на:

 Тактот за интерфејсот за програмирање на FLASH меморијата кој секогаш е HSI


тактот (FLITFCLK).
 USB тактот кој се добива од PLL VCO (PLL voltage-controlled oscillator)
 Опционален бајт loader такт кој што секогаш е тактиран од HSI (High speed
internal clock)
 ADC периферијата го добива такт сигналот секогаш од PLL излезот. Излезот од
PLL јамката може да ја достигне максималната фреквенција од 72 MHZ и пред
да стигне до ADC периферијата може да се подели со 1, 2, 4, 6, 8, 10, 12, 16, 32,
64, 128 или 256.
 U(S)ART периферијата може да биде тактирана од еден од следниве четири
извори:
o Системскиот такт
o HSI тактот
o LSE тактот
o APB1 или APB2 тактот (PCLK1 или PCLK2 во зависност од тоа на која
APB магистрала е мапиран соодветниот USART)
 I2C1/2 периферијата може да биде тактирана од еден од следниве два извори:
o Системскиот такт
o HIS тактот
 Тактот за I2S2 и I2S3 периферијата може да се добие и од надворешен посебен
такт извор.

1 Такт извори на STM32F303 микроконтролерот | Никола Јовановски


March 4, 2016 ЛАБОРАТОРИСКА ВЕЖБА 3 RCC

 Тактот за RTC може да се добие од LSE, LSI или од HSE тактот поделен со 32
 Тактот за IWDG периферијата секогаш е тактирана од внатрешниот LSI такт.

На слика 1 е дадена интерната структура на такт сигналите и нивното избирање


и делење кон периферијата.

Слика 1. Структура на такт сигналите.

2 Такт извори на STM32F303 микроконтролерот | Никола Јовановски


March 4, 2016 ЛАБОРАТОРИСКА ВЕЖБА 3 RCC

HSE такт
High-speed екстерниот такт сигнал (HSE) може да биде генериран од два такт
извори:

 HSE надворешен кристален/керамички резонатор


 HSE кориснички надворешен такт

Резонаторот и надворешните кондензатори треба да бидат поставени што е


можно поблиску до пиновите на микроконтролерот за HSE тактот со цел да се
минимизира излезната дисторзија и времето на стабилизација при вклучување.
Вредностите на кондензаторите мора да бидат избрани строго според селектираниот
осцилатор. На слика 2 е прикажан начинот на поврзување на надворешниот такт извор.

Слика 2. HSE/LSE такт извор.

Надворешен керамички/кристален резонатор

Надворешниот кристален осцилатор кој што може да биде од 4 до 32MHz има


предност во продуцирањето на многу прецизна рата на главниот такт сигнал. Флегот
HSERDY во Clock Control регистарот (RCC_CR) претставува индикатор за тоа дали
HSE осцилаторот е стабилен или не. При вклучување надворешниот такт не се
вклучува се додека овој бит не е сетиран од страна на хардверот. Дополнително може
да се генерира прекин ако тоа е овозможено во Clock Interrupt регистарот (RCC_CIR).
HSE кристалот може да се вклучи или исклучи со користење на HSEON битот во Clock
Control регистарот (RCC_CR).

3 HSE такт | Никола Јовановски


March 4, 2016 ЛАБОРАТОРИСКА ВЕЖБА 3 RCC

Надворешен такт сигнал

Во овој мод надворешен такт сигнал мора да биде обезбеден. Надворешниот


такт сигнал може да има фреквенција до 32 MHz. Овој мод може да се селектира со
сетирање на HSEBYP и HSEON битовите во Clock Control регистарот (RCC_CR).
Надворешниот такт сигнал (правоаголен, синусоидален или триаголен) со 40-60% duty
cycle во зависност од фреквенцијата може да го движи OSC_IN пинот, додека пак
OSC_OUT пинот може да се користи како пин за генерална намена (GPIO).

HSI такт

HSI такт сигналот е генериран од внатрешен 8 MHz RC осцилатор кој може да


се користи директно како системски такт или поделен со 2 како влезен такт на PLL
јамката. Предноста на HSI RC осцилаторот е во тоа што обезбедува извор на такт
сигнал за ниска цена (без користење на дополнителни компоненти). Ваквиот осцилатор
дополнително има и побрзо време на стартување во однос на HSE кристалниот
осцилатор, сепак дури и со калибрација фреквенцијата на ваквиот осцилатор е помалку
прецизна во однос на надворешниот кристален осцилатор или керамички резонатор.

Калибрација
Фреквенцијата на 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 phase-locked loop


Внатрешниот PLL може да се користи за мултиплицирање на HSI или HSE такт
фреквенцијата. PLL конфигурирањето (изборот на влезен такт сигнал и факторот на
множење) мора да се направат пред овозможувањето на PLL јамката. Еднаш кога PLL
јамката е овозможена овие параметри не можат да се менуваат. Процедурата за
модификација на PLL параметрите е следна:

 Оневозможување на PLL јамката со ресетирање на PLLON битот на 0


 Да се чека се додека PLLRDY битот не се ресетира од страна на хардверот. По
ресетирањето на овој пин од хардверот PLL јамката е целосно стопирана
(оневозможена)
 Промена на посакуваните параметри
 Овозможување на PLL повторно со поставување на PLLON битот на 1

4 Надворешен такт сигнал | Никола Јовановски


March 4, 2016 ЛАБОРАТОРИСКА ВЕЖБА 3 RCC

Прекин може да се генерира кога 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).

Надворешен такт сигнал (LSE bypass)

Во овој мод мора да имаме на располагање надворешен такт сигнал. Неговата


фреквенција може да биде до максимум 1MHz. Selektiraweto na ovoj мод се прави со
сетирање на LSEBYP и LSEON битовите во Backup domain control регистарот
(RCC_BDCR). Надворешен такт сигнал (правоаголен, синусоидален или триаголен) со
∼50% duty cycle може да го вози OSC32_IN пинот, додека пак OSC32_OUT пинот
може да се користи како пин за генерална намена (GPIO).

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)

Три различни такт извори можат да се користат како системски такт (SYSCLK):

 HSI осцилатор
 HSE осцилатор
 PLL
По системското ресетирање HSI осцилаторот е селектиран како системски такт.
Во CooCox во нашиот случај по ресетирањето како системски такт е ставен
5 LSE такт | Никола Јовановски
March 4, 2016 ЛАБОРАТОРИСКА ВЕЖБА 3 RCC

надворешниот такт кој доаѓа од микроконтролерот на ST link-от за дебагирање. Што


значи се користи HSE BYPASS за тактирање на микроконтролерот како такт извор за
PLL јамката. Со PLL јамката тактот се мултиплицира на 72MHz па како системски такт
на микроконтролерот се користи максималниот такт (по default во CooCox бидејќи
плочата нема екстерен посебен кристал за микроконтролерот па се користи од ST
линкот).

Кога изворот на такт се користи директно како системски такт или преку 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 регистарот со додаток објаснување на битовите.

Слика 3. Clock control register (RCC_CR).


Bits 31:26 Reserved, must be kept at reset value.
Bit 25 PLLRDY: PLL clock ready flag
Set by hardware to indicate that the PLL is locked.
0: PLL unlocked
1: PLL locked
Bit 24 PLLON: PLL enable
Set and cleared by software to enable PLL.
Cleared by hardware when entering Stop or Standby mode. This bit can not be reset if the PLL
clock is used as system clock or is selected to become the system clock.
0: PLL OFF
1: PLL ON
Bits 23:20 Reserved, must be kept at reset value.
Bit 19 CSSON: Clock security system enable
Set and cleared by software to enable the clock security system. When CSSON is set, the
clock detector is enabled by hardware when the HSE oscillator is ready, and disabled by
hardware if a HSE clock failure is detected.
0: Clock detector OFF

6 Избор на системски такт (SYSCLK) | Никола Јовановски


March 4, 2016 ЛАБОРАТОРИСКА ВЕЖБА 3 RCC

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

Bit 16 HSEON: HSE clock enable


Set and cleared by software.
Cleared by hardware to stop the HSE oscillator when entering Stop or Standby mode. This bit
cannot be reset if the HSE oscillator is used directly or indirectly as the system clock.
0: HSE oscillator OFF
1: HSE oscillator ON
Bits 15:8 HSICAL[7:0]: HSI clock calibration
These bits are initialized automatically at startup.
Bits 7:3 HSITRIM[4:0]: HSI clock trimming
These bits provide an additional user-programmable trimming value that is added to the
HSICAL[7:0] bits. It can be programmed to adjust to variations in voltage and temperature that
influence the frequency of the HSI.
The default value is 16, which, when added to the HSICAL value, should trim the HSI to 8 MHz
± 1%. The trimming step (Fhsitrim) is around 40 kHz between two consecutive HSICAL steps.
Bit 2 Reserved, must be kept at reset value.
Bit 1 HSIRDY: HSI clock ready flag
Set by hardware to indicate that HSI oscillator is stable. After the HSION bit is cleared,
HSIRDY goes low after 6 HSI oscillator clock cycles.
0: HSI oscillator not ready
1: HSI oscillator ready
Bit 0 HSION: HSI clock enable
Set and cleared by software.
Set by hardware to force the HSI oscillator ON when leaving Stop or Standby mode or in case
of failure of the HSE crystal oscillator used directly or indirectly as system clock. This bit
cannot be reset if the HSI is used directly or indirectly as system clock or is selected to become
the system clock.
0: HSI oscillator OFF
1: HSI oscillator ON

Слика 4. Clock configuration register (RCC_CFGR).


Bit 31 PLLNODIV: Do not divide PLL to MCO (in STM32F303x6/8 and STM32F328x8 ,
STM32F303xDxE and STM32F398xE only)
This bit is set and cleared by software. It switch-off divider-by-2 for PLL connection to MCO
0: PLL is divided by 2 before MCO
1: PLL is not divided before MCO
Bits 30:28 MCOPRE: Microcontroller Clock Output Prescaler (in STM32F303x6/8 and STM32F328x8 ,
STM32F303xDxE and STM32F398xE only)
There bits are set and cleared by software. It is highly recommended to change this prescaler
before MCO output is enabled
000: MCO is divided by 1
001: MCO is divided by 2

7 Избор на системски такт (SYSCLK) | Никола Јовановски


March 4, 2016 ЛАБОРАТОРИСКА ВЕЖБА 3 RCC

010: MCO is divided by 4


.....
111: MCO is divided by 128
Bit 28 MCOF: Microcontroller Clock Output Flag (STM32F303xB/C and STM32F358xC only)
Set and reset by hardware.
It is reset by hardware when MCO field is written with a new value
It is set by hardware when the switch to the new MCO source is effective.
Bit 27 Reserved, must be kept at reset value.
Bits 26:24 MCO: Microcontroller clock output
Set and cleared by software.
000: MCO output disabled, no clock on MCO
001: Reserved
010: LSI clock selected.
011: LSE clock selected.
100: System clock (SYSCLK) selected
101: HSI clock selected
110: HSE clock selected
111: PLL clock selected (divided by 1 or 2 depending on PLLNODIV bit).
Note: This clock output may have some truncated cycles at startup or during MCO clock
source switching.
Bit 23 I2SSRC: I2S external clock source selection (STM32F303xB/C/D/E, STM32F358xC and
STM32F398xE devices only)
Set and reset by software to clock I2S2 and I2S3 with an external clock. This bits must be
valid before enabling I2S2-3 clocks.
0: I2S2 and I2S3 clocked by system clock
1: I2S2 and I2S3 clocked by the external clock
Bits 21:18 PLLMUL: PLL multiplication factor
These bits are written by software to define the PLL multiplication factor. These bits can be
written only when PLL is disabled.
Caution: The PLL output frequency must not exceed 72 MHz.
0000: PLL input clock x 2
0001: PLL input clock x 3
0010: PLL input clock x 4
0011: PLL input clock x 5
0100: PLL input clock x 6
0101: PLL input clock x 7
0110: PLL input clock x 8
0111: PLL input clock x 9
1000: PLL input clock x 10
1001: PLL input clock x 11
1010: PLL input clock x 12
1011: PLL input clock x 13
1100: PLL input clock x 14
1101: PLL input clock x 15
1110: PLL input clock x 16
1111: PLL input clock x 16
Bit 17 PLLXTPRE: HSE divider for PLL input clock
This bits is set and cleared by software to select the HSE division factor for the PLL. It can be
written only when the PLL is disabled.
Note: This bit is the same as the LSB of PREDIV in Clock configuration register 2
(RCC_CFGR2) (for compatibility with other STM32 products)
0000: HSE input to PLL not divided
0001: HSE input to PLL divided by 2
Bits 16:15 PLLSRC: PLL entry clock source (STM32F303xD/E and STM32F398xE only)
Set and cleared by software to select PLL clock source. These bits can be written only when
PLL is disabled.
00: HSI/2 used as PREDIV1 entry and PREDIV1 forced to div by 2.
01: HSI used as PREDIV1 entry.
10: HSE used as PREDIV1 entry.
11: Reserved.
Bit 16 PLLSRC: PLL entry clock source (in STM32F303xB/C and STM32F358xC and
STM32F303x6/8 and STM32F328x8 devices)
Set and cleared by software to select PLL clock source. This bit can be written only when PLL
is disabled.
0: HSI/2 selected as PLL input clock
1: HSE/PREDIV selected as PLL input clock (refer to Section 9.4.12: Clock configuration
register 2 (RCC_CFGR2) on page 160

8 Избор на системски такт (SYSCLK) | Никола Јовановски


March 4, 2016 ЛАБОРАТОРИСКА ВЕЖБА 3 RCC

Bit 15 Reserved, must be kept at reset value in STM32F303xB/C, STM32F358xC, STM32F303x6/8


and STM32F328x8 devices, and used with Bit 16 in STM32F303xD/E to select the PLL clock
source.
Bit14 Reserved, must be kept at reset value.
Bits 13:11 PPRE2: APB high-speed prescaler (APB2)
Set and cleared by software to control the division factor of the APB2 clock (PCLK).
0xx: HCLK not divided
100: HCLK divided by 2
101: HCLK divided by 4
110: HCLK divided by 8
111: HCLK divided by 16
Bits 10:8 PPRE1: APB Low-speed prescaler (APB1)
Set and cleared by software to control the division factor of the APB1 clock (PCLK).
0xx: HCLK not divided
100: HCLK divided by 2
101: HCLK divided by 4
110: HCLK divided by 8
111: HCLK divided by 16
Bits 7:4 HPRE: HLCK prescaler
Set and cleared by software to control the division factor of the AHB clock.
0xxx: SYSCLK not divided
1000: SYSCLK divided by 2
1001: SYSCLK divided by 4
1010: SYSCLK divided by 8
1011: SYSCLK divided by 16
1100: SYSCLK divided by 64
1101: SYSCLK divided by 128
1110: SYSCLK divided by 256
1111: SYSCLK divided by 512
Note: The prefetch buffer must be kept on when using a prescaler different from 1 on the
AHB clock. Refer to section Read operations on page 67 for more details.
Bits 3:2 SWS: System clock switch status
Set and cleared by hardware to indicate which clock source is used as system clock.
00: HSI oscillator used as system clock
01: HSE oscillator used as system clock
10: PLL used as system clock
11: not applicable
Bits 1:0 SW: System clock switch
Set and cleared by software to select SYSCLK source.
Cleared by hardware to force HSI selection when leaving Stop and Standby mode or in case
of failure of the HSE oscillator used directly or indirectly as system clock (if the Clock Security
System is enabled).
00: HSI selected as system clock
01: HSE selected as system clock
10: PLL selected as system clock
11: not allowed

Задачи

1. Да се напише програма во CooCox со која ќе се конфигурира STM32F303


микроконтролерот како системски такт (clock) да го користи внатрешниот RC
осцилатор на 8 МHz фреквенција. Дополнително тактот на AHB магистралата да се
постави на 8 MHz, а тактот на APB1 и APB2 магистралите да се постави на 4 MHz.
Задачата која треба да ја изведува вака конфигурираниот систем е следна: прво се
вклучува диодата LD4 свети одредено време (доцнење со for јамка) се исклучува па
веднаш се вклучува диодата LD3 свети одредено време (истото време како диодата
LD4) па се исклучува, следна е диодата LD5. Понатаму редоследот на вклучување и
исклучување на диодата е LD7, LD9, LD10, LD8, LD6. Процесот се повторува
бесконечно пати (идејата е диодите кружно да вртат во насока на стрелките на
часовникот). Поврзаноста на диодите на плочата F3 е дадена на слика 5. Поврзаноста
на тастерот B1 на плочата F3 е дадена на слика 6.

9 Задачи | Никола Јовановски


March 4, 2016 ЛАБОРАТОРИСКА ВЕЖБА 3 RCC

Решение:
#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 -> CR |= 0x1; //Vkluci go vnatresniot RC


//oscilator HSI
while (!(RCC->CR & 0x2)); //Cekaj dodeka taktot od HSI
//ne se stabilizira
RCC -> CFGR &= ~(0x3); //Promeni izvor na sistemski
//takt na HSI
while (RCC->CFGR & (0x3 << 2)); //Cekaj dodeka promenata se
//zavrsi
RCC-> CR &= ~(1 << 16); //Iskluci HSE koj e default
//setiran kako sistemski 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 &= ~(0x3 << 11); //Postavi go taktot na APB2
//magistralata
RCC -> CFGR |= (0x1 << 13); //na SYSCLK / 2

/******************************GPIO configuration******************/

RCC -> AHBENR |= (0x1 << 21); //Vkluci clock za porta E

GPIOE -> MODER |= (0x5555 << 16); //Napravi gi pinovite od


//PE8-PE15 izlezni za
//generalna namena
GPIOE -> OTYPER &= ~(0xFF << 8); //Napravi gi pinovite od
//PE8-PE15 od tip push-
//pull
GPIOE -> OSPEEDR |= (0xFFFF << 16); //Postavija brzinata na
//pinovite PE8-PE15 na
//High speed

10 Задачи | Никола Јовановски


March 4, 2016 ЛАБОРАТОРИСКА ВЕЖБА 3 RCC

GPIOE -> PUPDR &= ~(0xFFFF << 16); //Napravigi pinovite


//PE8-PE15 bez pull-up i
//bez pull-down
//otpornici

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)

}
}

2. Да се модифицира претходната задача така што наместо внатрешниот RC


осцилатор како системски такт ќе се користи тактот од PLL. Како извор на такт за PLL
јамката да се користи тактот од внатрешниот RC осцилатор, а на излез потребно е
тактот да се мултиплицира на фреквенција од 64MHz што воедно ќе биде и
системскиот такт. Дополнително тактот на AHB и APB2 магистралите да се постави на
64MHz, додека пак тактот на APB1 магистралата да се постави на 32MHz.
Функционалноста на системот останува истата. Поврзаноста на диодите на плочата F3
е дадена на слика 5. Поврзаноста на тастерот B1 на плочата F3 е дадена на слика 6.

Решение:
#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

RCC -> CR |= 0x1; //Vkluci go vnatresniot RC


//oscilator HSI
while (!(RCC->CR & 0x2)); //Cekaj dodeka taktot od HSI
//ne se stabilizira

11 Задачи | Никола Јовановски


March 4, 2016 ЛАБОРАТОРИСКА ВЕЖБА 3 RCC

RCC -> CFGR &= ~(0x3); //Promeni izvor na sistemski


//takt na HSI
while (RCC->CFGR & (0x3 << 2)); //Cekaj dodeka promenata se
//zavrsi
RCC-> CR &= ~(1 << 16); //Iskluci HSE koj e default
//setiran kako sistemski takt

RCC->CR &= ~(0x1 << 24); //Onevozmozigo PLL


while (RCC->CR & (0x1 << 25)); //Cekaj dodeka PLL se iskluci

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

RCC -> AHBENR |= (0x1 << 21); //Vkluci clock za porta E

GPIOE -> MODER |= (0x5555 << 16); //Napravi gi pinovite od


//PE8-PE15 izlezni za
//generalna namena
GPIOE -> OTYPER &= ~(0xFF << 8); //Napravi gi pinovite od
//PE8-PE15 od tip push-
//pull
GPIOE -> OSPEEDR |= (0xFFFF << 16); //Postavija brzinata na
//pinovite PE8-PE15 na
//High speed
GPIOE -> PUPDR &= ~(0xFFFF << 16); //Napravigi pinovite
//PE8-PE15 bez pull-up i
//bez pull-down
//otpornici

12 Задачи | Никола Јовановски


March 4, 2016 ЛАБОРАТОРИСКА ВЕЖБА 3 RCC

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)

}
}

3. Да се напише програма во CooCox со која ќе се конфигурира STM32F303


микроконтролерот како системски такт (clock) да го користи надворешниот такт од ST
линкот за дебагирање на 8 МHz фреквенција. Дополнително тактот на AHB
магистралата да се постави на 8 MHz, тактот на APB2 магистралата да се постави на 2
MHz и тактот на APB1 магистралата да се постави на 1 MHz. Задачата која треба да ја
изведува вака конфигурираниот систем е следна: прво се вклучуваат диодите LD3,
LD7, LD10, LD6 истовремено, светат одредено време (доцнење со for јамка) се
исклучуваат па веднаш се вклучуваат диодите LD4, LD5, LD9, LD8 светат одредено
време (истото време како претходните диоди) па се исклучуваат. Процесот се
повторува бесконечно пати. Поврзаноста на диодите на плочата F3 е дадена на слика 5.
Поврзаноста на тастерот B1 на плочата F3 е дадена на слика 6.

Решение:
Бидејќи по 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)
{

uint32_t i; //Brojac za for jamka za docnenje

RCC -> CFGR &= ~(0x2); //Prefrli go sistemskiot takt od


//PLL na HSE
RCC -> CFGR |= 0x1;
13 Задачи | Никола Јовановски
March 4, 2016 ЛАБОРАТОРИСКА ВЕЖБА 3 RCC

while ((RCC -> CFGR & 0xC) != 0x4); //Cekaj dodeka


//prefrlanjeto se izvrsi

RCC -> CFGR &= ~(0x1 << 7); //Setiraj go delitelot za AHB
//na 1 odnosno AHB taktot ==
//sistemskiot takt

RCC -> CFGR |= (0x5 << 11); //Postavigo delitelot za


//taktot na APB2 magistralata
//na 4
RCC -> CFGR &= ~(0x1 << 12); //za da APB2 magistralata bide
//taktirana so takt
//SYSCLK/4=2MHz

RCC -> CFGR |= (0x3 << 9); //Postavigo delitelot za


//taktot na APB1 magistralata
//na 8
RCC -> CFGR &= ~(0x1 << 8); //za da APB1 magistralata bide
//taktirana so takt
//SYSCLK/8=1MHz

RCC -> AHBENR |= (0x1 << 21); //Vkluci clock za porta E

GPIOE -> MODER |= (0x5555 << 16); //Napravi gi pinovite od


//PE8-PE15 izlezni za
//generalna namena
GPIOE -> OTYPER &= ~(0xFF << 8); //Napravi gi pinovite od
//PE8-PE15 od tip push-
//pull
GPIOE -> OSPEEDR |= (0xFFFF << 16); //Postavija brzinata na
//pinovite PE8-PE15 na
//High speed
GPIOE -> PUPDR &= ~(0xFFFF << 16); //Napravigi pinovite
//PE8-PE15 bez pull-up i
//bez pull-down
//otpornici

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
}
}

14 Задачи | Никола Јовановски


March 4, 2016 ЛАБОРАТОРИСКА ВЕЖБА 3 RCC

4. Да се напише програма во CooCox со која ќе се конфигурира STM32F303


микроконтролерот како системски такт (clock) да го користи надворешниот такт од ST
линкот за дебагирање мултиплициран преку PLL јамката на фреквенција од 36 МHz.
Дополнително тактот на AHB и APB2 магистралите да се постави на 36 MHz, тактот на
APB1 магистралата да се постави на 18 MHz. Задачата која треба да ја изведува вака
конфигурираниот систем е иста како во задачата 3. Поврзаноста на диодите на плочата
F3 е дадена на слика 5. Поврзаноста на тастерот B1 на плочата F3 е дадена на слика 6.

Решение:
#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 &= ~(0x3); //Switch na sistemskiot takt od PLL


RCC-> CFGR |= 0x1; //vo HSE
while ((RCC -> CFGR & 0xC) != 4 ); //Cekaj dodeka se
//napravi promenata na
//sistemskiot takt

RCC->CR &= ~(0x1 << 24); //Onevozmozigo PLL


while (RCC->CR & (0x1 << 25)); //Cekaj dodeka PLL se
//iskluci

RCC->CFGR |= (0x1 << 16); //Izberi PLL source takt HSE

RCC->CFGR |= (0x1 << 17); //Setiraj go delitelot na hse


//pred vlezot vo pll na 2

RCC->CFGR &= ~(0xF << 18);


RCC->CFGR |= (0x7 << 18); //Postavi mnozitel na PLL na 9

RCC->CR |= (0x1 << 24); //Ovozmozigo PLL

RCC-> CFGR &= ~(0x3); //Switch na sistemskiot takt


//od HSE vo PLL
RCC-> CFGR |= 0x2;
while ((RCC -> CFGR & 0xC) != 0x8 ); //Cekaj dodeka se
//napravi promenata na
//sistemskiot takt

RCC -> CFGR &= ~(0x1 << 7); //Setiraj go delitelot za AHB
//na 1 odnosno AHB taktot ==
//sistemskiot takt

RCC -> CFGR &= ~(0x7 << 11); //Postavigo delitelot za


//taktot na APB2 magistralata

15 Задачи | Никола Јовановски


March 4, 2016 ЛАБОРАТОРИСКА ВЕЖБА 3 RCC

//na 1 za da APB2 magistralata


//bide taktirana so takt
//SYSCLK/1 = 36MHz

RCC -> CFGR |= (0x1 << 10); //Postavigo delitelot za


//taktot na APB1 magistralata
//na 2
RCC -> CFGR &= ~(0x3 << 8); //za da APB1 magistralata bide
//taktirana so takt
//SYSCLK/2=18MHz

RCC_GetClocksFreq(&clock1);

RCC -> AHBENR |= (0x1 << 21); //Vkluci clock za porta E

GPIOE -> MODER |= (0x5555 << 16); //Napravi gi pinovite od


//PE8-PE15 izlezni za
//generalna namena
GPIOE -> OTYPER &= ~(0xFF << 8); //Napravi gi pinovite od
//PE8-PE15 od tip push-
//pull
GPIOE -> OSPEEDR |= (0xFFFF << 16); //Postavija brzinata na
//pinovite PE8-PE15 na
//High speed
GPIOE -> PUPDR &= ~(0xFFFF << 16); //Napravigi pinovite
//PE8-PE15 bez pull-up i
//bez pull-down
//otpornici
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
}
}

5. Да се напише програма во CooCox со која ќе се конфигурира STM32F303


микроконтролерот како системски такт (clock) да го користи надворешниот такт од ST
линкот за дебагирање мултиплициран преку PLL јамката на фреквенција од 72 МHz.
Дополнително тактот на AHB и APB2 магистралите да се постави на 72 MHz, а тактот
на APB1 магистралата да се постави на 36 MHz. Да се претпостави дека иницијално
микроконтролерот работи на внатрешен HSI такт. Задачата која треба да ја изведува
вака конфигурираниот систем е иста како во задачата 3. Дополнително да се
16 Задачи | Никола Јовановски
March 4, 2016 ЛАБОРАТОРИСКА ВЕЖБА 3 RCC

конфигурира копчето B1 така што кога се држи притиснато се вклучува prefetch


баферот за Flash меморијата, а кога е исклучено се исклучува Prefetch баферот.
Поврзаноста на диодите на плочата F3 е дадена на слика 5. Поврзаноста на тастерот B1
на плочата F3 е дадена на слика 6.

Решение:
Функцијата 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();

RCC->CR |= ((1 << 16) | 1 << 18); //Postavigi bitovite


//HSEON na 1 i HSEBYP na
//1
while(!(RCC->CR & (1 << 17))); //Cekaj dodeka
//nadvoresniot takt se
//stabilizira

/* 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

/* PLL configuration: PLLCLK = HSE * 9 = 72 MHz */


RCC->CFGR |= ((0x1 << 16) | (0x7 << 18)); //Izvor na HSE kako
//PLL vlezen takt
//postavuvanje na
//mnozitel na 9
//(9*8=72mhz)
//potrebno e da se
//postavi i HSE
//delitelot za

17 Задачи | Никола Јовановски


March 4, 2016 ЛАБОРАТОРИСКА ВЕЖБА 3 RCC

//vlezniot takt vo
//PLL
/* Enable PLL */
RCC->CR |= (0x1 << 24); //Vkluci PLL

/* Wait till PLL is ready */


while(!(RCC->CR & (0x1 << 25))); //Cekaj dodeka PLL se
//stabilizira

/* Select PLL as system clock source */


RCC->CFGR &= (~(0x3)); //Selekcija na PLL kako
//Sistemski takt
RCC->CFGR |= (0x2);

/* Wait till PLL is used as system clock source */


while ((RCC->CFGR & 0xC) != 0x8); //Cekaj dodeka se izvrsi
//promenata
RCC_GetClocksFreq(&clock1);

RCC->AHBENR |= (0x1 << 17); //Vkluci clock za porta A


GPIOA -> MODER &= 0xFFFFFFFC; //Konfiguriranje na pin PA0
//(Button B1) kako vlezen pin
GPIOA -> OSPEEDR |= 0x3; //Postavuvanje na brzinata na
//pin PA0 (Button B1) na high
//speed
GPIOA -> PUPDR |= 0x2; //Konfiguriranje na pin PA0
//(Button B1) pull-down

RCC -> AHBENR |= (0x1 << 21); //Vkluci clock za porta E

GPIOE -> MODER |= (0x5555 << 16); //Napravi gi pinovite od


//PE8-PE15 izlezni za
//generalna namena
GPIOE -> OTYPER &= ~(0xFF << 8); //Napravi gi pinovite od
//PE8-PE15 od tip push-
//pull
GPIOE -> OSPEEDR |= (0xFFFF << 16); //Postavija brzinata na
//pinovite PE8-PE15 na
//High speed
GPIOE -> PUPDR &= ~(0xFFFF << 16); //Napravigi pinovite
//PE8-PE15 bez pull-up i
//bez pull-down
//otpornici

while(1)
{
if(GPIOA -> IDR & 0x1) //Ako kopceto e pritisnato

18 Задачи | Никола Јовановски


March 4, 2016 ЛАБОРАТОРИСКА ВЕЖБА 3 RCC

{
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
}
}

Слика 5. Лед диоди на F3 плочата и нивната поврзаност со пиновите од


STM32F303 микроконтролерот.

19 Задачи | Никола Јовановски


March 4, 2016 ЛАБОРАТОРИСКА ВЕЖБА 3 RCC

Слика 6. USER копчето на плочата F3 и неговата поврзаност со пинот PA0 од


STM32F303 микроконтролерот.

20 Задачи | Никола Јовановски

You might also like