<?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%2FRegisters</id>
	<title>Technique/Logiciel/API/Use/Core/Registers - 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%2FRegisters"/>
	<link rel="alternate" type="text/html" href="https://wikifr.techno-innov.fr/index.php?title=Technique/Logiciel/API/Use/Core/Registers&amp;action=history"/>
	<updated>2026-04-05T11:06:05Z</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/Registers&amp;diff=32&amp;oldid=prev</id>
		<title>Nathael : Page créée avec « {{DISPLAYTITLE:Interface logicielle (API) - Cœur (Cortex-M*) - Registres}}  == Registres de configuration == === Principe === Le processeur du micro-contrôleur ne voit q... »</title>
		<link rel="alternate" type="text/html" href="https://wikifr.techno-innov.fr/index.php?title=Technique/Logiciel/API/Use/Core/Registers&amp;diff=32&amp;oldid=prev"/>
		<updated>2020-09-02T03:35:11Z</updated>

		<summary type="html">&lt;p&gt;Page créée avec « {{DISPLAYTITLE:Interface logicielle (API) - Cœur (Cortex-M*) - Registres}}  == Registres de configuration == === Principe === Le processeur du micro-contrôleur ne voit q... »&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*) - Registres}}&lt;br /&gt;
&lt;br /&gt;
== Registres de configuration ==&lt;br /&gt;
=== Principe ===&lt;br /&gt;
Le processeur du micro-contrôleur ne voit que de la mémoire autour de lui. Il n&amp;#039;a pas accès directement aux signaux électriques. Pour accéder aux fonctions spéciales comme l&amp;#039;état électrique d&amp;#039;une sortie le processeur doit donc modifier des données dans une zone mémoire spécifique, dédiée à cette sortie, que l&amp;#039;on appelle un registre. &lt;br /&gt;
&lt;br /&gt;
La configuration de toutes les fonctions du micro-contrôleur se fait par le biais de ces registres.&lt;br /&gt;
&lt;br /&gt;
L&amp;#039;ensemble des registres est organisé en blocs, regroupés par fonctions avec une structure précise, décrite dans la documentation du micro-contrôleur dans la description des registres de chaque bloc fonctionnel.&lt;br /&gt;
&lt;br /&gt;
=== Structures ===&lt;br /&gt;
Ces descriptions ont été traduites en C sous forme de structures, chaque champ correspondant à un registre différent. Chaque structure est associée à une adresse de base (ou plusieurs lorsque plusieurs modules identiques sont présents) qui correspond à l&amp;#039;adresse du premier registre de la structure.&lt;br /&gt;
&lt;br /&gt;
Cette façon de faire est très différente de celle habituellement utilisée pour décrire les adresses des registres des micro-contrôleurs à base de multiples &amp;quot;&amp;lt;tt&amp;gt;#define&amp;lt;/tt&amp;gt;&amp;quot;, qui rend le code illisible et montre une grande méconnaissance du langage C.&amp;lt;br /&amp;gt;&lt;br /&gt;
L&amp;#039;utilisation de structures correspond à la méthode utilisée pour le noyau Linux, et est beaucoup plus logique pour décrire le contenu d&amp;#039;une structure. Cela permet aussi de définir la taille de chaque champ, ce qui n&amp;#039;est pas possible à l&amp;#039;aide de &amp;quot;&amp;lt;tt&amp;gt;#define&amp;lt;/tt&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Une grande partie des structures correspondant aux blocs fonctionnels ont été réparties dans les drivers correspondant (voir les fichiers include/drivers/*.h) ainsi que dans les fichiers relatifs au fonctionnement du cœur du micro-contrôleur (voir les fichiers include/core/*.h)&lt;br /&gt;
&lt;br /&gt;
Chaque driver fourni une définition permettant la déclaration d&amp;#039;un pointeur vers la structure correspondant à ses registres, sous la forme suivante :&lt;br /&gt;
 #define LPC_SYS_CONFIG  ((struct lpc_sys_config *) LPC_SYSCON_BASE)&lt;br /&gt;
 #define LPC_IO_CONTROL  ((struct lpc_io_control *) LPC_IOCON_BASE)&lt;br /&gt;
&lt;br /&gt;
=== Adresses de base ===&lt;br /&gt;
 #include &amp;quot;core/lpc_regs.h&amp;quot;&lt;br /&gt;
Les adresses de base des blocs sont définies dans le fichier &amp;quot;include/core/lpc_regs.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ce fichier n&amp;#039;est inclus que par les drivers ayant besoin de connaître l&amp;#039;adresse de base de leur structure.&lt;br /&gt;
&lt;br /&gt;
=== Accès ===&lt;br /&gt;
Lorsque vous devez accéder à un registre particulier, vous devez commencer par déclarer un pointeur vers la structure correspondant aux registres du bloc fonctionnel dont il fait partie.&amp;lt;br /&amp;gt;&lt;br /&gt;
Par exemple pour le registre correspondant à la sélection de l&amp;#039;horloge principale du micro-contrôleur, il s&amp;#039;agit d&amp;#039;un registres &amp;quot;système&amp;quot; présent dans la structure lpc_sys_config : &lt;br /&gt;
 struct lpc_sys_config* sys_config = LPC_SYS_CONFIG;&lt;br /&gt;
 &lt;br /&gt;
 sys_config-&amp;gt;main_clk_sel = LPC_MAIN_CLK_SRC_PLL_OUT;&lt;br /&gt;
Notez l&amp;#039;utilisation de la définition &amp;quot;&amp;lt;tt&amp;gt;LPC_MAIN_CLK_SRC_PLL_OUT&amp;lt;/tt&amp;gt;&amp;quot; pour définir la valeur écrite dans ce registre, qui est beaucoup plus lisible que &amp;quot;0x00000003&amp;quot;, qui n&amp;#039;a aucun sens lors de la lecture du code.&lt;br /&gt;
&lt;br /&gt;
De nombreuses valeurs sont ainsi définies dans les fichiers d&amp;#039;entête contenant les définitions des structures des registres des différents blocs fonctionnels. Certaines définitions peuvent manquer, n&amp;#039;hésitez pas à les compléter en fonction de vos besoins.&lt;br /&gt;
&lt;br /&gt;
Lorsqu&amp;#039;un registre regroupe plusieurs champs, ces définitions peuvent être regroupées pour permettre la configuration du registre en un accès unique, par exemple pour le registre sys_AHB_clk_ctrl de la structure lpc_sys_config :&lt;br /&gt;
 sys_config-&amp;gt;sys_AHB_clk_ctrl = (LPC_SYS_ABH_CLK_CTRL_MEM_ALL | LPC_SYS_ABH_CLK_CTRL_UART0);&lt;br /&gt;
Attention, l&amp;#039;exemple ci-dessus écrase l&amp;#039;ancienne valeur du registre.&amp;lt;br /&amp;gt;&lt;br /&gt;
Lorsque vous voulez seulement ajouter une valeur (définir un seul des champs présents dans le registre) sans modifier les autres, vous pouvez utiliser une des notation suivantes :&lt;br /&gt;
* Positionner un bit unique :&lt;br /&gt;
 sys_config-&amp;gt;sys_AHB_clk_ctrl |= LPC_SYS_ABH_CLK_CTRL_ADC;&lt;br /&gt;
* Enlever un bit unique :&lt;br /&gt;
 sys_config-&amp;gt;sys_AHB_clk_ctrl &amp;amp;= ~(LPC_SYS_ABH_CLK_CTRL_UART0);&lt;br /&gt;
* Modifier un groupe de bits :&lt;br /&gt;
 sys_config-&amp;gt;sys_AHB_clk_ctrl &amp;amp;= ~(LPC_SYS_ABH_CLK_CTRL_MEM_ALL); /* Mise à 0 des bits correspondant à MEM_ALL : 0x0000001F */&lt;br /&gt;
 sys_config-&amp;gt;sys_AHB_clk_ctrl |= (LPC_SYS_ABH_CLK_CTRL_SYSTEM | LPC_SYS_ABH_CLK_CTRL_RAM)&lt;br /&gt;
Les fichiers d&amp;#039;entête définissent parfois des masques permettant la remise à 0 d&amp;#039;un ensemble de bits correspondant à la configuration d&amp;#039;une valeur représentée sur plusieurs bits. Dans la majorité des cas ces valeurs ont une définition dont le nom se termine par &amp;quot;_MASK&amp;quot;, même si ce n&amp;#039;est pas le cas dans l&amp;#039;exemple ci-dessus.&lt;br /&gt;
&lt;br /&gt;
== Registres spéciaux ==&lt;br /&gt;
 #include &amp;quot;core/lpc_core.h&amp;quot;&lt;br /&gt;
Certains registres de fonctionnement du micro-contrôleur ne sont pas accessibles directement par une adresse. Le cœur du micro-contrôleur dispose d&amp;#039;instructions spécifiques pour lire ou modifier ces registres.&lt;br /&gt;
&lt;br /&gt;
Il s&amp;#039;agit des registres suivants:&lt;br /&gt;
* APSR (Application Program Status Register)&lt;br /&gt;
* IPSR (Interrupt Program Status Register)&lt;br /&gt;
* CONTROL (Control)&lt;br /&gt;
* PSP (Process Stack Pointer)&lt;br /&gt;
* MSP (Main Stack Pointer)&lt;br /&gt;
* PRIMASK (Priority Mask)&lt;br /&gt;
* BASEPRI_MAX / BASEPRI (Base Priority)&lt;br /&gt;
* FAULTMASK (Fault Mask)&lt;br /&gt;
&lt;br /&gt;
L&amp;#039;accès à ces registres se fait par des instructions spécifiques qui ne font pas partie du langage C. Voir la page [[Technique/Logiciel/API/Use/Core/Instruction_Set|Jeu d&amp;#039;instructions et instructions spéciales]] pour plus d&amp;#039;informations.&lt;/div&gt;</summary>
		<author><name>Nathael</name></author>
	</entry>
</feed>