Kysymys:
Kuinka keskeytyskäsittelijät otetaan käyttöön Cortex M0: n CMSIS-järjestelmässä?
0xakhil
2011-05-26 16:23:35 UTC
view on stackexchange narkive permalink

Minulla on LPC1114-paketti. Viime päivinä olen kaivanut Cortex M0: n CMSIS-toteutusta selvittääkseen, miten asiat siinä tehdään. Toistaiseksi ymmärsin, miten kukin rekisteri on kartoitettu ja miten pääsen siihen. Mutta silti en tiedä miten keskeytykset toteutetaan siinä. Tiedän vain keskeytyksistä CMSIS: ssä, että käynnistystiedostossa on joitain keskeytyskäsittelijöiden nimiä. Ja voin kirjoittaa omat käsittelijät kirjoittamalla yksinkertaisesti C-funktion samoilla nimillä kuin käynnistystiedostossa. Hämmentää minua se, että käyttöoppaassa sanotaan, että kaikkia GPIO: ta voidaan käyttää ulkoisina keskeytyslähteinä. Käynnistystiedostossa on kuitenkin vain 4 PIO-keskeytystä. Joten kerro minulle:

  1. Kuinka voin ottaa käyttöön ulkoiset keskeytyskäsittelijät muille GPIO: lle?
  2. Missä keskeytystaulukko on kartoitettu CMSIS: ssä?
  3. Mitä ovatko suurimmat erot NVIC: n ja AVR: n / PIC: n keskeytyksen toteutuksen välillä? (paitsi että NVIC voidaan yhdistää mihin tahansa salaman kohtaan)
Kolme vastused:
Austin Phillips
2011-05-27 05:18:41 UTC
view on stackexchange narkive permalink

Seuraavat tiedot täydentävät Igorin erinomaista vastausta.

C-ohjelmoinnin näkökulmasta keskeytyskäsittelijät määritetään tiedostossa cr_startup_xxx.c (esim. cr_startup_lpc13.c-tiedosto LPC1343: lle). Kaikki mahdolliset keskeytyskäsittelijät on määritelty siellä WEAK-aliakseksi. Jos et määritä omaa XXX_Handleria () keskeytyslähteelle, käytetään tässä tiedostossa määritettyä oletus keskeytyksen käsittelijän toimintoa. Linkkeri selvittää lopulliseen binaariin sisällytettävän toiminnon yhdessä cr_startup_xxx.c: n keskeytysvektoritaulukon kanssa.

Esimerkki GPIO-keskeytyksistä porteista näytetään demotiedostoissa gpio.c: ssä. NVIC: ssä on yksi keskeytystulo GPIO-porttia kohti. Jokainen portin yksittäinen bitti voidaan ottaa käyttöön / poistaa käytöstä keskeytyksen luomiseksi kyseiseen porttiin. Jos tarvitset keskeytyksiä esimerkiksi porteissa PIO1_4 ja PIO1_5, otat yksittäiset PIO1_4- ja PIO1_5-keskeytysbitit käyttöön GPIO0IE: ssä. Kun PIOINT0_Handler () -keskeytystoiminto käynnistyy, sinun on määritettävä, mitkä PIO1_4- tai PIO1_5-keskeytyksistä (tai molemmat) odottavat lukemalla GPIO0RIS-rekisterin ja käsittelemällä keskeytystä asianmukaisesti.

Igor Skochinsky
2011-05-26 17:08:05 UTC
view on stackexchange narkive permalink

(Huomaa, että kohdat 1 ja 2 ovat toteutuksen yksityiskohtia eivätkä arkkitehtonisia rajoituksia.)

  1. Suuremmissa NXP-siruissa (kuten LPC17xx) on pari erillistä keskeytystappia (EINTn) joilla on oma keskeytyskäsittelijä. Loput GPIO: t joutuvat käyttämään yhtä yleistä keskeytystä (EINT3). Voit sitten kysyä keskeytystilarekisteristä nähdäksesi mitkä nastat ovat käynnistäneet keskeytyksen.
  2. En ole kovin perehtynyt LPC11xx: een, mutta näyttää siltä, ​​että sillä on yksi keskeytys GPIO-porttia kohti . Sinun on jälleen tarkistettava tilarekisteri selvittääksesi tietyt nastat. On myös jopa 12 nastaa, jotka voivat toimia herätyslähteinä. En ole varma, pystytkö kaappaamaan heidät yleisinä keskeytyksinä (ts. Ne laukaistaan ​​todennäköisesti vain lepotilassa).
  3. Oletuskäsittelijätaulukko sijoitetaan osoitteeseen 0 (joka on salamavalossa). . Ensimmäinen merkintä on SP-rekisterin nollausarvo, toinen on nollausvektori ja loput ovat muita poikkeuksia ja keskeytysvektoreita. Pari ensimmäistä (kuten NMI ja HardFault) on ARM: n vahvistama, loput ovat sirukohtaisia. Jos haluat vaihtaa vektoreita ajon aikana, voit muokata sen uudelleen RAM-muistiin (sinun on ensin kopioitava taulukko). LPC11xx: ssä uudelleenmääritys on kiinteä SRAM: n alkuun (0x10000000), muut sirut voivat olla joustavampia.
  4. NVIC on optimoitu tehokkaalle keskeytysten käsittelylle:
    • ohjelmoitava prioriteettitaso 0- 3 kutakin keskeytystä kohden. Suuremman prioriteetin keskeytys estää matalamman prioriteetin (pesimisen). Alemman prioriteetin suorittaminen jatkuu, kun korkeamman prioriteetin keskeytys on valmis.
    • prosessorin tilan automaattinen pinoaminen keskeytyksen syöttämisen yhteydessä; tämä sallii keskeytyskäsittelijöiden kirjoittamisen suoraan C: hen ja poistaa tarpeen kokoonpanopäällysteille.
    • hännän ketjutus: tilan uudelleensyöttämisen ja työntämisen sijaan seuraava odottava keskeytys hoidetaan välittömästi
    • myöhään saapuva: jos korkeamman prioriteetin keskeytys saapuu prosessorin tilaa pinoamalla, se suoritetaan välittömästi aiemmin odottavan sijasta.

Koska olet perehtynyt PIC-tiedostoihin, katso tämä sovellushuomautus: Siirtyminen PIC-mikrokontrollereista Cortex-M3: een

Kyse on M3: sta, mutta suurin osa pisteistä koskee myös M0: ta .

Phuong Pham
2013-12-25 03:58:12 UTC
view on stackexchange narkive permalink

Austin ja Igor vastaukset ovat riittävän yksityiskohtaisia. Haluan kuitenkin vastata siihen toisella tavalla, ehkä pidät siitä hyödyllisenä.

LPC11xx: ssä (Cortex-M0) on 4 tasoa GPIO-nastoille, kaikilla nastoilla GPIO0.0 - GPIO0.n on sama keskeytysnumero ja kaikilla nastoilla GPIO3.0 - GPIO3.m jakaa saman keskeytysnumeron.

GPIO-keskeytyksen alustaminen LPC11xx: ssä on kuusi vaihetta

  1. Määritä nastatoiminto muokkaamalla nastaliitäntälohkorekistereitä.
  2. aseta nasta suunta muokkaamalla GPIO-datarekisteriä (oletusarvo syötetään).
  3. Määritä keskeytys jokaiselle yksittäiselle nastalle, sinun on mentävä GPIO-keskeytysmaskirekisteriin GPIOnIE ja asetettava bitti (joka vastaa nastaa) ) logiikka 1.
  4. Määritä keskeytys nousevalle reunalle tai laskevalle reunalle tai molemmille muokkaamalla GPIO-keskeytystunnistusrekistereitä GPIOnIBE ja GPIOnIS.
  5. Ota keskeytyslähde käyttöön joko PIO_0 / PIO_1 / PIO_2 / PIO_3 sisäkkäisessä vektoroidussa keskeytysohjauksessa CMSIS-toimintojen avulla.
  6. Aseta keskeytysprioriteetti CMSIS-toimintojen avulla.

Kooditoteutukset. Tarvitset kaksi toimintoa: yksi alustaa 6 yllä olevaa vaihetta ja toinen on keskeytyskäsittelijä, jonka vaaditaan olevan sama nimi kuin aloituskoodit, startup_LPC11xx.s -tiedostossa määritelty käsittelijä. Nimet ovat PIOINT0_IRQHandler - PIOINT3_IRQHandler . Jos käytät eri nimeä, sinun on muutettava nimiä käynnistystiedostossa.

  / * Aloita GPIO-nasta keskeytyksen hallintaan * / void GPIO_Init () {LPC_IOCON-> = .. // Pin-määritysrekisteri LPC_GPIO1->FIODIR = ... // GPIO-tietorekisteri LPC_GPIO1->FIOMASK = .. // GPIO-tietosuojarekisteri - valitse oikea tappi LPC_GPIO1->GPIOnIE = .. // Aseta putoava tai nouseva reuna NVIC_EnableIRQ (PIO_1); // Soita API: lle, jotta keskeytys otetaan käyttöön NVIC: ssä
NVIC_SetPriority (PriorityN); // Määritä prioriteetti tarvittaessa} / * Sen on oltava sama nimi kuin aloitustiedostossa startup_LPC11xx.s * / void PIOINT1_IRQHandler (void) {// Tee jotain täällä}  


Tämä Q & A käännettiin automaattisesti englanniksi.Alkuperäinen sisältö on saatavilla stackexchange-palvelussa, jota kiitämme cc by-sa 3.0-lisenssistä, jolla sitä jaetaan.
Loading...