Skip to content

zephyr: Add Seeed Studio's XIAO BLE NRF52840 SENSE board. #17679

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 5 commits into
base: master
Choose a base branch
from

Conversation

bikeNomad
Copy link
Contributor

Summary

This PR adds Zephyr support for Seeed Studio's XIAO BLE NRF52840 SENSE board.

It also provides a good example of a richer Zephyr port than the default, adding:

  • Frozen modules (including asyncio, upysh, aioble, neopixel, and aiorepl).
  • Enough MicroPython features to support using aioble (at least for the temp_sensor.py example)
  • JSON, random, re, struct, etc.
  • Support for my Zephyr ADC code (see PR zephyr: Add ADC support #17615)
  • Mounted LFS2 filesystem using the 2MiB flash mounted as /flash

You can build it in the usual way:

$ cd ports/zephyr
$ west build -b xiao_ble/nrf52840/sense . 

This will produce a .uf2 file in build/zephyr/zephyr.uf2 that can be copied into the XIAO-SENSE USB drive that appears when you double-click the RESET button.

Testing

I have tested this on several of these boards, with and without my ADC (#17615) and zensor.Sensor.attr_set() (#17653) PRs.

I have run the aioble temp_sensor.py example but haven't done much more with the BLE.

Trade-offs and Alternatives

The build size is as follows:

Memory region         Used Size  Region Size  %age Used
           FLASH:      428864 B       788 KB     53.15%
             RAM:      165908 B       256 KB     63.29%
        IDT_LIST:          0 GB        32 KB      0.00%

dpgeorge added 2 commits July 15, 2025 12:47
This commit adjusts the configuration of the minimal zephyr build to use
MICROPY_CONFIG_ROM_LEVEL_MINIMUM.  That's a lot cleaner than explicitly
enabling/disabling options.

Prior to this change the minimal build for qemu_cortex_m3 had size:

    Memory region         Used Size  Region Size  %age Used
               FLASH:      114436 B       256 KB     43.65%
                 RAM:       26320 B        64 KB     40.16%

and had the following test results (running using the CI settings, ie
`-d basics float --exclude inf_nan_arith`):

    352 tests performed (7092 individual testcases)
    352 tests passed
    254 tests skipped: ...

With the changes here the qemu_cortex_m3 size is now:

    Memory region         Used Size  Region Size  %age Used
               FLASH:       99428 B       256 KB     37.93%
                 RAM:       26312 B        64 KB     40.15%

That's a good decrease of about 15k firmware size.  And the test suite
still passes with:

    342 tests performed (6776 individual testcases)
    341 tests passed
    265 tests skipped: ...

Signed-off-by: Damien George <damien@micropython.org>
This commit adjusts the configuration of the standard zephyr build to use
MICROPY_CONFIG_ROM_LEVEL_BASIC_FEATURES.  That's a lot cleaner than
explicitly enabling/disabling options, and allows boards to more easily
fine-tune the settings, eg select a different feature level.

Features that are now enabled are:
- async/await keyword support
- `filter`, `property` and `reversed` builtins
- `range` attributes
- `str.count()` method
- `array` module with `array.array` object
- `collections` module with `collections.namedtuple` object
- `struct` module with everything
- `id = const()` and constant folding in the compiler

Bulding qemu_cortex_m3, the code size was originally:

    Memory region         Used Size  Region Size  %age Used
               FLASH:      193864 B       256 KB     73.95%
                 RAM:       61992 B        64 KB     94.59%

and with this commit it is now:

    Memory region         Used Size  Region Size  %age Used
               FLASH:      200698 B       256 KB     76.56%
                 RAM:       61992 B        64 KB     94.59%

That's a mild increase of +6834 bytes flash usage for a good selection of
new features.

Signed-off-by: Damien George <damien@micropython.org>
@dpgeorge
Copy link
Member

Thanks for the contribution, this is a nice addition.

I've opened #17680 which should help simplify this PR.

@dpgeorge dpgeorge added this to the release-1.26.0 milestone Jul 15, 2025
Signed-off-by: Ned Konz <ned@metamagix.tech>
…rd files.

Signed-off-by: Ned Konz <ned@metamagix.tech>
…ython#17680.

@dpgeorge's PR micropython#17680 defines the standard Zephyr config based on MICROPY_CONFIG_ROM_LEVEL_BASIC.
This allows for simplifying the XIAO BLE board's mpconfigport-xiao.h.

Signed-off-by: Ned Konz <ned@metamagix.tech>
@bikeNomad bikeNomad force-pushed the ned/zephyr-add-xiao-ble-nrf52840-sense branch from 3857a69 to 469d4f0 Compare July 15, 2025 18:59
@ned-pcs
Copy link
Contributor

ned-pcs commented Jul 15, 2025

@dpgeorge OK, simplified using your PR #17680. Will re-base when you merge it into mainline.

@ned-pcs
Copy link
Contributor

ned-pcs commented Jul 15, 2025

The additional features defined in mpconfigport-xiao.h add 12224 bytes of flash and 12 bytes of RAM size.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy