Stm lecke 74
Végül ideje, hogy megpróbáljunk külső megszakításokkal dolgozni. Ez a lecke először nagyon keresett, bár első pillantásra egyszerűnek tűnik. Sok kérés volt, és nem tudtam segíteni, csak válaszolni. Másodszor, most együttműködünk az ENC28J60 LAN modullal. van egy kijárat, amellyel egyes műveletek befejezése után megszakadhatunk, amit feldolgozni akartam. Ha sikerül, szeretném megosztani ezt veled, de anélkül, hogy az STM32 vezérlő külső megszakításainak kezdeti gondolata nélkül nehéz lenne ezt megérteni, azt hiszem, enyhén szólva. Ezért érkezett meg ez a lecke.
Mikrokontrollerként ugyanazt az STM32F103RCT6-ot vesszük. amely egy olcsó kártyán helyezkedik el, amellyel részt veszünk a LAN modul programozásának folyamatában, és mint programozó egy olcsó ST-Link V2 is.
Röviden a külső megszakításokról. A külső megszakítások olyan megszakítások, amelyeket a mikrokontroller kikötőjének meghatározott szakaszán bizonyos események előfordulása miatt feldolgoznak. Számos ilyen esemény létezhet csak két logikai állapot ellenére. Számos ilyen esemény könnyen látható a Cube MX lista megnyitásával a port lábainak konfigurációjában
Ezt a típust két csoportba lehet osztani. Az első csoport, a külső megszakítás, a külső megszakítások feldolgozása. A második az eseménykezelés. Az egyetlen különbség az, hogy az első esetben a megszakításkezelőt hívják, és a második esetben csak a megfelelő zászlót emeljük fel. Mindegyik csoport háromféle eseményre oszlik:
1. Felfelé mutató oldalt észleltünk (0-tól 1-ig változó szint)
2. Lefelé mutató frontot észlel (az 1. szint 0-ra változik),
3. A fenti frontok bármelyike észlelhető.
Vannak program-megszakítások is, de nem feltétlenül szükségesek ezekre.
Ez mind megszakítás típusú.
Számos regiszter van a külső megszakítások kezelésére:
EXTI_IMR. A megszakítások maszkjának nyilvántartása,
EXTI_EMR. Az eseménymaszkok nyilvántartása,
EXTI_RTSR. Az emelkedő szélén a triggerregiszter,
EXTI_FTSR: Az indítóregiszter a lehulló élen,
EXTI_SWIER. A szoftver megszakításának nyilvántartása elindul,
EXTI_PR. azon eseményjelzők nyilvántartása, amelyeknél megszakítási hívások zajlanak.
Mindezeket a nyilvántartásokat az összes STM-vezérlő referencia kézikönyvének műszaki dokumentációjában részletezzük. Nem fogjuk részletesen megfontolni őket, hagyjuk a HAL könyvtár lelkiismeretének.
Itt van a vezérlõ interrupt kezelõ logikai ábrája

Itt látjuk az összes regiszterünket, és mi a logikai kapcsolat közöttük.
Láthatja a külső megszakítások sorának szervezésének diagramját is

Itt 16 csomópontot látunk, amelyek a multiplexerek között csatlakoznak az összes csatlakozó aljához. Ez azt jelenti, hogy egyidejűleg a vezérlő 16 lábát is feldolgozhatjuk, de amint az a multiplex szervezetből látható, mindegyiknek különböző számokkal kell rendelkeznie. Vagyis a PA1 és PC2 lábakat egyszerre tudjuk feldolgozni, de nem tudjuk feldolgozni a PA1-et és a PC1-et.
Vannak olyan 4 vonalak is, amelyek nem kapcsolódnak általános célú portokhoz, hanem bizonyos perifériákhoz
A négy másik EXTI vonal a következőképpen csatlakozik:
• Az EXTI 16 vonal csatlakozik a PVD kimenethez
• Az EXTI 17 vonal csatlakozik az RTC Riasztási eseményhez
• Az EXTI 18 vonal az USB Wakeup eseményhez van csatlakoztatva
• Az EXTI 19 vonal az Ethernet Wakeup eseményhez csatlakozik (csak a csatlakoztatható vonali eszközök esetén érhető el)
Vagyis továbbra is feldolgozhatunk külső eseményeket a programozható feszültségérzékelőből, az RTC ébresztőóra, az USB és az Ethernet "ébredéseiből".
Ennyi az interrupts, és ez nem minden. A témában a műszaki dokumentációban írt, mint 18 oldal, így aki érdekli - győződjön meg róla, hogy olvassa el.
Feladatunk, hogy ezeket a megszakításokat helyesen feldolgozzuk a kódunkban a HAL könyvtár funkcióival.
Hozzon létre egy új projektet a Cube MX projekt generátorban a vezérlő kiválasztásával
Kapcsolja be a kvarcrezonátort
Válasszon egy programozót az SWD felülethez
Aktiválja a LED felelősségteljes részét

Kapcsolja ki a külső megszakításokat a PA1 talpán
Meghatározzuk az osztó és a multiplikátorok maximális teljesítményét az "Óra beállítás" részben (kattintsunk a képre a kép nagyításához)

Menjünk a "Konfiguráció" -ra, és a GPIO részen állítjuk be a láb PC13-at az átlagos sebességnél

Mert PA1 láb alkalmazandó szigorítás regisztrálja magát a közös busz, úgy, hogy nem lóg a levegőben, mint a megszakítás, akkor elkapni a gombot, és a gombot sehol nem húzzuk, különben az állapot lesz bizonytalan. Írja külső megszakítási szabadság alapértelmezett - felfutó éle

Alkalmazza a portbeállításokat, és lépjen a "NVIC" gombon lévő globális megszakítások beállításaira, kapcsolja be az EXTI1 megszakításokat

Ezeket a beállításokat is alkalmazza.
A projektet az EXTI01 név kijelölésével és az SW4STM32 fejlesztői környezet kiválasztásával fogjuk konfigurálni

Generálja a projektet, nyissa meg a rendszer munkaállomáson. mint mindig, és törölje a debug fájlt a hibakereső beállításaiban.
Mi összegyűjtjük a projektet, megpróbáljuk elindítani, de valószínűleg nem fogunk sikerülni, és a konzolban egy ilyen üzenetet fogunk látni, hogy a vezérlő nem villan fel, mert nem sikerült újraindítani
Természetesen a RESET gombot tarthatja és engedje el a táblán időben. De másképp fogunk menni. Számos fórumot olvastam, és nem találtam semmit, kivéve a config fájlok szerkesztését. Nyissa meg debug fájlját a projekt tulajdonságaiban

A megnyíló párbeszédpanelen menjen a "Debugger" fülre, és kattintson a "Generator options"

A "Reset mode" (alaphelyzetbe állítás) mezőben, amely alul nyitott, kiválasztjuk a "Software System reset"

Megmentjük a beállításokat, most mindent meg kell csinálni.
Nyissa meg a main.c parancsot, és kapcsolja ki a LED-et a main () függvényben. mivel tudjuk, hogy inverz módon kapcsolódik (természetesen ezt a Cube MX-ben is elvégezheti, de annyira egyértelmű)
/ * FELHASZNÁLÓI KÓD BEGIN 2 * /
HAL_GPIO_WritePin (GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
/ * USER CODE END 2 * /
Ezután a main.c-ben adjon hozzá egy külső megszakításkezelőt
/ * FELHASZNÁLÓI KÓD BEGIN 4 * /
void HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin)
/ * FELHASZNÁLÓI KÓD VÉG 4 * /
Ezután megkeressük az 1 sorból a megszakítást és a LED világítását
void HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin)
HAL_GPIO_WritePin (GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
/ * FELHASZNÁLÓI KÓD VÉG 4 * /
Csatlakoztassa a gombot a PA1 és a tápkábel között (kattintson a képre a kép nagyításához)

Összegyűjtjük a projektet, megszabjuk a szabályozót. Ezután kattintson a gombra - a LED világítani fog (a képre nagyításhoz kattintson a képre)

Diverzifikáljuk egy kicsit a projektünket, így nem lenne olyan unalmas. Ehhez megyünk a Cube MX-be, és mivel nincs Keilünk, nem kell bezárnunk a projektet, és bekapcsoljuk a PA2 lábán lévő külső megszakítókat
És egy másik típust is beiktatunk - a leengedő fronton lévő megszakítási műveletet, és az ellenállást a feszültségforrással ellentétben húzzuk. Ehhez hajtsa végre a következő beállításokat a PAIO lábánál a GPIO "Konfiguráció" menüpontjában

Alkalmazza a beállításokat, hozza létre a projektet, térjen vissza a Rendszer munkapadhoz és végezzen frissítési projektet.
Hozzáadhatjuk kezelőnket az alábbiak szerint, így a PA1 talp megszakításával a LED világít, PA2 esetén pedig kialszik
void HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin)
ha (GPIO_Pin == GPIO_PIN_1)
HAL_GPIO_WritePin (GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
> else if (GPIO_Pin == GPIO_PIN_2)
HAL_GPIO_WritePin (GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
Még egy gombot csatlakoztatunk, de már a PA2-hez, a második pedig a közös vezetékhez (kattintson a képre a kép nagyításához)

Most, ha összegyűjtjük a kódot, és varrjuk a vezérlőt, akkor az első gomb a LED világítását jelzi, a második pedig kialszik.
Úgy tűnik, van ilyen? És mi történik, függetlenül a haladás, a program, nem egy végtelen ciklusban, amikor van írva közben felvezető egy gomb megnyomásával, akkor soha nem lesz, és nem lesz világos, hogy mi események feldolgozása. Ezért vizsgálja a külső megszakítások, tettünk egy nagy lépést előre függetlenség felé kezelése bizonyos események a lábát a mikrokontroller port. Természetesen figyelembe véve a már nagyon gazdag tapasztalatunkat, nem volt nehéz feladatunk.
Köszönöm mindenkinek a figyelmet!
