Wio LTE Cat 1 notes

Here’s my notes on the Wio LTE 4G GNSS Cat 1 https://www.seeedstudio.com/Wio-LTE-US-Version-4G-Cat-1-GNSS.html

  1. Use the SeeedJP hardware not the version from the wiki.
    This is the URL for the boards manager http://www.seeed.co.jp/package_SeeedJP_index.json
    The board is “Seeed Wio LTE Cat.1”
    The wiki version uses outdated libraries and you will have problems using most other STM libraries, including the RTC and low power libraries below.

  2. Use the SeeedJP library not the version in the wiki
    It is more extensive and works far better than the version listed in the wiki.

  3. For low power you will need both the RTC and low power libraries.

  4. There is some messing around with drivers to get both the DFU programming and USB debug output working smoothly. Basically when you put the Wio into DFU mode the USB serial goes away. Some serial terminals, including that built into Arduino IDE, can not handle that. So try other serial terminals until you find one that works.

  5. Add a delay in the setup() function to allow the USB serial to enumerate under windows. 2 seconds or less works.

  6. The JP board library does not have the battery voltage for some reason. I ended up editing
    C:\Users\xxxx\AppData\Local\Arduino15\packages\SeeedJP\hardware\stm32\1.7.0\variants\WIO_LTE\PeripheralPins.c and enabling the PB_0 analog input, then

#define PIN_BAT_C 16
pinMode(PIN_BAT_C, INPUT_ANALOG); // battery voltage
bat_volts_mv = (analogRead(PIN_BAT_C) * 1000) / 620;
// 4200 mV = charging/full charged
  1. The battery connector is the JST-SHR 1mm Be careful because there are some batteries available with this connector but most have the polarity reversed.

  2. Power consumption with the EC21 off is around 70 mA. Using low power idle or sleep it is 15-20 mA, and deepSleep is 1-2 mA. deepSleep is harder to wake from as some re-initialization is required. It might be possible to go lower than 1 mA with more optimization but that was good enough for me.

  3. WioLTE::GetTime has some fixed offsets for the return string from AT+CCLK which might need tweaking.

  4. In some power saving modes the systick stops so for timing you need to switch from millis() to your own function which uses the rtc. Because sooner or later you’ll end up with your loop function calling other functions at a specific time interval, which will get messed up if the systick stops during sleep.

Otherwise it is working fairly smoothly and the hardware works well. For a hardware revision I’d put the boot0 button on the top of the board and get rid of the EC21 key switch, and also have more i2c connectors and fewer analog, and get rid of the headphone/microphone circuit. A 2mm JST connector for the battery would be good to. Spending some time to get the DFU to work like the SAMD21 with both flash programming and USB serial debug would be nice too. I’m not sure if that is a difference in hardware which the STM32 cannot do.

  1. I had to add a direct AT command function to the library, because my network requires some configuration before opening a socket.
// send cmd and waits for OK
bool WioLTE::cmd(const char * cmd, const unsigned int timeout)
  bool ret = _AtSerial.WriteCommandAndReadResponse(cmd, "^OK$", timeout, NULL);
  return ret;

Wio.cmd("AT+QNVFW=\"/nv/item_files/modem/mmode/ue_usage_setting\",01", 1000);