MECRISP est un Forth développé par Matthias Koch originalement pour les µC MSP430 mais a été depuis porté sur de nombreuses plateformes. Dans cet article j'installe MECRISP sur une carte blue pill et le met à l'essaie.
Les références utilisées pour cet article sont les suivantes.
- Moving Forth with Mecrisp-Stellaris and Embello (en anglais).
- MECRISP sur sourceforge (en anglais).
- hackaday-Forth, version augmentée de MECRISP selon l'article mentionné dans la première référence (en anglais).
- STM32F1xx technical reference manual, RM0008 (en anglais).
- STM32F103x8 datasheet, DS5319 (en anglais).
Installation de MECRISP sur la carte blue pill
Le projet MECRISP est sur sourceforge. Il faut télécharger le fichier https://sourceforge.net/projects/mecrisp/files/mecrisp-stellaris-2.4.4.tar.gz/download et le décompresser.
On va dans le répertoire contenant les fichiers du stm32f103
$ ls
1w.fs lcd-ptinting.fs si4432_spi.fs
font16x30.fs mecrisp-stellaris-stm32f103.bin si-test.fs
lcd-base.fs mecrisp-stellaris-stm32f103.hex stm32f103.fs lcd-graphics.fs precompiled
st-flash 1.4.0-47-gae717b9-dirty
2018-08-13T16:57:12 INFO usb.c: -- exit_dfu_mode
2018-08-13T16:57:12 INFO common.c: Loading device parameters....
2018-08-13T16:57:12 INFO common.c: Device connected is: F1 Medium-density device, id 0x20036410
2018-08-13T16:57:12 INFO common.c: SRAM size: 0x5000 bytes (20 KiB), Flash: 0x10000 bytes (64 KiB) in pages of 1024 bytes
2018-08-13T16:57:12 INFO common.c: Attempting to write 15696 (0x3d50) bytes to stm32 address: 134217728 (0x8000000)
Flash page at addr: 0x08003c00 erased
2018-08-13T16:57:12 INFO common.c: Finished erasing 16 pages of 1024 (0x400) bytes
2018-08-13T16:57:12 INFO common.c: Starting Flash write for VL/F0/F3/F1_XL core id
2018-08-13T16:57:12 INFO flash_loader.c: Successfully loaded flash loader in sram
16/16 pages written
2018-08-13T16:57:13 INFO common.c: Starting verification of write complete
2018-08-13T16:57:13 INFO common.c: Flash written and verified! jolly good!
Utilisation de MECRISP FORTH
Pour voir la liste des mots du dictionnaire MECRISP consultez le fichier README. En plus des mots commun à toutes les plateformes il y a une section pour chaque µC pour les mots spécifiques à chacun.
Au démarrage MECRISP compile les nouveaux mots dans la mémoire RAM. Donc à la réinitialisation les nouvelles définitions sont perdues. Une fois qu'une définition est testée on peu la redéfinir en mémoire flash. Le mot compiletoflash permet de compiler en mémoire flash. Le mot compiletoram permet de revenir à la compilation en mémoire RAM. Pour savoir si la compilation à lieu en mémoire RAM il y a le mot compiletoram? qui retourne -1 si c'est le cas sinon retourne zéro.
branchement de la carte au port sériel.
Il n'y a que 4 fils à brancher.
description |
---|
GND commun de l'alimentation |
3v3 alimentation pour la carte et l'adapteur RS-232 |
TX broche A9 de la carte va à RX de l'adapteur RS-232 |
RX broche A10 de la carte va à TX de l'adapteur RS-232. |
J'utilise minicom pour la communication entre le PC et la carte. Ouvrons un terminal et lançons minicom.
L'option -b indique la vitesse de communication, soit 115200 BAUD.
OPTIONS: I18n
Compilé le Feb 7 2016, 13:37:27.
Port /dev/ttyS0, 09:32:44
Tapez CTRL-A Z pour voir l'aide concernant les touches spéciales
exemple:
567 .ok
\ voyons l'état de la pile .ok
.s Stack: [1 ] 42 TOS: 567 *>
ok.
\ le nombre 567 a ete empile ok.
xyz xyz not found.
\ xyz n'est pas un mot reconnu ok.
.s Stack: [0 ] TOS: 567 *>
ok.
\ la pile est vide
Sur la deuxième ligne j'ai saisi xyz. L'interpréteur de commande n'a pas trouvé ce mot dans le dictionnaire, il affiche donc le message not found et vide les piles. Notez que TOS indique toujours 567. Cependant .s indique bien que la pile contient [ 0 ] éléments. La façon dont la commande .s travaille peu prêter à confusion. .s affiche toujours un élément de trop. Cet élément est le contenu de la mémoire RAM pointé par le pointeur de pile lorsque la pile est vide. Ainsi dans la première utilisation de .s le nombre 42 est indiqué alors qu'il ne fait pas partir des arguments disponibles. Dans le deuxième appel .s indique 567 au sommet alors que la pile est vide. Il faut considérer ça comme un bogue de la commande .s.
Maintenant on va créer un programme pour faire clignoter la LED verte qui est sur la carte. Cette LED est branchée sur PC15. C'est à dire le port C bit 15.
\ les constantes pour les addresse des SFR tel \ que trouvé dans manuel de référence du STM32F103C8t6 $40011000 constant gpioc_crl ok. $40011004 constant gpioc_crh ok. $40011010 constant gpioc_bsrr ok. $40011014 constant gpioc_brr ok. $44644444 gpioc_crh ! ok. : led_on ( -- ) \ allume led verte ok. 13 pwr2 gpioc_brr ! ; ok. : led_off ( -- ) \ eteint led verte ok. 13 pwr2 gpioc_bsrr ! ; ok. : delay ( u -- ) \ busy loop ok. 1000 * 0 do i drop loop ; ok. : blink ( speed -- ) \ clignote led verte jusqu'a touche enfoncee ok. begin led_on dup delay led_off dup delay key? until key 2drop ; ok. 100 blink ok. 50 blink ok.
Je suis curieux de savoir comment MECRISP configure le system clock En consultant le manuel de référence on trouve 2 registres pour la configuration du clock, Clock Control Register rcc_cr et Clock Configuration Register rcc_cfgr Je vais définir les constantes pour ces registres et le mot prt-field pour voir le contenu binaire d'un champ du registre.
$40021000 constant rcc-base-adr \ adresse de base rcc ok. rcc-base-adr constant rcc-cr \ offset 0 ok. rcc-base-adr 4 + constant rcc-cfgr \ offset 4 ok. rcc-cfgr @ h. 0 ok. rcc-cr @ h. 4A83 ok.
Un brin de Folie
Travailler directement dans minicom n'est pas pratique en autre pour corriger les erreurs ou inclure des fichiers source Forth. Heureusement Jean-Claude Wippler auteur du blog Jeelabs a créer une console sérielle pour nous faciliter la tâche. Cette console s'appelle Folie. Nous allons donc l'installer et l'utiliser à la place de minicom.
Des binaires de l'application sont disponible ici.
- Téléchargé le fichier folie-linux-x64.gz
- dézipper le fichier
- rendre le fichier exécutable
- créer un lien dans mon dossier ~/bin avec un nom plus court.
- Se déplacer dans le dossier mecrisp-Stellaris qui contient le fichier stm32f103.fs
- Lancer folie en indiquant le port sériel utilisé.
gunzip folie-linux-x64.gz chmod +x folie-linux-x64 ln "/home/jacques/Documents/blue pill/mecrisp/folie-linux-x64" /home/jacques/bin cd "~/Documents/blue pill/mecrisp/mecrisp-*/stm32f103" folie -p /dev/ttyS0 ok.
J'utilise geany comme éditeur. Geany reconnais les fichiers avec l'extension .fs comme étant des fichiers Forth et fait la coloration de la syntaxe. J'ai créer le fichier picatout.fs avec quelques définitions de mon cru.
include picatout.fs
Pour compiler le fichier. Folie ne semble interpréter les fins de lignes correctement. J'ai essayé avec des fins de lignes LF, CR et
CRLF et aucune ne fonctionne correctement cependant la compilation fonctionne sans erreur même si l'affichage est défectueux. Testons les nouveaux mots.
\ combien de mots dans le dictionnaire? ok. wc u. 350 ok. \ flash libre? ok. flash-free u. 48800 ok. \ ram-libre? ok. ram-free u. 19472 ok. \ impression en binaire ok. 45 bin. 101101 ok. \ extraction d'un champ ok. 45 3 3 bitfield bin. 101 ok. \ puissance de 2 ok. 15 pwr2 u. 32768 ok.
forgetram \ efface les mots en RAM compiletoflash \ compile en flash include picatout.fs \ compile le fichier en flash compiletoram \ revient à la compilation en RAM
Dans le dossier mecrisp-stallaris-2.4.4/stm32103 il y a plusieurs fichiers .fs qui peuvent-être inclus. Celui nommé stm32f103.fs contient la définitions des constantes pour toutes les adresses des registres spéciaux du stm32f103c8t6. Il y en plus de 500. Après cette inclusion, wc rapporte 852 mots et flash-free 32928 octets libres.
NOTE:
Je ne sais pas si le problème est avec mon ordinateur mais lorsque je fais une commande include dans Folie, quelque secondes après la fin de l'opération le disque dur de mon ordinateur se met à trasher et l'ordinateur ne répond plus m'obligeant à l'éteindre. C'est à 3ième fois que je recommence la section de cet article consacrée à Folie, hum!!
installation de hackaday-forth
A lieu d'installer MECRISP de base vous pouvez installer la version hackaday-forth.
- Clonez le dépôt sur votre ordinateur
git clone https://github.com/hexagon5un/hackaday-forth
- Déplacez-vous dans le dossier ROMS et faites la commande:
st-flash write mecrisp-stellaris-hackaday-edition.bin 0x8000000Cette version prend beaucoup plus de mémoire flash, il ne reste que 31744 octets pour les applications.
- Lancez minicom si ce n'est pas déja fait
retour à l'introduction
Aucun commentaire:
Publier un commentaire
Remarque : Seuls les membres de ce blogue sont autorisés à publier des commentaires.