Instrukcja Lab2 id 216873 Nieznany

background image

Architektura komputerów

i systemy operacyjne



Instrukcja do laboratorium nr 2

Temat:

Obsługa timerów i przerwań w mikrokontrolerach

rodziny STM32



Opracował: Tadeusz Sondej
Data: 03.11.2010 r.





Spis treści

1.

WPROWADZENIE..................................................................................................................................... 2

1.1.

C

EL ĆWICZENIA

..................................................................................................................................... 2

1.2.

W

YMAGANIA

........................................................................................................................................ 2

1.3.

P

RZYKŁADOWE PYTANIA KONTROLNE

.................................................................................................. 2

2.

ZADANIE NR 1 – OBSŁUGA TIMERA SYSTEMOWEGO (SYSTICK) ............................................ 3

2.1.

C

EL ĆWICZENIA

..................................................................................................................................... 3

2.2.

P

RZYKŁADOWY PROJEKT

...................................................................................................................... 3

2.3.

Z

ADANIE PUNKTOWANE

(2

PUNKTY

)..................................................................................................... 4

3.

ZADANIE NR 2 – OBSŁUGA TIMERA I PRZERWAŃ ZEWNĘTRZNYCH .................................... 5

3.2.

C

EL ĆWICZENIA

..................................................................................................................................... 5

3.3.

P

RZYKŁADOWY PROJEKT

...................................................................................................................... 5

3.4.

Z

ADANIE PUNKTOWANE

(3

PUNKTY

)..................................................................................................... 6

4.

ZADANIE NR 3 – OBSŁUGA TIMERA W TRYBIE PWM .................................................................. 7

4.2.

C

EL ĆWICZENIA

..................................................................................................................................... 7

4.3.

P

RZYKŁADOWY PROJEKT

...................................................................................................................... 7

4.4.

Z

ADANIE PUNKTOWANE

(3

PUNKTY

)..................................................................................................... 8




background image

2

1. Wprowadzenie

1.1. Cel

ćwiczenia

Celem ćwiczenia jest zapoznanie i nauczenie studentów korzystania z timerów i

systemu przerwań oraz korzystania z bibliotek programowych STM32F10x Standard
Peripherals Library (plik o nazwie stm32f10x_stdperiph_lib), udostępnianych przez firmę
STMicroelectronics.

1.2. Wymagania

ƒ Podstawowa znajomość architektury mikrokontrolera STM32F103VBT6.
ƒ Znajomość budowy i działania timera SysTick.
ƒ Podstawowa znajomość budowy i działania timerów mikrokontrolera

STM32F103VBT6.

ƒ Znajomość organizacji przerwań mikrokontrolerów Cortex-M3.
ƒ Znajomość płyty laboratoryjnej ZL27ARM.
ƒ Podstawowa znajomość języka C.

1.3. Przykładowe pytania kontrolne

ƒ Wymień kilka źródeł przerwań występujących w mikrokontrolerach rodziny STM32.
ƒ Na jakie zbocza może reagować przerwanie zewnętrzne EXTI ?
ƒ W jakim celu wykorzystuje się priorytety przerwań ?
ƒ Omów podstawowy sposób działania timera systemowego SysTick.
ƒ Na czym polega praca timera z automatycznym przeładowaniem ?
ƒ Na czym polega praca timera w trybie PWM ?
ƒ W jakim celu mogą być wykorzystywane timery mikrokontrolera STM32 ?
ƒ Narysuj przykładowy sposób podłączenia przycisku do portu wejściowego

mikrokontrolera.




background image

3

2. Zadanie nr 1 – obsługa timera systemowego (SysTick)

2.1. Cel

ćwiczenia

Celem ćwiczenia jest zapoznanie się i nauczenie obsługi podstawowego timera

(SysTick) mikroprocesorów Cortex-M3.

2.2. Przykładowy projekt

Nazwa pliku projektu: Lab2_SysTick.zip

Najważniejsze funkcje projektu:

//---------------------------------------------------------------------
int main (void)
{
boardInit();

// petla glowna programu
while(1)
{
nop();
}

} // main

//---------------------------------------------------------------------
void boardInit (void)
{
ioportInit();
ledAllOff();
sysTimerInit();

}

//---------------------------------------------------------------------
void ioportInit (void)
{
GPIO_InitTypeDef GPIO_InitStructure;

/* Configure all unused GPIO port pins in Analog Input mode (floating input
trigger OFF), this will reduce the power consumption and increase the device
immunity against EMI/EMC */

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
RCC_APB2Periph_GPIOC

|

RCC_APB2Periph_GPIOD

|

RCC_APB2Periph_GPIOE

,

ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_Init(GPIOE, &GPIO_InitStructure);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE, DISABLE);

// Configure the LEDS pins
RCC_APB2PeriphClockCmd(LEDS_GPIO_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = LEDS_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(LEDS_GPIO_PORT, &GPIO_InitStructure);

background image

4

}

//---------------------------------------------------------------------
void sysTimerInit (void)
{
delayTimer=0;
cntTemp=500;

// konfiguracja timera SysTick
SysTick->VAL = 0; // wartosc poczatkowa
SysTick->LOAD = 0x00011940 - 1; // przerwanie co 1 ms dla zegara 72 MHz
SysTick->CTRL = 7; // konfiguracja pracy timera SysTick
}

//---------------------------------------------------------------------
void SysTick_Handler(void)
{
// ------- TASK 1 -------------------------------
// tu mozna dodawac kolejne zadania


// ------- TASK n-1 -----------------------------
if(delayTimer!=0) {delayTimer--;}

// ------- TASK n -------------------------------
if(--cntTemp==0)
{
cntTemp=500;
ledD8Toggle();
}
// ----------------------------------------------
}

Opis projektu:
W projekcie uruchomiony jest podstawowy timer (SysTick), który jest wbudowany w rdzeń
mikrokontrolerów ARM Cortex-M3. Częstotliwość pracy rdzenia procesora została ustalona
na 72 MHz (włączona pętla PLL). Konfiguracja pracy zegarów i magistral mikrokontrolera
jest ustawiona w pliku system_stm32f10x.c. W projekcie SysTick został tak
skonfigurowany aby zgłaszał przerwanie co 1 ms. Po uruchomieniu programu co 0,5 sekundy
miga dioda D8.


2.3. Zadanie punktowane (2 punkty)

ƒ Odpowiedz na pytanie jak wyznacza się wartości ustawiane w funkcji

sysTimerInit()

.

ƒ Skonfiguruj SysTick tak aby przerwania były zgłaszane co 10 ms.
ƒ Zmień obsługę przerwania SysTick aby co 1 s na czas 100 ms zapalała się dioda D8.
ƒ Korzystając z przerwań SysTick napisz w funkcji „main” procedury pokazujące na

diodach D1-D6 stan licznika programowego (6. bitowy), zliczającego w górę z
częstotliwością 0,5 Hz. Licznik powinien zliczać w kodzie binarnym.




background image

5

3. Zadanie nr 2 – obsługa timera i przerwań zewnętrznych

3.2. Cel

ćwiczenia

Celem ćwiczenia jest zapoznanie się i nauczenie podstawowej obsługi timerów i

przerwań zewnętrznych.

3.3. Przykładowy projekt

Nazwa pliku projektu: Lab2_ExtiTimer.zip

Najważniejsze funkcje projektu:

//---------------------------------------------------------------------
int main (void)
{
boardInit();

flagSW0irq=0;
// petla glowna programu
while(1)
{
if(flagSW0irq==1)
{
flagSW0irq=0;
while(getSW0()==0)
{
ledAllOff();
}
}
}
} // main


void timersInit (void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;

// ---------- timer 2 cfg ------------
// TIM2 clock enable
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
// Time base configuration
TIM_TimeBaseStructure.TIM_Prescaler = 1;
TIM_TimeBaseStructure.TIM_Period = (uint16_t)((36000000)/1000); // co 1 ms
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
// Prescaler configuration
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Active;
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);

// TIM IT enable
TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE);
TIM_Cmd(TIM2, ENABLE);

cntTempTimer2=0;
}


background image

6

void SysTick_Handler(void)
{
// ------- TASK 1 -------------------------------
// tu mozna dodawac kolejne zadania

// ------- TASK n-1 -----------------------------
if(delayTimer!=0) {delayTimer--;}

// ------- TASK n -------------------------------
if(--cntTemp==0)
{
cntTemp=500;
ledD8Toggle();
}
// ----------------------------------------------
}

//---------------------------------------------------------------------
void EXTI0_IRQHandler(void)
{
if((EXTI->PR & SW0_GPIO_EXTI_LINE))
{
EXTI->PR = SW0_GPIO_EXTI_LINE;
flagSW0irq=1;
}
}

//---------------------------------------------------------------------
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);
if(++cntTempTimer2==200)
{
cntTempTimer2=0;
ledD1Toggle();
}
}
}

Opis projektu:
W projekcie włączone są przerwania od timera SysTick, przycisku zewnętrznego SW0 oraz
timera 2 (TIM2). Timer 2 został skonfigurowany do pracy w trybie automatycznego
przeładowania ze zgłaszaniem przerwania co 1 ms. Po uruchomieniu programu co 500 ms
miga dioda D8 a co 200 ms dioda D1. Jeżeli nastąpi wciśnięcie przycisku SW0, to na czas
wciśnięcia SW0 obydwie diody są wyłączone.

3.4. Zadanie punktowane (3 punkty)

ƒ Skonfiguruj program tak aby reagował na przerwania od przycisku SW2.
ƒ Zamiast timera 2 należy wykorzystać timer 3.
ƒ Napisz program który po każdorazowym wciśnięciu i wyciśnięciu przycisku SW2

uruchamia timer 3 na czas 100 ms. Na czas aktywnego działania timera 3 zapala się
dioda D5 (na 100 ms).



background image

7

4. Zadanie nr 3 – obsługa timera w trybie PWM

4.2. Cel

ćwiczenia

Celem ćwiczenia jest zapoznanie się i nauczenie obsługi timera działającego w trybie

modulacji szerokości impulsu (PWM).

4.3. Przykładowy projekt

Nazwa pliku projektu: Lab2_PwmTimer.zip

Najważniejsze funkcje projektu:

//---------------------------------------------------------------------
int main (void)
{
boardInit();

// petla glowna programu
while(1)
{
}
} // main

//---------------------------------------------------------------------
void boardInit (void)
{
ioportInit();
ledAllOff();
sysTimerInit();
timersInit();
nvicConfiguration();
extiConfiguration();
}

//================================================================================
void timersInit (void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;

// TIM3 clock enable
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

// Time base configuration
TIM_TimeBaseStructure.TIM_Prescaler = 72-1;
TIM_TimeBaseStructure.TIM_Period = 1000;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

// PWM1 Mode configuration: Channel2
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 100;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);

TIM_ARRPreloadConfig(TIM3, ENABLE);

TIM_Cmd(TIM3, ENABLE); // TIM3 enable counter
}

background image

8

Opis projektu:
W przykładowym projekcie do generowania sygnału PWM wykorzystany jest drugi kanał
timera 3 (TIM3). Generowany sygnał PWM podłączony jest do wyjścia timera TIM3_CH2
(jest to linia o oznaczeniu PA7). Częstotliwość sygnału PWM domyślnie ustawiona jest na 1
kHz, natomiast współczynnik wypełnienia impulsu wynosi 0,1. Generowany sygnał PWM
można zaobserwować na oscyloskopie podłączonym do linni PA7 na złączu JP6.
W projekcie aktywne jest przerwanie od SW0 i timera SysTick.


4.4. Zadanie punktowane (3 punkty)

ƒ Napisz program aby za pomocą przycisku SW0 zwiększać współczynnik wypełnienia

przebiegu generowanego przez timer 3 (TIM3) na linii PA7.

ƒ Jednocześnie za pomocą przycisku SW1 można będzie zmniejszać współczynnik

wypełnienia przebiegu generowanego przez timer 3 (TIM3) na linii PA7.




Wyszukiwarka

Podobne podstrony:
lab2 Instrukcja P2 C P id 75048 Nieznany
Instrukcja ESRI id 216707 Nieznany
instrukcja laboratoryjna id 216 Nieznany
lab2 7 id 259265 Nieznany
Instruktaz stanowiskowy id 2176 Nieznany
INSTRUKCJA obserwacja id 217027 Nieznany
Instrukcja 12 id 215508 Nieznany
bd lab2 id 81995 Nieznany (2)
INSTRUKCJA BHP 4 id 215697 Nieznany
KOS instrukcja 7 TM id 248303 Nieznany
JPPO Lab2 id 228821 Nieznany
instrukcja DTC id 216677 Nieznany
AKiSO lab2 id 53766 Nieznany
Instrukcja Lab4 id 216877 Nieznany
INSTRUKCJE Cwiczenie 1 id 71952 Nieznany
5 Instrukcja if id 39694 Nieznany
Instrumenty pochodne id 217770 Nieznany
Instrukcja UV2 id 217242 Nieznany
instrukcja 10 id 215506 Nieznany

więcej podobnych podstron