<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://wikifr.techno-innov.fr/index.php?action=history&amp;feed=atom&amp;title=Technique%2FLogiciel%2FAPI%2FUse%2FCore%2FInterrupts</id>
	<title>Technique/Logiciel/API/Use/Core/Interrupts - Historique des versions</title>
	<link rel="self" type="application/atom+xml" href="https://wikifr.techno-innov.fr/index.php?action=history&amp;feed=atom&amp;title=Technique%2FLogiciel%2FAPI%2FUse%2FCore%2FInterrupts"/>
	<link rel="alternate" type="text/html" href="https://wikifr.techno-innov.fr/index.php?title=Technique/Logiciel/API/Use/Core/Interrupts&amp;action=history"/>
	<updated>2026-04-04T02:31:19Z</updated>
	<subtitle>Historique des versions pour cette page sur le wiki</subtitle>
	<generator>MediaWiki 1.41.0</generator>
	<entry>
		<id>https://wikifr.techno-innov.fr/index.php?title=Technique/Logiciel/API/Use/Core/Interrupts&amp;diff=34&amp;oldid=prev</id>
		<title>Nathael : Page créée avec « {{DISPLAYTITLE:Interface logicielle (API) - Cœur (Cortex-M*) - Interruptions}}  == Principe == Les interruptions sont un mécanisme qui permet d&#039;exécuter immédiatement... »</title>
		<link rel="alternate" type="text/html" href="https://wikifr.techno-innov.fr/index.php?title=Technique/Logiciel/API/Use/Core/Interrupts&amp;diff=34&amp;oldid=prev"/>
		<updated>2020-09-02T03:38:38Z</updated>

		<summary type="html">&lt;p&gt;Page créée avec « {{DISPLAYTITLE:Interface logicielle (API) - Cœur (Cortex-M*) - Interruptions}}  == Principe == Les interruptions sont un mécanisme qui permet d&amp;#039;exécuter immédiatement... »&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nouvelle page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{DISPLAYTITLE:Interface logicielle (API) - Cœur (Cortex-M*) - Interruptions}}&lt;br /&gt;
&lt;br /&gt;
== Principe ==&lt;br /&gt;
Les interruptions sont un mécanisme qui permet d&amp;#039;exécuter immédiatement le code d&amp;#039;une fonction spécifique lorsqu&amp;#039;un événement donné se produit, en interrompant le déroulement normal du programme, pour permettre le traitement immédiat de l&amp;#039;événement concerné.&amp;lt;br /&amp;gt;&lt;br /&gt;
L&amp;#039;exécution normale du programme &amp;quot;principal&amp;quot; reprends une fois que la routine de traitement (gestion) de l&amp;#039;interruption a terminé son exécution.&lt;br /&gt;
&lt;br /&gt;
== Utilisation avec l&amp;#039;API ==&lt;br /&gt;
Dans la majorité des cas (et donc la majorité des drivers) la configuration des interruptions et leur utilisation est gérée par le driver.&amp;lt;br /&amp;gt;&lt;br /&gt;
La configuration au niveau du programme utilisateur consiste à enregistrer une routine qui sera appelée par le gestionnaire interne au driver, après avoir effectué les éventuels traitements nécessaires au préalable.&lt;br /&gt;
&lt;br /&gt;
L&amp;#039;enregistrement des ces routines (callbacks) se fait par le biais de l&amp;#039;interface de chaque driver, et est détaillé sur la page de description de chaque driver.&lt;br /&gt;
&lt;br /&gt;
=== Règles ===&lt;br /&gt;
Un callback &amp;#039;&amp;#039;&amp;#039;DOIT&amp;#039;&amp;#039;&amp;#039; respecter les règles suivantes :&lt;br /&gt;
* Être court&lt;br /&gt;
* Ne pas inclure de boucles&lt;br /&gt;
* N&amp;#039;utiliser que des variables locales ou volatiles&lt;br /&gt;
* Ne pas déclencher d&amp;#039;autres interruptions&lt;br /&gt;
&lt;br /&gt;
=== Explications ===&lt;br /&gt;
Une routine de gestion d&amp;#039;une interruption est une fonction qui s&amp;#039;exécute en dehors du fonctionnement normal du programme. Pendant ce temps, le reste du programme (et les autres routines de traitement des interruptions) ne peuvent pas s&amp;#039;exécuter. Si une routine de traitement met trop de temps à traiter une interruption, il risque de se produire une autre interruption avant la fin, provoquant soit un appel récursif de la routine de traitement, soit une perte d&amp;#039;information (une interruption non vue, donc non traitée).&amp;lt;br /&amp;gt;&lt;br /&gt;
Pour ce faire, il faut éviter à tout prix le parcours de tableaux ou la recherche d&amp;#039;éléments dans une liste, qui sont des opérations très longues. Les boucles sont aussi à proscrire, car le risque de &amp;quot;boucler&amp;quot; pendant trop longtemps est très grand.&lt;br /&gt;
&lt;br /&gt;
L&amp;#039;accès aux variables globales est une opération hasardeuse si le compilateur n&amp;#039;a pas été informé du caractère volatile de la variable en question. En effet, du point de vue du compilateur une routine de gestion d&amp;#039;une interruption n&amp;#039;est jamais appelée, et ne risque donc pas de modifier une variable utilisée dans une autre fonction. Il peut donc très bien optimiser l&amp;#039;accès à une variable et en stocker une copie dans un registre pendant tout le temps d&amp;#039;exécution d&amp;#039;une boucle, alors que l&amp;#039;interruption modifiera la variable en mémoire, et non pas dans le registre. La boucle attendra indéfiniment, et le programme sera bloqué.&amp;lt;br /&amp;gt;&lt;br /&gt;
Si la variable est déclarée &amp;quot;volatile&amp;quot; le compilateur forcera la relecture de la valeur de la variable à chaque test ou accès, et la &lt;br /&gt;
modification par l&amp;#039;interruption sera bien prise en compte.&lt;br /&gt;
&lt;br /&gt;
Pour limiter les traitements à l&amp;#039;intérieur d&amp;#039;un &amp;quot;callback&amp;quot;, il est conseillé d&amp;#039;utiliser des &amp;quot;drapeaux&amp;quot;.&amp;lt;br /&amp;gt;&lt;br /&gt;
Les drapeaux sont des variables déclarées &amp;quot;volatile&amp;quot; servant à signaler au programme principal qu&amp;#039;un événement est survenu.&amp;lt;br /&amp;gt;&lt;br /&gt;
Un drapeau peut être binaire, ou véhiculer une information donnant plus d&amp;#039;indications au programme principal sur ce qu&amp;#039;il lui faut réaliser.&lt;br /&gt;
Dans le cas d&amp;#039;événements à haute fréquence, le drapeau pourra être un compteur, et le programme principal pourra éventuellement protéger l&amp;#039;accès à cette variable par l&amp;#039;utilisation de la fonction sync_lock_test_and_set(), qui désactive les interruptions avant de lire l&amp;#039;ancienne valeur, la remplace par la nouvelle valeur, réactive les interruptions, et renvoie l&amp;#039;ancienne valeur.&lt;br /&gt;
&lt;br /&gt;
Enfin, il ne faut pas qu&amp;#039;un gestionnaire d&amp;#039;interruption fasse appel à une fonction qui attende ou risque d&amp;#039;attendre que d&amp;#039;autres événements se produisent pour se terminer. il s&amp;#039;agit notamment de toutes les fonctions fournies par les drivers de communication (UART, I2C, SPI, ...) dont le fonctionnement repose aussi sur des interruptions.&amp;lt;br /&amp;gt;&lt;br /&gt;
Par exemple, l&amp;#039;envoi d&amp;#039;un message se fera dans la boucle principale, l&amp;#039;interruption positionnant simplement un drapeau indiquant le message à envoyer.&lt;br /&gt;
&lt;br /&gt;
== Fonctionnement interne - NVIC ==&lt;br /&gt;
La gestion des interruptions sur les LPC passe par un &amp;quot;bloc&amp;quot; appelé NVIC (Nested Vector Interrupt Controller).&amp;lt;br /&amp;gt;&lt;br /&gt;
Dans certains cas, il peut-être nécessaire de modifier le fonctionnement interne de l&amp;#039;API, pour une application critique ou très pointue.&amp;lt;br /&amp;gt;&lt;br /&gt;
Cette partie donne quelques pistes et détails sur le fonctionnement interne de l&amp;#039;API pour la partie gestion des interruptions et interface avec le NVIC.&lt;br /&gt;
&lt;br /&gt;
=== Table des vecteurs d&amp;#039;interruption ===&lt;br /&gt;
Pour que le micro-contrôleur sache à quelle fonction faire appel, il est nécessaire d&amp;#039;enregistrer l&amp;#039;adresse de la fonction concernée dans une table, appelée &amp;quot;table des vecteurs d&amp;#039;interruption&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Cette table dispose d&amp;#039;une entrée par interruption existante. La liste des interruptions et leur ordre est défini et fixe pour chaque micro-contrôleur, et cet ordre n&amp;#039;a pas beaucoup d&amp;#039;importance pour l&amp;#039;utilisation des interruptions.&lt;br /&gt;
&lt;br /&gt;
Le lien entre les numéros d&amp;#039;interruptions (l&amp;#039;ordre) et les fonctions à appeler lorsque l&amp;#039;interruption concernée se produit est fait dans le fichier &amp;quot;core/bootstrap.c&amp;quot;, dans la table &amp;lt;tt&amp;gt;vector_table[]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
 void *vector_table[] __attribute__ ((section(&amp;quot;.vectors&amp;quot;))) = {&lt;br /&gt;
    &amp;amp;_end_stack, /* Initial SP value */ /* 0 */&lt;br /&gt;
    Reset_Handler,&lt;br /&gt;
    NMI_Handler,&lt;br /&gt;
    HardFault_Handler,&lt;br /&gt;
    0,&lt;br /&gt;
    /* [....] */&lt;br /&gt;
 };&lt;br /&gt;
À noter l&amp;#039;attribut définissant la section dans laquelle le compilateur devra mettre cette table, ce qui permettra à l&amp;#039;éditeur de lien de placer cette table au bon endroit dans le binaire qui sera flashé sur le micro-contrôleur.&lt;br /&gt;
&lt;br /&gt;
=== Les handlers et les &amp;quot;dummy handlers&amp;quot; ===&lt;br /&gt;
Les &amp;quot;handlers&amp;quot; sont les routines de gestion des interruptions.&lt;br /&gt;
&lt;br /&gt;
Chacune des ces routines a une définition &amp;quot;factice&amp;quot; présente dans le fichier &amp;quot;core/bootstrap.c&amp;quot;, à l&amp;#039;exception du Reset_Handler qui est obligatoire et est définit dans le même fichier.&lt;br /&gt;
Ces définitions se présentent sous la forme suivante :&lt;br /&gt;
 void UART_0_Handler(void) __attribute__ ((weak, alias (&amp;quot;Dummy_Handler&amp;quot;)));&lt;br /&gt;
&lt;br /&gt;
Cette notation permet de définir le nom de la fonction à appeler pour chaque interruption, sans être obligé de déclarer effectivement les fonctions. Chaque nom est déclaré comme étant un alias &amp;quot;faible&amp;quot; de la fonction Dummy_Handler(). Si lors de l&amp;#039;édition de lien il n&amp;#039;y a aucune autre définition pour cette fonction, alors l&amp;#039;adresse utilisée sera celle de la fonction Dummy_Handler(). Si une autre définition est présente avec le même nom (dans ce fichier ou dans un autre), elle prendra la place de celle-ci, et c&amp;#039;est l&amp;#039;adresse de l&amp;#039;autre fonction qui sera utilisée et mise dans la table des vecteurs d&amp;#039;interruption.&lt;br /&gt;
&lt;br /&gt;
=== Numéros d&amp;#039;interruptions ===&lt;br /&gt;
 #include &amp;quot;core/lpc_core.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Les numéros des vecteurs d&amp;#039;interruption sont définis dans le fichier d&amp;#039;entête &amp;quot;include/core/lpc_core.h&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Une partie de ces vecteurs correspond aux &amp;quot;exceptions&amp;quot; (entrées 1 à 15 dans la table des vecteurs d&amp;#039;interruption, souvent numérotées -15 à -1 dans la documentation).&amp;lt;br /&amp;gt;&lt;br /&gt;
Attention, certaines entrées ne sont pas des interruptions (entrées 0, 1 et 7) et toutes ne sont pas systématiquement présentes. leur position est fixe.&amp;lt;br /&amp;gt;&lt;br /&gt;
Ci-dessous les numéros des exceptions disponibles sur le micro-contrôleur LPC1224 :&lt;br /&gt;
 /* Cortex-M0 Processor Exceptions Numbers */&lt;br /&gt;
 /* Note : entry 0 is &amp;quot;end stack pointer&amp;quot; */&lt;br /&gt;
 #define RESET_IRQ       ( -15 ) /*  1 - Reset ... not an interrupt ... */&lt;br /&gt;
 #define NMI_IRQ         ( -14 ) /*  2 - Non Maskable Interrupt */&lt;br /&gt;
 #define HARD_FAULT_IRQ  ( -13 ) /*  3 - Cortex-M0 Hard Fault Interrupt */&lt;br /&gt;
 /* Note : entry 7 is the 2’s complement of the check-sum of the previous 7 entries */&lt;br /&gt;
 #define SV_CALL_IRQ     (  -5 ) /* 11 - Cortex-M0 Supervisor Call Interrupt */&lt;br /&gt;
 #define PEND_SV_IRQ     (  -2 ) /* 14 - Cortex-M0 Pend SV Interrupt */&lt;br /&gt;
 #define SYSTICK_IRQ     (  -1 ) /* 15 - Cortex-M0 System Tick Interrupt */&lt;br /&gt;
&lt;br /&gt;
Le reste des vecteurs d&amp;#039;interruption correspond aux vecteurs ou lignes d&amp;#039;interruption des différents modules, ou interruptions &amp;quot;externes&amp;quot;. Il s&amp;#039;agit des numéros 0 à 31 (vecteurs 16 à 47). L&amp;#039;ordre et la présence de chaque vecteur dépend du micro-contrôleur.&amp;lt;br /&amp;gt;&lt;br /&gt;
Les numéros de ces vecteurs d&amp;#039;interruption sont définis dans le fichier d&amp;#039;entête &amp;quot;include/core/lpc_core.h&amp;quot;, à la suite des précédents.&lt;br /&gt;
&lt;br /&gt;
Voir la liste complète plus bas sur cette page, dans la section &amp;quot;Spécificités par micro-contrôleur&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Activation des interruptions ==&lt;br /&gt;
=== Activation / désactivation globale ===&lt;br /&gt;
 static inline void lpc_enable_irq(void);&lt;br /&gt;
 static inline void lpc_disable_irq(void);&lt;br /&gt;
La fonction lpc_enable_irq() sert à autoriser toutes les interruptions configurées. Par défaut, au démarrage les interruptions sont autorisées.&lt;br /&gt;
La fonction lpc_disable_irq() sert à bloquer la totalité des interruptions, sans les désactiver ou changer leur configuration individuelle. Les interruptions peuvent être à nouveau autorisées (selon leur configuration) en faisant appel à la fonction lpc_enable_irq().&lt;br /&gt;
 &lt;br /&gt;
=== Activation / désactivation par vecteur pour les interruptions externes ===&lt;br /&gt;
 static inline void NVIC_EnableIRQ(uint32_t IRQ);&lt;br /&gt;
 static inline void NVIC_DisableIRQ(uint32_t IRQ);&lt;br /&gt;
&lt;br /&gt;
Les fonctions NVIC_EnableIRQ et NVIC_DisableIRQ servent à activer / désactiver l&amp;#039;interruption dont le numéro est passé en paramètre.&amp;lt;br /&amp;gt;&lt;br /&gt;
Pour qu&amp;#039;un driver fonctionne sur interruption il est nécessaire d&amp;#039;activer l&amp;#039;interruption correspondante (et de définir une routine de gestion de l&amp;#039;interruption en utilisant le nom présent dans le fichier &amp;quot;core/bootstrap.c&amp;quot;).&amp;lt;br /&amp;gt;&lt;br /&gt;
Seules les interruptions externes (numéros 0 à 31) peuvent être activées ou désactivées.&lt;br /&gt;
&lt;br /&gt;
=== Déclenchement ou annulation d&amp;#039;une interruption externe par logiciel ===&lt;br /&gt;
 static inline uint32_t NVIC_GetPendingIRQ(uint32_t IRQ);&lt;br /&gt;
 static inline void NVIC_SetPendingIRQ(uint32_t IRQ);&lt;br /&gt;
 static inline void NVIC_ClearPendingIRQ(uint32_t IRQ);&lt;br /&gt;
&lt;br /&gt;
Il est possible de déclencher ou d&amp;#039;annuler de façon &amp;quot;factice&amp;quot; une interruption, que ce soit pour effectuer des tests, ou pour des besoins spécifiques.&amp;lt;br /&amp;gt;&lt;br /&gt;
Le déclenchement par logiciel se fait par le biais de la fonction NVIC_SetPendingIRQ().&amp;lt;br /&amp;gt;&lt;br /&gt;
L&amp;#039;annulation d&amp;#039;une interruption (par exemple lorsque les interruptions sont inhibées) se fait par le biais de la fonction NVIC_ClearPendingIRQ().&amp;lt;br /&amp;gt;&lt;br /&gt;
La fonction NVIC_GetPendingIRQ() renvoie 1 si l&amp;#039;interruption est en attente de traitement, ou 0 sinon.&lt;br /&gt;
&lt;br /&gt;
Les trois fonctions prennent en paramètre le numéro de l&amp;#039;interruption externe concernée (numéros 0 à 31).&lt;br /&gt;
&lt;br /&gt;
== Gestion des priorités ==&lt;br /&gt;
 static inline void NVIC_SetPriority(uint32_t IRQ, uint32_t priority)&lt;br /&gt;
 static inline uint32_t NVIC_GetPriority(uint32_t IRQ)&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
== Spécificités par micro-contrôleur ==&lt;br /&gt;
=== LPC82x ===&lt;br /&gt;
Liste des interruptions externes et nom des routines de gestion associés :&lt;br /&gt;
 /* UARTS */&lt;br /&gt;
 #define UART0_IRQ  --&amp;gt; UART_0_Handler()&lt;br /&gt;
 #define UART1_IRQ  --&amp;gt; UART_1_Handler()&lt;br /&gt;
 #define UART2_IRQ  --&amp;gt; UART_2_Handler()&lt;br /&gt;
 &lt;br /&gt;
 /* I2C */&lt;br /&gt;
 #define I2C0_IRQ  --&amp;gt; I2C_0_Handler()&lt;br /&gt;
 #define I2C1_IRQ  --&amp;gt; I2C_1_Handler()&lt;br /&gt;
 #define I2C2_IRQ  --&amp;gt; I2C_2_Handler()&lt;br /&gt;
 #define I2C3_IRQ  --&amp;gt; I2C_3_Handler()&lt;br /&gt;
 &lt;br /&gt;
 /* SPI */&lt;br /&gt;
 #define SSP0_IRQ  --&amp;gt; SSP_0_Handler()&lt;br /&gt;
 #define SSP1_IRQ  --&amp;gt; SSP_1_Handler()&lt;br /&gt;
 &lt;br /&gt;
 /* Timers */&lt;br /&gt;
 #define SCT_IRQ  --&amp;gt; SCT_Handler()  /* State Configurable Timer */&lt;br /&gt;
 #define MRT_IRQ  --&amp;gt; MRT_Handler()  /* Multi-Rate Timer */&lt;br /&gt;
 #define WKT_IRQ  --&amp;gt; WKT_Handler()  /* Wakeup Timer */&lt;br /&gt;
 &lt;br /&gt;
 /* ADC */&lt;br /&gt;
 #define CMP_IRQ  --&amp;gt; Comparator_Handler()&lt;br /&gt;
 #define ADC_SEQA_IRQ  --&amp;gt; ADC_SEQA_Handler()  /* ADC Sequence A */&lt;br /&gt;
 #define ADC_SEQB_IRQ  --&amp;gt; ADC_SEQB_Handler()  /* ADC Sequence B */&lt;br /&gt;
 #define ADC_THCMP_IRQ --&amp;gt; ADC_THCMP_Handler() /* ADC Threshold comparator */&lt;br /&gt;
 #define ADC_OVR_IRQ   --&amp;gt; ADC_OVR_Handler()   /* ADC Overrun */&lt;br /&gt;
 &lt;br /&gt;
 /* GPIO */&lt;br /&gt;
 #define PININT0_IRQ  --&amp;gt;  PININT_0_Handler()&lt;br /&gt;
 /* [...] */&lt;br /&gt;
 #define PININT7_IRQ  --&amp;gt;  PININT_7_Handler()&lt;br /&gt;
 &lt;br /&gt;
 /* Other */&lt;br /&gt;
 #define WDT_IRQ   --&amp;gt; WDT_Handler()  /* Watchdog */&lt;br /&gt;
 #define BOD_IRQ   --&amp;gt; BOD_Handler()  /* Brown Out Detection */&lt;br /&gt;
 #define SDMA_IRQ  --&amp;gt; DMA_Handler()  /* DMA */&lt;br /&gt;
 #define FLASH_IRQ --&amp;gt; FLASH_Handler()&lt;br /&gt;
&lt;br /&gt;
=== LPC11A04 ===&lt;br /&gt;
&lt;br /&gt;
=== LPC122x ===&lt;br /&gt;
Liste des interruptions externes et nom des routines de gestion associés :&lt;br /&gt;
 /* UARTS */&lt;br /&gt;
 #define UART0_IRQ  --&amp;gt; UART_0_Handler()&lt;br /&gt;
 #define UART1_IRQ  --&amp;gt; UART_1_Handler()&lt;br /&gt;
 &lt;br /&gt;
 /* I2C */&lt;br /&gt;
 #define I2C0_IRQ  --&amp;gt; I2C_0_Handler()&lt;br /&gt;
 &lt;br /&gt;
 /* SPI */&lt;br /&gt;
 #define SSP0_IRQ  --&amp;gt; SSP_0_Handler()&lt;br /&gt;
 &lt;br /&gt;
 /* Timers */&lt;br /&gt;
 #define TIMER0_IRQ  --&amp;gt; TIMER_0_Handler()&lt;br /&gt;
 #define TIMER1_IRQ  --&amp;gt; TIMER_1_Handler()&lt;br /&gt;
 #define TIMER2_IRQ  --&amp;gt; TIMER_2_Handler()&lt;br /&gt;
 #define TIMER3_IRQ  --&amp;gt; TIMER_3_Handler()&lt;br /&gt;
 &lt;br /&gt;
 /* ADC */&lt;br /&gt;
 #define COMPARATOR_IRQ  --&amp;gt; Comparator_Handler()&lt;br /&gt;
 #define ADC_IRQ  --&amp;gt; ADC_Handler()&lt;br /&gt;
 &lt;br /&gt;
 /* GPIO */&lt;br /&gt;
 #define PIO_0_IRQ  --&amp;gt; PIO_0_Handler()  /* port 0 */&lt;br /&gt;
 #define PIO_1_IRQ  --&amp;gt; PIO_1_Handler()  /* port 1 */&lt;br /&gt;
 #define PIO_2_IRQ  --&amp;gt; PIO_2_Handler()  /* port 2 */&lt;br /&gt;
 &lt;br /&gt;
 /* Other */&lt;br /&gt;
 #define WDT_IRQ  --&amp;gt; WDT_Handler()  /* Watchdog */&lt;br /&gt;
 #define BOD_IRQ  --&amp;gt; BOD_Handler()  /* Brown Out Detection */&lt;br /&gt;
 #define DMA_IRQ  --&amp;gt; DMA_Handler()  /* DMA */&lt;br /&gt;
 #define RTC_IRQ  --&amp;gt; RTC_Handler()  /* Real Time Clock (RTC) */&lt;br /&gt;
 /* Wakeup */&lt;br /&gt;
 #define WAKEUP0_IRQ  --&amp;gt; WAKEUP_Handler()&lt;br /&gt;
 #define WAKEUP1_IRQ&lt;br /&gt;
 /* [...] */&lt;br /&gt;
 #define WAKEUP9_IRQ&lt;br /&gt;
 #define WAKEUP10_IRQ&lt;br /&gt;
 #define WAKEUP11_IRQ&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=== LPC176x ===&lt;/div&gt;</summary>
		<author><name>Nathael</name></author>
	</entry>
</feed>