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.