classe StateMachine – accès à l’interface d’E/S programmable du RP2040¶
La classe StateMachine donne accès à l’interface PIO (E/S programmable) du RP2040.
Pour l’assemblage des programmes PIO, voir rp2.asm_pio().
Constructeurs¶
- class rp2.StateMachine(id: int, program: Callable | None = None, *args, **kwargs)¶
Obtient la machine à états numérotée id. Le RP2040 possède deux instances PIO identiques, chacune avec 4 machines à états : il y a donc 8 machines à états au total, numérotées de 0 à 7.
Optionnellement, l’initialise avec le programme donné program : voir
StateMachine.init.- init(program: Callable, freq: int = -1, *, in_base: machine.Pin | None = None, out_base: machine.Pin | None = None, set_base: machine.Pin | None = None, jmp_pin: machine.Pin | None = None, sideset_base: machine.Pin | None = None, in_shiftdir: int | None = None, out_shiftdir: int | None = None, push_thresh: int | None = None, pull_thresh: int | None = None) None¶
Configure l’instance de machine à états pour exécuter le programme donné program.
Le programme est ajouté à la mémoire d’instructions de cette instance PIO. Si la mémoire d’instructions contient déjà ce programme, son décalage est réutilisé afin d’économiser de la mémoire d’instructions.
freq est la fréquence en Hz à laquelle faire fonctionner la machine à états. Par défaut, la fréquence de l’horloge système.
Le diviseur d’horloge est calculé comme
system clock frequency / freq, il peut donc y avoir de légères erreurs d’arrondi.Le diviseur d’horloge minimal possible est le 65536e de l’horloge système : ainsi, à la fréquence d’horloge système par défaut de 125 MHz, la valeur minimale de freq est
1908. Pour faire fonctionner les machines à états à des fréquences plus lentes, vous devrez réduire la vitesse de l’horloge système avecmachine.freq().in_base est la première broche à utiliser pour les instructions
in().out_base est la première broche à utiliser pour les instructions
out().set_base est la première broche à utiliser pour les instructions
set().jmp_pin est la première broche à utiliser pour les instructions
jmp(pin, ...).sideset_base est la première broche à utiliser pour le side-set.
in_shiftdir est le sens dans lequel l’ISR effectuera le décalage, soit
PIO.SHIFT_LEFTsoitPIO.SHIFT_RIGHT.out_shiftdir est le sens dans lequel l’OSR effectuera le décalage, soit
PIO.SHIFT_LEFTsoitPIO.SHIFT_RIGHT.push_thresh est le seuil en bits avant que l’auto-push ou le re-push conditionnel soit déclenché.
pull_thresh est le seuil en bits avant que l’auto-pull ou le re-pull conditionnel soit déclenché.
Remarque : les broches utilisées pour in_base doivent être configurées manuellement en entrée (ou autrement) afin que le PIO puisse voir le signal souhaité (elles peuvent être des broches d’entrée, des broches de sortie ou connectées à un autre périphérique). La broche jmp_pin peut également être configurée manuellement, mais sera par défaut une broche d’entrée.
- active(value: bool | int | None = None, /) bool¶
Obtient ou définit si la machine à états est actuellement en cours d’exécution.
>>> sm.active() True >>> sm.active(0) False
- restart() None¶
Redémarre la machine à états et saute au début du programme.
Cette méthode efface l’état interne de la machine à états à l’aide du registre
SM_RESTARTdu RP2040. Cela inclut :les compteurs de décalage d’entrée et de sortie
le contenu du registre de décalage d’entrée
le compteur de délai
l’état d’attente sur IRQ
une instruction bloquée exécutée avec
StateMachine.exec()
- exec(instr: str | int) None¶
Exécute une seule instruction PIO.
Si instr est une chaîne de caractères, utilise
asm_pio_encodepour encoder l’instruction à partir de la chaîne donnée.>>> sm.exec("set(0, 1)")Si instr est un entier, il est traité comme une instruction en code machine PIO déjà encodée à exécuter.
>>> sm.exec(rp2.asm_pio_encode("out(y, 8)", 0))
- get(buf: 'bytearray | array | None' = None, shift: int = 0) int¶
Extrait un mot de la FIFO RX de la machine à états.
Si la FIFO est vide, la méthode bloque jusqu’à l’arrivée de données (c’est-à-dire jusqu’à ce que la machine à états pousse un mot).
La valeur est décalée vers la droite de shift bits avant d’être renvoyée, c’est-à-dire que la valeur de retour est
word >> shift.
- put(value: 'int | bytes | bytearray | array', shift: int = 0) None¶
Pousse des mots sur la FIFO TX de la machine à états.
value peut être un entier, un tableau de type
B,HouI, ou unbytearray.Cette méthode bloque jusqu’à ce que tous les mots aient été écrits dans la FIFO. Si la FIFO est, ou devient, pleine, la méthode bloque jusqu’à ce que la machine à états extraie suffisamment de mots pour achever l’écriture.
Chaque mot est d’abord décalé vers la gauche de shift bits, c’est-à-dire que la machine à états reçoit
word << shift.
- rx_fifo() int¶
Renvoie le nombre de mots présents dans la FIFO RX de la machine à états. Une valeur de 0 indique que la FIFO est vide.
Utile pour vérifier si des données sont en attente de lecture, avant d’appeler
StateMachine.get().
- tx_fifo() int¶
Renvoie le nombre de mots présents dans la FIFO TX de la machine à états. Une valeur de 0 indique que la FIFO est vide.
Utile pour vérifier s’il y a de la place pour pousser un autre mot avec
StateMachine.put().
Protocole tampon¶
La classe StateMachine prend en charge le buffer protocol, permettant un accès direct aux FIFO d’émission et de réception de chaque machine à états. Cela sert principalement à permettre de passer directement des objets StateMachine comme paramètres de lecture ou d’écriture lors de la configuration d’un canal rp2.DMA().