<?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%2FDrivers%2FGPIO</id>
	<title>Technique/Logiciel/API/Use/Drivers/GPIO - 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%2FDrivers%2FGPIO"/>
	<link rel="alternate" type="text/html" href="https://wikifr.techno-innov.fr/index.php?title=Technique/Logiciel/API/Use/Drivers/GPIO&amp;action=history"/>
	<updated>2026-04-04T02:30:01Z</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/Drivers/GPIO&amp;diff=41&amp;oldid=prev</id>
		<title>Nathael : Page créée avec « {{DISPLAYTITLE:Interface logicielle (API) - Driver GPIO}}  == Présentation ==  #include &quot;drivers/gpio.h&quot; Le driver &quot;GPIO&quot; (General Purpose Input / Output) donne accès au... »</title>
		<link rel="alternate" type="text/html" href="https://wikifr.techno-innov.fr/index.php?title=Technique/Logiciel/API/Use/Drivers/GPIO&amp;diff=41&amp;oldid=prev"/>
		<updated>2020-09-02T03:47:42Z</updated>

		<summary type="html">&lt;p&gt;Page créée avec « {{DISPLAYTITLE:Interface logicielle (API) - Driver GPIO}}  == Présentation ==  #include &amp;quot;drivers/gpio.h&amp;quot; Le driver &amp;quot;GPIO&amp;quot; (General Purpose Input / Output) donne accès au... »&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nouvelle page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{DISPLAYTITLE:Interface logicielle (API) - Driver GPIO}}&lt;br /&gt;
&lt;br /&gt;
== Présentation ==&lt;br /&gt;
 #include &amp;quot;drivers/gpio.h&amp;quot;&lt;br /&gt;
Le driver &amp;quot;GPIO&amp;quot; (General Purpose Input / Output) donne accès aux fonctions d&amp;#039;entrée / sortie &amp;quot;génériques&amp;quot; (General Purpose) pour les pins du micro-contrôleur.&lt;br /&gt;
&lt;br /&gt;
La sélection de la fonction &amp;quot;GPIO&amp;quot; pour une pin est fait à l&amp;#039;aide de la fonction config_pio() décrite à la page &amp;quot;[[Technique/Logiciel/API/Use/Core/PIO|Configuration des fonctions des ports d&amp;#039;entrée/sortie]]&amp;quot; de cette documentation.&lt;br /&gt;
L&amp;#039;appel à cette fonction est fait automatiquement lors de l&amp;#039;appel aux fonction config_gpio() ou set_gpio_callback() décrites dans les sections suivantes.&lt;br /&gt;
&lt;br /&gt;
Le nombre de ports et le nombre de pins disponibles sur chaque port dépends du micro-contrôleur utilisé, et parfois même du nombre de pattes physiques du boîtier utilisé.&lt;br /&gt;
Le fichier d&amp;#039;entête fournit  les définitions du nombre de pins disponibles pour chaque port, indépendamment du type de boîtier utilisé.&lt;br /&gt;
 #define PORT0_NB_PINS&lt;br /&gt;
 #define PORT1_NB_PINS&lt;br /&gt;
 #define PORT2_NB_PINS&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
== Activation ==&lt;br /&gt;
 void gpio_on(void);&lt;br /&gt;
 void gpio_off(void);&lt;br /&gt;
&lt;br /&gt;
Les sous-systèmes (modules) du micro-contrôleurs permettant l&amp;#039;accès à la configuration et à l&amp;#039;état des GPIO peuvent être activés ou désactivés pour limiter la consommation du micro-contrôleur. Cette désactivation est faite en coupant l&amp;#039;horloge du sous-système concerné.&amp;lt;br /&amp;gt;&lt;br /&gt;
Cette activation ou désactivation peut se faire port par port sur certains micro-contrôleurs, cependant l&amp;#039;implémentation actuelle active ou désactive tous les ports en même temps.&amp;lt;br /&amp;gt;&lt;br /&gt;
Lorsqu&amp;#039;ils sont désactivés, les sorties conservent leur état, mais l&amp;#039;état des entrées n&amp;#039;est plus mis à jour et il n&amp;#039;est plus possible de changer l&amp;#039;état des sorties sans réactiver les ports d&amp;#039;entrée sortie.&lt;br /&gt;
&lt;br /&gt;
== Configuration : GPIO ==&lt;br /&gt;
 void config_gpio(const struct pio* gpio, uint32_t mode, uint8_t dir, uint8_t ini_val);&lt;br /&gt;
&lt;br /&gt;
La fonction config_gpio() permet de configurer une pin du micro-contrôleur en fonction GPIO, et de spécifier son mode de fonctionnement, sa direction &amp;#039; dir&amp;#039; (GPIO_DIR_IN ou GPIO_DIR_OUT) et son état par défaut &amp;#039;ini_val&amp;#039; (0 ou 1).&amp;lt;br /&amp;gt;&lt;br /&gt;
Le paramètre &amp;#039;mode&amp;#039; est passé à la fonction config_pio() en ajoutant le bit &amp;quot;LPC_IO_DIGITAL&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Utilisation : Entrées/Sorties, accès séparé ==&lt;br /&gt;
Les fonctions présentées ci-dessous n&amp;#039;utilisent pas d&amp;#039;appel de fonction, mais des définitions, à l&amp;#039;exception de gpio_read() qui utilise une fonction &amp;quot;inline&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 void gpio_dir_in(const struct pio gpio);&lt;br /&gt;
 void gpio_dir_out(const struct pio gpio);&lt;br /&gt;
&lt;br /&gt;
Les fonctions gpio_dir_in() et gpio_dir_out() permettent de changer la direction d&amp;#039;une GPIO après sa configuration initiale.&lt;br /&gt;
&lt;br /&gt;
 void gpio_set(const struct pio gpio);&lt;br /&gt;
 void gpio_clear(const struct pio gpio);&lt;br /&gt;
 void gpio_toggle(const struct pio gpio);&lt;br /&gt;
&lt;br /&gt;
La fonction gpio_set() permet de changer l&amp;#039;état d&amp;#039;une GPIO configurée en sortie en la mettant au niveau logique &amp;quot;1&amp;quot;, indépendamment de son état actuel, et sans changer l&amp;#039;état des autres pins du même port.&amp;lt;br /&amp;gt;&lt;br /&gt;
La fonction gpio_clear() permet de changer l&amp;#039;état d&amp;#039;une GPIO configurée en sortie en la mettant au niveau logique &amp;quot;0&amp;quot;, indépendamment de son état actuel, et sans changer l&amp;#039;état des autres pins du même port.&amp;lt;br /&amp;gt;&lt;br /&gt;
La fonction gpio_toggle() permet de changer l&amp;#039;état d&amp;#039;une GPIO configurée en sortie en inversant son niveau logique, sans avoir besoin de lire au préalable son état actuel, et sans changer l&amp;#039;état des autres pins du même port.&lt;br /&gt;
&lt;br /&gt;
 uint32_t gpio_read(const struct pio gpio);&lt;br /&gt;
&lt;br /&gt;
La fonction gpio_read() renvoie 0 si l&amp;#039;entrée correspondante est à l&amp;#039;état logique &amp;quot;0&amp;quot;, et autre chose (dépendant du micro-contrôleur) si l&amp;#039;entrée correspondante est à l&amp;#039;état logique &amp;quot;1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Utilisation : Entrées/Sorties, accès groupé ==&lt;br /&gt;
Cette partie est extrêmement spécifique à chaque micro-contrôleur et il est nécessaire de se référer à la documentation du micro-contrôleur pour l&amp;#039;utiliser. Les éléments présentés ici ne sont que des indications générales aidant à comprendre le fonctionnement.&lt;br /&gt;
&lt;br /&gt;
Lorsqu&amp;#039;il est nécessaire de mettre à jour plusieurs sorties simultanément, ou de lire plusieurs entrées en une seule fois, il est possible de passer directement par la structure donnant accès aux registres correspondants.&lt;br /&gt;
&lt;br /&gt;
Cette structure est définie dans le fichier d&amp;#039;entête &amp;quot;drivers/gpio.h&amp;quot;, et contient plusieurs champs en fonction du micro-contrôleur, permettant différents modes d&amp;#039;accès aux entrées/sorties correspondantes.&lt;br /&gt;
 enum gpio_ports {&lt;br /&gt;
    GPIO_PORT0,&lt;br /&gt;
    GPIO_PORT1,&lt;br /&gt;
    /* [....] */&lt;br /&gt;
 };&lt;br /&gt;
 struct lpc_gpio&lt;br /&gt;
 {&lt;br /&gt;
     /* [....] */&lt;br /&gt;
 };&lt;br /&gt;
 #define LPC_GPIO_REGS(x)&lt;br /&gt;
Il existe une structure &amp;quot;lpc_gpio&amp;quot; pour chaque port du micro-contrôleur (indépendemment du nombre de pins de chaque port).&amp;lt;br /&amp;gt;&lt;br /&gt;
Pour accéder à un port donné, il faut déclarer un pointeur vers la structure correspondante au port (par exemple le port 0) :&lt;br /&gt;
 struct lpc_gpio* gpio_port = LPC_GPIO_REGS(GPIO_PORT0);&lt;br /&gt;
Chaque champ de cette structure donne un type d&amp;#039;accès particulier à l&amp;#039;état des pins du micro-contrôleur. Les différents champs suivants peuvent être disponibles en fonction du micro-contrôleur. (Tous ne sont pas présents, se référer au fichier d&amp;#039;entête &amp;quot;drivers/gpio.h&amp;quot; correspondant au micro-contrôleur concerné pour connaître les champs existants).&amp;lt;br /&amp;gt;&lt;br /&gt;
Pour la plupart des champs, un mot de 32 bits représente les 32 pins d&amp;#039;un port donné. (Le bit 0 correspond à la pin 0, le bit 1 à la pin 1, ...).&lt;br /&gt;
* &amp;#039;in&amp;#039;, &amp;#039;out&amp;#039;, &amp;#039;val&amp;#039; ou &amp;#039;mval&amp;#039; : Valeur de l&amp;#039;ensemble des pins du port sur un mot de 32 bits&lt;br /&gt;
* &amp;#039;set&amp;#039;, &amp;#039;clear&amp;#039; et &amp;#039;toggle&amp;#039; : Permet de ne changer que l&amp;#039;état de certaines sorties, sans modifier l&amp;#039;état des autres sorties.&lt;br /&gt;
* &amp;#039;data_dir&amp;#039; : Change la direction des GPIO du port.&lt;br /&gt;
* &amp;#039;mask&amp;#039; : Permet de définir un masque d&amp;#039;accès aux bits des autres champs. Affecte différents champs en fonction du micro-contrôleur.&lt;br /&gt;
Champs particuliers :&lt;br /&gt;
* &amp;#039;bval[32]&amp;#039; : Valeur de la pin sur un octet, le plus souvent sous la forme d&amp;#039;un tableau&lt;br /&gt;
* &amp;#039;wval[32]&amp;#039; : Valeur de la pin sur un entier de 32 bits, le plus souvent sous la forme d&amp;#039;un tableau&lt;br /&gt;
&lt;br /&gt;
== Utilisation : Interruptions ==&lt;br /&gt;
 int set_gpio_callback(void (*callback) (uint32_t), const struct pio* gpio, uint8_t sense);&lt;br /&gt;
 void remove_gpio_callback(const struct pio* gpio);&lt;br /&gt;
 void remove_gpio_callback(unsigned int irq);&lt;br /&gt;
&lt;br /&gt;
La fonction set_gpio_callback() sert à enregistrer une routine (paramètre &amp;#039;callback&amp;#039;) qui sera appelée lorsque l&amp;#039;événement &amp;#039;sense&amp;#039; sur la GPIO &amp;#039;gpio&amp;#039; générera une interruption.&amp;lt;br /&amp;gt;&lt;br /&gt;
La configuration de le GPIO correspondante en entrée et l&amp;#039;enregistrement et la configuration de l&amp;#039;interruption sont faits par la fonction set_gpio_callback().&amp;lt;br /&amp;gt;&lt;br /&gt;
Le fichier d&amp;#039;entête &amp;quot;drivers/gpio.h&amp;quot; définit une énumération d&amp;#039;événements et d&amp;#039;états pouvant déclencher une interruption.&lt;br /&gt;
 EDGES_BOTH   /* Fronts montants et descendants */&lt;br /&gt;
 EDGE_FALLING  /* Fronts descendants */&lt;br /&gt;
 EDGE_RISING   /* Front montants */&lt;br /&gt;
 LEVEL_HIGH  /* Niveau haut */&lt;br /&gt;
 LEVEL_LOW   /* Niveau bas */&lt;br /&gt;
Note : un &amp;quot;front&amp;quot; est un changement d&amp;#039;état d&amp;#039;une entrée. Un front montant est donc le passage de l&amp;#039;entrée du niveau logique &amp;quot;0&amp;quot; au niveau logique &amp;quot;1&amp;quot;.&amp;lt;br /&amp;gt;&lt;br /&gt;
Deux types de valeurs de retour sont possibles pour la fonction set_gpio_callback() en fonction du micro-contrôleur et du fonctionnement des interruptions GPIO pour ce micro-contrôleur (voir les spécificités par micro-contrôleur ci-dessous) :&lt;br /&gt;
* Dans le cas de l&amp;#039;enregistrement par GPIO, la valeur de retour est un code d&amp;#039;erreur (valeur négative en cas d&amp;#039;erreur, ou 0 si tout c&amp;#039;est bien déroulé).&lt;br /&gt;
* Pour l&amp;#039;enregistrement par numéro d&amp;#039;interruption, la valeur de retour est soit un code d&amp;#039;erreur (valeur négative), soit le numéro de l&amp;#039;interruption allouée à cette GPIO (valeur supérieure ou égale à 0).&lt;br /&gt;
&lt;br /&gt;
La fonction remove_gpio_callback() sert à désactiver une interruption précédemment enregistrée par la fonction set_gpio_callback().&amp;lt;br /&amp;gt;&lt;br /&gt;
Selon le type de fonctionnement de l&amp;#039;enregistrement des interruptions (par GPIO ou par numéro d&amp;#039;interruption) le paramètre est soit la GPIO utilisée pour enregistrer l&amp;#039;interruption, soit le numéro d&amp;#039;interruption alloué par la fonction set_gpio_callback().&amp;lt;br /&amp;gt;&lt;br /&gt;
Se référer à la section &amp;quot;Spécificités par micro-contrôleur&amp;quot; ci-dessous pour déterminer le type du paramètre pour le micro-contrôleur utilisé.&lt;br /&gt;
&lt;br /&gt;
== Spécificités par micro-contrôleur ==&lt;br /&gt;
=== LPC82x ===&lt;br /&gt;
* Nombre de ports : 1&lt;br /&gt;
* Nombre de pins sur port 0 : &lt;br /&gt;
* Fonctionnement des interruptions :&lt;br /&gt;
: Enregistrement par numéro d&amp;#039;interruption.&lt;br /&gt;
: 8 interruptions individuelles disponibles.&lt;br /&gt;
: N&amp;#039;importe quelle pin peut être reliée à n&amp;#039;importe quelles interruption.&lt;br /&gt;
: 2 interruptions &amp;quot;groupées&amp;quot; (pattern match).&lt;br /&gt;
&lt;br /&gt;
=== LPC11A04 ===&lt;br /&gt;
&lt;br /&gt;
=== LPC122x ===&lt;br /&gt;
* Nombre de ports : 3&lt;br /&gt;
* Nombre de pins sur port 0 : 32&lt;br /&gt;
* Nombre de pins sur port 1 : 7&lt;br /&gt;
* Nombre de pins sur port 2 : 16 (Uniquement présentes sur les boîtiers avec 64 pins)&lt;br /&gt;
* Fonctionnement des interruptions :&lt;br /&gt;
: Enregistrement par GPIO (struct pio).&lt;br /&gt;
: Une interruption par port.&lt;br /&gt;
: Pas de limitation du nombre de pins pouvant être configurées pour générer des interruptions.&lt;br /&gt;
&lt;br /&gt;
=== LPC176x ===&lt;/div&gt;</summary>
		<author><name>Nathael</name></author>
	</entry>
</feed>