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 11 11:28:07 2019 +0000
Revision:
31:da14aa77f977
Parent:
30:15743b79c6cb
Revert back to Mbed OS 5.10.4 due to issues to fit in RAM2 on GCC_ARM

Who changed what in which revision?

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