<?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%2FTimers</id>
	<title>Technique/Logiciel/API/Use/Drivers/Timers - 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%2FTimers"/>
	<link rel="alternate" type="text/html" href="https://wikifr.techno-innov.fr/index.php?title=Technique/Logiciel/API/Use/Drivers/Timers&amp;action=history"/>
	<updated>2026-04-04T04:03:18Z</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/Timers&amp;diff=47&amp;oldid=prev</id>
		<title>Nathael : Page créée avec « {{DISPLAYTITLE:Interface logicielle (API) - Timers, Compteurs, PWM}}  == Présentation ==  #include &quot;drivers/timers.h&quot;  L&#039;implémentation du support des timers a été dé... »</title>
		<link rel="alternate" type="text/html" href="https://wikifr.techno-innov.fr/index.php?title=Technique/Logiciel/API/Use/Drivers/Timers&amp;diff=47&amp;oldid=prev"/>
		<updated>2020-09-02T03:52:09Z</updated>

		<summary type="html">&lt;p&gt;Page créée avec « {{DISPLAYTITLE:Interface logicielle (API) - Timers, Compteurs, PWM}}  == Présentation ==  #include &amp;quot;drivers/timers.h&amp;quot;  L&amp;#039;implémentation du support des timers a été dé... »&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nouvelle page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{DISPLAYTITLE:Interface logicielle (API) - Timers, Compteurs, PWM}}&lt;br /&gt;
&lt;br /&gt;
== Présentation ==&lt;br /&gt;
 #include &amp;quot;drivers/timers.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
L&amp;#039;implémentation du support des timers a été découpée en deux parties pour en simplifier l&amp;#039;utilisation : une partie commune à tous les types de timers, qui représente l&amp;#039;interface d&amp;#039;utilisation des timers dans cette API, et une partie spécifique à chaque type de timer, abstraite par cette API, et dont l&amp;#039;utilisateur n&amp;#039;a pas besoin de se préoccuper s&amp;#039;il n&amp;#039;a pas de contraintes extrêmement précises et spécifique au type de timer présent sur le micro-contrôleur. (Dans le cas contraire il pourra s&amp;#039;inspirer du code spécifique comme base pour son implémentation).&lt;br /&gt;
&lt;br /&gt;
Le fichier d&amp;#039;entête &amp;quot;drivers/timers.h&amp;quot; définit le nombre de timers présents, et le nombre maximum de canaux (channels) disponibles, ainsi que les noms des timers disponibles (en fait un numéro).&lt;br /&gt;
&lt;br /&gt;
 #define NUM_TIMERS&lt;br /&gt;
 #define MAX_CHANNELS&lt;br /&gt;
 &lt;br /&gt;
 /* Timer numbers to be used for functions from this driver. */&lt;br /&gt;
 enum lpc_timers {&lt;br /&gt;
    [....]&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
les fichiers d&amp;#039;entête spécifiques à chaque type de timer définissent d&amp;#039;autres valeurs spécifiques, et sont inclus directement par le fichier d&amp;#039;entête &amp;quot;drivers/timers.h&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Le premier paramètre de toutes les fonctions relatives à l&amp;#039;utilisation des timers est toujours ce nom de timer (&amp;#039;timer_num&amp;#039;). Voir la sous-section &amp;quot;Spécificités liées aux différents micro-contrôleurs&amp;quot; ci-dessous pour les nom des timers présents pour chaque micro-contrôleur.&lt;br /&gt;
&lt;br /&gt;
Avant toute utilisation, chaque timer doit être initialisé et configuré. Il peut ensuite être démarré, arrêté, mis en pause, ou remis à zéro à l&amp;#039;aide des fonction correspondantes.&lt;br /&gt;
&lt;br /&gt;
Toutes les fonctions qui renvoient un entier renvoient 0 en cas de succès, ou une valeur négative correspondant à un code d&amp;#039;erreur en cas d&amp;#039;erreur. Voir [[Technique/Logiciel/API/Use/Libs#errno.h|la liste des codes d&amp;#039;erreur supportés]] dans le fichier d&amp;#039;entête &amp;quot;lib/errno.h&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Initialisation ==&lt;br /&gt;
 int timer_on(uint8_t timer_num, uint32_t clkrate, void (*callback)(uint32_t));&lt;br /&gt;
 int timer_off(uint8_t timer_num);&lt;br /&gt;
&lt;br /&gt;
Avant toute utilisation ou configuration un timer doit être initialisé avec la fonction timer_on().&amp;lt;br /&amp;gt;&lt;br /&gt;
Comme pour toutes les autres fonctions, le premier paramètre est le nom du timer (numéro compris entre 0 et NUM_TIMERS).&amp;lt;br /&amp;gt;&lt;br /&gt;
Le paramètre &amp;#039;clkrate&amp;#039; est utilisé pour configurer le &amp;quot;prescaler&amp;quot; et ainsi diviser l&amp;#039;horloge principale pour que le timer compte moins vite. Si &amp;#039;clkrate&amp;#039; vaut 0 le prescaler n&amp;#039;est pas utilisé. Il est aussi possible de spécifier une valeur spécifique pour le prescaler lors de la configuration en mode &amp;quot;compteur timer&amp;quot;.&amp;lt;br /&amp;gt;&lt;br /&gt;
Le paramètre &amp;#039;callback&amp;#039; permet d&amp;#039;enregistrer un callback pour ce timer, qui sera appelé si un événement du timer (match ou capture) est configuré pour générer une interruption.&lt;br /&gt;
&lt;br /&gt;
La fonction timer_off() désactive le timer sélectionné soit en désactivant l&amp;#039;horloge associée, soit en coupant son alimentation, selon le fonctionnement interne du micro-contrôleur.&lt;br /&gt;
&lt;br /&gt;
== Configuration initiale ==&lt;br /&gt;
La configuration des timers se fait par l&amp;#039;une des fonctions timer_pwm_config() ou timer_counter_config() selon le mode de fonctionnement désiré.&amp;lt;br&amp;gt;&lt;br /&gt;
Chaque mode de fonctionnement dispose d&amp;#039;une structure spécifique pour la configuration du timer.&lt;br /&gt;
&lt;br /&gt;
=== Configuration en mode &amp;quot;Timer / Compteur&amp;quot; ===&lt;br /&gt;
 int timer_counter_config(uint8_t timer_num, const struct lpc_tc_config* conf);&lt;br /&gt;
 &lt;br /&gt;
 struct lpc_tc_config&lt;br /&gt;
    uint16_t mode;&lt;br /&gt;
    uint32_t prescale_val;&lt;br /&gt;
    uint8_t count_control;&lt;br /&gt;
    uint8_t count_chan;&lt;br /&gt;
    uint8_t reset_on_cap;&lt;br /&gt;
    uint8_t match_control[NUM_CHANS];&lt;br /&gt;
    uint32_t match[NUM_CHANS];&lt;br /&gt;
    uint8_t ext_match_config[NUM_CHANS];&lt;br /&gt;
    uint8_t cap_control[NUM_CHANS];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
La configuration en mode compteur ou timer permet d&amp;#039;accéder aux fonctionnalités &amp;quot;match&amp;quot; et &amp;quot;capture&amp;quot; des timers. L&amp;#039;incrémentation du compteur peut se faire soit par l&amp;#039;horloge interne, soit par l&amp;#039;une des entrées &amp;quot;capture&amp;quot; du micro-contrôleur. Le fonctionnement précis du timer est configuré à l&amp;#039;aide de la structure &amp;quot;lpc_tc_config&amp;quot; passée par le paramètre &amp;#039;conf&amp;#039;. Les fonctions des champs de la structure &amp;quot;lpc_tc_config&amp;quot; sont détaillées ci-dessous.&amp;lt;br /&amp;gt;&lt;br /&gt;
les champs &amp;#039;match_control[]&amp;#039;, &amp;#039;match[]&amp;#039;, &amp;#039;ext_match_config[]&amp;#039; et &amp;#039;cap_control[]&amp;#039; sont des tableaux, avec une entrée pour chaque canal du timer. Le entrées correspondant aux canaux non utilisés sont laissées à 0.&lt;br /&gt;
&lt;br /&gt;
* Le champ &amp;#039;mode&amp;#039; permet de préciser le mode de fonctionnement désiré. Il s&amp;#039;agit d&amp;#039;un masque entre les valeurs suivantes :&lt;br /&gt;
: LPC_TIMER_MODE_TIMER ou LPC_TIMER_MODE_COUNTER&lt;br /&gt;
:: Une seule des deux valeurs possible&lt;br /&gt;
: LPC_TIMER_MODE_CAPTURE&lt;br /&gt;
:: Active les fonctionnalités de capture décrites dans le champ cap_control[]&lt;br /&gt;
: LPC_TIMER_MODE_MATCH&lt;br /&gt;
:: Active les fonctionnalités de &amp;quot;match&amp;quot; décrites dans les champs match_control[], match[] et ext_match_config[]&lt;br /&gt;
* Si il est non nul, le champ &amp;#039;prescale_val&amp;#039; permet de remplacer la valeur calculée lors de l&amp;#039;appel à timer_on(). Si &amp;#039;prescale_val&amp;#039; vaut 0 la valeur actuelle du &amp;quot;prescaler&amp;quot; est conservée.&lt;br /&gt;
* Le champ &amp;#039;count_control&amp;#039; définit quels fronts de l&amp;#039;entrée &amp;quot;CAP&amp;quot; sélectionnée par le champ &amp;#039;count_chan&amp;#039; incrémentent le compteur. Ce champ est ignoré en mode &amp;quot;timer&amp;quot;. Les valeurs possibles sont les suivantes :&lt;br /&gt;
: LPC_COUNTER_INC_ON_RISING&lt;br /&gt;
: LPC_COUNTER_INC_ON_FALLING&lt;br /&gt;
: LPC_COUNTER_INC_ON_BOTH&lt;br /&gt;
* Le champ &amp;#039;count_chan&amp;#039; définit quelle entrée &amp;quot;CAP&amp;quot; est utilisée pour incrémenter le compteur en mode &amp;quot;compteur&amp;quot;. Ce champ est ignoré en mode &amp;quot;timer&amp;quot;.&lt;br /&gt;
* Le champ &amp;#039;reset_on_cap&amp;#039; permet d&amp;#039;activer la fonctionnalité de ré-initialisation du compteur sur événement extérieur (&amp;quot;CAP&amp;quot;). Cette fonctionnalité simplifie la mesure de durée d&amp;#039;une impulsion. Ce champ doit contenir la valeur &amp;quot;LPC_COUNTER_CLEAR_ON_EVENT_EN&amp;quot; ajouté à l&amp;#039;une des valeurs &amp;quot;LPC_COUNTER_CLEAR_ON_***&amp;quot; (*** est à remplacer par CHAN0_RISE, CHAN0_FALL, CAHN1_RISE, ..., CHAN3_FALL).&lt;br /&gt;
* Chaque valeur du tableau &amp;#039;match_control[]&amp;#039; est une combinaison des valeurs suivantes servant à configurer le fonctionnement &amp;quot;interne&amp;quot; du timer lors des événements &amp;quot;match&amp;quot; :&lt;br /&gt;
: LPC_TIMER_INTERRUPT_ON_MATCH&lt;br /&gt;
:: Une interruption est générée quand le compteur atteins la valeur &amp;quot;match&amp;quot; du canal correspondant.&lt;br /&gt;
: LPC_TIMER_RESET_ON_MATCH&lt;br /&gt;
:: Le compteur est remis à 0 quand le compteur atteins la valeur &amp;quot;match&amp;quot; du canal correspondant.&lt;br /&gt;
: LPC_TIMER_STOP_ON_MATCH&lt;br /&gt;
:: Le compteur est arrêté quand le compteur atteins la valeur &amp;quot;match&amp;quot; du canal correspondant.&lt;br /&gt;
: LPC_TIMER_INT_RESET_AND_STOP_ON_MATCH&lt;br /&gt;
:: Combinaison des trois valeurs précédentes.&lt;br /&gt;
* Le tableau &amp;#039;match[]&amp;#039; contient les valeurs à placer dans les registres &amp;quot;match&amp;quot; correspondants pour permettre le déclenchement d&amp;#039;événements lorsque le compteur du timer atteins la valeur correspondante.&lt;br /&gt;
* Les valeurs du tableau &amp;#039;ext_match_config[]&amp;#039; servent à définir le comportement &amp;quot;extérieur&amp;quot; du timer lors des événements &amp;quot;match&amp;quot;. Il s&amp;#039;agit d&amp;#039;une des valeurs suivantes:&lt;br /&gt;
: LPC_TIMER_NOTHING_ON_MATCH&lt;br /&gt;
: LPC_TIMER_CLEAR_ON_MATCH&lt;br /&gt;
: LPC_TIMER_SET_ON_MATCH&lt;br /&gt;
: LPC_TIMER_TOGGLE_ON_MATCH&lt;br /&gt;
* Les valeurs du tableau &amp;#039;cap_control[]&amp;#039; servent à définir les événements déclenchés par le changement d&amp;#039;état le l&amp;#039;entrée &amp;quot;capture&amp;quot; correspondante. Il s&amp;#039;agit d&amp;#039;une combinaison des valeurs suivantes:&lt;br /&gt;
: LPC_TIMER_CAP_ON_RISING_EDGE&lt;br /&gt;
:: La valeur actuelle du compteur est copiée dans le registre &amp;quot;capture&amp;quot; du canal correspondant lors d&amp;#039;un front montant.&lt;br /&gt;
: LPC_TIMER_CAP_ON_FALLING_EDGE&lt;br /&gt;
:: La valeur actuelle du compteur est copiée dans le registre &amp;quot;capture&amp;quot; du canal correspondant lors d&amp;#039;un front descendant.&lt;br /&gt;
: LPC_TIMER_INTERRUPT_ON_CAPTURE&lt;br /&gt;
:: Une interruption est générée lorsque le registre capture correspondant est chargé avec la valeur actuelle du compteur.&lt;br /&gt;
&lt;br /&gt;
Note :&amp;lt;br /&amp;gt;&lt;br /&gt;
Les entrées &amp;quot;capture&amp;quot; et les sorties &amp;quot;match&amp;quot; doivent être configurées à l&amp;#039;aide des fonctions pio_config() ou set_pins() ([[Technique/Logiciel/API/Use/Core/PIO|Voir le chapitre sur la configuration des ports d&amp;#039;entrée/sortie]]).&lt;br /&gt;
&lt;br /&gt;
=== Configuration en mode PWM (Pulse Width Modulation) ===&lt;br /&gt;
 int timer_pwm_config(uint8_t timer_num, const struct lpc_timer_pwm_config* pwm_conf);&lt;br /&gt;
 &lt;br /&gt;
 struct lpc_timer_pwm_config {&lt;br /&gt;
    uint8_t nb_channels;&lt;br /&gt;
    uint8_t period_chan;&lt;br /&gt;
    uint32_t period;&lt;br /&gt;
    uint8_t outputs[MAX_CHANNELS];&lt;br /&gt;
    uint32_t match_values[MAX_CHANNELS];&lt;br /&gt;
    uint32_t outputs_initial_state;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
La configuration en mode PWM permet d&amp;#039;accéder aux fonctionnalités &amp;quot;Pulse Width Modulation&amp;quot; des timers. L&amp;#039;incrémentation du compteur est obligatoirement faire par l&amp;#039;horloge interne (avec utilisation ou non du prescaler quand il est disponible).&amp;lt;br /&amp;gt;&lt;br /&gt;
Le fonctionnement précis du timer en mode PWM est configuré à l&amp;#039;aide de la structure &amp;quot;lpc_pwm_config&amp;quot; passée par le paramètre &amp;#039;conf&amp;#039;. Les fonctions des champs de la structure &amp;quot;lpc_pwm_config&amp;quot; sont détaillées ci-dessous.&amp;lt;br /&amp;gt;&lt;br /&gt;
les champs &amp;#039;outputs[]&amp;#039; et &amp;#039;match_values[]&amp;#039; sont des tableaux.&lt;br /&gt;
&lt;br /&gt;
* Le champ &amp;#039;nb_channels&amp;#039; définit combien de sorties PWM sont utilisées.&lt;br /&gt;
* Le champ &amp;#039;period_chan&amp;#039; définit quel canal est utilisé pour générer la période. Certains micro-contrôleurs ignorent ce champ.&lt;br /&gt;
* Le champ &amp;#039;period&amp;#039; définit la période du cycle PWM, en nombre de cycles d&amp;#039;horloge du timer.&lt;br /&gt;
* Le tableau &amp;#039;outputs[]&amp;#039; contient les numéros des sorties correspondantes aux valeurs présentes dans le tableau &amp;#039;match_values[]&amp;#039;&lt;br /&gt;
* Le tableau &amp;#039;match_values[]&amp;#039; contient les valeurs permettant de contrôler le rapport cyclique des sorties PWM. Chaque valeur est reliée à la sortie définie dans le tableau outputs[] pour l&amp;#039;indice correspondant. Ces valeurs doivent être inférieures à la valeur du champ &amp;#039;périod&amp;#039;. Il s&amp;#039;agit de la valeur du compteur à laquelle la sortie changera d&amp;#039;état.&lt;br /&gt;
* Le champ &amp;#039;outputs_initial_state&amp;#039; permet de définir l&amp;#039;état initial des sorties PWM lorsque le micro-contrôleur le permet Chaque bit correspond à l&amp;#039;état initial de la sortie correspondante (bit 0 pour la sortie 0, bit 1 pour la sortie 1, ....). L&amp;#039;ordre correspond au numéro des sorties et non pas à l&amp;#039;ordre dans le tableau &amp;#039;outputs[]&amp;#039;. L&amp;#039;état initial des sorties inutilisées est sans importance.&lt;br /&gt;
&lt;br /&gt;
Note :&amp;lt;br /&amp;gt;&lt;br /&gt;
Les sorties &amp;quot;match&amp;quot; doivent être configurées à l&amp;#039;aide des fonctions pio_config() ou set_pins() ([[Technique/Logiciel/API/Use/Core/PIO|Voir le chapitre sur la configuration des ports d&amp;#039;entrée/sortie]]).&lt;br /&gt;
&lt;br /&gt;
== Utilisation ==&lt;br /&gt;
=== Contrôle du compteur ===&lt;br /&gt;
 void timer_start(uint8_t timer_num);&lt;br /&gt;
 void timer_continue(uint8_t timer_num);&lt;br /&gt;
 void timer_pause(uint8_t timer_num);&lt;br /&gt;
 void timer_stop(uint8_t timer_num);&lt;br /&gt;
 void timer_halt(uint8_t timer_num);&lt;br /&gt;
 void timer_restart(uint8_t timer_num);&lt;br /&gt;
&lt;br /&gt;
Ces fonctions permettent de contrôler le compteur correspondant au timer sélectionné.&amp;lt;br /&amp;gt;&lt;br /&gt;
* timer_start() permet de démarrer un timer qui n&amp;#039;a pas encore compté ou a été stoppé ou de reprendre le compte sans remise à zéro si le timer a été mis en pause.&lt;br /&gt;
* timer_continue() permet de reprendre le compte sans remise à zéro après que le timer ait été mis en pause.&lt;br /&gt;
* timer_pause() permet de mettre en pause un timer sans changer la valeur du compteur.&lt;br /&gt;
* timer_stop() et timer_halt() permettent d&amp;#039;arrêter un compteur, en remettant la valeur du compteur à 0.&lt;br /&gt;
* timer_restart() permet de reprendre le compte à zéro sans interrompre le compte. Si le timer était en pause, il est redémarré.&lt;br /&gt;
&lt;br /&gt;
=== Lecture des valeurs actuelles ===&lt;br /&gt;
 int timer_get_counter_val(uint8_t timer_num, uint32_t* val);&lt;br /&gt;
 int timer_get_capture_val(uint8_t timer_num, uint8_t channel, uint32_t* val);&lt;br /&gt;
&lt;br /&gt;
Ces fonctions permettent de récupérer la valeur actuelle du compteur pour timer_get_counter_val() ou de la dernière capture effectuée sur le canal &amp;#039;channel&amp;#039; pour timer_get_capture_val(). La valeur demandée est placée à l&amp;#039;adresse pointée par &amp;#039;val&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
=== Changement des valeurs &amp;quot;match&amp;quot; ===&lt;br /&gt;
 int timer_set_match(uint8_t timer_num, uint8_t channel, uint32_t val);&lt;br /&gt;
&lt;br /&gt;
La fonction timer_set_match() permet de remplacer la valeur du registre &amp;quot;match&amp;quot; par la valeur &amp;#039;val&amp;#039; pour le canal &amp;#039;channel&amp;#039;.&amp;lt;br /&amp;gt;&lt;br /&gt;
cette fonction permet notamment de changer la période ou le rapport cyclique d&amp;#039;une sortie lors du fonctionnement en PWM.&lt;br /&gt;
&lt;br /&gt;
== Spécificités liées aux différents micro-contrôleurs ==&lt;br /&gt;
=== LPC82x ===&lt;br /&gt;
* Nombre de timers: 4&lt;br /&gt;
* Modes de fonctionnement :&lt;br /&gt;
* Nom des timers :&lt;br /&gt;
: LPC_SCT&lt;br /&gt;
: LPC_SCT16_T0&lt;br /&gt;
: LPC_SCT16_T1&lt;br /&gt;
: LPC_MRT&lt;br /&gt;
* État initial des sorties PWM : configurable par sortie.&lt;br /&gt;
* Paramètre &amp;#039;period_chan&amp;#039; ignoré. Aucun canal de sortie utilisé pour la gestion de la période.&lt;br /&gt;
&lt;br /&gt;
=== LPC11A04 ===&lt;br /&gt;
* Nombre de timers :&lt;br /&gt;
* Modes de fonctionnement :&lt;br /&gt;
&lt;br /&gt;
=== LPC122x ===&lt;br /&gt;
* Nombre de timers : 4&lt;br /&gt;
* Modes de fonctionnement : Timer/Counter et PWM&lt;br /&gt;
* Nom des timers :&lt;br /&gt;
: LPC_TIMER_16B0&lt;br /&gt;
: LPC_TIMER_16B1&lt;br /&gt;
: LPC_TIMER_32B0&lt;br /&gt;
: LPC_TIMER_32B1&lt;br /&gt;
* État initial des sorties PWM : 0 (état bas).&lt;br /&gt;
&lt;br /&gt;
=== LPC176x ===&lt;br /&gt;
* Nombre de timers :&lt;br /&gt;
* Modes de fonctionnement :&lt;/div&gt;</summary>
		<author><name>Nathael</name></author>
	</entry>
</feed>