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
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.
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);
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.
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;
}
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).
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
}
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.