L'architecture PIC est caractérisée par ses multiples attributs :
Espaces de code et de données séparés (architecture Harvard).
Un petit nombre d'instructions de longueur fixe.
La plupart des instructions s'exécutent en un seul cycle (2 cycles d'horloge, ou 4 dans les modèles 8 bits), avec un cycle de délai sur les branchements et les sauts.
Un accumulateur (W0), dont l'utilisation (comme opérande source) est implicite (non codée dans l'opcode).
Tous les emplacements RAM fonctionnent comme des registres, à la fois comme source et/ou destination des opérations mathématiques et autres. [6]
Une pile matérielle pour stocker les adresses de retour.
Une petite quantité d'espace de données adressable (32, 128 ou 256 octets selon la famille), étendue par banc de mémoire.
L'espace de données mappe les registres CPU, les ports et les périphériques.
Les indicateurs d'état de l'UAL sont mappés dans l'espace de données.
Le compteur de programme est également mappé dans l'espace de données et accessible en écriture (utilisé pour les sauts indirects).
Il n'y a pas de distinction entre l'espace mémoire et l'espace registre, car la RAM sert à la fois de mémoire et de registres, et la RAM est généralement appelée fichier de registres ou simplement registres.
Espace de données (RAM) : les PIC ont un ensemble de registres qui servent de RAM à usage général. Les registres de contrôle spéciaux pour les ressources matérielles sur puce sont également mappés dans l'espace de données. L'adressabilité de la mémoire varie selon la série de dispositifs, et tous les PIC ont un mécanisme de banc pour étendre l'adressage à une mémoire supplémentaire. Les séries plus récentes disposent d'instructions de déplacement qui peuvent couvrir tout l'espace adressable, indépendamment du banc sélectionné. Dans les dispositifs plus anciens, tout déplacement de registre devait passer par l'accumulateur.
Pour implémenter l'adressage indirect, on utilise un « registre de sélection de fichier » (FSR) et un « registre indirect » (INDF). Un numéro de registre est écrit dans le FSR, après quoi les lectures ou écritures sur INDF se feront en réalité sur le registre pointé par FSR. Les dispositifs plus récents ont étendu ce concept avec des incréments/décréments pré et post pour une plus grande efficacité dans l'accès aux données stockées séquentiellement. Cela permet également de traiter FSR presque comme un pointeur de pile (SP).
La mémoire de données externe n'est pas directement adressable, sauf dans certains dispositifs PIC18 à haut nombre de broches.
Espace de code : l'espace de code est généralement implémenté en ROM, EPROM ou flash ROM. En général, la mémoire de code externe n'est pas directement adressable en raison de l'absence d'interface mémoire externe. Les exceptions sont les PIC17 et certains PIC18 à haut nombre de broches. [7]
Taille de mot : tous les PIC manipulent (et adressent) les données en blocs de 8 bits. Cependant, l'unité d'adressabilité de l'espace de code n'est généralement pas la même que celle de l'espace de données. Par exemple, les PIC des familles baseline (PIC12) et mid-range (PIC16) ont une mémoire programme adressable dans la même taille de mot que la largeur d'instruction, soit 12 ou 14 bits respectivement. En revanche, dans la série PIC18, la mémoire programme est adressée en incréments de 8 bits (octets), ce qui diffère de la largeur d'instruction de 16 bits.
Pour être clair, la capacité de la mémoire programme est généralement indiquée en nombre d'instructions (d'un seul mot), plutôt qu'en octets.
Piles : les PIC ont une pile d'appel matérielle, utilisée pour sauvegarder les adresses de retour. La pile matérielle n'est pas accessible par logiciel sur les dispositifs plus anciens, mais cela a changé avec la série 18.
Le support matériel pour une pile de paramètres à usage général était absent dans les premières séries, mais cela s'est considérablement amélioré avec la série 18, rendant l'architecture de la série 18 plus adaptée aux compilateurs de langage de haut niveau.
Jeu d'instructions : les instructions d'un PIC varient d'environ 35 instructions pour les PIC bas de gamme à plus de 80 instructions pour les PIC haut de gamme. Le jeu d'instructions comprend des instructions pour effectuer diverses opérations sur les registres directement, l'accumulateur et une constante littérale, ou l'accumulateur et un registre, ainsi que pour l'exécution conditionnelle et les branchements.
Certaines opérations, comme la définition et le test de bits, peuvent être effectuées sur n'importe quel registre numéroté, mais les opérations arithmétiques à deux opérandes impliquent toujours W (l'accumulateur), écrivant le résultat dans W ou dans l'autre registre opérande. Pour charger une constante, il faut la charger dans W avant de pouvoir la déplacer dans un autre registre. Sur les cœurs plus anciens, tous les déplacements de registres devaient passer par W, mais cela a changé sur les cœurs « haut de gamme ».
Les cœurs PIC ont des instructions de saut qui sont utilisées pour l'exécution conditionnelle et les branchements. Les instructions de saut sont « sauter si le bit est défini » et « sauter si le bit n'est pas défini ». Comme les cœurs antérieurs au PIC18 n'avaient que des instructions de branchement inconditionnel, les sauts conditionnels sont implémentés par un saut conditionnel (avec la condition opposée) suivi d'un branchement inconditionnel. Les sauts sont également utiles pour l'exécution conditionnelle de toute instruction unique suivante. Il est possible de sauter des instructions de saut. Par exemple, la séquence d'instructions « sauter si A ; sauter si B ; C » exécutera C si A est vrai ou si B est faux.
La série 18 a introduit des registres shadow qui sauvegardent plusieurs registres importants lors d'une interruption, fournissant un support matériel pour sauvegarder automatiquement l'état du processeur lors du traitement des interruptions.
En général, les instructions PIC se répartissent en 5 classes :
Opération sur le registre de travail (WREG) avec un opérande immédiat 8 bits (« littéral »). Par exemple, movlw (déplacer un littéral vers WREG), andlw (ET logique avec WREG). Une instruction particulière au PIC est retlw, charger une valeur immédiate dans WREG et revenir, utilisée avec des branchements calculés pour produire des tables de recherche.
Opération avec WREG et un registre indexé. Le résultat peut être écrit soit dans le registre de travail (par exemple addwf reg,w), soit dans le registre sélectionné (par exemple addwf reg,f).
Opérations sur les bits. Elles prennent un numéro de registre et un numéro de bit, et effectuent l'une des 4 actions : définir ou effacer un bit, tester et sauter sur défini/effacé. Ces dernières sont utilisées pour effectuer des branchements conditionnels. Les indicateurs d'état habituels de l'UAL sont disponibles dans un registre numéroté, ce qui permet des opérations telles que « brancher si retenue effacée ».
Transferts de contrôle. En dehors des instructions de saut mentionnées précédemment, il n'y en a que deux : goto et call.
Quelques instructions diverses à zéro opérande, comme le retour de sous-programme et sleep pour passer en mode basse consommation.
Performances : les décisions architecturales visent à maximiser le rapport vitesse/coût. L'architecture PIC a été parmi les premières conceptions CPU scalaires, et elle reste parmi les plus simples et les moins chères. L'architecture Harvard, dans laquelle les instructions et les données proviennent de sources séparées, simplifie grandement le timing et la conception des microcircuits, ce qui profite à la vitesse d'horloge, au prix et à la consommation d'énergie.
Le jeu d'instructions PIC est adapté à l'implémentation rapide de tables de recherche dans l'espace programme. Ces recherches prennent une instruction et deux cycles d'instruction. De nombreuses fonctions peuvent être modélisées de cette manière. L'optimisation est facilitée par l'espace programme relativement grand du PIC (par exemple 4096 × 14 bits sur le 16F690) et par la conception du jeu d'instructions, qui permet d'intégrer des constantes. Par exemple, la cible d'une instruction de branchement peut être indexée par W, et exécuter un « RETLW » qui fait ce que son nom indique : retourner avec un littéral dans W.
La latence d'interruption est constante à trois cycles d'instruction. Les interruptions externes doivent être synchronisées avec le cycle d'instruction de quatre horloges, sinon il peut y avoir une gigue d'un cycle d'instruction. Les interruptions internes sont déjà synchronisées. La latence d'interruption constante permet aux PIC d'atteindre des séquences de synchronisation à faible gigue pilotées par interruptions. Un exemple est un générateur d'impulsions de synchronisation vidéo. Cela n'est plus vrai dans les derniers modèles de PIC, car ils ont une latence d'interruption synchrone de trois ou quatre cycles.
Avantages : petit jeu d'instructions à apprendre, architecture RISC, oscillateur intégré avec vitesses sélectionnables, programmation et débogage dans le circuit faciles avec des unités PICKit disponibles pour moins de 50 $, microcontrôleurs peu coûteux, large gamme d'interfaces incluant I²C, SPI, USB, USART, A/D, comparateurs programmables, PWM, LIN, CAN, PSP et Ethernet [8], disponibilité de processeurs en boîtier DIL faciles à manipuler pour un usage amateur.
Limitations : un seul accumulateur, commutation de banc de registres nécessaire pour accéder à toute la RAM de nombreux dispositifs, opérations et registres non orthogonaux ; certaines instructions peuvent adresser la RAM et/ou des constantes immédiates, tandis que d'autres ne peuvent utiliser que l'accumulateur.
Les limitations de pile suivantes ont été résolues dans la série PIC18, mais s'appliquent toujours aux cœurs antérieurs :
La pile d'appel matérielle n'est pas adressable, donc la commutation de tâches préemptive ne peut pas être implémentée.
Les piles implémentées par logiciel ne sont pas efficaces, il est donc difficile de générer du code réentrant et de supporter des variables locales.
Avec une mémoire programme paginée, il y a deux tailles de page à prendre en compte : une pour CALL et GOTO, et une autre pour GOTO calculé (généralement utilisé pour les tables de recherche). Par exemple, sur PIC16, CALL et GOTO ont 11 bits d'adressage, donc la taille de page est de 2048 mots d'instruction. Pour les GOTO calculés, où l'on ajoute à PCL, la taille de page est de 256 mots d'instruction. Dans les deux cas, les bits d'adresse supérieurs sont fournis par le registre PCLATH. Ce registre doit être modifié à chaque transfert de contrôle entre les pages. PCLATH doit également être préservé par tout gestionnaire d'interruption. [9]
Développement de compilateurs : bien que plusieurs compilateurs commerciaux soient disponibles, en 2008, Microchip a publié ses propres compilateurs C, C18 et C30, pour les processeurs des séries 18F, 24F et 30/33F.
Le jeu d'instructions RISC facile à apprendre du langage assembleur PIC peut rendre le flux global difficile à comprendre. L'utilisation judicieuse de macros simples peut améliorer la lisibilité du langage assembleur PIC. Par exemple, l'assembleur Parallax PIC original (« SPASM ») a des macros qui cachent W et font ressembler le PIC à une machine à deux adresses. Il a des macros comme « mov b, a » (déplacer les données de l'adresse a vers l'adresse b) et « add b, a » (ajouter les données de l'adresse a à celles de l'adresse b). Il cache également les instructions de saut en fournissant des macros de branchement à trois opérandes comme « cjne a, b, dest » (comparer a et b et sauter à dest s'ils ne sont pas égaux).
Différences architecturales des cœurs de la famille : les puces PICmicro ont une architecture Harvard et les mots d'instruction ont des tailles inhabituelles. À l'origine, les instructions 12 bits comprenaient 5 bits d'adresse pour spécifier l'opérande mémoire et des destinations de branchement de 9 bits. Des révisions ultérieures ont ajouté des bits d'opcode, permettant des bits d'adresse supplémentaires.
Cœurs Baseline (12 bits) : ces dispositifs disposent d'une mémoire code de 12 bits de large, d'un fichier de registres de 32 octets et d'une pile d'appel de deux niveaux. Ils sont représentés par la série PIC10, ainsi que par certains PIC12 et PIC16. Les dispositifs baseline sont disponibles dans des boîtiers de 6 à 40 broches.
Généralement, les 7 à 9 premiers octets du fichier de registres sont des registres spéciaux, et les octets restants sont de la RAM à usage général. Les pointeurs sont implémentés à l'aide d'une paire de registres : après avoir écrit une adresse dans le FSR (registre de sélection de fichier), l'INDF (registre indirect) devient un alias du registre adressé. Si la RAM est bancarisée, le numéro de banc est sélectionné par les 3 bits de poids fort du FSR. Cela affecte les registres 16-31 ; les registres 0-15 sont globaux et non affectés par les bits de sélection de banc.
En raison de l'espace de registres très limité (5 bits), 4 registres rarement lus n'ont pas reçu d'adresse, mais ont été écrits par des instructions spéciales (OPTION et TRIS).
L'espace d'adressage ROM est de 512 mots (12 bits chacun), qui peut être étendu à 2048 mots par banc. Les instructions CALL et GOTO spécifient les 9 bits de poids faible de la nouvelle adresse code ; les bits de poids fort supplémentaires sont pris dans le registre d'état. Notez qu'une instruction CALL ne contient que 8 bits d'adresse et ne peut spécifier que des adresses dans la première moitié de chaque page de 512 mots.
Les tables de recherche sont implémentées à l'aide d'un GOTO calculé (affectation au registre PCL) vers une table d'instructions RETLW.
Le jeu d'instructions est le suivant. Les numéros de registres sont appelés « f », tandis que les constantes sont appelées « k ». Les numéros de bits (0-7) sont sélectionnés par « b ». Le bit « d » sélectionne la destination : 0 indique W, tandis que 1 indique que le résultat est réécrit dans le registre source f. Les indicateurs C et Z peuvent être définis en fonction du résultat ; sinon ils ne sont pas modifiés. Les instructions d'addition et de soustraction (mais pas de rotation) qui définissent C définissent également l'indicateur DC (retenue de chiffre), la retenue du bit 3 au bit 4, utile pour l'arithmétique BCD.
Jeu d'instructions PIC 12 bits 11 10 9 8 7 6 5 4 3 2 1 0 Mnémotechnique C? Z? Description
0 0 0 0 0 0 0 opcode Instructions diverses
0 0 0 0 0 0 0 0 0 0 0 0 NOP Aucune opération (MOVW 0,W)
0 0 0 0 0 0 0 0 0 0 1 0 OPTION Copie W dans le registre OPTION
0 0 0 0 0 0 0 0 0 0 1 1 SLEEP Passage en veille
0 0 0 0 0 0 0 0 0 1 0 0 CLRWDT Réinitialisation du chien de garde
0 0 0 0 0 0 0 0 0 1 f TRIS f Copie W dans le registre trois états (f = 1, 2 ou 3)
0 0 opcode d register Opérations ALU : dest ← OP(f,W)
0 0 0 0 0 0 1 f MOVWF f dest ← W
0 0 0 0 0 1 d f CLR f,d Z dest ← 0, généralement CLRW ou CLRF f
0 0 0 0 1 0 d f SUBWF f,d C Z dest ← f−W (dest ← f+~W+1)
0 0 0 0 1 1 d f DECF f,d Z dest ← f−1
0 0 0 1 0 0 d f IORWF f,d Z dest ← f | W, ou inclusif
0 0 0 1 0 1 d f ANDWF f,d Z dest ← f & W, et logique
0 0 0 1 1 0 d f XORWF f,d Z dest ← f ^ W, ou exclusif
0 0 0 1 1 1 d f ADDWF f,d C Z dest ← f+W
0 0 1 0 0 0 d f MOVF f,d Z dest ← f
0 0 1 0 0 1 d f COMF f,d Z dest ← ~f, complément bit à bit
0 0 1 0 1 0 d f INCF f,d Z dest ← f+1
0 0 1 0 1 1 d f DECFSZ f,d dest ← f−1, puis saut si zéro
0 0 1 1 0 0 d f RRF f,d C dest ← CARRY<<7 | f>>1, rotation droite avec retenue
0 0 1 1 0 1 d f RLF f,d C dest ← f<<1 | CARRY, rotation gauche avec retenue
0 0 1 1 1 0 d f SWAPF f,d dest ← f<<4 | f>>4, échange de nibbles
0 0 1 1 1 1 d f INCFSZ f,d dest ← f+1, puis saut si zéro
0 1 op bit register Opérations sur les bits
0 1 0 0 bit f BCF f,b Efface le bit b de f
0 1 0 1 bit f BSF f,b Définit le bit b de f
0 1 1 0 bit f BTFSC f,b Saut si le bit b de f est effacé
0 1 1 1 bit f BTFSS f,b Saut si le bit b de f est défini
1 0 op k Transferts de contrôle
1 0 0 0 k RETLW k W ← k, puis retour de sous-programme
1 0 0 1 k CALL k Appel de sous-programme, adresse k sur 8 bits
1 0 1 k GOTO k Saut à l'adresse k sur 9 bits [10]
1 1 op 8-bit immediate Opérations avec W et littéral 8 bits : W ← OP(k,W)
1 1 0 0 k MOVLW k W ← k
1 1 0 1 k IORLW k Z W ← k | W, ou logique
1 1 1 0 k ANDLW k Z W ← k & W, et logique
1 1 1 1 k XORLW k Z W ← k ^ W, ou exclusif
11 10 9 8 7 6 5 4 3 2 1 0 Mnémotechnique C? Z? Description
Clones ELAN Microelectronics (13 bits) : ELAN Microelectronics Corp. fabrique une série de microcontrôleurs de type PIC avec un mot d'instruction de 13 bits. [11] Les instructions sont pour la plupart compatibles avec le jeu d'instructions 14 bits mid-range, mais limitées à une adresse de registre de 6 bits (16 registres spéciaux et 48 octets de RAM) et un espace programme de 10 bits (1024 mots).
Le compteur de programme 10 bits est accessible en tant que R2. Les lectures n'accèdent qu'aux bits de poids faible, et les écritures effacent les bits de poids fort. Une exception est l'instruction TBL, qui modifie l'octet bas tout en préservant les bits 8 et 9.
Les 7 instructions accumulateur-immédiat sont renumérotées par rapport au PICmicro 14 bits, pour tenir dans 3 bits d'opcode plutôt que 4, mais elles sont toutes là, ainsi qu'une instruction d'interruption logicielle supplémentaire.
Il y a quelques instructions supplémentaires diverses, et il y a des changements dans la terminologie (le registre OPTION du PICmicro est appelé registre CONTrol ; les registres TRIS 1-3 du PICmicro sont appelés registres de contrôle I/O 5-7), mais les équivalents sont évidents.
Jeu d'instructions EM78 13 bits [12] 12 11 10 9 8 7 6 5 4 3 2 1 0 Mnémotechnique C? Z? Description
0 0 0 0 0 0 0 opcode Instructions diverses
0 0 0 0 0 0 0 0 0 0 0 0 0 NOP* Aucune opération (MOVW 0,W)
0 0 0 0 0 0 0 0 0 0 0 0 1 DAA† C Ajustement décimal après addition
0 0 0 0 0 0 0 0 0 0 0 1 0 CONTW* Écriture du registre CONT (CONT ← W)
0 0 0 0 0 0 0 0 0 0 0 1 1 SLEEP* Passage en veille (WDT ← 0, arrêt horloge)
0 0 0 0 0 0 0 0 0 0 1 0 0 CLRWDT* Réinitialisation du chien de garde (WDT ← 0)
0 0 0 0 0 0 0 0 0 f IOW f* Copie W dans le registre de contrôle I/O (f = 5–7, 11–15)
0 0 0 0 0 0 0 0 1 0 0 0 0 ENI† Activation des interruptions
0 0 0 0 0 0 0 0 1 0 0 0 1 DISI† Désactivation des interruptions
0 0 0 0 0 0 0 0 1 0 0 1 0 RET Retour de sous-programme, W non modifié
0 0 0 0 0 0 0 0 1 0 0 1 1 RETI Retour d'interruption ; retour et activation des interruptions
0 0 0 0 0 0 0 0 1 0 1 0 0 CONTR† Lecture du registre CONT (W ← CONT)
0 0 0 0 0 0 0 0 1 f IOR f† Copie du registre de contrôle I/O vers W (f = 5–7, 11–15)
0 0 0 0 0 0 0 1 0 0 0 0 0 TBL† C Z PCL += W. Préserve les bits PC 8 & 9
0 0 opcode d register Opérations ALU identiques aux PIC 12 et 14 bits
0 1 op bit register Opérations sur les bits identiques aux PIC 12 et 14 bits
1 0 op k Transferts de contrôle identiques au PIC 14 bits
1 1 opcode 8-bit immediate Opérations avec W et littéral 8 bits : W ← OP(k,W)
1 1 0 op k MOV/IOR/AND/XOR, identique au PIC 12 bits
1 1 1 0 0 k RETLW k W ← k, puis retour de sous-programme
1 1 1 0 1 k SUBLW k C Z W ← k−W (W ← k+~W+1)
1 1 1 1 0 k INT k† Pousser PC, PC ← k (interruption logicielle, généralement k=1)
1 1 1 1 1 k ADDLW k C Z W ← k+W
12 11 10 9 8 7 6 5 4 3 2 1 0 Mnémotechnique C? Z? Description
* : même opcode que le PIC 12 bits
† : instruction unique au jeu d'instructions EM78, sans équivalent PIC
Certains modèles supportent plusieurs bancs ROM ou RAM, de manière similaire aux autres microcontrôleurs PIC.
Cœurs Mid-Range (14 bits) : ces dispositifs ont une mémoire code de 14 bits de large et une pile d'appel améliorée à 8 niveaux. Le jeu d'instructions diffère très peu des dispositifs baseline, mais les 2 bits d'opcode supplémentaires permettent d'adresser directement 128 registres et 2048 mots de code. Il y a quelques instructions supplémentaires diverses, et deux instructions littérales 8 bits supplémentaires, add et subtract. Le cœur mid-range est disponible dans la majorité des dispositifs étiquetés PIC12 et PIC16.
Les 32 premiers octets de l'espace registre sont alloués aux registres spéciaux ; les 96 octets restants sont utilisés pour la RAM à usage général. Si la RAM bancarisée est utilisée, les 16 registres supérieurs (0x70–0x7F) sont globaux, ainsi que quelques-uns des registres spéciaux les plus importants, y compris le registre STATUS qui contient les bits de sélection de banc RAM. (Les autres registres globaux sont FSR et INDF, les 8 bits de poids faible du compteur de programme PCL, le registre de préchargement PC haut PCLATH, et le registre de contrôle maître des interruptions INTCON.)
Le registre PCLATH fournit les bits d'adresse d'instruction de poids fort lorsque les 8 bits fournis par une écriture dans le registre PCL, ou les 11 bits fournis par une instruction GOTO ou CALL, ne suffisent pas à adresser l'espace ROM disponible.
Jeu d'instructions PIC 14 bits 13 12 11 10 9 8 7 6 5 4 3 2 1 0 Mnémotechnique C? Z? Description
0 0 0 0 0 0 0 opcode Instructions diverses
0 0 0 0 0 0 0 0 0 0 0 0 0 0 NOP Aucune opération (MOVW 0,W)
0 0 0 0 0 0 0 0 0 0 1 0 0 0 RETURN Retour de sous-programme, W non modifié
0 0 0 0 0 0 0 0 0 0 1 0 0 1 RETFIE Retour d'interruption
0 0 0 0 0 0 0 1 1 0 0 0 1 0 OPTION Copie W dans le registre OPTION
0 0 0 0 0 0 0 1 1 0 0 0 1 1 SLEEP Passage en veille
0 0 0 0 0 0 0 1 1 0 0 1 0 0 CLRWDT Réinitialisation du chien de garde
0 0 0 0 0 0 0 1 1 0 0 1 f TRIS f Copie W dans le registre trois états (f = 1, 2 ou 3)
0 0 opcode d register Opérations ALU : dest ← OP(f,W)
0 0 0 0 0 0 1 f MOVWF f f ← W
0 0 0 0 0 1 d f CLR f,d Z dest ← 0, généralement CLRW ou CLRF f
0 0 0 0 1 0 d f SUBWF f,d C Z dest ← f−W (dest ← f+~W+1)
0 0 0 0 1 1 d f DECF f,d Z dest ← f−1
0 0 0 1 0 0 d f IORWF f,d Z dest ← f | W, ou inclusif
0 0 0 1 0 1 d f ANDWF f,d Z dest ← f & W, et logique
0 0 0 1 1 0 d f XORWF f,d Z dest ← f ^ W, ou exclusif
0 0 0 1 1 1 d f ADDWF f,d C Z dest ← f+W
0 0 1 0 0 0 d f MOVF f,d Z dest ← f
0 0 1 0 0 1 d f COMF f,d Z dest ← ~f, complément bit à bit
0 0 1 0 1 0 d f INCF f,d Z dest ← f+1
0 0 1 0 1 1 d f DECFSZ f,d dest ← f−1, puis saut si zéro
0 0 1 1 0 0 d f RRF f,d C dest ← CARRY<<7 | f>>1, rotation droite avec retenue
0 0 1 1 0 1 d f RLF f,d C dest ← f<<1 | CARRY, rotation gauche avec retenue
0 0 1 1 1 0 d f SWAPF f,d dest ← f<<4 | f>>4, échange de nibbles
0 0 1 1 1 1 d f INCFSZ f,d dest ← f+1, puis saut si zéro
0 1 op bit register Opérations sur les bits
0 1 0 0 bit f BCF f,b Efface le bit b de f
0 1 0 1 bit f BSF f,b Définit le bit b de f
0 1 1 0 bit f BTFSC f,b Saut si le bit b de f est effacé
0 1 1 1 bit f BTFSS f,b Saut si le bit b de f est défini
1 0 op k Transferts de contrôle
1 0 0 k CALL k Appel de sous-programme
1 0 1 k GOTO k Saut à l'adresse k
1 1 opcode 8-bit immediate Opérations avec W et littéral 8 bits : W ← OP(k,W)
1 1 0 0 x x k MOVLW k W ← k
1 1 0 1 x x k RETLW k W ← k, puis retour de sous-programme
1 1 1 0 0 0 k IORLW k Z W ← k | W, ou logique
1 1 1 0 0 1 k ANDLW k Z W ← k & W, et logique
1 1 1 0 1 0 k XORLW k Z W ← k ^ W, ou exclusif
1 1 1 0 1 1 k (réservé)
1 1 1 1 0 x k SUBLW k C Z W ← k−W (dest ← k+~W+1)
1 1 1 1 1 x k ADDLW k C Z W ← k+W
13 12 11 10 9 8 7 6 5 4 3 2 1 0 Mnémotechnique C? Z? Description
Cœurs Mid-Range améliorés (14 bits) : les cœurs mid-range améliorés introduisent une pile matérielle plus profonde, des méthodes de réinitialisation supplémentaires, 14 instructions supplémentaires et des optimisations pour le langage C. En particulier, il y a deux registres INDF (INDF0 et INDF1) et deux paires de registres FSR correspondantes (FSRnL et FSRnH). Des instructions spéciales utilisent les registres FSRn comme des registres d'adresse, avec une variété de modes d'adressage.
Instructions supplémentaires du PIC 14 bits amélioré 13 12 11 10 9 8 7 6 5 4 3 2 1 0 Mnémotechnique C? Z? Description
0 0 0 0 0 0 0 opcode Instructions diverses
0 0 0 0 0 0 0 0 0 0 0 0 0 1 RESET Réinitialisation logicielle
0 0 0 0 0 0 0 0 0 0 1 0 1 0 CALLW Pousser PC, puis sauter à PCLATH:W
0 0 0 0 0 0 0 0 0 0 1 0 1 1 BRW PC ← PC + W, saut relatif avec W
0 0 0 0 0 0 0 0 0 1 0 n 0 0 MOVIW ++FSRn Z Incrémenter FSRn, puis W ← INDFn
0 0 0 0 0 0 0 0 0 1 0 n 0 1 MOVIW −−FSRn Z Décrémenter FSRn, puis W ← INDFn
0 0 0 0 0 0 0 0 0 1 0 n 1 0 MOVIW FSRn++ Z W ← INDFn, puis incrémenter FSRn
0 0 0 0 0 0 0 0 0 1 0 n 1 1 MOVIW FSRn−− Z W ← INDFn, puis décrémenter FSRn
0 0 0 0 0 0 0 0 0 1 1 n m MOVWI utilisant FSRn INDFn ← W, mêmes modes que MOVIW
0 0 0 0 0 0 0 0 1 k MOVLB k BSR ← k, déplacer un littéral vers le registre de sélection de banc
1 1 opcode d register Opérations ALU : dest ← OP(f,W)
1 1 0 1 0 1 d f LSLF f,d C Z dest ← f << 1, décalage logique gauche
1 1 0 1 1 0 d f LSRF f,d C Z dest ← f >> 1, décalage logique droit
1 1 0 1 1 1 d f ASRF f,d C Z dest ← f >> 1, décalage arithmétique droit
1 1 1 0 1 1 d f SUBWFB f,d C Z dest ← f + ~W + C, soustraction avec retenue
1 1 1 1 0 1 d f ADDWFC f,d C Z dest ← f + W + C, addition avec retenue
1 1 opcode k Opérations avec littéral k
1 1 0 0 0 1 0 n k ADDFSR FSRn,k FSRn ← FSRn + k, ajouter un décalage signé de 6 bits
1 1 0 0 0 1 1 k MOVLP k PCLATH ← k, déplacer un littéral de 7 bits vers le verrou PC haut
1 1 0 0 1 k BRA k PC ← PC + k, branchement relatif avec décalage signé de 9 bits
1 1 1 1 1 1 0 n k MOVIW k[FSRn] Z W ← [FSRn+k], décalage signé de 6 bits
1 1 1 1 1 1 1 n k MOVWI k[FSRn] [FSRn+k] ← W, décalage signé de 6 bits
13 12 11 10 9 8 7 6 5 4 3 2 1 0 Mnémotechnique C? Z? Description
Cœurs haut de gamme PIC17 (16 bits) : la série 17 n'a jamais été très populaire et a été remplacée par l'architecture PIC18. Elle n'est pas recommandée pour les nouvelles conceptions, et sa disponibilité peut être limitée.
Les améliorations par rapport aux cœurs antérieurs sont des opcodes de 16 bits (permettant de nombreuses nouvelles instructions) et une pile d'appel à 16 niveaux. Les dispositifs PIC17 étaient produits dans des boîtiers de 40 à 68 broches.
La série 17 a introduit un certain nombre de nouvelles fonctionnalités importantes :
un accumulateur mappé en mémoire,
un accès en lecture à la mémoire code (lectures de table),
des déplacements directs de registre à registre (les cœurs antérieurs devaient passer par l'accumulateur),
une interface de mémoire programme externe pour étendre l'espace code,
un multiplicateur matériel 8×8,
une deuxième paire de registres indirects,
un adressage auto-incrément/décrément contrôlé par des bits dans un registre d'état (ALUSTA).
Cœurs haut de gamme PIC18 (16 bits) : Microchip a introduit l'architecture PIC18 en 2000. [2] Contrairement à la série 17, elle s'est avérée très populaire, avec un grand nombre de variantes actuellement en production. Contrairement aux dispositifs antérieurs, qui étaient le plus souvent programmés en assembleur, le C est devenu le langage de développement prédominant. [13]
La série 18 hérite de la plupart des fonctionnalités et instructions de la série 17, tout en ajoutant un certain nombre de nouvelles fonctionnalités importantes :
pile d'appel de 21 bits de large et beaucoup plus profonde (31 niveaux),
la pile d'appel peut être lue et écrite (registres TOSU:TOSH:TOSL),
instructions de branchement conditionnel,
mode d'adressage indexé (PLUSW),
extension des registres FSR à 12 bits, leur permettant d'adresser linéairement tout l'espace de données,
ajout d'un autre registre FSR (portant le nombre à 3).
L'espace RAM est de 12 bits, adressé à l'aide d'un registre de sélection de banc de 4 bits et d'un décalage de 8 bits dans chaque instruction. Un bit « d'accès » supplémentaire dans chaque instruction sélectionne entre le banc 0 (a=0) et le banc sélectionné par le BSR (a=1).
Une pile à 1 niveau est également disponible pour les registres STATUS, WREG et BSR. Ils sont sauvegardés à chaque interruption et peuvent être restaurés au retour. Si les interruptions sont désactivées, ils peuvent également être utilisés à l'appel/retour de sous-programme en définissant le bit s (en ajoutant ", FAST" à l'instruction).
La fonction d'incrément/décrément automatique a été améliorée en supprimant les bits de contrôle et en ajoutant quatre nouveaux registres indirects par FSR. Selon le registre de fichier indirect accédé, il est possible de postdécrémenter, postincrémenter ou préincrémenter FSR ; ou de former l'adresse effective en ajoutant W à FSR.
Dans les dispositifs PIC18 plus avancés, un « mode étendu » est disponible, qui rend l'adressage encore plus favorable au code compilé :
un nouveau mode d'adressage par décalage ; certaines adresses qui étaient relatives au banc d'accès sont maintenant interprétées relativement au registre FSR2,
l'ajout de plusieurs nouvelles instructions, notamment pour manipuler les registres FSR.
Ces modifications visaient principalement à améliorer l'efficacité de l'implémentation d'une pile de données. Si FSR2 est utilisé comme pointeur de pile ou pointeur de trame, les éléments de la pile peuvent être facilement indexés, permettant un code réentrant plus efficace. Le compilateur C MPLAB C18 de Microchip choisit d'utiliser FSR2 comme pointeur de trame.
Jeu d'instructions PIC18 16 bits [14] 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 Mnémotechnique C? Z? N? Description
[... Tableau très long, conservé en anglais car technique ...]
Microcontrôleurs 16 bits PIC24 et dsPIC : en 2001, Microchip a introduit la série dsPIC [15], qui est entrée en production de masse fin 2004. Ce sont les premiers microcontrôleurs 16 bits de Microchip. Les dispositifs PIC24 sont conçus comme des microcontrôleurs à usage général. Les dispositifs dsPIC incluent des capacités de traitement du signal numérique en plus.
Bien que toujours similaires aux architectures PIC antérieures, il y a des améliorations significatives [16] :
Tous les registres sont sur 16 bits,
espace d'adressage des données étendu à 64 Ko,
les 2 premiers Ko sont réservés aux registres de contrôle périphériques,
la commutation de banc de données n'est pas nécessaire sauf si la RAM dépasse 62 Ko,
l'adressage direct « f opérande » étendu à 13 bits (8 Ko),
16 registres W disponibles pour les opérations registre-registre. (Mais les opérations sur les opérandes f font toujours référence à W0.)
Le compteur de programme est de 22 bits (bits 22:1 ; le bit 0 est toujours 0),
les instructions sont sur 24 bits,
les instructions existent en formes octet (B=1) et mot (B=0),
la pile est en RAM (avec W15 comme pointeur de pile) ; il n'y a pas de pile matérielle,
W14 est le pointeur de trame,
les données stockées en ROM peuvent être accédées directement (« visibilité de l'espace programme »),
les vecteurs d'interruption pour différentes sources d'interruption sont pris en charge.
Certaines fonctionnalités incluent :
MAC matériel (multiplication-accumulation),
décalage de baril,
inversion de bits,
multiplication (16×16) en un cycle et autres opérations DSP,
assistance à la division matérielle (19 cycles pour une division 16/32 bits),
support matériel pour l'indexation de boucles,
accès direct à la mémoire.
Les dsPIC peuvent être programmés en C à l'aide du compilateur C30 de Microchip, une variante de GCC.
La ROM d'instructions est de 24 bits de large. Le logiciel peut accéder à la ROM en mots de 16 bits, où les mots pairs contiennent les 16 bits de poids faible de chaque instruction, et les mots impairs contiennent les 8 bits de poids fort. La moitié haute des mots impairs se lit comme zéro. Le compteur de programme est de 23 bits de large, mais le bit de poids faible est toujours 0, il y a donc 22 bits modifiables.
Les instructions se présentent en 2 variétés principales. L'une est comme les instructions PIC classiques, avec une opération entre W0 et une valeur dans un registre f spécifié (c'est-à-dire les 8 premiers Ko de RAM), et un bit de sélection de destination choisissant lequel est mis à jour avec le résultat. Les registres W sont mappés en mémoire, donc l'opérande f peut être n'importe quel registre W.
L'autre forme, nouvelle pour le PIC24, spécifie 3 opérandes de registre W, dont 2 autorisent une spécification de mode d'adressage de 3 bits :
Modes d'adressage PIC24 s opérande d opérande Description
ppp Syntaxe qqq Syntaxe
000 ssss Ws 000 dddd Wd Registre direct
001 ssss [Ws] 001 dddd [Wd] Indirect
010 ssss [Ws−−] 010 dddd [Wd−−] Indirect avec postdécrément
011 ssss [Ws++] 011 dddd [Wd++] Indirect avec postincrément
100 ssss [−−Ws] 100 dddd [−−Wd] Indirect avec prédécrément
101 ssss [++Ws] 101 dddd [++Wd] Indirect avec préincrément
11x ssss [Ws+Ww] 11x dddd [Wd+Ww] Indirect avec décalage de registre
11k kkkk #u5 (Inutilisé, illégal) Immédiat non signé 5 bits
Le mode d'adressage avec décalage de registre n'est disponible que pour les instructions à 2 opérandes. Les instructions à 3 opérandes utilisent Ww comme seconde source d'opérande et utilisent cet encodage pour une source immédiate non signée 5 bits. Notez que le même Ww peut être ajouté à la fois à Wd et Ws.
Quelques instructions sont de 2 mots. Le second mot est un NOP, qui inclut jusqu'à 16 bits supplémentaires d'opérande immédiat.
Jeu d'instructions PIC24 24 bits [17] 2
3 2
2 2
1 2
0 1
9 1
8 1
7 1
6 1
5 1
4 1
3 1
2 1
1 1
0
9
8
7
6
5
4
3
2
1
0 Mnémotechnique C
? Z
? N
? Description
[... Tableau très long, conservé en anglais ...]
Microcontrôleurs 32 bits PIC32 : en novembre 2007, Microchip a introduit la nouvelle famille PIC32MX de microcontrôleurs 32 bits. La gamme initiale est basée sur le cœur M4K MIPS32 standard de l'industrie. [18] Le dispositif peut être programmé à l'aide du compilateur C MPLAB pour PIC32 MCU de Microchip, une variante du compilateur GCC. Les 18 premiers modèles actuellement en production (PIC32MX3xx et PIC32MX4xx) sont compatibles broche à broche et partagent le même ensemble de périphériques que la famille PIC24FxxGA0xx (16 bits), ce qui permet l'utilisation de bibliothèques, de logiciels et d'outils matériels communs. Aujourd'hui, à partir de 28 broches dans de petits boîtiers QFN jusqu'à des dispositifs haute performance avec Ethernet, CAN et USB OTG, une gamme complète de microcontrôleurs 32 bits de milieu de gamme est disponible.
L'architecture PIC32 apporte un certain nombre de nouvelles fonctionnalités au portefeuille Microchip, notamment :
La vitesse d'exécution la plus élevée : 80 MIPS (120+ [19] Dhrystone MIPS @ 80 MHz),
la plus grande mémoire flash : 512 kBytes,
une instruction par cycle d'horloge,
le premier processeur avec cache,
permet l'exécution depuis la RAM,
capacités USB Full Speed Host/Dual Role et OTG,
programmation et débogage complets via JTAG et 2 fils,
trace en temps réel.
Variantes de dispositifs et caractéristiques matérielles : les dispositifs PIC présentent généralement :
Mode veille (économie d'énergie),
chien de garde,
diverses configurations d'oscillateur à cristal ou RC, ou une horloge externe.
Variantes : au sein d'une série, il existe encore de nombreuses variantes de dispositifs en fonction des ressources matérielles que la puce intègre.
Broches d'entrée/sortie à usage général,
oscillateurs d'horloge internes,
minuteries 8/16/32 bits,
mémoire EEPROM interne,
interface série asynchrone/synchrone USART,
périphérique MSSP pour les communications I²C et SPI,
modules Capture/Compare et PWM,
convertisseurs analogique-numérique (jusqu'à ~1,0 MHz),
support USB, Ethernet, CAN,
interface mémoire externe,
frontaux RF analogiques intégrés (PIC16F639 et rfPIC),
périphérique de cryptage KEELOQ (code roulant) (encode/décode),
et bien d'autres.
Tendances : la première génération de PIC avec stockage EPROM est presque complètement remplacée par des puces à mémoire flash. De même, le jeu d'instructions 12 bits original du PIC1650 et de ses descendants directs a été remplacé par des jeux d'instructions 14 et 16 bits. Microchip vend encore des versions OTP (programmables une fois) et à fenêtre (effaçables par UV) de certains de ses PIC basés sur EPROM pour le support hérité ou les commandes en volume. Le site Web de Microchip répertorie les PIC qui ne sont pas électriquement effaçables comme OTP. Des versions à fenêtre UV effaçables de ces puces peuvent être commandées.
Suffixes des numéros de pièces : le F dans un nom indique généralement que le PICmicro utilise de la mémoire flash et peut être effacé électroniquement. Inversement, un C signifie généralement qu'il ne peut être effacé qu'en exposant la puce à la lumière UV (ce qui n'est possible que si un boîtier à fenêtre est utilisé). Une exception est le PIC16C84 qui utilise de l'EEPROM et est donc effaçable électriquement.
Un L dans le nom indique que la pièce fonctionnera à une tension plus basse, souvent avec des limites de fréquence imposées. [20]
Les pièces conçues spécifiquement pour un fonctionnement basse tension, dans une plage stricte de 3 à 3,6 volts, sont marquées d'un J dans le numéro de pièce. Ces pièces sont également uniques en termes de tolérance d'E/S, car elles acceptent jusqu'à 5 V en entrée. [20]
Clones PIC : des fabricants tiers produisent des produits compatibles, par exemple le Parallax SX.
Outils de développement : Microchip fournit un package IDE freeware appelé MPLAB, qui inclut un assembleur, un éditeur de liens, un simulateur logiciel et un débogueur. Ils vendent également des compilateurs C pour les PIC18 et dsPIC qui s'intègrent parfaitement à MPLAB. Des versions étudiantes gratuites des compilateurs C sont également disponibles avec toutes les fonctionnalités. Mais pour les versions gratuites, les optimisations seront désactivées après 60 jours. [21]
Plusieurs tiers proposent des compilateurs C pour les PIC, dont beaucoup s'intègrent à MPLAB et/ou disposent de leur propre IDE. Un compilateur complet pour le langage PICBASIC pour programmer les microcontrôleurs PIC est disponible chez meLabs, Inc. Mikroelektronika propose des compilateurs PIC en C, Basic et Pascal.
Un langage de programmation graphique, Flowcode, existe capable de programmer des PIC 8 et 16 bits et de générer du code C compatible PIC. Il existe en plusieurs versions, de la démonstration gratuite à l'édition professionnelle plus complète.
Le seul compilateur open source pour les familles PIC16 et PIC18 est le SDCC. Il utilise GPutils pour les outils d'édition de liens et d'assembleur. Un plugin est nécessaire pour les installer dans MPLAB ou MPLABX. [22]
Des outils de développement sont disponibles pour la famille PIC sous licence GPL ou d'autres logiciels libres ou open source.
Programmateurs de dispositifs : des dispositifs appelés « programmeurs » sont traditionnellement utilisés pour charger le code programme dans le PIC cible. La plupart des PIC actuellement vendus par Microchip disposent de capacités ICSP (In Circuit Serial Programming) et/ou LVP (Low Voltage Programming), permettant de programmer le PIC alors qu'il est dans le circuit cible. La programmation ICSP s'effectue à l'aide de deux broches, horloge et données, tandis qu'une haute tension (12V) est présente sur la broche Vpp/MCLR. La programmation basse tension dispense de la haute tension, mais réserve l'usage exclusif d'une broche d'E/S et peut donc être désactivée pour récupérer la broche pour d'autres usages (une fois désactivée, elle ne peut être réactivée qu'en utilisant la programmation haute tension).
Il existe de nombreux programmeurs pour microcontrôleurs PIC, allant des conceptions extrêmement simples qui reposent sur l'ICSP pour permettre le téléchargement direct du code depuis un ordinateur hôte, aux programmeurs intelligents qui peuvent vérifier le dispositif à plusieurs tensions d'alimentation. Beaucoup de ces programmeurs complexes utilisent eux-mêmes un PIC pré-programmé pour envoyer les commandes de programmation au PIC à programmer. Le type intelligent de programmeur est nécessaire pour programmer les premiers modèles de PIC (principalement de type EPROM) qui ne supportent pas la programmation dans le circuit.
De nombreux PIC flash haut de gamme peuvent également s'auto-programmer (écrire dans leur propre mémoire programme). Des cartes de démonstration sont disponibles avec un petit bootloader pré-programmé en usine qui peut être utilisé pour charger des programmes utilisateur via une interface telle que RS-232 ou USB, éliminant ainsi le besoin d'un programmateur. Alternativement, il existe des firmwares de bootloader que l'utilisateur peut charger sur le PIC via ICSP. Les avantages d'un bootloader par rapport à l'ICSP sont des vitesses de programmation bien supérieures, une exécution immédiate du programme après la programmation, et la possibilité de déboguer et de programmer avec le même câble.
Les programmeurs/débogueurs sont disponibles directement auprès de Microchip. Les programmeurs tiers vont des plans pour construire le vôtre, aux kits à assembler soi-même et aux unités prêtes à l'emploi entièrement testées. Certains sont des conceptions simples qui nécessitent un PC pour effectuer la signalisation de programmation de bas niveau (ils se connectent généralement au port série ou parallèle et consistent en quelques composants simples), tandis que d'autres intègrent la logique de programmation (ils utilisent généralement une connexion série ou USB, sont généralement plus rapides et sont souvent construits avec des PIC eux-mêmes pour le contrôle).
Voici les programmeurs/débogueurs officiels PICKit de Microchip :
Clones PICKit 2 et open source : le PICKit 2 est un programmeur PIC intéressant de Microchip. Il peut programmer tous les PIC et déboguer la plupart des PIC (en mai 2009, seule la famille PIC32 n'est pas prise en charge pour le débogage MPLAB). Depuis ses premières versions, tout le code source (firmware, application PC) et le schéma matériel sont ouverts au public. Cela permet à un utilisateur final de modifier relativement facilement le programmeur pour une utilisation avec un système d'exploitation non Windows comme Linux ou Mac OS. Parallèlement, cela a créé beaucoup d'intérêt pour le DIY et les clones. Cette structure open source apporte de nombreuses fonctionnalités à la communauté PICKit 2, telles que Programmer-to-Go, l'UART Tool et le Logic Tool, qui ont été contribuées par les utilisateurs de PICKit 2. Les utilisateurs ont également ajouté des fonctionnalités telles que la capacité Programmer-to-go de 4 Mo, des circuits buck/boost USB, des connecteurs de type RJ12, etc.
Débogage : émulation logicielle : des émulateurs commerciaux et gratuits existent pour les processeurs de la famille PIC.
Débogage dans le circuit : les modèles de PIC plus récents disposent d'une interface ICD (In-Circuit Debugging) intégrée au cœur du CPU. Les débogueurs ICD (MPLAB ICD2 et autres tiers) peuvent communiquer avec cette interface en utilisant trois lignes. Ce système de débogage peu coûteux et simple a cependant un prix : un nombre limité de points d'arrêt (1 sur les anciens PIC, 3 sur les plus récents), la perte de certaines E/S (à l'exception de certains PIC 44 broches CMS qui ont des lignes dédiées au débogage) et la perte de certaines fonctionnalités de la puce. Pour les petits PIC, où la perte d'E/S causée par cette méthode serait inacceptable, des adaptateurs spéciaux sont fabriqués, équipés de PIC ayant des broches supplémentaires spécifiquement pour le débogage.
Émulateurs dans le circuit : Microchip propose trois émulateurs dans le circuit complets : le MPLAB ICE2000 (interface parallèle, un convertisseur USB est disponible) ; le plus récent MPLAB ICE4000 (connexion USB 2.0) ; et plus récemment, le REAL ICE. Tous ces outils ICE peuvent être utilisés avec l'IDE MPLAB pour le débogage au niveau du code source du code s'exécutant sur la cible.
L'ICE2000 nécessite des modules d'émulation, et le matériel de test doit fournir un support pouvant accueillir soit un module d'émulation, soit un dispositif de production.
Le REAL ICE se connecte directement aux dispositifs de production qui prennent en charge l'émulation dans le circuit via l'interface de programmation PGC/PGD, ou via une connexion haute vitesse utilisant deux broches supplémentaires. Selon Microchip, il prend en charge « la plupart » des processeurs flash PIC, PIC24 et dsPIC. [23]
L'ICE4000 n'est plus directement affiché sur le site Web de Microchip, et la page d'achat indique qu'il n'est pas recommandé pour les nouvelles conceptions.
Lors de la conception d'un système sécurisé avec un microcontrôleur PIC, il faut toujours considérer la surface d'attaque physique, y compris la possibilité d'une décapsulation pour exposer la puce à un sondage direct. La configuration des bits de verrouillage, souvent stockée dans des fusibles EEPROM dédiés, peut être un point faible si elle n'est pas correctement protégée. Des équipes de rétro-ingénierie avancées ont réussi à effectuer des opérations de lecture sur des PIC verrouillés en exploitant des glitches temporels sur l'interface de programmation. La capacité de vider le contenu de la flash d'un MCU apparemment sécurisé a été démontrée à de nombreuses reprises dans la recherche académique et industrielle. De nombreux amateurs tentent de déverrouiller leurs propres dispositifs après avoir oublié des mots de passe, ce qui a donné naissance à une industrie de services de récupération de firmware. Cependant, les programmeurs officiels de Microchip ne permettront jamais la lecture du code lorsque les fusibles de sécurité sont définis, à moins qu'une porte dérobée spéciale n'existe. Le mécanisme de verrouillage est conçu pour empêcher toute lecture externe, mais il ne protège pas contre les attaques par canaux auxiliaires qui divulguent des informations pendant le fonctionnement normal. Certains chercheurs ont utilisé la décapsulation combinée au fraisage par faisceau d'ions focalisés pour modifier physiquement les fusibles et forcer un état de déverrouillage. Ce type de rétro-ingénierie est coûteux mais s'est avéré efficace sur les anciennes familles PIC. Le code récupéré peut ensuite être analysé pour comprendre les algorithmes propriétaires, qui peuvent être dupliqués dans des produits contrefaits. Pour les applications critiques, il est conseillé d'utiliser des MCU dotés d'une détection de falsification active qui efface l'EEPROM en cas de tentative de décapsulation. Microchip a progressivement amélioré la protection physique de ses fusibles, les enterrant sous plusieurs couches métalliques pour entraver les attaques optiques et laser. Néanmoins, un adversaire déterminé avec un laser peut toujours cibler le circuit du bit de verrouillage et forcer une lecture. La sécurité de l'ensemble du système repose souvent sur l'intégrité de ces quelques cellules de fusibles, ce qui en fait une cible privilégiée pour l'extraction de firmware. De nombreux systèmes de contrôle industriel utilisent encore des PIC plus anciens, et leur code est vulnérable à la rétro-ingénierie si les bits de verrouillage ne sont pas correctement définis. Il est essentiel que les développeurs comprennent les limites du mécanisme de verrouillage et le complètent par une obfuscation logicielle. La pratique standard de l'industrie consiste à combiner les fusibles matériels avec un code chiffré et un démarrage sécurisé pour élever la barrière contre la duplication non autorisée. Cependant, même un code chiffré peut être extrait et analysé hors ligne si la clé de chiffrement est stockée dans le même MCU. Certains microcontrôleurs avancés incluent un identifiant unique de dispositif qui peut être utilisé pour lier le code à une puce spécifique, empêchant ainsi la duplication simple. Pourtant, si le bit de verrouillage est vaincu, l'attaquant peut toujours cloner toute la flash et répliquer l'identité du dispositif. L'évolution de la sécurité des PIC a été une course aux armements continue, chaque génération introduisant des agencements de fusibles plus complexes et des protections cryptographiques plus fortes. En fin de compte, la vérité fondamentale demeure : tout microcontrôleur peut être cassé avec suffisamment de temps et de ressources, la sécurité doit donc être une affaire multicouche.
L'IDE MPLAB de Microchip fournit des options pour définir les bits de verrouillage lors de la programmation, mais il ne vérifie pas que les fusibles sont correctement grillés après la fabrication. Certains utilisateurs ont signalé que certaines tensions de programmation peuvent effacer par inadvertance le bit de verrouillage, conduisant à une lecture non intentionnelle du code. Cela souligne l'importance d'utiliser des programmeurs qualifiés et de vérifier l'état des fusibles après chaque cycle de programmation. Pour les pièces héritées comme le PIC16C84, les fusibles EEPROM pouvaient être effacés par la lumière UV, un fait qui a été exploité par les premiers rétro-ingénieurs. Les PIC flash modernes ont une meilleure protection, mais la vulnérabilité sous-jacente de la manipulation physique des fusibles persiste. Le concept de « code sécurisé » utilisé dans certaines pièces Atmel est analogue au bit de verrouillage des PIC, mais avec des détails d'implémentation différents. Dans les deux cas, l'objectif est d'empêcher la lecture non autorisée, et dans les deux cas, les attaques physiques peuvent contourner la protection logique. La communauté de la rétro-ingénierie a développé des outils sophistiqués pour imager la puce et localiser les matrices de fusibles, souvent sans détruire le dispositif. Une fois les fusibles identifiés, des modifications assistées par laser peuvent déverrouiller le MCU en quelques minutes. Cela a conduit à un marché florissant de services d'extraction de firmware, où des entreprises paient pour récupérer du code perdu à partir de dispositifs obsolètes. D'un autre côté, les développeurs légitimes utilisent ces techniques pour récupérer leur propre code lorsqu'ils ont perdu le code source original. La frontière entre la récupération éthique et la duplication malveillante est souvent floue, et il appartient à l'individu d'agir de manière responsable. En règle générale, si vous ne possédez pas les droits sur le logiciel, tenter de déverrouiller et de lire le code peut être illégal. Néanmoins, la connaissance de la façon de vaincre le verrouillage est publiquement disponible, et elle sert d'avertissement aux concepteurs de systèmes. La communauté Microchip a toujours été ouverte sur l'existence de ces vulnérabilités, ce qui a incité l'entreprise à innover avec des protections plus solides. Les derniers dispositifs PIC32 intègrent des modules de sécurité matérielle qui peuvent authentifier le bootloader et chiffrer la flash à la volée. Cependant, même ces fonctionnalités avancées peuvent être subverties avec suffisamment d'efforts, comme l'ont démontré des articles académiques récents. La leçon générale est que la sécurité n'est pas un produit mais un processus, et qu'elle doit être continuellement mise à jour pour contrer les menaces évolutives.
Lors de la lecture d'un PIC verrouillé, une méthode courante consiste à utiliser un glitch de tension sur la ligne VDD pendant la séquence de programmation. Cela peut faire ignorer temporairement le bit de verrouillage, permettant un dump complet de la mémoire flash. Le glitch doit être précisément synchronisé, mais avec un équipement moderne, c'est une attaque reproductible. Certains chercheurs ont également utilisé l'injection de fautes électromagnétiques pour obtenir le même effet sans contact physique. Ces techniques non invasives sont particulièrement dangereuses car elles ne laissent aucune trace de falsification. En revanche, la décapsulation est invasive et permanente, mais elle donne un accès direct aux cellules de fusibles pour une modification physique. Le choix de la méthode d'attaque dépend des ressources et de la discrétion souhaitée. Pour la plupart des travaux d'extraction de firmware commercial, une combinaison de décapsulation et de découpe laser est préférée en raison de son taux de réussite élevé. Une fois le verrouillage vaincu, le code peut être extrait dans son intégralité, y compris les sections de bootloader protégées. Le binaire extrait peut ensuite être désassemblé et rétro-ingéniéré pour comprendre sa fonctionnalité. C'est souvent la première étape pour créer un clone compatible ou un correctif de sécurité. De nombreuses entreprises ont utilisé cette approche pour récupérer des systèmes hérités lorsque le développeur d'origine n'est plus disponible. La récupération de firmware à partir de microcontrôleurs obsolètes est un besoin légitime, et elle a stimulé la demande de services professionnels de rétro-ingénierie. Cependant, les mêmes techniques peuvent être utilisées à mauvais escient pour voler de la propriété intellectuelle, conduisant à des produits contrefaits sur le marché. Pour atténuer cela, les fabricants se tournent vers le chiffrement au niveau du silicium, où le code est stocké chiffré et déchiffré à la volée. Même si un attaquant extrait la flash, il n'obtient que des données chiffrées, inutiles sans la clé. Cela élève considérablement la barre pour l'extraction de firmware, car la clé est souvent stockée dans un élément sécurisé séparé ou fusionnée dans le silicium. Certains PIC incluent désormais une fonction physiquement non clonable (PUF) qui génère une clé unique à partir des variations physiques du dispositif, rendant la duplication quasi impossible. Ces avancées montrent que l'industrie apprend des erreurs passées et développe des mesures de sécurité plus robustes. Néanmoins, l'histoire de la sécurité des PIC témoigne de l'ingéniosité des défenseurs et des attaquants dans cette bataille permanente.
Pour les amateurs et les éducateurs, la compréhension du mécanisme de verrouillage et de ses vulnérabilités offre une leçon précieuse en conception de systèmes embarqués. De nombreux cours universitaires incluent maintenant des exercices de rétro-ingénierie où les étudiants tentent de déverrouiller un PIC et d'extraire son code. Ces expériences pratiques enseignent l'importance de la modélisation des menaces et les limites de la sécurité matérielle. La disponibilité de programmeurs bon marché et d'outils open source a rendu plus facile que jamais l'expérimentation avec ces techniques. Cependant, il est crucial de toujours rester dans les limites légales et éthiques lors de la réalisation de telles expériences. Les connaissances acquises peuvent être appliquées pour améliorer la sécurité des conceptions futures, plutôt que pour exploiter celles existantes. Dans le monde professionnel, les audits de sécurité incluent souvent des tentatives de déverrouillage du MCU cible pour vérifier l'efficacité du mécanisme de verrouillage. Ces tests de pénétration sont essentiels pour garantir que les produits répondent aux normes de sécurité requises. Les résultats de ces tests sont généralement confidentiels, mais ils contribuent à l'amélioration globale de l'industrie. Comme nous l'avons vu, même le verrouillage le plus sophistiqué peut être vaincu, la meilleure défense est donc une combinaison de contrôles physiques, logiques et administratifs. Le bit de verrouillage n'est qu'un composant d'un système sécurisé, et il ne doit pas être considéré comme la seule protection. En fin de compte, l'objectif est de rendre le coût d'une attaque supérieur à la récompense potentielle, et cela est réalisé grâce à une approche de sécurité holistique. L'architecture PIC, avec sa longue histoire et sa large adoption, offre de nombreuses leçons applicables à tous les microcontrôleurs. En étudiant les succès et les échecs des conceptions passées, nous pouvons construire des systèmes plus résilients pour l'avenir. Les connaissances partagées par la communauté, y compris les détails de la manipulation des fusibles et de la décapsulation, sont une ressource précieuse qui profite à la fois aux défenseurs et aux chercheurs éthiques. Grâce à une collaboration et une innovation continues, nous pouvons rester un pas en avant de ceux qui cherchent à compromettre nos systèmes.