Manipulation des registres ESP32
publication: 1 janvier 2022 / mis à jour 10 mai 2024
Le but de cet article est de reprendre les mots mtest
,
mclr
et mset
déjà définis dans la version Flashforth
pour ARDUINO. Ces mots n'existent pas dans ESP32Forth.
Les registres ESP32
Les registres des cartes ESP32 sont très nombreux. On retrouve ces registres dans la
documentation technique diffusée par la sté EXPRESSIF ici:
ESP32 Technical Reference Manual
Extrait de la page 631:
Ici, ces deux registres SENS_SAR_DAC_CTRL1_REG et SENS_SAR_DAC_CTRL2_REG peuvent se définir en langage FORTH très simplement comme ceci:
\ DAC control registers
$3FF48898 constant SENS_SAR_DAC_CTRL1_REG
$3FF4889C constant SENS_SAR_DAC_CTRL2_REG
Récupérer le contenu d'un registre
Pour récupérer le contenu de ce registre APB_SARADC_CTRL_REG, utilisons
le mot UL@
:
hex SENS_SAR_DAC_CTRL1_REG UL@ . \ display 0 SENS_SAR_DAC_CTRL2_REG UL@ . \ display 3000000
UL@
récupère un contenu 32 bits à partir de l'adresse spécifiée.
La valeur $0 récupérée lors de l'exécution de SENS_SAR_DAC_CTRL1_REG UL@
doit être analysée en fonction de la position de certains bits de ce registre:
Contrôle DAC.
- SENS_DAC_CLK_INV 1: inverse PDAC_CLK, 0: pas d'inversion. (R/W)
- SENS_DAC_CLK_FORCE_HIGH force PDAC_CLK à 1. (R/W)
- SENS_DAC_CLK_FORCE_LOW force PDAC_CLK à 0. (R/W)
- SENS_DAC_DIG_FORCE 1: DAC1 et DAC2 utilisent DMA, 0: DAC1 et DAC2 n'utilisent pas DMA. (R/W)
- SENS_SW_TONE_EN 1: valide le générateur CW, 0: dévalide le générateur CW. (R/W)
- SENS_SW_FSTEP Pas de fréquence du générateur CW; peut être utilisé pour ajuster la fréquence. (R/W)
\ Registers set for DAC control $3FF48898 constant SENS_SAR_DAC_CTRL1_REG \ DAC control
De même, la valeur $3000000 récupérée lors de l'exécution de SENS_SAR_DAC_CTRL2_REG UL@
doit être analysée en fonction de la position de certains bits de ce registre:
DAC output control .
- SENS_DAC_CW_EN2 1: sélection du générateur CW comme source pour PDAC2_DAC[7:0], 0: sélectionne le registre reg_pdac2_dac[7:0] comme source pour PDAC2_DAC[7:0]. (R/W)
- SENS_DAC_CW_EN1 1: sélection du générateur CW comme source pour PDAC1_DAC[7:0], 0: sélectionne le registre reg_pdac1_dac[7:0] comme source pour PDAC1_DAC[7:0]. (R/W)
- SENS_DAC_INV2 DAC2, 00: aucune inversion de bits, 01: inversion de tous les bits, 10: inversion bits hauts MSB, 11: inversion de tous les bits sauf bits hauts MSB. (R/W)
- SENS_DAC_INV1 DAC1, 00: aucune inversion de bits, 01: inversion de tous les bits, 10: inversion bits hauts MSB, 11: inversion de tous les bits sauf bits hauts MSB. (R/W)
- SENS_DAC_SCALE2 DAC2, 00: pas de rapport; 01: rapport à 1/2; 10: rapport à 1/4; 11: rapport à 1/8. (R/W)
- SENS_DAC_SCALE1 DAC1, 00: pas de rapport; 01: rapport à 1/2; 10: rapport à 1/4; 11: rapport à 1/8. (R/W)
- SENS_DAC_DC2 décalage DC pour le générateur DAC2. (R/W)
- SENS_DAC_DC1 décalage DC pour le générateur DAC1. (R/W)
\ Registers set for DAC control $3FF4889c constant SENS_SAR_DAC_CTRL2_REG \ DAC output control
La valeur $3000000 du registre SENS_SAR_DAC_CTRL2_REG
nous indique que les bits b24 et
b25 sont à 1. Sur la figure ci-dessus, ils sont marqués par les étiquettes SENS_DAC_CW_EN1 et
SENS_DAC_CW_EN2.
Récupération de l'état d'un bit de registre avec mtst
Voyons comment récupérer l'état du bit b16 du registre SENS_SAR_DAC_CTRL1_REG:
hex SENS_SAR_DAC_CTRL1_REG UL@ \ get content of SENS_SAR_DAC_CTRL1_REG register $00010000 and \ mask bit b16
Définissons le mot mtst
comme suit:
\ mask addr content : mtst ( mask addr -- x ) UL@ and ; \ test bit b16 of SENS_SAR_DAC_CTRL1_REG register $00010000 SENS_SAR_DAC_CTRL1_REG mtst \ if 0=, bit b16 is 0 \ if 0<>, bit b16 is 1
Le bit b16, est étiqueté SENS_SW_TONE_EN. Voici comment définir une constante avec cette étiquette:
$00010000 constant SENS_SW_TONE_EN
ou comme ceci:
decimal 1 16 lshift constant SENS_SW_TONE_EN \ test bit SENS_SW_TONE_EN of SENS_SAR_DAC_CTRL1_REG register SENS_SW_TONE_EN SENS_SAR_DAC_CTRL1_REG mtst \ if 0=, bit b16 is 0 \ if 0<>, bit b16 is 1
Modifier le contenu d'un registre
Voici comment, en langage C, on met à 1 le bit b16, pointé par l'étiquette SENS_SW_TONE_EN; du contenu du registre SENS_SAR_DAC_CTRL1_REG.
SET_PERI_REG_MASK(SENS_SAR_DAC_CTRL1_REG, SENS_SW_TONE_EN);
En langage C, c'est la macro SET_PERI_REG_MASK()
qui effectue
cette modification.
Sur Flashforth pour ARDUINO, il existe déjà le mot mset
. Pour
ESP32Forth, on le définira comme suit:
: mset ( mask addr -- )
dup UL@
rot or swap L!
;
1 24 lshift constant SENS_DAC_CW_EN1
1 25 lshift constant SENS_DAC_CW_EN2
SENS_DAC_CW_EN1 SENS_SAR_DAC_CTRL2_REG mset
SENS_DAC_CW_EN2 SENS_SAR_DAC_CTRL2_REG mset
\ clear masked addr content
: mclr ( c addr --)
dup L@
rot and swap L!
;
SENS_DAC_CW_EN1 SENS_SAR_DAC_CTRL2_REG mclr
SENS_DAC_CW_EN2 SENS_SAR_DAC_CTRL2_REG mclr
Legal: site web personnel sans commerce / personal site without seling