classe PIO – utilisation avancée du PIO¶
La classe PIO encapsule l’un des deux blocs d’E/S programmables (PIO) du RP2040. Chaque bloc PIO contient une mémoire d’instructions (32 instructions) partagée par quatre machines à états indépendantes, ainsi qu’une interface FIFO privée vers chaque machine à états et un contrôleur d’IRQ.
La plupart des scripts interagissent avec le PIO via StateMachine – cette classe est destinée aux cas d’utilisation avancés qui nécessitent de :
Charger et retirer explicitement des programmes via
add_program()/remove_program().Déplacer la base GPIO du PIO à travers la fenêtre de 32 broches de la puce via
gpio_base().S’accrocher aux indicateurs d’IRQ à l’échelle du bloc via
irq().
Pour l’assemblage des programmes PIO, voir rp2.asm_pio().
Constructeurs¶
- class rp2.PIO(id: int)¶
Renvoie l’objet singleton
PIOpour le bloc PIO identifié parid. Le RP2040 possède deux blocs PIO, numérotés0et1. LèveValueErrorpour tout autre id.Méthodes¶
- gpio_base(base: machine.Pin | int | None = None, /) int¶
Obtient ou définit la base GPIO de ce bloc PIO.
Le PIO du RP2040 voit une fenêtre de 32 broches dans l’espace GPIO ; la fenêtre peut commencer à GPIO0 ou GPIO16. La base détermine quelle fenêtre est active pour toutes les machines à états de ce PIO.
Sans argument, renvoie la base actuelle (le numéro de broche GPIO,
0ou16).Avec un argument, définit la base.
basepeut être une instancemachine.Pinou le numéro de broche entier, et doit correspondre à GPIO0 ou GPIO16. La base doit être définie avant qu’un programme soit ajouté ou qu’une machine à états soit construite sur ce bloc PIO.
- add_program(program: Callable) None¶
Charge
programdans la mémoire d’instructions de ce PIO. La disposition mémoire résultante est réutilisée par toutes les machines à états de ce bloc PIO.Chaque PIO ne dispose que de 32 instructions de mémoire de programme partagée entre tous les programmes ; si le nouveau programme ne tient pas, cette méthode lève
OSError(ENOMEM). Le même programme peut être chargé sur les deux instances PIO, mais elles consomment des régions de mémoire distinctes.
- remove_program(program: Callable | None = None, /) None¶
Retire
programde la mémoire d’instructions de ce PIO, libérant de l’espace pour de nouveaux programmes. Siprogramest omis, tous les programmes actuellement chargés sur ce PIO sont retirés.Retirer un programme qui n’était pas chargé est sans effet (aucune exception).
- state_machine(id: int, program: Callable | None = None, *args, **kwargs) StateMachine¶
Renvoie l’une des quatre instances
StateMachineappartenant à ce bloc PIO.idest l’index local de la machine à états (0–3).Si
programest fourni, la machine à états est configurée pour l’exécuter – tous les arguments positionnels/nommés sont transmis àStateMachine.init().Exemple
>>> rp2.PIO(1).state_machine(3) StateMachine(7)
L’identifiant global de la machine à états de l’objet renvoyé est
pio_id * 4 + sm_id.
- irq(handler: Callable[[PIO], None] | None = None, trigger: int = IRQ_SM0 | IRQ_SM1 | IRQ_SM2 | IRQ_SM3, hard: bool = False) Callable¶
Obtient ou configure l’IRQ au niveau du bloc pour ce PIO.
handlerest la fonction de rappel à déclencher lorsque l’une des IRQ de machine à états demandées se verrouille. Le gestionnaire reçoit cette instancePIOcomme unique argument ; à l’intérieur du gestionnaire, les machines à états déclenchantes peuvent être identifiées viaself.irq().flags()combiné par ET avec les constantesIRQ_SM*.triggerest un masque de bits d’une ou plusieurs valeursIRQ_SM0..IRQ_SM3. La valeur par défaut se déclenche sur n’importe quelle machine à états.hard=Trueenregistre un gestionnaire d’interruption matérielle (aucune allocation sur le tas dans la fonction de rappel).MicroPython associe l’IRQ 0 sur chaque bloc PIO ; l’IRQ 1 est réservée et n’est pas accessible depuis Python.
Constantes¶
- IN_LOW: int¶
À passer à
out_init/set_init/sideset_initdeasm_pio()pour que la broche démarre comme une entrée pilotée à l’état bas (c’est-à-dire en haute impédance avec le tampon de sortie maintenant un 0).
- IN_HIGH: int¶
À passer à
out_init/set_init/sideset_initdeasm_pio()pour que la broche démarre comme une entrée avec le tampon de sortie maintenant un 1.
- OUT_LOW: int¶
À passer à
out_init/set_init/sideset_initdeasm_pio()pour que la broche démarre comme une sortie pilotée au niveau logique 0.
- OUT_HIGH: int¶
À passer à
out_init/set_init/sideset_initdeasm_pio()pour que la broche démarre comme une sortie pilotée au niveau logique 1.
- SHIFT_LEFT: int¶
À passer à
in_shiftdir/out_shiftdirdeasm_pio()ouStateMachine.init()pour que les décalages déplacent les bits vers le MSB.
- SHIFT_RIGHT: int¶
À passer à
in_shiftdir/out_shiftdirdeasm_pio()ouStateMachine.init()pour que les décalages déplacent les bits vers le LSB.
- JOIN_NONE: int¶
À passer à
fifo_joindeasm_pio()pour que la machine à états dispose de FIFO TX et RX séparées de 4 mots (la valeur par défaut).
- JOIN_TX: int¶
À passer à
fifo_joindeasm_pio()pour que la FIFO TX soit doublée à 8 mots en absorbant la FIFO RX. La machine à états ne peut alors plus recevoir de données.