Sie sind auf Seite 1von 11

Interruptions et STM32

Issam Outassourt, Alexis Robert

Fonctionnement des interruptions


Contrleur dinterruptions prsent dans le cur ARM Cortex-M
NVIC : Nested Vectored Interrupt Controller

Gre les priorits entre interruptions


Gre la sauvegarde/restauration des registres
Le tout de faon optimise (tail chaining, stack pop pre-emption, late arrival)
Le fabriquant du micro-contrleur peut y greffer ses interruptions (ex : UART,
DMA, EXTI), le cur ayant aussi ses propres interruptions (ex : Hard Fault)
Le tout de faon commune entre tous les curs ARM afin de faciliter le
portage des RTOS (idem pour le timer SysTick)

Groupe de priorits et sous-priorits


Le Cortex-M possde un registre de priorit sur 8 bits pour chaque
interruption : 255 niveaux de priorit
Divis en deux parties : group priority & sub priority
Faon de splitter configur dans le registre PRIGROUP
Erreur courante : priorit maximale = 0, priorit minimale = 255

Group priority dfinit si une interruption peut interrompre une


interruption courante (pr-emption)
Sub priority dfinit qui sexcutera en premier si deux interruptions du
mme group priority arrivent en mme temps

EXTI, sa vie, son uvre


On a vu les interruptions venant de lextrieur du cur ARM mais lances
par le reste du microcontrleur.
On veut lancer une interruption depuis lextrieur : EXTI (EXTernal Interrupts)

Exemple : Boutons poussoir, rveil si trafic rseau,


Permet de lancer une interruption en front montant et/ou descendent
Squence les informations via lhorloge APB2
Rveille le cur ARM de veille

Rsout le problme du polling


Permet de mettre en veille le cur pour ntre rveill que si quelquun agit avec le
priphrique
Soulage le scheduler du RTOS

Priphrique fourni par ST

Sources dinterruptions
GPIO
Priphriques autres pour
rveiller le cur
Ethernet
USB OTG
Horloge RTC

Les sources se configurent dans


les registres de AFIO (sur STM32F1)

Configuration des EXTI


1. Configurer EXTI
a) Rgler le masque des vnements gnrant des interruptions : EXTI_IMR
b) Rgler le masque raising/falling trigger : EXTI_RTSR / EXTI_FTSR

2. Configurer la source dans AFIO


Rgler le registre AFIO_EXTICRx
3. Activer le priphrique AFIO
Activer son horloge dans le priphrique RCC
4. Configurer le NVIC
Activer linterruption et rgler la priorit

Interruptions sous ChibiOS


Types dinterruptions
NMI (non maskable interrupts), FI (fast interrupt), RI (regular
interrupts)
Une machine tats
Transitions sur appel de fonctions ou sur interruptions
Configuration
Dfinition des handlers dinterruptions
Initialisation du vecteur dinterruptions

Exemple pratique
Faire changer ltat dune LED depuis un bouton (via EXTI)
https://gist.github.com/anonymous/5006972

Structure dun IRQ handler


CH_IRQ_HANDLER(myIRQ) { //myIRQ : IRQ Identifier

CH_IRQ_PROLOGUE();
/* IRQ handling code, preemptable if the architecture supports it.*/
chSysLockFromIsr();
/* Invocation of some I-Class system APIs, never preemptable.*/
chSysUnlockFromIsr();
/* More IRQ handling code, again preemptable.*/
CH_IRQ_EPILOGUE();
}
CH_FAST_IRQ_HANDLER(myIRQ){

EXTI : le handler
static void extcb1(EXTDriver *extp, expchannel_t channel) {
palTogglePad(GPIOD, GPIOD_LED4);
}

EXTI : Configuration
Options gnrales :

EXT_CH_MODE_DISABLED
EXT_CH_MODE_RISING_EDGE
EXT_CH_MODE_FALLING_EDGE
EXT_CH_MODE_BOTH_EDGES
EXT_CH_MODE_AUTOSTART

EXT_MODE_GPIO[A-I] spcifique STM32

/* Configure EXTI */
static const EXTConfig extcfg = {
{

{EXT_CH_MODE_BOTH_EDGES | EXT_MODE_GPIOA, extcb1},


{EXT_CH_MODE_DISABLED, NULL},
},
};
//main

extStart(&EXTD1, &extcfg);

EXTI : le main
int main(void) {
halInit(); // Initialise la HAL
chSysInit(); // Initialise ChibiOS

palSetPadMode(GPIOD, GPIOD_LED4, PAL_MODE_OUTPUT_PUSHPULL);


extInit(); // Initialise le driver EXTI
extStart(&EXTD1, &extcfg); // Rgle les registres EXTI

extChannelEnable(&EXTD1, 0); // Dmarre EXTI


while(1) {}

Das könnte Ihnen auch gefallen