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 7 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.

Signed-off-by: Ned Konz <ned@metamagix.tech>
…ectory.

Signed-off-by: Ned Konz <ned@metamagix.tech>
@Blafy
Copy link

Blafy commented Jul 16, 2025

Great !
Do you have a plan to implement a disable flag for the p25q16h ?
This little flash is IMO a bad addition on this board, as it requires to be put into suspend mode to keep the nice low power of the NRF chip ...

@bikeNomad
Copy link
Contributor Author

bikeNomad commented Jul 16, 2025

@Blafy asks:

Great ! Do you have a plan to implement a disable flag for the p25q16h ? This little flash is IMO a bad addition on this board, as it requires to be put into suspend mode to keep the nice low power of the NRF chip ...

Good question. Not using this flash means that instead of 2MiB filesystem we'd have only 32KiB, at least without partition modification.

The stock "Storage" partition (given the original overlay; see nrf52840_partition_uf2_sdv7.dtsi ) on the NRF chip is only 32kB in size (156kB is given to the SoftDevice that we don't use, and 48kB is saved for the UF2 bootloader). The way these boards are set up at the factory includes the UF2 bootloader and SoftDevice. Using MCUBoot and two app partitions (see nrf52840_partition.dtsi) still only leaves 32kB of storage space.

Although the newest Adafruit UF2 bootloader allows for having no SoftDevice (thus maybe letting us use the 156kiB space for /flash instead), I haven't tried this.

As for putting it into suspend mode, I would hope that the nordic,qspi-nor driver would do this when possible. I've seen current consumption in the 1-2mA range even without the new lightsleep code.

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.

4 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