8L-tanfolyam, 3. rész - megszakítások, exti

A keretben lévő megszakításvezérlő (ITC - InTerrupt Controller) támogatja a beágyazott megszakításokat, és prioritásként osztja őket. Ez azt jelenti, hogy ha mi most végeztünk kezelője néhány nem túl fontos megszakítás (pl timer), és hirtelen történt megszakítja egy magasabb prioritású, akkor az időzítő megszakítás megszakad, és az MC azonnal rohan kezelni több. Ha a prioritások ugyanazok (vagy az új prioritás alacsonyabb, mint a jelenleg feldolgozott), akkor az új megszakítás csak az előző befejezése után fog feldolgozni.







És mi történik, ha egyszerre két megszakítás fordul elő? Vagy néhány fontos megszakítás történt a feldolgozás során? És akkor az első fog menni, hogy kezelje a magasabb prioritással rendelkezőt. És ha a prioritások ugyanazok? A gondos olvasó megkérdezi. Ezután végrehajtódik az első megszakítás, ami közelebb áll a megszakítási táblázathoz.

8L-tanfolyam, 3. rész - megszakítások, exti

Jelenleg összesen 29 megszakítási vektorok, plusz két számozatlan: RESET - rendszer újraindítása, TRAP - szoftver megszakítás (TRAP csapat hívott össze). Szigorúan szólva kétféle prioritás létezik: a szoftver (amelyet minden egyes megszakításhoz konfigurálhatunk) és a hardver - ez csak a vektorok sorrendje a megszakítási táblában. A címke szerint azt mutatja, hogy a legnagyobb prioritást hardver megszakítja a FLASH memóriába, és megszakítja I2C általában megfosztott figyelmet, míg a végén az asztalra. Azonban senki sem tiltja, hogy a legfontosabb, magas program prioritást állítson elő - fontosabb, mint a hardver.

A TRAP megszakítása általában minden program prioritásán alapul. Az aktuális megszakítás elsőbbségétől függetlenül a TRAP parancs végrehajtása itt is a kezelőhöz vezet.

Más megszakítások esetén a prioritást az ITC_SPR1 - ITC_SPR8 nyilvántartások határozzák meg.

8L-tanfolyam, 3. rész - megszakítások, exti

Minden vektorhoz két bit van elosztva, amely 4 lehetséges értéket ad. De valójában a program prioritásai csak 3:

A 10-es érték, amely nincs a listán, megfelel a főprogram prioritásának, és nem tudja telepíteni. És ez értelmetlen, ha emlékszel arra, hogy a vezérlő megszakítja a megszakítási sort: a megszakítás ugyanolyan prioritással bír, mint a főprogram, soha nem fog megszakadni.

A szükséges megszakítások engedélyezése és konfigurálása után globálisan engedélyezni kell a megszakítás kezelését. Az STM8-ban a RIM (A megszakítások letiltása - SIM) parancsszerzője szolgálja ezt a célt, és nagyon érdekes módon dolgozik. A zavarás engedélyezése / tiltása (pl. AVR) beállítása helyett az éppen futó kód prioritását módosítja. A RIM parancs alacsony prioritású (10, ugyanaz, amelyet nem lehet megállítani), és minden megszakítás megszakíthatja a programfuttatást. És a SIM parancs az aktuális kódot a legmagasabb prioritásra állítja, és a megszakítás nem akadályozhatja meg a kód végrehajtását.

Minden megszakításnak saját zászlója van, ami azt jelzi, hogy az esemény történt, és itt az ideje, hogy elmenjen a kezelőhöz. Az STM8-ban ezek a zászlók általában nem alaphelyzetbe kerülnek, és manuálisan le kell dobni. Ellenkező esetben, miután kiléptünk a kezelőből, újra belekeverünk. És mi? A zászló felemelkedik, ezért kezelni kell a megszakítást.

Igaz, a zászlók visszaállítása különböző esetekben eltérő módon szerveződik. Néha vissza kell állítania a zászlót, néha - egy adott regiszter olvasásához (például az ADC megszakításakor - olvassa el a mérés eredményét). Továbbá a különböző perifériák leírásakor megadom a kezelő sablonokat, és pontosan jelezik, hogy a megszakítási zászlók itt visszaállnak.

Amikor a megszakítás WFI módban megy végbe, az MK felesleges késedelem nélkül lép be a kezelőbe. A gyakorlatban a megszakításra való belépés ideje 5 ciklus alatt csökken. Itt:

8L-tanfolyam, 3. rész - megszakítások, exti

A WFI beírásához végre kell hajtani az assembler WFI parancsot (a Captain Evidence aktívan segített a cikk megírásában)

Most a rendszermag leáll a következő megszakításig. Ne felejtse el beállítani ezt a megszakítást, és hagyja, különben nem tudsz felébredni :)

Nos, most van némi ötletünk arról, hogy a megszakítások hogyan működnek az STM8-ban. Sima úton megy az EXT-EXT-re, a belső terhelés, vagyis a külső megszakítások.

Ha megnézzük a megszakítási táblázatot, láthatjuk, hogy 11 vektor van kiosztva az EXTI-nek.
Három közülük nevében egy levél gyanúsan emlékeztet a kikötő nevére (EXTIE / F, EXTIB.). És a fennmaradó 8-es szám, nem kevésbé gyanúsan hasonlít a pólusszámra. RM0031 eloszlatni minden kételyt és gyanút megerősítette -, mert az a tény, hogy a megszakítási vektorok nem elég erős az összes csapokat, a rendszer szerveződik egy igen kifinomult módon.

Kezdjük a kezdetektől. Minden egyes pólus esetén engedélyezheti vagy letilthatja a megszakítást. Ez akkor történik, ha az előző részt megjegyzi, a Px_CR2 regiszteren keresztül, ahol x a port betűje (mielőtt ezt a pólust be kell állítani a bemenetre). Így a megszakításokat csak az előírt tűkre engedélyezheti, a többi nem zavarja.







Továbbá, minden fele a port (azaz, az alsó 4 láb és 4 nagy), akkor választhat, hogy hol megy jel - megszakítani csapok (EXTI0, EXTI1.), Or port (EXTIB, EXTID.). Az első esetben mindegyik tűhöz egyedi megszakítást kapunk. De a többi kikötőből való megszakítások jönnek ide. A második esetben mi lesz egy felvezető a jelet a négy csap (persze, ha lehetővé tesszük megszakítások egyáltalán), de minden egyes portra. Mindez az EXTI_CONF1 és EXTI_CONF2 regisztereken keresztül van konfigurálva:

Minden egyes bit itt minden port felső vagy alsó felének felel meg. Például a PDLIS (Port D Alacsony megszakítás kiválasztása) felelős a D. port 0..3.

A bit egybeállítása azt jelenti, hogy a port ezen fele egy megszakítást ad minden pólusnak (például EXTID). A nulla azt jelenti, hogy mind a négy tű megszakítja az EXTI0..EXTI7 csoportot.

Ezenkívül minden egyes vektor esetében (nevezetesen vektor, nem egyetlen tû) lehet beállítani azt a frontot, amely mentén a megszakítás indít. Ez az EXTI_CR1 - EXTI_CR4 regisztereken keresztül történik.

Minden egyes megszakításhoz két bit van hozzárendelve. Ennek megfelelően 4 megszakítási mód áll rendelkezésre:
00 - Aktiválja az átmenetet 1-ről 0-ra (a hátsó él) és alacsony szintre. Ez azt jelenti, hogy a kezelőt folyamatosan hívják addig, amíg a tüskék alacsonyak.
01 - Az átmenet 0-ról 1-re (élszél)
10 - Ismét a hátsó szélén, de már nincs alacsony szintje
11 - Mindkét fronton. Más szavakkal, minden szinten változtat.

A bitek nevei egyszerűen kialakulnak. P1IS - 1. érintésérzékelő érzékenység, PBIS - B port megszakítása érzékenység és így tovább.

A megszakítások zászlait (amiről fent írom, hogy le kell esnie) az EXTI_SR1 és az EXTI_SR2 regiszterek közé tartoznak.


Vektorenként egy bit. És el kell dobni őket egy egység megírásával (a karcolás helyett, amint azt a kapitány talán elvárta).

Itt van egy ilyen bonyolult rendszer. Először úgy tűnhet, hogy nem nagyon kényelmes a munka során. De valójában ez a kellemetlenség csak akkor nyilvánul meg, ha azonnal meg kell szakítania a megszakítást a lábakból (és ez gyakran nem szükséges). A hétköznapi problémákban nincsenek különleges kellemetlenségek.

Ami az STM8S-t illeti. akkor ott a megszakítások nem annyira zavaró (de kevesebb lehetőség). Tény, hogy csak a kikötőkből vannak megszakadások. Mint PCINT az AVR-ben. Az egyik jel mindegyikhez csatlakozik. Engedélyezheti a megszakításokat egyenként az egyes tüskékhez, de az elülső rész csak az egyes vektorok számára van beállítva - pl. az egész kikötő számára.

Írjunk még egy haszontalan példát, hogy megértsük, hogyan működik a gyakorlatban. Hardver alapon vegyen egy példát az utolsó részből (ahol volt egy jelző), és csatoljon hozzá egy másik gombot. Minden gomb megszakad.
Az első megszakításkezelőben egy hurokban leszünk (igen, furcsa vagyok), hogy átkapcsoljam a jelzőszámokat. És a második processzorban (amelyet magasabb prioritásként fogunk felhozni), villogni fogjuk a LED-et.

Ha lenyomva tartja az elsõ gombot, az MK lóg a megszakításkezelõben, és megkezdi a sorszámozást. De ha megnyomja a második gombot, az első megszakítás fontosabb lesz, és a LED villogni kezd. Ha elengedi a második gombot, a jelző továbbra is átkapcsolja az azon a számon, amelyen megállt - az első megszakításkezelő továbbra is fut. Egyszerűen, egyértelműen.

Először be kell állítania a csapokat. Hagyja, hogy az első gomb D6-ra lógjon, a második pedig a D7-en (ezek a tűk leginkább a Pinboard gombjaihoz kapcsolódnak).

Nem érünk hozzá a DDR-regiszterhez - már az MK indításakor nullázódik.

A EXTI_CONF1 nyilvántartás (amely elosztja a jelet a csap / ports megszakítás) is nulla az elején, akkor minden pin ad nekünk egy külön megszakítás. És hagyja.

Még mindig be kell állítania az elülső elemet, ami megindítja a megszakítást. A földhöz közeli sajtoláshoz használt gombok azt jelentik, hogy el kell érni a 2 (10) értéket a hátsó élhez:

Végül meg kell szüntetni a megszakítás elsőbbségét az első gombról (D6), így a második megszakítása megszakíthatja az első kezelőjét:

Nézd meg a megszakítási táblázatot - az EXTI6 vektort, amely a 14-es számon van, és megfelel a VECT14SPR csoportnak. A 0 érték, amit emlékeztetek, "átlag" prioritást jelent.

Az indikátor és a LED kiigazítása áttért a korábbi példáktól, ezért nem fogom itt hozni - lásd a forrást.

A megszakítások csak globálisan engedélyezettek. Ezt az RIM összeszerelési parancs végzi

Ezzel a main () befejeződött és megy a megszakításkezelőhöz. Az IAR-ban a kezelő ebben a trükkös módon nyilvánul meg:

Hogy minden egyes alkalommal, amikor a szükséges vektor mögött nem felmászni egy adatlapon, lehetséges a szennyezés a iostm8l151k6.h-ból. A fájl végére az összes vektor íródik. Íme egy darab egy példaért:

Ó, és miért felel meg az EXTI6 vektor a 0x10 (16), és nem 14 számnak, mint az adatlapban szereplő lemez? És könnyű figyelembe venni az első két megszakítást - RESET és TRAP. És a táblázatban szám nélkül mennek.

A felvezető neve - ez csak egy függvény nevét, és nincs különleges követelményeket ott.

Kiderült, hogy a megszakítás kezelő EXTI6 tudjuk címkézni az alábbiak szerint:

Rajongók a rövidség is, ha nem akarják, hogy átalakítsuk azt defayn:

Aztán lesz kijelölve a megszakítás:

Mit fog megegyezni, úgy néz ki, szebb.

Megszakításkezelõkben ebben a példában majdnem azonos (kivéve, hogy az első számjegy kapcsoló és dióda villog a második). Ezért a felvezető mutatják, csak az első gomb:

Azt hiszem, minden tisztának kell lennie. A második felvezető mi villog LED a D5, amíg meg nem jelenik a magas szinten pin D7.

Úgy tűnik, hogy minden a külső megszakítások.

Végül azt mondom, egy érdekes vonás hívott aktivációs szint, amely szintén megszakítani.
Gyakran kiderül, hogy az egész program (jó, kivéve a kezdeti beállítások) szóródik a megszakítás kezelő. Az egyik fő díszített nyomorúságos végtelenített-gag. Mi ismét egy ilyen esetben. És ha a készülék tápellátását akkumulátor és szüksége van az energiatakarékosság, akkor közötti megszakítások alvó üzemmódban, és hagyja, hogy csak a teljesítmény a rakodók.

A srácok a STM úgy döntött, hogy életünket könnyebbé az építőiparban az ilyen algoritmusok és kicsit seb AL. Nem található CFG_GCR nyilvántartás (Configiration - Általános konfigurációs regiszter)

Ha írd yedinichku, és készenléti üzemmódba, majd miután MK felébred szakítani, és végrehajtja a felvezető, akkor nem fog a main (), és azonnal repülnek vissza aludni. Mintegy alvó módokat, még mindig nem tud semmit igazán, de próbáld meg ezt a funkciót, amit akar.

Legyen cserélje ciklusban a végsapka oly szerkezete:

HALT - a legmélyebb energiatakarékos üzemmódot, ami kikapcsolja az óra, és az ébredés csak akkor lehetséges, külső megszakítás, megszakított egy pár interfészek vagy RTC.

A program indítása után a viselkedése nem változik, de nincs ciklus késleltetési végén main () már nem a mag, és nem pazarolja az energiát. Közvetlenül befejezése után a felvezető, az MC alvó módba.

Ja, és miért vektor EXTI6 száma megegyezik 0x10 (16), 14 helyett, mint a táblázatban az adatlap? És csak akkor elszámolni az első két megszakítás - RESET és TRAP. A táblázatban azok nincsenek-nos. először futott - nagyon matyukatsya ... Mi a titka a jelentését ezek?
Több öl, hogy sok vektorok meghatározások IARA elemzi úgy, hogy látható megtalálja a kívánt megszakítás. Az ADC, például. Egyszerűen be magát, vagy csak annyit írj a mágikus tsifir.

Akkor „aki először állt fel -, hogy a cipők és a” Jelentés a kifejezést. és megszakítja I2C általában elhanyagolt Aga a táblázatban nincs egyáltalán :)
Eleinte úgy tűnhet, hogy ez nem nagyon könnyen kezelhető. Először azt hittem, hogy ő nagyon megkövezték. Akkor is, de.

Ui Azt is meg kell tulajdonítani, hogy nem próbálták meg ismét STM8S-sorozat :)

Javítva egy lemezt (ott folytatjuk egy másik oldalon azt, már nem értették meg egyszerre), írtam STM8S még cipők eltávolítjuk :)

A rendszer úgy néz ki furcsa, igen. Úgy néz ki, elvitték alapján STM8S és megpróbálta bővíteni, de hogy éppen bizarr. Nos, legalább már interrapt bármilyen lábak




Kapcsolódó cikkek