ESP8266 | ESP32 | |
---|---|---|
DRAM | 96KB | 328k |
Flash | 4MB | 4MB (suivant versions) |
Frequence | 80Mhz | 160 a 240 Mhz |
SRAM | 64KB | 520Kb |
GPIO | 17 | 36 |
Analog GPIO | 1 | 18 |
L'ESP32 comporte :
Instruction | Syntaxe | Description | Exemple |
---|---|---|---|
Add | ADD Rdst,Rsrc1,Rsrc2 ADD Rdst,Rsrc1,imm |
L'instruction ajoute un registre source à un autre registre source ou à une valeur signée de 16 bits et stocke le résultat dans le registre de destination. | 1:ADD R1, R2, R3 ;R1 = R2 + R3 2:ADD R1, R2, 0x1234 ;R1 = R2 + 0x1234 3:.set value1, 0x03 ;constant value1=0x03 ADD R1, R2, value1 ;R1 = R2 + value1 4:.global label ;declaration of variable label ADD R1, R2, label ;R1 = R2 + label ... ; label: nop ;definition of variable label |
Sub | SUB Rdst,Rsrc1,Rsrc2 SUB Rdst,Rsrc1,imm |
L'instruction soustrait le registre source d'un autre registre source ou soustrait une valeur signée 16 bits d'un registre source, et stocke le résultat dans le registre de destination. | 1:SUB R1, R2, R3 ;R1 = R2 - R3 2:SUB R1, R2, 0x1234 ;R1 = R2 - 0x1234 ; 3:.set value1, 0x03 ;constant value1=0x03 SUB R1, R2, value1 ;R1 = R2 - value1 4:.global label ;declaration of variable label SUB R1, R2, label ;R1 = R2 - label .... label: nop ;definition of variable label |
And | AND Rdst,Rsrc1,Rsrc2 AND Rdst,Rsrc1,imm |
L'instruction effectue un ET logique d'un registre source et d'un autre registre source ou d'une valeur signée 16 bits et stocke le résultat dans le registre de destination. | 1:AND R1, R2, R3 ;R1 = R2 & R3 2:AND R1, R2, 0x1234 ;R1 = R2 & 0x1234 3:.set value1, 0x03 ;constant value1=0x03 AND R1, R2, value1 ;R1 = R2 & value1 4:.global label ;declaration of variable label AND R1, R2, label ;R1 = R2 & label .... label: nop ;definition of variable label |
Or | OR Rdst,Rsrc1,Rsrc2 OR Rdst,Rsrc1,imm |
L'instruction effectue un OU logique d'un registre source et d'un autre registre source ou d'une valeur signée 16 bits et stocke le résultat dans le registre de destination. | 1: OR R1, R2, R3 ;R1 = R2 \| R3 2: OR R1, R2, 0x1234 ;R1 = R2 \| 0x1234 3: .set value1, 0x03 ;constant value1=0x03 OR R1, R2, value1 ;R1 = R2 \| value1 4: .global label ;declaration of variable label OR R1, R2, label ;R1 = R2 \|label .... label: nop ;definition of variable label |
Lsh | LSH Rdst,Rsrc1,Rsrc2 LSH Rdst,Rsrc1,imm |
L'instruction effectue un décalage logique vers la gauche du registre source vers le nombre de bits d'un autre registre source ou une valeur signée 16 bits et stocke le résultat dans le registre de destination. | 1:LSH R1, R2, R3 ;R1 = R2 << R3 2:LSH R1, R2, 0x03 ;R1 = R2 << 0x03 3:.set value1, 0x03 ;constant value1=0x03 LSH R1, R2, value1 ;R1 = R2 << value1 4:.global label ;declaration of variable label LSH R1, R2, label ;R1 = R2 << label .... label: nop ;definition of variable label |
Rsh | RSH Rdst,Rsrc1,Rsrc2 RSH Rdst,Rsrc1,imm |
L'instruction effectue un décalage logique vers la droite du registre source vers le nombre de bits d'un autre registre source ou une valeur signée 16 bits et stocke le résultat dans le registre de destination. | 1:RSH R1, R2, R3 ;R1 = R2 >> R3 2:RSH R1, R2, 0x03 ;R1 = R2 >> 0x03 3:.set value1, 0x03 ;constant value1=0x03 RSH R1, R2, value1 ;R1 = R2 >> value1 4:.global label ;declaration of variable label RSH R1, R2, label ;R1 = R2 >> label .... label: nop ;definition of variable label |
Nop | NOP | Aucune opération n'est effectuée. Seul le PC est incrémenté | 1:NOP |
Instruction | Syntaxe | Opérande | Description | Exemple |
---|---|---|---|---|
Move | MOVE Rdst,Rsrc MOVE Rdst,imm |
Rdst - Registre R [0..3] Rsrc - Registre R [0..3] Imm - valeur signée 16 bits |
L'instruction se déplace vers la valeur du registre de destination à partir du registre source ou de la valeur signée 16 bits. | 1:MOVE R1, R2 ;R1 = R2 2:MOVE R1, 0x03 ;R1 = 0x03 3:.set value1, 0x03 ;constant value1=0x03 MOVE R1, value1 ;R1 = value1 4:.global label ;declaration of label MOVE R1, label ;R1 = address_of(label) / 4 ... label: nop ;definition of label |
ST | ST Rsrc,Rdst,décalage |
Rsrc - R[0..3], contient la valeur 16 bits à stocker Rdst - R[0..3], adresse de la destination, en mots de 32 bits Décalage - valeur signée 10 bits, décalage en octets |
L'instruction stocke la valeur 16 bits de Rsrc dans le demi-mot inférieur de la mémoire avec l'adresse Rdst+offset. Le demi-mot supérieur est écrit avec le compteur de programme courant (PC), exprimé en mots, décalé vers la gauche de 5 bits Mem[Rdst+offset/4]{31:0}={PC[10:0],5'b0,Rsrc[15:0]} | 1: ST R1, R2, 0x12 ;MEM[R2+0x12] = R1 2: .data ;Data section definition Addr1: .word 123 ;Define label Addr1 16 bit .set offs, 0x00 ;Define constant offs .text ;Text section definition MOVE R1, 1 ;R1 = 1 MOVE R2, Addr1 ;R2 = Addr1 ST R1, R2, offs ;MEM[R2+0] = R1 ;MEM[Addr1+0] will be 32'h600001 |
LD | LD Rsrc,Rdst,décalage |
Rdst - R[0..3], destination Rsrc - R[0..3], contient l'adresse de destination, en mots de 32 bits Décalage - valeur signée 10 bits, décalage en octets |
L'instruction charge le demi-mot inférieur de 16 bits de la mémoire avec l'adresse Rsrc+offset dans le registre de destination Rdst: Rdst[15:0]=Mem[Rsrc+offset/4][15:0] | 1: LD R1, R2, 0x12 ;R1 = MEM[R2+0x12] 2: .data ;Data section definition Addr1: .word 123 ;Define label Addr1 16 bit .set offs, 0x00 ;Define constant offs .text ;Text section definition MOVE R1, 1 ;R1 = 1 MOVE R2, Addr1 ;R2 = Addr1 / 4 ;(address of label is converted into words) LD R1, R2, offs ;R1 = MEM[R2 + 0] ;R1 will be 123 |
Instruction | Syntaxe | Opérande | Description | Exemple |
---|---|---|---|---|
Jump | JUMP Rdst JUMP ImmAddr JUMP Rdst,Condition JUMP ImmAddr, Condition |
Rdst - Registre R [0..3] contenant l'adresse à laquelle sauter (exprimée en mots de 32 bits) ImmAddr - adresse 13 bits (exprimée en octets), alignée sur 4 octets Condition :
|
L'instruction fait sauter à l'adresse spécifiée. Le saut peut être inconditionnel ou basé sur un indicateur ALU. | 1: JUMP R1 ;Jump to address in R1 (address in R1 is in 32-bit words) 2: JUMP 0x120, EQ ;Jump to address 0x120 (in bytes) if ALU result is zero 3: JUMP label ;Jump to label ... label: nop ;Definition of label 4: .global label ;Declaration of global label MOVE R1, label ;R1 = label (value loaded into R1 is in words) JUMP R1 ;Jump to label ... label: nop ;Definition of label |
Jumpr | JUMPR Step,Threshold,Condition |
Step - décalage relatif par rapport à la position actuelle, en octets Threshold - valeur de seuil pour l'état de la branche Condition :
|
L'instruction fait un saut vers une adresse relative si la condition est vraie. La condition est le résultat de la comparaison de la valeur du registre R0 et de la valeur de seuil. | 1:pos: JUMPR 16, 20, GE ;Jump to address (position + 16 bytes) if value in R0 >= 20 2: ;Down counting loop using R0 register MOVE R0, 16 ; load 16 into R0 label: SUB R0, R0, 1 ; R0-- NOP ; do something JUMPR label, 1, GE ; jump to label if R0 >= 1 |
Jumps | JUMPS Step,Threshold,Condition |
Step - décalage relatif par rapport à la position actuelle, en octets Threshold - valeur de seuil pour l'état de la branche Condition :
|
L'instruction fait un saut vers une adresse relative si la condition est vraie. La condition est le résultat de la comparaison de la valeur du registre de comptage et de la valeur de seuil. | 1:pos: JUMPS 16, 20, EQ ; Jump to (position + 16 bytes) if stage_cnt == 20 2: ;Up counting loop using stage count register STAGE_RST ;set stage_cnt to 0 label: STAGE_INC 1 ;stage_cnt++ NOP ;do something JUMPS label, 16, LT ;jump to label if stage_cnt < 16 |
STAGE_RST | STAGE_RST | Pas d'opérandes | L'instruction définit le registre de comptage d'étapes sur 0. | 1: STAGE_RST ; Reset stage count register |
STAGE_INC | STAGE_INC Valeur | Valeur - valeur 8 bits | L'instruction incrémente le registre de comptage d'étages d'une valeur donnée. | 1: STAGE_INC 10 ;stage_cnt += 10 2: ;Up counting loop example: STAGE_RST ;set stage_cnt to 0 label: STAGE_INC 1 ;stage_cnt++ NOP ;do something JUMPS label, 16, LT ;jump to label if stage_cnt < 16 |
STAGE_DEC | STAGE_DEC Valeur | Valeur - valeur 8 bits | L'instruction incrémente le registre de comptage d'étages d'une valeur donnée. | 1: STAGE_DEC 10 ;stage_cnt -= 10 2: ;Up counting loop example: STAGE_RST ;set stage_cnt to 0 STAGE_INC 16 ;increment stage_cnt to 16 label: STAGE_DEC 1 ;stage_cnt-- NOP ;do something JUMPS label, 0, GT ;jump to label if stage_cnt > 0 |
HALT | HALT | Pas d'opérandes | L'instruction arrête le coprocesseur ULP et redémarre le temporisateur de réveil ULP, s'il est activé. | 1: HALT ;Halt the coprocessor |
WAKE | WAKE | Pas d'opérandes | L'instruction envoie une interruption de l'ULP au contrôleur RTC. | 1: is_rdy_for_wakeup: ;Read RTC_CNTL_RDY_FOR_WAKEUP bit READ_RTC_FIELD(RTC_CNTL_LOW_POWER_ST_REG, RTC_CNTL_RDY_FOR_WAKEUP) AND r0, r0, 1 JUMP is_rdy_for_wakeup, eq ; Retry until the bit is set WAKE ; Trigger wake up REG_WR 0x006, 24, 24, 0 ; Stop ULP timer (clear RTC_CNTL_ULP_CP_SLP_TIMER_EN) HALT ; Stop the ULP program ; After these instructions, SoC will wake up, ; and ULP will not run again until started by the main program. |
SLEEP | SLEEP sleep_reg | sleep_reg -0..4, sélectionne l'un des registres SENS_ULP_CP_SLEEP_CYCx_REG | L'instruction sélectionne laquelle des SENS_ULP_CP_SLEEP_CYCx_REG valeurs de registre (x = 0..4) doit être utilisée par le temporisateur de réveil ULP comme période de réveil. Par défaut, la valeur de SENS_ULP_CP_SLEEP_CYC0_REG est utilisée. | 1:SLEEP 1 ; Use period set in SENS_ULP_CP_SLEEP_CYC1_REG 2:.set sleep_reg, 4 ; Set constant SLEEP sleep_reg ;Use period set in SENS_ULP_CP_SLEEP_CYC4_REG |
WAIT | WAIT Cycles | Cycles - nombre de cycles d'attente | L'instruction retarde pour un nombre donné de cycles. | 1: WAIT 10 ;Do nothing for 10 cycles 2: .set wait_cnt, 10 ;Set a constant WAIT wait_cnt ;wait for 10 cycles |
TSENS | TSENS Rdst, Wait_Delay |
Rdst - Registre de destination R[0..3], le résultat sera stocké dans ce registre Wait_Delay - nombre de cycles utilisés pour effectuer la mesure |
L'instruction effectue une mesure à l'aide de TSENS et stocke le résultat dans un registre à usage général. | 1: TSENS R1, 1000 ;Measure temperature sensor for 1000 cycles, ;and store result to R1 |
ADC | ADC Rdst, Sar_sel, Mux | Rdst - Registre de destination R[0..3], le résultat sera stocké dans ce registre Sar_sel - Sélectionnez ADC: 0 = SARADC1, 1 = SARADC2 Mux - PAD sélectionné, le pad SARADC [Mux + 1] est activé |
L'instruction effectue des mesures à partir de l'ADC. | 1: ADC R1, 0, 1 ; Measure value using ADC1 pad 2 ;and store result into R1 |
I2C_RD | I2C_RD Sub_addr, High, Low, Slave_sel | Sub_addr - Adresse dans l'esclave I2C à lire. High , Low - Définit la plage de bits à lire. Les bits en dehors de la plage [High, Low] sont masqués. Slave_sel - Index de l'adresse d'esclave I2C à utiliser. |
I2C_RDl'instruction lit un octet de l'esclave I2C avec index Slave_sel. L'adresse de l'esclave (au format 7 bits) doit être définie à l'avance dans le champ de registre SENS_I2C_SLAVE_ADDRx , où 8 bits de résultat de lecture sont stockés dans le registre R0 == Slave_sel | 1: I2C_RD 0x10, 7, 0, 0 ;Read byte from sub-address 0x10 of slave ;with address set in SENS_I2C_SLAVE_ADDR0 |
I2C_WR | I2C_WR Sub_addr, Value, High, Low, Slave_sel | Sub_addr - Adresse dans l'esclave I2C à lire. Valeur - valeur 8 bits à écrire. High , Low - Définit la plage de bits à lire. Les bits en dehors de la plage [High, Low] sont masqués. Slave_sel - Index de l'adresse d'esclave I2C à utiliser. |
I2C_WRL'instruction écrit un octet dans l'esclave I2C avec index Slave_sel. L'adresse de l'esclave (au format 7 bits) doit être définie à l'avance dans le champ de registre SENS_I2C_SLAVE_ADDRx , où x == Slave_sel | 1: I2C_WR 0x20, 0x33, 7, 0, 1 ; Write byte 0x33 to sub-address 0x20 of slave ;with address set in SENS_I2C_SLAVE_ADDR1. |
REG_RD | REG_RD Addr , haut, bas | Addr - Adresse de registre, en mots de 32 bits Haut - Numéro de bit de fin de registre Low - Numéro de bit de démarrage du registre |
L'instruction lit jusqu'à 16 bits à partir d' un registre périphérique dans un registre à usage général: R0 = REG[Addr][High:Low] | 1: REG_RD 0x120, 7, 4 ;load 4 bits: R0 = {12'b0, REG[0x120][7:4]} |
REG_WR | REG_WR Addr , haut, bas, Data | Addr - Adresse de registre, en mots de 32 bits Haut - Numéro de bit de fin de registre Low - Numéro de bit de démarrage du registre Data - Valeur à écrire, 8 bits |
L'instruction écrit jusqu'à 8 bits à partir d' une valeur de données immédiates dans un registre périphérique: REG[Addr][High:Low] = data | 1: REG_WR 0x120, 7, 0, 0x10 ; set 8 bits: REG[0x120][7:0] = 0x10 |