Il y a un épisode de Ren et Stimpy avec un gros bouton rouge « effaceur d’historique » sur lequel il ne faut pas appuyer. Bien sûr, qui peut résister à la tentation d’appuyer sur le bouton inpressible ? Il en va de même pour les conseils de développement. S’il y a un bouton là-bas, vous voulez le lire dans votre code, n’est-ce pas ? Le Raspberry Pi Pico est un peu étrange à cet égard. Le modèle standard n’a pas de bouton de réinitialisation, mais il existe un gros bouton alléchant pour réinitialiser en mode chargeur de démarrage. Vous ne l’utilisez qu’à la mise sous tension, alors pourquoi ne pas le lire dans votre code ? Pourquoi pas, en effet ?
Il s’avère que ce bouton n’est pas ce que vous pensez. Il n’est pas du tout connecté à une broche CPU normale. Au lieu de cela, il se connecte à la puce de mémoire flash. Cela signifie-t-il que vous ne pouvez pas le lire du tout ? Pas exactement. Il y a de bonnes nouvelles, puis de mauvaises nouvelles.
La bonne nouvelle
Les exemples officiels du Raspberry Pi montrent comment lire le bouton (vous avez lu tous les exemples, n’est-ce pas ?). Vous pouvez convertir temporairement la sélection de puce du flash en entrée et essayer de déterminer si la broche est faible, ce qui signifie que le bouton est enfoncé. Cela semble facile, non ?
Les mauvaises nouvelles
La mauvaise nouvelle est vraiment mauvaise. Lorsque vous basculez la sélection de la puce flash sur une entrée, vous perdrez l’accès à la mémoire flash. Mais nous fuyons la mémoire flash ! Ainsi, la première chose à considérer est que le code devra être exécuté à partir de la RAM.
Mais ce n’est pas tout. Le Pico a des interruptions et deux cœurs de processeur. Ainsi, même si vous n’avez plus de mémoire flash, il n’y a aucune raison de supposer que quelqu’un d’autre ne voudra pas l’utiliser simultanément. Donc, pour que cela fonctionne, vous devez désactiver les interruptions et arrêter l’autre cœur du processeur pendant que vous lisez la broche.
L’exemple
En regardant l’exemple, ils font tout sauf désactiver le deuxième cœur. J’ai récemment dû mettre ce code dans un programme de style Arduino ; il existe un excellent support Arduino pour le Pico. Mettre la fonction en RAM est assez simple :
bool __no_inline_not_in_flash_func(_get_bootsel_button)() {
Le reste consiste simplement à manipuler les broches d’E/S et à activer et désactiver les interruptions :
uint32_t flags = save_and_disable_interrupts(); // Set chip select to Hi-Z hw_write_masked(&ioqspi_hw->io[CS_PIN_INDEX].ctrl, GPIO_OVERRIDE_LOW << IO_QSPI_GPIO_QSPI_SS_CTRL_OEOVER_LSB, IO_QSPI_GPIO_QSPI_SS_CTRL_OEOVER_BITS); // Note we can't call into any sleep functions in flash right now for (volatile int i = 0; i< 1000; ++i); // The HI GPIO registers in SIO can observe and control the 6 QSPI pins. // Note the button pulls the pin *low* when pressed. bool button_state = !(sio_hw->gpio_hi_in & (1u << CS_PIN_INDEX)); // Need to restore the state of chip select, else we are going to have a // bad time when we return to code in flash! hw_write_masked(&ioqspi_hw->io[CS_PIN_INDEX].ctrl, GPIO_OVERRIDE_NORMAL << IO_QSPI_GPIO_QSPI_SS_CTRL_OEOVER_LSB, IO_QSPI_GPIO_QSPI_SS_CTRL_OEOVER_BITS); restore_interrupts(flags);
Cela laisse le noyau. J’ai mis un wrapper autour de cette fonction pour éviter tout problème éventuel lié à son appel depuis la RAM (même si cela fonctionnerait probablement) :
bool get_bootsel_button(void) { bool rv; // freeze rp2040.idleOtherCore(); rv = _get_bootsel_button(); // unfreeze rp2040.resumeOtherCore(); return rv; }
Ça marche. Mais je m’inquiète de son inefficacité. Vous souhaitez généralement interroger souvent un bouton. Éteindre l’autre cœur, désactiver les interruptions et la boucle inactive pour laisser la broche s’installer – tout cela prendra du temps. En pratique, cela semble fonctionner correctement, mais cela doit ralentir un peu les choses.
En rétrospective…
Alors, pouvez-vous lire le bouton Pico ? Oui. Devrais-tu? Peut être. Pour certaines applications, c’est probablement très bien. Mais si vous vous souciez des performances, ce n’est probablement pas la meilleure idée.
Avec deux cœurs de 133 MHz, une tonne de mémoire, un débogage facile et ces processeurs périphériques sympas, il y a beaucoup de choses à aimer dans le Pico. Peut-être pas le bouton BOOTSEL.