pinMode(Vext, OUTPUT) after deep sleep crashes Wireless Shell

I’m programming a wireless shell with Arduino environment:
https://github.com/Heltec-Aaron-Lee/WiFi_Kit_series and
https://github.com/HelTecAutomation/ESP32_LoRaWAN

Setting pin mode of GPIO21(Vext) to OUTPUT works on first boot but crash the esp32 after deep sleep.

Does Anyone have the same problem or can use Vext after deep sleep?

hi,

we recommend you add “pinMode(Vext,OUTPUT);digitalWrite(Vext, LOW);” in this function:
%E5%9B%BE%E7%89%87

Because VEXT will be closed after ESP32 sleeps.

I tried this. But the result is the same:
It works after first boot. But after deep sleep the CPU crashes shortly after prepareTxFrame() then.

hi,

can you show your code.

of course. I created a minimal example to demonstrate the crash.

This is the Arduino OTAA example. I changed isTxConfirmed and overTheAirActivation to false and added the license.
The only code change is adding pinMode(Vext, OUTPUT); in setup() in this case.
There is no difference in where I put the pinMode() or if I actually use digitalWrite(). Setting the pinMode to OUTPUT anywhere in the sketch crashes the CPU after a deep sleep.

This is the output of above sketch on serial port:

Hi,

I’m sorry.

Due to network restrictions, some websites cannot be accessed normally on our side. Can you directly post your code?

`/*

  • HelTec Automation™ LoRaWAN 1.0.2 OTAA example use OTAA, CLASS A
  • Function summary:
    • use internal RTC(150KHz);
    • Include stop mode and deep sleep mode;
    • 15S data send cycle;
    • Informations output via serial(115200);
    • Only ESP32 + LoRa series boards can use this library, need a license
  • to make the code run(check you license here: http://www.heltec.cn/search/);
  • You can change some definition in “Commissioning.h” and “LoRaMac-definitions.h”
  • HelTec AutoMation, Chengdu, China.
  • 成都惠利特自动化科技有限公司
  • https://heltec.org
  • support@heltec.cn

*this project also release in GitHub:
*https://github.com/HelTecAutomation/ESP32_LoRaWAN
*/

#include <ESP32_LoRaWAN.h>
#include “Arduino.h”

/*license for Heltec ESP32 LoRaWan, quary your ChipID relevant license: http://resource.heltec.cn/search */
//uint32_t license[4] = {0xaa397DF0, 0x85aaF814, 0x7A38C73D, 0x48E68607};
uint32_t license[4] = {0xXXXXXXXX,0xXXXXXXXX,0xXXXXXXXX,0xXXXXXXXX};

/* OTAA para*/
uint8_t DevEui[] = { 0x22, 0x32, 0x33, 0x00, 0x00, 0x88, 0x88, 0x02 };
uint8_t AppEui[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
uint8_t AppKey[] = { 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x66, 0x01 };

/* ABP para*/
uint8_t NwkSKey[] = { 0x15, 0xb1, 0xd0, 0xef, 0xa4, 0x63, 0xdf, 0xbe, 0x3d, 0x11, 0x18, 0x1e, 0x1e, 0xc7, 0xda,0x85 };
uint8_t AppSKey[] = { 0xd7, 0x2c, 0x78, 0x75, 0x8c, 0xdc, 0xca, 0xbf, 0x55, 0xee, 0x4a, 0x77, 0x8d, 0x16, 0xef,0x67 };
uint32_t DevAddr = ( uint32_t )0x007e6ae1;

/LoraWan channelsmask, default channels 0-7/
uint16_t userChannelsMask[6]={ 0x00FF,0x0000,0x0000,0x0000,0x0000,0x0000 };

/LoraWan Class, Class A and Class C are supported/
DeviceClass_t loraWanClass = CLASS_A;

/the application data transmission duty cycle. value in [ms]./
uint32_t appTxDutyCycle = 15000;

/OTAA or ABP/
bool overTheAirActivation = false;

/ADR enable/
bool loraWanAdr = true;

/* Indicates if the node is sending confirmed or unconfirmed messages */
bool isTxConfirmed = false;

/* Application port */
uint8_t appPort = 2;

/*!

  • Number of trials to transmit the frame, if the LoRaMAC layer did not
  • receive an acknowledgment. The MAC performs a datarate adaptation,
  • according to the LoRaWAN Specification V1.0.2, chapter 18.4, according
  • to the following table:
  • Transmission nb | Data Rate
  • ----------------|-----------
  • 1 (first) | DR
  • 2 | DR
  • 3 | max(DR-1,0)
  • 4 | max(DR-1,0)
  • 5 | max(DR-2,0)
  • 6 | max(DR-2,0)
  • 7 | max(DR-3,0)
  • 8 | max(DR-3,0)
  • Note, that if NbTrials is set to 1 or 2, the MAC will not decrease
  • the datarate, in case the LoRaMAC layer did not receive an acknowledgment
    */
    uint8_t confirmedNbTrials = 8;

/*LoraWan debug level, select in arduino IDE tools.

  • None : print basic info.
  • Freq : print Tx and Rx freq, DR info.
  • Freq && DIO : print Tx and Rx freq, DR, DIO0 interrupt and DIO1 interrupt info.
  • Freq && DIO && PW: print Tx and Rx freq, DR, DIO0 interrupt, DIO1 interrupt and MCU deepsleep info.
    */
    uint8_t debugLevel = LoRaWAN_DEBUG_LEVEL;

/LoraWan region, select in arduino IDE tools/
LoRaMacRegion_t loraWanRegion = ACTIVE_REGION;

static void prepareTxFrame( uint8_t port )
{
appDataSize = 4;//AppDataSize max value is 64
appData[0] = 0x00;
appData[1] = 0x01;
appData[2] = 0x02;
appData[3] = 0x03;
}

// Add your initialization code here
void setup()
{
Serial.begin(115200);
while (!Serial);
SPI.begin(SCK,MISO,MOSI,SS);
Mcu.init(SS,RST_LoRa,DIO0,DIO1,license);
deviceState = DEVICE_STATE_INIT;
delay(500);
pinMode(Vext,OUTPUT);
}

// The loop function is called in an endless loop
void loop()
{
switch( deviceState )
{
case DEVICE_STATE_INIT:
{
LoRaWAN.init(loraWanClass,loraWanRegion);
break;
}
case DEVICE_STATE_JOIN:
{
LoRaWAN.join();
break;
}
case DEVICE_STATE_SEND:
{
prepareTxFrame( appPort );
LoRaWAN.send(loraWanClass);
deviceState = DEVICE_STATE_CYCLE;
break;
}
case DEVICE_STATE_CYCLE:
{
// Schedule next packet transmission
txDutyCycleTime = appTxDutyCycle + randr( -APP_TX_DUTYCYCLE_RND, APP_TX_DUTYCYCLE_RND );
LoRaWAN.cycle(txDutyCycleTime);
deviceState = DEVICE_STATE_SLEEP;
break;
}
case DEVICE_STATE_SLEEP:
{
LoRaWAN.sleep(loraWanClass,debugLevel);
break;
}
default:
{
deviceState = DEVICE_STATE_INIT;
break;
}
}
}`

Serial Output:

Rebooting…
ets Jun 8 2016 00:22:57

rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 188777542, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1044
load:0x40078000,len:8896
load:0x40080400,len:5816
entry 0x400806ac
[E][esp32-hal-cpu.c:115] removeApbChangeCallback(): not found func=400D8DFC arg=3FFBECB0
ESP32 MCU init…
ESP32 MCU inited OK!

LoRaWAN EU868 Class A start!

unconfirmed uplink sending …
TX on freq 868100000 Hz at DR 0
DIO0:TX Done
RX on freq 868100000 Hz at DR 0
DIO1:RX Timeout
RX on freq 869525000 Hz at DR 0
DIO1:RX Timeout
Deep Sleep until Next TxPacket:10672 ms
ets Jun 8 2016 00:22:57

rst:0x5 (DEEPSLEEP_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 188777542, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1044
load:0x40078000,len:8896
load:0x40080400,len:5816
entry 0x400806ac
[E][esp32-hal-cpu.c:115] removeApbChangeCallback(): not found func=400D8DFC arg=3FFBECB0
Guru Meditation Error: Core 0 panic’ed (IllegalInstruction). Exception was unhandled.
Memory dump at 0x400f03c0: f2fdebfe f9bdf3ff fefdbfff
Core 0 register dump:
PC : 0x400f03c4 PS : 0x00050031 A0 : 0x400f259a A1 : 0x3ffbe1d0
A2 : 0x00060120 A3 : 0x3ffbe808 A4 : 0x40084b80 A5 : 0x00000001
A6 : 0x00000000 A7 : 0x00000000 A8 : 0x800dc1aa A9 : 0x4008ab48
A10 : 0x00000000 A11 : 0x40085308 A12 : 0x00000000 A13 : 0x3ffbb970
A14 : 0x00000000 A15 : 0x3ffbbce0 SAR : 0x0000001d EXCCAUSE: 0x00000000
EXCVADDR: 0x00000000 LBEG : 0x00000000 LEND : 0x00000000 LCOUNT : 0x00000000
Core 0 was running in ISR context:
EPC1 : 0x400f03c4 EPC2 : 0x00000000 EPC3 : 0x00000000 EPC4 : 0x00000000

Backtrace: 0x400f03c4:0x3ffbe1d0 0x400f2597:0x3ffbbff0 0x400dcb77:0x3ffbc010 0x40089ce6:0x3ffbc030 0x400887a5:0x3ffbc050

Rebooting…

hi,

we have tested your code. it is normal.

could you modified these para?
%E5%9B%BE%E7%89%87

yes. But it is no difference, except joining and confirmed sending takes more time until first deep sleep.

Does it really work after deep sleep additional crash reset? Could it be related to library Versions?
I use latest version from https://github.com/Heltec-Aaron-Lee/WiFi_Kit_series and
https://github.com/HelTecAutomation/ESP32_LoRaWAN

sorry, How do you judge the ESP32 chip crash? Serial port print log?

yes, IllegalInstruction Exception on Serial log.

hi,

maybe that board breaken. could you test another board?

yes, maybe it is a hardware problem.

Currently I have only one test device. I will test on another one soon.