Aller au contenu

Exercices du chapitre "Microcontrôleur et periphériques"

Inverser l’état d’une LED

Exercice 1

Écrivez un programme en C++ qui inverse l’état d’une LED connectée à la broche PE_0 lorsqu’un bouton connecté sur la broche PA_0 est appuyé. Notez que la LED est allumée lorsqu’on écrit un 0 dans la broche et éteinte lorsqu’on écrit un 1. On aimerait qu’elle soit éteinte au démarrage. Notez aussi que le bouton a besoin d’une résistance de pull-down pour fonctionner. Faites attention à ne pas utiliser de “Magic numbers” dans votre code et définissez vos constantes avec des static constexpr.

Parité UART

Exercice 2

À quoi sert la “parité” dans les paramètres de communication avec un UART ?

Périphériques I2C

Exercice 3

Cherchez sur Internet d’autres périphériques qui utilisent l’I2C

Débit sur un bus SPI

Exercice 4

Avec un SPI rapide (50MHz), combien de temps faut-il pour lire complètement une carte SD de 16GiB ?

Inversion d’une LED basée sur un état

Exercice Exercices du chapitre “Microcontrôleur et periphériques”/5

Implémentez la classe MyDevice pour que la LED soit inversée à chaque deuxième pression du bouton.

Suffixe C++ pour les unités de temps

Exercice 6

Quel(s) mécanismes(s) de C++ permet(tent) de simplement ajouter un suffixe ms à une durée pour un temps en millisecondes ?

Utilisation des unités de temps

Soit le code :

timer_measure_kernel.cpp
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#include "mbed.h"

int main()
{
    uint64_t now = Kernel::get_ms_count();
    ThisThread::sleep_for(100ms);
    uint64_t later      = Kernel::get_ms_count();
    uint64_t elapsed_ms = later - now;
    printf("Elapsed ms: %u\n", (uint32_t)elapsed_ms);
}

La ligne 5 interroge le temps actuel du noyau (en millisecondes et sur 64 bits), la ligne 6 attend 100 millisecondes, puis la ligne 7 lit le nouveau temps actuel du noyau. Le temps écoulé est la différence entre les deux temps.

Exercice 7

Quel est le défaut de cette solution ?

Clignotement asymétrique d’une LED

Exercice 8

Soit le code

timer_blink.cpp
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#include "mbed.h"

constexpr int kLedOn  = 0;
constexpr int kLedOff = 1;

void toggle(DigitalOut* led) { *led = !*led; }

int main()
{
    DigitalOut led(PE_0, kLedOff);
    Ticker flipper;
    flipper.attach(callback(&toggle, &led), 500ms);
    while (true) {
        asm("nop");
    }
}
Modifiez ce code pour garder la LED allumée pendant 250 millisecondes et éteinte pendant 750 millisecondes, en utilisant une classe afin de sauvegarder l’état du dispositif.

Consommation d’énergie et autonomie

Exercice Exercices du chapitre “Microcontrôleur et periphériques”/9

Nous souhaitons alimenter une station météo construite avec un microcontrôleur STM32F412 avec deux piles en série de type AA de \(1.5\,V\) et \(2800\,mAh\) chacune. En mode de veille, le microcontrôleur (avec une tension de \(3V\)) consomme \(12\,\mu{}A\). Pour faire la mesure et l’envoyer, le microcontrôleur à besoin de \(3\) secondes pendant lesquelles il consomme \(112\,\mu{}A\) par \(Mhz\) et il tourne à \(100\,Mhz\). Pendant ces 3 secondes, il faut aussi activer le module LoRa qui consomme \(100\,mA\) pendant \(100\, mS\). En travail, le circuit est aussi alimenté en \(3V\).

Avec quelle période pouvons nous faire des mesures pour que le système puisse fonctionner pendant \(5\) ans avec les mêmes piles ?