Manipulation des registres ESP32

publication: 1 janvier 2022 / mis à jour 10 mai 2024

Read this page in english

 


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.

\ 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 .

\ 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