====== 4. Přerušení ====== ===== Cíle cvičení ===== - Orientovat se v organizaci přerušení pomocí NVIC - 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 } }