Warning
This page is located in archive. Go to the latest version of this course pages.

5. Externí přerušení

Cíle cvičení

  1. Orientovat se v organizaci přerušení pomocí NVIC
  2. Pochopit funkci EXTI

External Interrupt/Event Controller - EXTI

Řadič externího přerušení EXTI má 23 kanálů. Je tedy možné vytvořit až 23 různých přerušení. Prvních 16 kanálů je určeno portům GPIO. Lze tedy libovolný pin libovolného GPIO připojit na jeden kanál, ale bohužel s malým omezením: ke kanálu 0 lze připojit jen nulté piny a jen jednoho GPIO (tedy pokud je na kanál 0 připojen GPIOA, pak bude přerušení na kanálu 0 generovat změna na pinu PA0, žádný jiný nultý pin), ke kanálu 1 lze připojit jen první piny a jen jednoho GPIO. Pokud je tedy nastaveno generování přerušení z pinu PB2, již nelze použít k externímu přerušení pin PA2, ani PC2, ani PD2, ani žádný další pin 2 libovolného portu.

Zbytek kanálů je přiřazen následovně:

  EXTI 16 – PVD output
  EXTI 17 – RTC Alarm event
  EXTI 18 – USB OTG FS Wakeup
  EXTI 19 – Ethernet Wakeup
  EXTI 20 – USB OTG HS Wakeup
  EXTI 21 – RTC Tamper and TimeStamp
  EXTI 22 – RTC Wakeup

System Configuration Controller - SYSCFG

EXTI registry

IMR - Interrupt mask register

32b registr, využito 23 prvních bitů. Každý bit odpovídá jednomu kanálu. Logická jednička na příslušné pozici povoluje generování přerušení daného kanálu.

EMR - Event mask register

32b registr, využito 23 prvních bitů. Každý bit odpovídá jednomu kanálu. Jeho nastavování je stejné jako u registru IMR. Nastavením logické jedničky je povoleno generování události.

RTSR - Rising trigger selection register

32b registr, využito 23 prvních bitů. Každý bit odpovídá jednomu kanálu. Nastavení příslušného bitu do logické jedničky konfiguruje kanál tak, že generují přerušení při náběžné hraně.

FTSR - Falling trigger selection register

32b registr, využito 23 prvních bitů. Každý bit odpovídá jednomu kanálu. Nastavení příslušného bitu do logické jedničky konfiguruje kanál tak, že generují přerušení při sestupné hraně.

Pozn.: Lze nastavit, aby na jednom kanálu bylo generováno přerušení na obě hrany nastavením log 1 v obou registrech – RTSR i FTSR.

SWIER - Software interrupt event register

32b registr, využito 23 prvních bitů. Tímto registrem lze softwarově vytvořit požadavek na přerušení konkrétního kanálu.

PR - Pending register

32b registr, využito 23 prvních bitů. Tento registr plní dvě úlohy. Při vzniku přerušení je zde nastaven bit toho kanálu, jež přerušení vyvolal. Po dokončení rutiny přerušení je ale třeba žádost o přerušení zrušit, jinak by bylo přerušení generováno ihned znova. Rušení požadavku je provedeno zápisem log 1 na příslušném bitu.

void EXTI15_10_IRQHandler()
{
    // change PR (pending interrupt) to 1, if is 0
    setbit(EXTI->PR, 13);
    // change of system LED
    togglebit(GPIOA->ODR, 5);
}
 
void buttonConfig(void)
{
    setbit(RCC->AHB1ENR, 2);
    // RCC->AHB1ENR |= 0x05; -- two GPIO's at once
    // activate pull-up
    setbit(GPIOC->PUPDR, 26);
 
    // System configuration controller clock enable, page 121
    setbit(RCC->APB2ENR, 14);
 
    // mask
    setbit(EXTI->IMR, 13);
 
    // IRQ on falling / rising 
    setbit(EXTI->FTSR, 13);
 
    // GPIOC 13 will be source of IRQ
    setbit(SYSCFG->EXTICR[3], 5);
 
    // enable IRQ
    NVIC_EnableIRQ(EXTI15_10_IRQn); // 40 ~ EXTI15_10_IRQn
 
    // the same !
    setbit(NVIC->ISER[40/32], 40%32);
}
 
void ledConfig()
{
    // minimal config
    setbit(RCC->AHB1ENR, 0);
    setbit(GPIOA->MODER, 10);
}
 
int main(void)
{
    ledConfig();
    buttonConfig();
 
    while (1)
    {
        // boring stuff here
    }
}

courses/b2m37mam/tutorials/05.txt · Last modified: 2021/07/17 12:06 by viteks