Skip to content
jcaridadhdez edited this page May 3, 2018 · 5 revisions

Welcome to the RAK811-tracker wiki!

Application information

This application sends through ports 2, 3 and 4 the information from the sensors on the board. On port 2 it sends the GPS information, on port 3 it sends the battery information and on port 4 the acceleration data. This data is sent every 20 seconds, so a GPS cycle is performed every minute. This can be varied in the code by varying the value of APP_TX_DUTYCYCLE.

Because of this way of sending data, once you have copied the contents of the decoder.js file into your decoder functions, you must also filter port 2 in the ttnmapper integration.

PLATFORMIO Configuration

Add new board definition

The earlier versions of the board only had 16K ram so stm32l15xx6.ld is default as linker script. If you want to use the full 32K ram you can change this line before copy "ldscript": "/home/olof/rak/STM32L151XBA_FLASH.ld"

If you use, platformio ide, press

1) Home button
2) Platforms/ST STM32 reveal button

Instruction

cp rak811.json ~/.platformio/platforms/ststm32/boards/rak811.json

If you do not have this directory: ".platformio/platforms/ststm32":

pio platform install ststm32

Setting Up

This example is preconfigured to use it in EU868 region. If you want to use it in other region such as US915, AU915 or others you have to change region in platformio.ini

Then in Comissioning.h file please enter your own DEVEUI, APPEUI, APPKEY to reach your application.

Compile

pio run

OS Configuration

If you are using Windows or macOS it is not needed to do anything before flashing the firmware compiled.

In linux OS, it is needed to instal stm32flash before try flashing the board. This can be done by typing this in your terminal:

Debian and derivates:

apt install stm32flash

ArchLinux and derivates:

yaourt -S stm32flash

Others: you can download the tar file stm32flash from sourceforge and compile it.

Booting on flash-mode or normal-mode

To be able to flash your new firmware, your board must boot in flash-mode. This can be made by changing the jumper included to this position

FLASH-MODE

After changed it, you can plug the USB and the board will boot in flash mode. Once flashed your device, the jumper must change back again to the original position to boot in normal-mode

NORMAL-MODE

Finally if the board is powered, it will boot with following the instructions on the new firmware.

To flash firmware

You can use the platformio, it comes with stlinkv2 Just move the BOOT strap from normal boot position to flash position

pio run --target upload --upload-port /dev/ttyUSB0

Or if you want in stm32flash_src there is code to flash the device.

macOS:

./stm32flash_src/stm32flash -w .pioenvs/rak811/firmware.bin /dev/ttyUSB0

To reset and start after download, try

./stm32flash_src/stm32flash -w .pioenvs/rak811/firmware.bin -v -g 0x0 /dev/ttyUSB0

Linux:

stm32flash /dev/ttyUSB0 -e 254 -w .pioenvs/rak811/firmware.bin

It is possible that the board can't be written. In this case, you have to disable write protection:

stm32flash /dev/ttyUSB0 -k

and then:

stm32flash /dev/ttyUSB0 -e 254 -w .pioenvs/rak811/firmware.bin

As seen in stm32flash wiki

If some steps fail, unplug the board from the usb and plug again.

Windows

stm32flash_src/stm32flash.exe -E -w .pioenvs/rak811/firmware.bin COM15

Start

Unplug the board from the usb, change the jumper to the normal-boot position. Now it starts and outputs debug information on UART,

Move Detected INT1 src:0x48
[Debug]: tempr: 35 Bat: 3988mv
[Debug]: ACC X:FF00 Y:0000 Z:FF00
GpsGetLatestGpsPositionDouble ret = 1

Qemu

I have made a simple qemu board emulation and its possible to start and run in qemu, Read more here running in qemu

MCU information

Interface serial_posix: 57600 8E1
Version      : 0x31
Option 1     : 0x00
Option 2     : 0x00
Device ID    : 0x0429 (STM32L1xxx6(8/B)A)
- RAM        : 32KiB  (4096b reserved by bootloader)
- Flash      : 128KiB (size first sector: 16x256)
- Option RAM : 32b
- System RAM : 4KiB

http://www.st.com/content/ccc/resource/technical/document/reference_manual/cc/f9/93/b2/f0/82/42/57/CD00240193.pdf/files/CD00240193.pdf/jcr:content/translations/en.CD00240193.pdf

Building with makefile,

You can checkout the original files and use this makefile to build, https://raw.githubusercontent.com/oguiter/RAK811_BreakBoard/master/Makefile I did this and ran the generated elf files in qemu. Read more amout this experiment here, Read more here running in parallell

Startup code

The startup code should have been this, https://github.com/RAKWireless/RAK811_BreakBoard/tree/master/src/boards/RAK811BreakBoard/cmsis/arm-gcc/boards/RAK811BreakBoard/cmsis/startup_stm32l151xb.s

But instead .platformio/packages/framework-cmsis/variants/stm32l1/stm32l151xba/startup_stm32l151xba.S is used,

Only difference is that platformio has removed the call to __libc_init_array /bl __libc_init_array/ /* PlatformIO note: Will work without -nostartfiles */

Here you can read more about this, http://cs107e.github.io/guides/gcc/ https://www.embedded.com/design/mcus-processors-and-socs/4026075/Building-Bare-Metal-ARM-Systems-with-GNU-Part-2

The option -nostartfiles instructs the linker to not use the standard system startup functions nor link the code containing those functions.

The library function __libc_init_array invokes all C++ static constructors (see also the linker script). As we do not have any static c++ constructors this should not be a problem, but could be something to think about. If you patch the function to call , bl __libc_init_array then you might get an undefined reference to _init. https://answers.launchpad.net/gcc-arm-embedded/+question/224709