I²C

On souhaite utiliser le capteur HTS221 (température et humidité) qui est sur la carte.

Étape 1

Dans STM32Cube, activez le port I²C sur lequel est connecté ce capteur avec une vitesse de 400kHz. C'est le seul bus I²C qui nous intéressera ici.

Étape 2

Écrivez une interface i2cll (pour low-level), sous la forme d'un fichier d'entête et d'un fichier C correspondant, permettant de :

  • écrire vers un périphérique de ce bus ;
  • lire depuis un périphérique de ce bus ;
  • écrire et lire des registres à l'adresse demandée si le périphérique concerné ce comporte comme une mémoire (comme la plupart des périphériques I²C).

Vous pouvez n'implémenter que le dernier item. Dans tous les cas, ces fonctions devront utiliser un sémaphore binaire qu'elles attendront de pouvoir prendre une fois la commande terminée, ce qui permettra au système de passer en veille. Ce sémaphore sera signalé depuis la routine d'interruption idoine, en utilisant les fonctionnalités de FreeRTOS.

Attention, on ne devra pas utiliser CMSIS-OS (les fonctions et types commençant par "os") dans cette interface et dans la suivante, nous n'utiliserons que des fonctions et types natifs de FreeRTOS.

Il faudra que ces fonctions soient appelables depuis plusieurs threads en même temps. Il vous faudra probablement utiliser un mutex pour implémenter une section critique afin de ne pas tenter d'accéder au bus I²C de manière concurrente.

Étape 3

Écrivez une interface hts221 permettant :

  • d'initialiser le périphérique et de procéder à une capture de température par seconde ; cette fonction devra être idempotente, y compris en cas d'appel depuis plusieurs threads simultanément ;
  • de procéder à une lecture de la température, appelable depuis plusieurs threads simultanément.

Il vous faudra probablement utiliser un mutex pour implémenter une section critique afin de ne pas mélanger les transactions faite envers le hts221.

Étape 4

Écrivez un programme de test qui envoie la température toutes les secondes sur le port série. Vérifiez que la carte réagit bien aux changements de température en la couvrant de votre main (sans la toucher) ou en soufflant doucement dessus.