Mbed OS and Pelion Device Management example over WIFI for DISCO_L475VG_IOT01 board

Dependencies:   X_NUCLEO_COMMON ST_INTERFACES

DEPRECATED

This example application is not maintained and not recommended. It uses an old version of Mbed OS, Pelion DM and Arm toolchain. It doesn't work with Mbed Studio.

Please use: https://os.mbed.com/teams/mbed-os-examples/code/mbed-os-example-pelion/

This example is known to work on the following platforms:

DISCO_L475E_IOT01A

Follow the Quick-Start instructions: https://cloud.mbed.com/quick-start

Example functionality

This example showcases the following device functionality:

  • Read onboard temperature and humidity sensors, and report them as Pelion LWM2M resources (see image below).
  • On user button click, increment Pelion LWM2M button resource.
  • Allow the user to change the state of the board LED from Pelion LWM2M led_state resource and PUT request.
  • Uses all onboard sensors and reports them as Pelion LWM2M resources.

/media/uploads/screamer/pelion_st_humidity_reading.png?v=2

Use this example with Mbed CLI

1. Import the application into your desktop:

mbed import https://os.mbed.com/teams/ST/code/pelion-example-disco-iot01

cd pelion-example-disco-iot01

2. Install the CLOUD_SDK_API_KEY

mbed config -G CLOUD_SDK_API_KEY <PELION_DM_API_KEY>

For instructions on how to generate your API key, please see the documentation.

3. Initialize firmware credentials (done once per repository). You can use the following command:

mbed dm init -d "<your company name in Pelion DM>" --model-name "<product model identifier>" -q --force

If above command do not work for your Mbed CLI, please consider upgrading Mbed CLI to version 1.8.x or above.

4. Compile and program:

mbed compile -t <toolchain> -m DISCO_L475VG_IOT01A

(supported toolchains : GCC_ARM / ARM / IAR)

5. You can connect on a virtual terminal/COM port to the platform using:

mbed sterm -b 115200

This should give you an output similar to:

[BOOT] Mbed Bootloader
[BOOT] ARM: 00000000000000000000
[BOOT] OEM: 00000000000000000000
[BOOT] Layout: 0 80096F4
[BOOT] Active firmware integrity check:
[BOOT] SHA256: 0660E360D432225D5251461998FD8617B017098C5F1F90D5FB607BF8C27ED530
[BOOT] Version: 1553615309
[BOOT] Slot 0 is empty
[BOOT] Active firmware up-to-date
[BOOT] Application's start address: 0x8010400
[BOOT] Application's jump address: 0x8011041
[BOOT] Application's stack address: 0x20018000
[BOOT] Forwarding to application...

Starting Simple Pelion Device Management Client example
You can hold the user button during boot to format the storage and change the device identity.

Sensors configuration:
Invalid new address!
HTS221  humidity & temperature    = 0xBC
LPS22HB pressure & temperature    = 0xB1
LIS3MDL magnetometer              = 0x3D
LSM6DSL accelerometer & gyroscope = 0x6A

Connecting to the network using Wifi...
Connected to the network successfully. IP address: 192.168.1.3
Initializing Pelion Device Management Client...
Initialized Pelion Client. Registering...
Registered to Pelion Device Management. Endpoint Name: 0169********************001002d5

ADC temp:     23.0037 C,  vref:      0.3661 V
HTS221 temp:   28.700 C,  humidity:   31.90 %
LPS22HB temp:  29.600 C,  pressure: 1032.01 mbar
LIS3MDL mag:    0.217 x,  -0.284 y,  -0.053 z [gauss]
LSM6DSL acc:    0.005 x,  -0.014 y,   1.029 z [g]
LSM6DSL gyro:   0.910 x,  -0.910 y,   1.120 z [dps]
VL53L0X dist:    1855 mm
Committer:
screamer
Date:
Mon Mar 04 22:11:02 2019 +0000
Revision:
28:0e774865873d
Child:
30:15743b79c6cb
The example program now report all sensors

Who changed what in which revision?

UserRevisionLine numberNew contents of line
screamer 28:0e774865873d 1 #if !defined(MBED_APP_START)
screamer 28:0e774865873d 2 #define MBED_APP_START 0x08000000
screamer 28:0e774865873d 3 #endif
screamer 28:0e774865873d 4
screamer 28:0e774865873d 5 #if !defined(MBED_APP_SIZE)
screamer 28:0e774865873d 6 #define MBED_APP_SIZE 1024k
screamer 28:0e774865873d 7 #endif
screamer 28:0e774865873d 8
screamer 28:0e774865873d 9 /* Linker script to configure memory regions. */
screamer 28:0e774865873d 10 MEMORY
screamer 28:0e774865873d 11 {
screamer 28:0e774865873d 12 FLASH (rx) : ORIGIN = MBED_APP_START, LENGTH = MBED_APP_SIZE
screamer 28:0e774865873d 13 SRAM2 (rwx) : ORIGIN = 0x10000188, LENGTH = 32k - 0x188
screamer 28:0e774865873d 14 SRAM1 (rwx) : ORIGIN = 0x20000000, LENGTH = 96k
screamer 28:0e774865873d 15 }
screamer 28:0e774865873d 16
screamer 28:0e774865873d 17 /* Linker script to place sections and symbol values. Should be used together
screamer 28:0e774865873d 18 * with other linker script that defines memory regions FLASH and RAM.
screamer 28:0e774865873d 19 * It references following symbols, which must be defined in code:
screamer 28:0e774865873d 20 * Reset_Handler : Entry of reset handler
screamer 28:0e774865873d 21 *
screamer 28:0e774865873d 22 * It defines following symbols, which code can use without definition:
screamer 28:0e774865873d 23 * __exidx_start
screamer 28:0e774865873d 24 * __exidx_end
screamer 28:0e774865873d 25 * __etext
screamer 28:0e774865873d 26 * __data_start__
screamer 28:0e774865873d 27 * __preinit_array_start
screamer 28:0e774865873d 28 * __preinit_array_end
screamer 28:0e774865873d 29 * __init_array_start
screamer 28:0e774865873d 30 * __init_array_end
screamer 28:0e774865873d 31 * __fini_array_start
screamer 28:0e774865873d 32 * __fini_array_end
screamer 28:0e774865873d 33 * __data_end__
screamer 28:0e774865873d 34 * __bss_start__
screamer 28:0e774865873d 35 * __bss_end__
screamer 28:0e774865873d 36 * __end__
screamer 28:0e774865873d 37 * end
screamer 28:0e774865873d 38 * __HeapLimit
screamer 28:0e774865873d 39 * __StackLimit
screamer 28:0e774865873d 40 * __StackTop
screamer 28:0e774865873d 41 * __stack
screamer 28:0e774865873d 42 * _estack
screamer 28:0e774865873d 43 */
screamer 28:0e774865873d 44 ENTRY(Reset_Handler)
screamer 28:0e774865873d 45
screamer 28:0e774865873d 46 SECTIONS
screamer 28:0e774865873d 47 {
screamer 28:0e774865873d 48 .text :
screamer 28:0e774865873d 49 {
screamer 28:0e774865873d 50 KEEP(*(.isr_vector))
screamer 28:0e774865873d 51 *(.text*)
screamer 28:0e774865873d 52 KEEP(*(.init))
screamer 28:0e774865873d 53 KEEP(*(.fini))
screamer 28:0e774865873d 54
screamer 28:0e774865873d 55 /* .ctors */
screamer 28:0e774865873d 56 *crtbegin.o(.ctors)
screamer 28:0e774865873d 57 *crtbegin?.o(.ctors)
screamer 28:0e774865873d 58 *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
screamer 28:0e774865873d 59 *(SORT(.ctors.*))
screamer 28:0e774865873d 60 *(.ctors)
screamer 28:0e774865873d 61
screamer 28:0e774865873d 62 /* .dtors */
screamer 28:0e774865873d 63 *crtbegin.o(.dtors)
screamer 28:0e774865873d 64 *crtbegin?.o(.dtors)
screamer 28:0e774865873d 65 *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
screamer 28:0e774865873d 66 *(SORT(.dtors.*))
screamer 28:0e774865873d 67 *(.dtors)
screamer 28:0e774865873d 68
screamer 28:0e774865873d 69 *(.rodata*)
screamer 28:0e774865873d 70
screamer 28:0e774865873d 71 KEEP(*(.eh_frame*))
screamer 28:0e774865873d 72 } > FLASH
screamer 28:0e774865873d 73
screamer 28:0e774865873d 74 .ARM.extab :
screamer 28:0e774865873d 75 {
screamer 28:0e774865873d 76 *(.ARM.extab* .gnu.linkonce.armextab.*)
screamer 28:0e774865873d 77 } > FLASH
screamer 28:0e774865873d 78
screamer 28:0e774865873d 79 __exidx_start = .;
screamer 28:0e774865873d 80 .ARM.exidx :
screamer 28:0e774865873d 81 {
screamer 28:0e774865873d 82 *(.ARM.exidx* .gnu.linkonce.armexidx.*)
screamer 28:0e774865873d 83 } > FLASH
screamer 28:0e774865873d 84 __exidx_end = .;
screamer 28:0e774865873d 85
screamer 28:0e774865873d 86 __etext = .;
screamer 28:0e774865873d 87 _sidata = .;
screamer 28:0e774865873d 88
screamer 28:0e774865873d 89 .data : AT (__etext)
screamer 28:0e774865873d 90 {
screamer 28:0e774865873d 91 __data_start__ = .;
screamer 28:0e774865873d 92 _sdata = .;
screamer 28:0e774865873d 93 *(vtable)
screamer 28:0e774865873d 94 *(.data*)
screamer 28:0e774865873d 95
screamer 28:0e774865873d 96 . = ALIGN(8);
screamer 28:0e774865873d 97 /* preinit data */
screamer 28:0e774865873d 98 PROVIDE_HIDDEN (__preinit_array_start = .);
screamer 28:0e774865873d 99 KEEP(*(.preinit_array))
screamer 28:0e774865873d 100 PROVIDE_HIDDEN (__preinit_array_end = .);
screamer 28:0e774865873d 101
screamer 28:0e774865873d 102 . = ALIGN(8);
screamer 28:0e774865873d 103 /* init data */
screamer 28:0e774865873d 104 PROVIDE_HIDDEN (__init_array_start = .);
screamer 28:0e774865873d 105 KEEP(*(SORT(.init_array.*)))
screamer 28:0e774865873d 106 KEEP(*(.init_array))
screamer 28:0e774865873d 107 PROVIDE_HIDDEN (__init_array_end = .);
screamer 28:0e774865873d 108
screamer 28:0e774865873d 109
screamer 28:0e774865873d 110 . = ALIGN(8);
screamer 28:0e774865873d 111 /* finit data */
screamer 28:0e774865873d 112 PROVIDE_HIDDEN (__fini_array_start = .);
screamer 28:0e774865873d 113 KEEP(*(SORT(.fini_array.*)))
screamer 28:0e774865873d 114 KEEP(*(.fini_array))
screamer 28:0e774865873d 115 PROVIDE_HIDDEN (__fini_array_end = .);
screamer 28:0e774865873d 116
screamer 28:0e774865873d 117 KEEP(*(.jcr*))
screamer 28:0e774865873d 118 . = ALIGN(8);
screamer 28:0e774865873d 119 /* All data end */
screamer 28:0e774865873d 120 __data_end__ = .;
screamer 28:0e774865873d 121 _edata = .;
screamer 28:0e774865873d 122
screamer 28:0e774865873d 123 } > SRAM1
screamer 28:0e774865873d 124
screamer 28:0e774865873d 125 .bss :
screamer 28:0e774865873d 126 {
screamer 28:0e774865873d 127 . = ALIGN(8);
screamer 28:0e774865873d 128 __bss_start__ = .;
screamer 28:0e774865873d 129 _sbss = .;
screamer 28:0e774865873d 130 *(.bss*)
screamer 28:0e774865873d 131 *(COMMON)
screamer 28:0e774865873d 132 . = ALIGN(8);
screamer 28:0e774865873d 133 __bss_end__ = .;
screamer 28:0e774865873d 134 _ebss = .;
screamer 28:0e774865873d 135 } > SRAM2
screamer 28:0e774865873d 136
screamer 28:0e774865873d 137 .heap (COPY):
screamer 28:0e774865873d 138 {
screamer 28:0e774865873d 139 __end__ = .;
screamer 28:0e774865873d 140 end = __end__;
screamer 28:0e774865873d 141 *(.heap*)
screamer 28:0e774865873d 142 . += (ORIGIN(SRAM1) + LENGTH(SRAM1) - .);
screamer 28:0e774865873d 143 __HeapLimit = .;
screamer 28:0e774865873d 144 } > SRAM1
screamer 28:0e774865873d 145 PROVIDE(__heap_size = SIZEOF(.heap));
screamer 28:0e774865873d 146 PROVIDE(__mbed_sbrk_start = ADDR(.heap));
screamer 28:0e774865873d 147 PROVIDE(__mbed_krbs_start = ADDR(.heap) + SIZEOF(.heap));
screamer 28:0e774865873d 148 /* Check if data + heap exceeds RAM1 limit */
screamer 28:0e774865873d 149 ASSERT((ORIGIN(SRAM1)+LENGTH(SRAM1)) >= __HeapLimit, "SRAM1 overflow")
screamer 28:0e774865873d 150 /* .stack_dummy section doesn't contains any symbols. It is only
screamer 28:0e774865873d 151 * used for linker to calculate size of stack sections, and assign
screamer 28:0e774865873d 152 * values to stack symbols later */
screamer 28:0e774865873d 153 .stack_dummy (COPY):
screamer 28:0e774865873d 154 {
screamer 28:0e774865873d 155 *(.stack*)
screamer 28:0e774865873d 156 } > SRAM2
screamer 28:0e774865873d 157
screamer 28:0e774865873d 158 /* Set stack top to end of RAM, and stack limit move down by
screamer 28:0e774865873d 159 * size of stack_dummy section */
screamer 28:0e774865873d 160 __StackTop = ORIGIN(SRAM2) + LENGTH(SRAM2);
screamer 28:0e774865873d 161 _estack = __StackTop;
screamer 28:0e774865873d 162 __StackLimit = __StackTop - SIZEOF(.stack_dummy);
screamer 28:0e774865873d 163 PROVIDE(__stack = __StackTop);
screamer 28:0e774865873d 164 /* Check if stack exceeds RAM2 limit */
screamer 28:0e774865873d 165 ASSERT((ORIGIN(SRAM2)+LENGTH(SRAM2)) >= __StackLimit, "SRAM2 overflow")
screamer 28:0e774865873d 166 /* Check if bss exceeds __StackLimit */
screamer 28:0e774865873d 167 ASSERT(__bss_end__ <= __StackLimit, "BSS is too big for RAM2")
screamer 28:0e774865873d 168 }