Posted 2016-01-20 11:49:46 +0200

blogs->nordicers

# Segger Embedded Studio - Cross Platform IDE w/ no Code Limit! (Mac OS X, Linux support)

This blog post will get you started with SEGGER Embedded Studio (SES) in less than 15 minutes!

# Motivation

• Windows, Mac OS X and Linux support.
• Free no limit evaluation.
• Extremely intuitive & easy to use.
• Powerful debugging capabilities.
• Seamlessly import existing Keil/IAR projects.
• Choice between GCC (default) and LLVM compiler.

Nordic's development kits come shipped with SEGGER J-Link firmware. Many of our tools used to program and debug our devices rely on SEGGER software & benefit from SEGGER's unparalleled feature set and performance. It would make sense to use SEGGER's IDE as well to provide a smoother development and debugging experience.

# NEW & Improved tutorial

https://devzone.nordicsemi.com/blogs/845/segger-embedded-studio-cross-platform-ide-w-no-cod/

# Setting up SES

Open SES. You should see the Dashboard home page. Here you will see the package manager, software updates & your projects. Under Packages click "Manage Packages" and then double click on the "CMSIS Core Support Package." Then click "Next" and this package will be installed. There isn't a Nordic package currently but no worries, its not needed. You should see something like this: SES_Home_Dashboard.png.

# Compiling and running an example

Now lets compile and run the blinky example found in Nordic's SDK. Select "File->Open IAR EWARM / Keil MDK Project" and then navigate to blinky_blank_pca100XX.uvprojx in your SDK directory. Be sure to select the correct project for the board you are using. For me the full path is "nRF5_SDK_11.0.0-2.alpha_bc3f6a0\examples\peripheral\blinky\pca10040\blank\arm5_no_packs\blinky_blank_pac10040.uvprojx" as I am using the nRF52 Development Kit.

Now we just need to do a few things to compile & run this project!

1. SES automatically includes RTT files in projects. While this is a great tool for debugging (much better than using UART) lets not worry about it for now. Just remove the folder "RTT Files" from the project by right clicking it and selecting "Remove."
2. Next Keil uses CMSIS and Device software packs. SES imported these packs as the folders "::CMSIS" and "::Device." Remove both of these folders from the project.
3. Now we need to add our system files. This includes a startup file and "system_nrf52.c." Just like Keil, IAR and GCC have their own startup files, so does SES (It is GCC assembler but has some slight differences from gcc_startup_nrf52.s). Download ses_nrf52_startup.s and add it to the Nordic SDK you are using in /components/toolchain. Download and add ses_nrf51_startup.s for nRF51 series devices.
4. In SES see the folder "System Files." Remove "Cortex_M_Startup.s" from this folder. Now right click the folder "System Files" and select "Add existing files." Navigate to components/toolchain in your SDK and add both "ses_nrf52_startup.s" & "system_nrf52.c."

All source files are added to the project now. SES looks at all files in the project and knows to compile these files just like Keil. The different folders like "Application," "nRF_Drivers," "System Files" help you keep your source files organized. Your project should look like this now.

The last thing to do now is to configure the project settings. This is very similar to how it is done in Keil. In GCC these are configured with compiler and linker flags. SES imports Keil project settings so almost all of this is done for us. All we need to do is add some include paths for header files that are no longer contained in a Keil software pack and set up the connection with the device so we can program/debug.

1. Right click the project "Project 'blinky_blank_pca10040'" and you will see the project properties. Click "User Include Directories" in the drop down and add "../../../../../../components/device" at the bottom. This will include the files like nrf.h that our application uses. If you didn't install the CMSIS pack manager you will also need to include "../../../../../../components/toolchain/gcc" You can see all the project properties by clicking the first item in the drop down "Edit Properties."
2. Right click the project again and select "Target Connection." Select "J-Link" instead of simulator and click OK.

Now we are ready to go! Simply right click the project and click "Build." Or under the "Build" tab you can click "Build and Run" or "Build and Debug." Make sure your nRF5x Development Kit is connected to your computer and turned on. Then run the program and see that the LEDs blink.

# Debugging

Now lets debug the application. Under the "Debug" tab click "Go." When you start debugging an application SES will automatically build (if any source files have been changed), erase flash sectors and program the application. It will open the debug window with the program counter at the start of main(). You should see this.

There are a lot of debugging features I won't go over in this blog post. There are some amazing debug features and it is very easy to use. Experiment a bit here and you should get the hang of it very quickly!

There's your quick intro to SES. This IDE is a great option for any developers working with Nordic chips. You should easily be able to import a more complex Keil or IAR project like a BLE example from our SDK or one of your own projects from here. Explore the Project Settings and debug features more - this IDE is very easy to learn. If you are coming from GCC you will notice that there is no linker script. In project settings all you need to do is add some flags and it will be automatically generated properly. The main thing to do is specify the start of FLASH and RAM for an application using a softdevice.

Please comment and let us know what you think about this IDE. If we get good feedback there will be more to come with SES!

# Running a BLE example

Running a BLE example requires the exact same steps as above with just a few extra ones. (Note: for now don't use any nRF device pack, import the project and just select the standard c/c++ executable template. if you haven't already installed the Nordic device package this doesn't apply to you).

1. Follow all the steps as you did above but do this for a BLE example.
2. You need to set aside FLASH and RAM for the softdevice. To do this right click the project and select "Import Section Placement." This will create a copy of the template "flash_placement.xml" in the same directory as your Embedded Studio project.
3. Open this file and edit it to look just like the file opened in the screen shot below (all you are doing is changing the start address of FLASH and RAM... This screenshot also shows you how to import "flash_placement.xml" to your project.
4. At this point you should be able to compile the application. Now lets set up Embedded Studio so the softdevice is automatically flashed along with the application when running/debugging. See the picture below to do this very easily. Now just make sure you erase your chip (at least for the first time you do this), and hit build & debug. That was easy! This can also work with a boot loader so you can be very efficient!

# Notes

• "thumb_crt0.s" is the startup library used. It is very small and fast resulting in compact and fast code. It is the 'equivalent' of MicroLIB in Keil. This is the code that is run from the reset handler and calls main.
• To use the LLVM compiler instead of GCC under the "Tools" tab select "Options" and change "Default Compiler Variant" from gcc to clang. I have successfully compiled BLE examples using GCC as the assembler and Clang as the compiler. (*Note currently if you compile BLE examples with Clang they will only run correctly without any optimizations. Optimizations seem to break SVCALL() as RK has pointed out to me. This can be fixed but will required modifications to our SDK. If you would like to see this let us know).

# Troubleshooting (Linux users see here!)

• Make sure you have the most up to date J-Link Software and Documentation pack (linked in required software above).
• Linux seems to not import Keil projects as well. If you are running SES on linux you need to read the project properties more carefully. You will need to set your "Memory Map Macros" to FLASH_START=0x00000000 FLASH_SIZE=0x00080000 SRAM_START=0x20000000 SRAM_SIZE=0x00010000 or whatever they should be with a softdevice. In "Linker Options" you will need to set the "Section Placement File" as $(StudioDir)/targets/Cortex_M/flash_placement.xml. In "Code Generation Options" make sure you set the ARM Architecture, Core Type properly. Also in "J-Link Options" you will need to set "J-Link DLL File" to the absolute path of the one installed with SES. # Troubleshooting for PCA_10036 rperkins: I came across the same issue with a few of our boards (a mix of PCA10040's & PCA10036's). The solution would be to set the following in Project->Edit Properties->Build->Memory Map Macros... FLASH_START=0x00000000 FLASH_SIZE=0x00080000 SRAM_START=0x20000000 SRAM_SIZE=0x00008000 SRAM1_START=0x08000000 SRAM1_SIZE=0x00008000 This should give you 2 x 32KB memory regions should you need the 2nd 32KB of memory. Alternatively, simply removing the SRAM1_xxx macros will give a single 32KB region if your project doesn't need the additional memory. --This is leonwj's comment below and will be helpful for anyone using this board. # Licensing Evaluating this software is free and there are no limitations on the features of the IDE. However when developing production firmware for commercial products a licence is required. More information about licensing SES here: https://www.segger.com/ses-licensing.html. Your SES licence can be stored on your J-Link debug probe, https://www.segger.com/jlink-debug-probes.html, so that you can use SES on any of your computers. # edit (Still unstable, BLE examples are hardfaulting when using the pack so recommended not to use for now unless you want to try to figure this out). SEGGER has released a pack for Nordic devices. Official release is coming soon. Please save the package attached nRF.emPackage. It can be manually installed in Embedded Studio via Tools -> Packages -> Manually Install Packages... Once this is installed in Embedded Studio, import a Keil project as above. No need to add user include directories, the startup file i attached, and many of the other things you had to do. Works more out of the box. Will be updating this post when i get some time. ## 37 comments Posted Jan. 20, 2016, 12:28 p.m. I thought the screen looked familiar .. this is a re-branded Crossworks, the IDE I've been using for the last two years. The documentation even says 'Rowley' on it. Looks like they just simplified some pieces of it and shrink-wrapped it for SEGGER. That's great - I love Crossworks - hopefully this will be a good free version for people to learn. Posted Jan. 20, 2016, 8:16 p.m. Nice - thanks for the blog post. I was able to follow it and run and debug blinky on our hardware on OS X. The debugger seems particularly useful for mixed-mode debugging. Up to this point we have been using GCC and GDB from the command-line (on OS X) for debugging; I may consider migrating to SES in the future. Is there a command-line option for building a SES project? We'd still want the ability to perform automated builds for CI / producing release images. Posted Jan. 20, 2016, 11:04 p.m. Very nice blog post and nice looking IDE! The unlimited code size for evaluation version is definitely plus but please mention that license agreement doesn't allow to use this tool for production FW. Spending 1-3k$ for good tools is definitely worth it (if it is SES or Keil or IAR or CrossWorks or anything else) but to be fair their are not "free to use" as GCC license so every budget restricted (and law respecting) developer should take it into account.

Cheers Jan

Posted Jan. 20, 2016, 11:49 p.m.

Hi Guys,

Writing here as an official SEGGER representative.

@Mike: command line building in Embedded Studio is supported. This can be done via emBuild See Embedded Studio manual: https://download.segger.com/SES/segger_embedded_studio_v212_manual.pdf Section "Command-Line Project Builder"

@endnode: Will bring that up in the next meeting, thanks!

Posted Jan. 21, 2016, 12:08 a.m.

Great news for Mac OS users. Just one question: any reason it looks so bad / pixelated on MacBook with retina display?

Posted Jan. 21, 2016, 12:56 a.m.

retina support has been one of the Crossworks requests for a while, it would be nice to have, although I've got used to it looking like that.

Posted Jan. 21, 2016, 2:15 a.m.

@LukaszM,

Mac OS X support is usually hampered because Apple change their OS in major and minor ways much more frequently than Microsoft do with Windows. Retina support requires a step up in the underlying Qt framework, and recent USB changes in El Capitain have not helped either.

There is a tentative plan to address the Retina issue, but no firm timeline. SEGGER Embedded Studio is workable now on OS X, but I agree it does not look ideal on this platform. We will do better.

Posted Jan. 21, 2016, 5:59 a.m.

Qt has had information on this available for almost three years now. Hopefully this will get addressed soon.

Posted Jan. 21, 2016, 12:48 p.m.

This looks very promising. Could somebody provide required .S file for nRF51822? Or maybe instructions how to modify one from the SDK.

Posted Jan. 21, 2016, 1:30 p.m.

Try this one .. nRF51_Startup.s. It's a modified version of the one I use which actually works for both nRF51 and nRF52 but it's cleaner to have separate ones.

Posted Jan. 21, 2016, 3:35 p.m.

Keton: I posted the ses_nrf51_startup.s in the blog post.

Any applications can be run on the nRF51. Just add the ses startup file for nrf51 and system_nrf51.c instead of the 52 files.

RK: Thanks, I made some small modifications to the file you provided.

Posted Jan. 23, 2016, 7:15 a.m.

great job !!!, support linux and mac OS..

Posted Jan. 24, 2016, 9:30 p.m.

This is very timely, as my IOT code is hitting the 32KB limit quite frequently. The blinky example you gave is helpful, and works fine with the tweaks you documented. I was trying the next example in that folder, blinky_rtx; it would not compile because the rtx file is for M3, not M4F. Since the example runs fine with Keil, it seems the SES does not recognize some combinations like this that will work with Keil. Do you have a blinky_rtx with the rtx version that SES likes? Could the Nordic SDK be checked with both Keil and SES to make sure all is well in future releases? Many thanks.

Posted Jan. 26, 2016, 10:12 a.m.

Hello,

The included ses_nrf52_startup.s file works perfectly with the nRF52 (PCA10040 v0.9.0) DK board but fails when using the nRF52 (PCA10036 v1.0.0) board. Running against the latter board throws a hard fault in the - ISR_HANDLER HardFault_Handler - Line #44. The issue is the same for all the examples that I have attempted - using SES Release 2.14 and nRF5 SDK v11.0.0-2.alpha - week #51.

Can you confirm what changes need to be made in order to rectify this error.

Thanks

Posted Jan. 26, 2016, 10:17 p.m.

Mike S: This is something that we are working on. We now have a nRF device pack for SES and will be doing official MDK releases. We need to coordinate with our SDK team now to try to get SES officially supported there.

rperkins: This is strange. The startup file should be the same (maybe the preview dev kit doesn't have all the interrupts but this shouldnt cause that error). I think the problem is elsewhere. Note that preview dev kit only has 0x8000 of RAM, not 0x10000. Also your board would be defined as PCA_10036. I would reccomend to look at the keil project settings for a PCA_10036 project and make sure everything is the same as in SES. -But if you really think it is in the startup file I would look at the 'gcc_arm_startup_nrf52.s' or whatever it is called that you know works for PCA_10036 and compare it to the one you have for SES. If any interrupt handlers are defined that shouldnt be there in SES startup cahnge to ISR_RESERVED

Posted Jan. 27, 2016, 8:35 a.m.

rperkins: I came across the same issue with a few of our boards (a mix of PCA10040's & PCA10036's). The solution would be to set the following in Project->Edit Properties->Build->Memory Map Macros...

FLASH_START=0x00000000 FLASH_SIZE=0x00080000 SRAM_START=0x20000000 SRAM_SIZE=0x00008000 SRAM1_START=0x08000000 SRAM1_SIZE=0x00008000

This should give you 2 x 32KB memory regions should you need the 2nd 32KB of memory. Alternatively, simply removing the SRAM1_xxx macros will give a single 32KB region if your project doesn't need the additional memory.

Michael Dietz: Great post, looking forward to your follow-up blogs. Also given that many devs still have the PCA10036 Preview DK boards, I would suggest add a small caveat in future instructions to avoid any confusion.

Thanks

Posted Jan. 27, 2016, 8:44 a.m.

Thanks leon! I included your comment in the post to make sure people see it. This will be included in the future tutorial/documentation on SES. If you find anything else please let me know!

Posted Jan. 28, 2016, 9:12 a.m.

What a nice post! I'm looking for a solution on OS X and this is it.Thanks. However, can I debug an S110 project with SES on OS X? There isn't an nRFgo for OS X. Could you tell me how to download S110 to Flash on OS X?

Thanks.

Posted Jan. 29, 2016, 6:14 a.m.

this ide can support sdk 6.0 ?

Posted Jan. 29, 2016, 9:45 a.m.

Yes the IDE will support any of our SDKs. It uses the GCC compiler. I beleive it is GCC 4.9.3 but hopefully it will be updated to GCC 5.2.1 soon.

Posted Jan. 30, 2016, 11:39 a.m.

Hello,

I experience the same issue as rperkins when using my nRF52832 Preview DK with SES. The project compiles, but I receive the hardfault ISR_HANDLER HardFault_Handler on Line #44. I am using the PCA_10040.

I will try the solution posted by leonwj, but just to understand the difference between the DK's and the production status.

On the the Nordic website the nRF52832 Preview DK is still active and the nRF52832 DK seems to be available sometime in Q1 2016. But from what I can read here it seems that some people have the non Preview version. And on Mouser the nRF52832 seems to be the active version (not the Preview version).

So if I order another DK from Mouser or any other distributor will I then receive the Preview or the non Preview DK?

And is it correctly understood that the Preview DK is PCA_10036 and the non Preview is PCA_10040?

It is not very clear to me what the status is on the nRF52832 DK (Preview or not). Please clarify this.

Thanks.

Posted Jan. 30, 2016, 2:13 p.m.

Jan L: The preview DK is the PCA_10036 board. This DK has the beta nRF52832. This beta had an error with its RAM memory map leading to the differences leonwj mentioned above. PCA_10040 board is the 'production' nRF52832. This has the correct memory map for RAM 0x20000000-0x20010000.

You get a hardfault if you are using PCA_10036 and try to use this same memory map. This is because the stack is allocated at the top of RAM and this doesn't exist in PCA_10036. (PCA_10036 RAM is 0x20000000-0x20008000)

That is something you would need to ask the distributer. The PCA_10040 is available now but distributers may have PCA_10036 stil in stock - not sure..

Posted Jan. 30, 2016, 5:37 p.m.

What is the easiest way to flash SoftDevice on Mac OSX? Can it be integrated into the SES workflow?

I have tried specify the SoftDevice as an Additional Load File but have had no success so far. Any ideas?

Posted Jan. 31, 2016, 6:27 p.m.

Hi Michael!

I am not quite sure what you mean when you refer to the Keil preprocessor definitions. Do I have to install Keil in order to do that? An when you refer to the Keil project file is that the arm4 project folder?

I am only importing the ble_app_hrs example from file->open IAR EWARM / Keil MDK project.., so I guess I haven't saved a copy of the project. It doesn't seem to be possible in evaluation mode..?

Did you see my last comment regarding the project folder duplicate? Is that how it should be?

Posted Feb. 1, 2016, 8:23 a.m.

Hey Jan:

Looks like you've almost got it.

1. Make sure you have all the correct processor definitions. To do this look at the preprossesor definitions in Keil (i.e. BLE_STACK_SUPPORT_REQD CONFIG_GPIO_AS_PINRESET BOARD_PCA10040 NRF52_PAN_12 S132 SWI_DISABLE0 NRF52 SOFTDEVICE_PRESENT NRF_LOG_USES_UART=1) and make sure all of these are also defined in SES (in project settings).
2. Make sure your SES project file is in the same directory as the Keil project file. You will notice files are included like so in Keil (../../../components/device) for example. This means the compiler looks at the path your project file is in and then moves out folder after folder and enters folders from here. So your SES project will need to be in Nordic's SDK to use these include paths. (If you import a Keil project the SES project will be created and saved in the same folder by default so make sure the keil project you import is in the correct place).

Posted Feb. 1, 2016, 9:02 a.m.

Hi Michael!

I am not quite sure what you mean when you refer to the Keil preprocessor definitions. Do I have to install Keil in order to do that? An when you refer to the Keil project file is that the arm4 project folder?

I am only importing the ble_app_hrs example from file->open IAR EWARM / Keil MDK project.., so I guess I haven't saved a copy of the project. It doesn't seem to be possible in evaluation mode..?

One one thing I saw was that when I import the BLE example project to SES then two identical folders are created in the SES Project Explorer. Is that how it should be? When I import the Blinky example only one folder is created, which makes more sense.

Posted Feb. 1, 2016, 11:24 a.m.

Jan L: When I say 'Keil preprocessor definitions' I was just referring to the defines in keil project settings. You can either define something in your project settings (keil preprocessor definitions in keil examples) or in your code (#define NRF52). In the SDK you have some project specific preprocessor definitions in either the (Keil, IAR project files or the makefile if using GCC). For example NRF52 is defined in the project settings and then this is used to include the correct header files nrf52.h instead of nrf51.h etc... other things like softdevice, debug, interrupt, etc.. are also in many ble projects preprocessor defines.

While the defines in your code (at the top of main.c) will get imported properly maybe these won't when you import from a keil project in SES. If they don't you can just add them (look at the makefile in the project directory under armcc if you don't have keil).

It is possible to save a project in evaluation mode. If you look in that directory that the keil project you imported is you will see an SES project file: *.emProject

Posted Feb. 2, 2016, 9:47 a.m.

Hi, Michael! I have the same problem with Sam: " What is the easiest way to flash SoftDevice on Mac OSX? Can it be integrated into the SES workflow? I have tried specify the SoftDevice as an Additional Load File but have had no success so far. Any ideas? " Could you give us some help?

Posted Feb. 2, 2016, 10:43 a.m.

Once I get this working I will simplify this post to use the nRF pack and also post how to load the softdevice with your application properly.

Posted Feb. 2, 2016, 11:38 a.m.

I have installed the nRF device pack, imported the pca_10040 project (though my board is the 10036 Preview DK) and added the following to the memory Map Macros:

FLASH_START=0x0001b000 FLASH_SIZE=0x00065000 SRAM_START=0x2000f100 SRAM_SIZE=0x00006100 SRAM1_START=0x08000000 SRAM1_SIZE=0x00008000

I can compile and run the project, so far so good (I do get a but I get a HardFault_Handler in nRF52_Vectors.s when debugging, but I haven't done the last part described by Segger yet).

Can you confirm that using the pca_10040 project file and adding the Memory Map Macros above are correct even for the PCA10036 Preview DK?

Now I am not quite sure about the SEGGER part described above.

• Using the real memory map for the macros is that what I have described above?

• And what is meant by copying the section placement file (where can it be found) into the project and modifying it to not place sections into the softdevice?

Posted Feb. 2, 2016, 2:26 p.m.

Hi Michael, I have found the 'flash_placement.xml' file, so I would like to try the above suggestion. If you could provide the exact Memory Map Macro's and where to change/add FLASH_APP_START=0x1B000 SRAM_APP_START=0x20001F00 to the xml file, then it would be great. Have you made any progress in finding a better solution? Thanks.

Posted Feb. 2, 2016, 3:51 p.m.

Guys, I edited the blog post to show how to properly set up Embedded Studio for a BLE example and integrate the softdevice into the Embedded Studio workflow. Check out the edit (don't use nRF device pack for this)!

Note: The Memory Map Macros need to be set to the entire memory range of your device and "flash_placement.xml" will take care of setting aside FLASH, RAM for the softdevice.

Posted Feb. 3, 2016, 10:32 p.m.

No matter what I do, nothing works. I've followed the tutorial in all detail, and have tried multiple times from scratch with both the Preview DK and the final DK. No change. Have tried with both the SDK linked to in the post, and the "old" 0.9.2. And both the old and new softdevice.

But nothing happens when I build and run. There are no errors (except I had to comment out FILE __stdout; and FILE __stdin; in retarget.c to be able to build it.

No LEDs are blinking (except for the power/data-in/out).

I've tried to flash the softdevice with RKNRFGO (http://sourceforge.net/p/rknrfgo/) which works perfectly with my "old" setup, and by letting SEGGER do it as described above. Nothing works.

Anyone? Otherwise I'll revert to my Eclipse/GCC/RKNRFGO setup.

Posted Feb. 4, 2016, 1:57 a.m.

Hi, Michael, have you seen that "SES-->Target-->Erase all" is always gray. Can I use it to erase the nordic flash?

Posted Feb. 4, 2016, 8:58 a.m.

Henrik: So everything compiles without warnings and you can flash and debug? When debugging does your program get to main or does it fail before that? (just remove retarget.c from your project for now - not sure where this problem comes from but program will compile and run fine without it). Also

Bee: Erase all isn't supported right now for our chips but it will be soon (hopefully next release).

Posted Feb. 4, 2016, 1:10 p.m.

Please see new and improved blog post here https://devzone.nordicsemi.com/blogs/845/segger-embedded-studio-cross-platform-ide-w-no-cod/

Posted Oct. 28, 2016, 12:56 p.m.

I am using nRF52-DK and SDK12, i am trying to get hang of SES by working with Blinky example in sdk. After succesful build and run, nRF52-DK is not advertising the packets.

## Recent blog posts

Posted 2017-04-11 11:49:17 by Radosław Koppel
• ### Taking a deeper dive into Bluetooth 5

Posted 2017-04-07 14:53:51 by John Leonard
• ### Logging enabled by default in SDK Bluetooth examples

Posted 2017-03-29 11:27:02 by Håvard
• ### Monitor Mode Debugging with J-Link and GDB/Eclipse

Posted 2017-03-29 05:56:12 by Daniel Veilleux
• ### Getting started with Nordic's Secure DFU bootloader, a step by step guide

Posted 2017-03-20 17:13:52 by Hung Bui

## Recent questions

• ### nRF52832 one of output (p0.15) lost its power

Posted 2017-04-28 12:07:25 by Damian
• ### mesh dfu serial translate update file . 15 min？ why so slowlly？

Posted 2017-04-28 12:03:43 by mr_sev
• ### Ram related issue / What are the best practices (armgcc, linker) > nRF51 16 kB vs 32 kB

Posted 2017-04-28 11:39:06 by trdop
• ### SoftDevice Update size

Posted 2017-04-28 11:30:48 by Mihail
• ### How to setup a complete BLE5 enviornment ?

Posted 2017-04-28 10:33:28 by allankliu