mercredi 23 octobre 2019

nucleo-8s208rb

Cet article est le premier consacré à la carte de développement NUCLEO-8S208RB de STMicroelectronics. Je travaille sur système d'exploitation Ubuntu en utilisant le compilateur et l'assembleur SDCC1. De plus pour programmer la carte il faut utiliser stm8flash.

J'ai découvert l’existence d'un livre en anglais sur google book qui explique comment développer pour les microcontrôleurs STM8 sur Ubuntu2. Le livre n'est pas visible au complet dans google book mais seulement le début qui décrit l'installation de SDCC et stm8flash.

Je vais commencer par décrire brièvement comment installer SDCC3 et stm8flash. Pour l'éditeur de texte je vous laisse choisir selon vos préférences. Un simple éditeur comme geany peut aussi bien faire l'affaire, c'est même préférable si vous êtes un débutant et que vous ne voulez pas avoir à apprivoiser les environnement plus complexes comme vscode ou code:blocks.

Installation des outils de développement

Je présume que vous avez déjà une connaissance d'Ubuntu et de l'utilisation de son gestionnaire de paquets en ligne de commandes. Pour installer SDCC rien de plus simple puisque le paquet est disponible dans le dépôt standard d'Ubuntu.


 sudo apt update && sudo apt install sdcc

Pour stm8flash c'est un plus compliqué car il faut construire le logiciel à partir des sources disponible sur github. Normalement le logiciel git est installé avec Unbutu. S'il n'est pas sur votre ordinateur faites simplement la commande:


 sudo apt install git
Choisissez un dossier dans lequel cloner le dépôt github du projet stm8flash et à partir de ce dossier effectuez la commande:

 git clone https://github.com/vdudouyt/stm8flash
Je présume que le compilateur gcc est déjà installé sur votre ordinateur car il est requis pour construire le binaire de stm8flash. À partir du dossier dans lequel se trouve stm8flash il suffit de lancer la commande make.

jacques@HP8200:~/github/stm8flash$ make
cc -g -O0 --std=gnu99 --pedantic -Wall `pkg-config --cflags libusb-1.0`    -c -o stlink.o stlink.c
stlink.c: In function ‘stlink_read_and_cmp’:
stlink.c:62:6: warning: unused variable ‘recv’ [-Wunused-variable]
  int recv = stlink_read(pgm, buf, count);
      ^~~~
stlink.c: In function ‘stlink_swim_write_block’:
stlink.c:484:7: warning: unused variable ‘r’ [-Wunused-variable]
   int r = libusb_bulk_transfer(pgm->dev_handle,
       ^
cc -g -O0 --std=gnu99 --pedantic -Wall `pkg-config --cflags libusb-1.0` 
stlink.o stlinkv2.o espstlink.o main.o byte_utils.o ihex.o srec.o stm8.o 
libespstlink.o `pkg-config --libs libusb-1.0` -o stm8flash
jacques@HP8200:~/github/stm8flash$ ls stm8flash -l
-rwxr-xr-x 1 jacques jacques 104456 oct 19 11:11 stm8flash
Malgré les 2 avertissements à propos de variables non utilisées, la compilation c'est faites normalement. Maintenant il suffit de copier le binaire stm8flash dans votre dossier ~/bin.

 cp stm8flash ~/bin
Cependant si la librairie libusb-1.0-0-dev n'est pas installée sur votre ordinateur il va y avoir une erreur à la compilation. Vous devrez donc l'installer et recompiler stm8flash.

 sudo apt install libusb-1.0-0-dev

Si tout ça a bien fonctionné on est maintenant prêt à ouvrir l'éditeur de texte et à écrire du code avant de compiler et de flasher le binaire dans la carte nucleo.

Le projet

Comme j'aime écrire en assembleur j'ai décidé de présenter un projet en assembleur. J'ai eu de la misère à trouver la documentation de l'assembleur sdas qui est fait parti de SDCC. Il semble que l'intérêt pour cet assembleur soit limité la plupart construisent leur projets en C. Je vais documenté tous les détails du fichier source en particulier les directives. Pour les mnémoniques d'instructions c'est déjà disponible dans le manuel de programmation des STM8. Il s'agit du manuel PM0044.

MONA

Il s'agit d'un MONiteur écrit en Assembleur. Il est utilisé avec un terminal sur le PC qui communique avec la carte via le UART3 du microcontrôleur. Ce moniteur permet de lire ou d'écrire n'importe où dans la mémoire du STM8S208, RAM, FLASH, EEPROM, OPTION, SFR. Il permet d'interagir avec la carte directement et d'observer le comportement résultant.

Comme on le voie chaque commande n'est qu'une seule lettre suivie des arguments. Les arguments peuvent être entrée en décimal ou hexadécimal. Les nombres en hexadécimal sont précédés de 0x ou de $.

Au démarrage le programme affiche son nom ainsi que la version. Le modèle du microcontrôleur et les différentes régions mémoire. MONA protège contre l'écriture la région de mémoire flash qu'il utilise ainsi que la région RAM de 0x0000 - 0x00AE qui contient les variables qu'il utilise.

Voici une capture d'écran qui montre l'exécution de quelque commandes.

  • h $4000 est utilisée pour affichier le contenu des adresses $4000-$4007. Chaque fois qu'on presse la barre d'espacement les 8 adresses suivantes sont affichées. N'importe quel autre touche termine la commande. Cette plage d'adresses est située au début de l'EEPROM.
  • ! $4000 1 2 3 4 5 6 7 8 écris 8 valeurs dans l'EEPROM à partir de l'adresse $4000. Puisque ces valeurs sont inscrites dans l'EEPROM elles vont rester là même après un redémarrage du MCU.
  • h $4000 Nous permet de vérifier que les valeurs ont bien étées inscrites.
  • les commandes t $500a et t $500e n'ont aucun effet car je n'ai pas fournis le bitmask des bits à inverser.
  • t $500a 32 cette commande bascule la valeur du bit 5 à l'adresse $500a qui est le registre PC_ODR. La LED2 de la carte est branchée sur ce bit. Donc en faisant cette commande l'état de la LED2 change.
  • t $500a 32 En enfonçant la combinaison de touche CTRL-R on réaffiche la dernière commande. Dans ce cas çi ça permet d'éteindre et d'allumer la LED2 en alternance en faisant uen série de CTRL-R ENTER.
  • t $500a $20 C'est la même commande sauf que j'ai indiqué la valeur de masque en hexadécimal. Plusieurs bits peuvent être inversés en même temps. Par exemple pour inverser les 8 bits il suffit de faire t addr 255.
Le fichier readme.md qui est dans le dossier mona décrit chacune des commandes en français.

Mes projets pour la carte nucleo-8s208rb sont dans un dépôt github. Pour cloner ce dépôt sur votre ordinateur, dans un répertoire de votre choix, faites la commande:


git clone https://github.com/picatout/stm8_nucleo
Pour mettre à jour le git lorsque j'ai fait des modfications au projet faites simplement:

git pull

Construire et flasher le programme

Chaque programme est dans un dossier séparé. Pour compiler un programme il faut se déplacer dans le dossier. Pour simplifier le tout j'ai créé un fichier Makefile. Voici une capture d'écran qui montre comment compiler et flasher mona sur la carte nucleo 8s208rb.

Donc après s'être déplacé dans le dossier mona j'ai fait la commande make et puisqu'il n'y avait pas d'erreur de compilation j'ai fait la commande make flash pour programmer la carte. Le message indique que le programme occupe 2225 octets dans la mémoire flash du microcontrôleur stm8s208rb

Analyse du code source de MONA

Dans les jours qui suivent je vais décrire le code source de MONA. Ça pourra servir de tutoriel pour l'écriture en assembleur de programme pour les MCU stm8. Je vais faire ce travail dans un fichier markdown MONA.md qu'il sera plus facile de lire sur le site web que dans un éditeur de texte.


NOTES

  1. SDCC signifit Small Device C Compiler.
  2. STM8 Microcontroller Development on Ubuntu. Livre numérique kindle à petit prix. Je recommande ce livre si vous lisez l'anglais. La dépense est minime.
  3. Au moment de l'écriture de cet article la version de SDCC disponible dans le dépôt d'Unbuntu 18.04 est la version 3.8.0 alors que la version sur souceforge.net est la version 3.9.0. Pour installer la version 3.9.0. il faut construire l'application à partir des sources. La procédure est disponible ici (en anglais).

Aucun commentaire:

Publier un commentaire

Remarque : Seuls les membres de ce blogue sont autorisés à publier des commentaires.