STM32 WiFi and Bluetooth
While STMicroelectronics do offer STM32 MCUs with wireless functionality in their "W" family, for some truly baffling reason, they have never offered a MCU with [{WiFi]] functionality, and in this day and age that does seem quite remarkable. On Oct. 1, 2024, they announced a strategic partnership with Qualcomm development, no - not a WiFi enabled STM32 but a Module which could be hooked up to a STM32 MCU and some libraries supporting this library.
The ST67W611M1 Module
Towards the middle of 2025, the new module was finally announced, the "ST67W611M1xx" one.
ESP-01
To be added
ESP-32
To be added
Building the Slave firmware
Prerequisites
This section assumes a working and up-to-date ESP-IDF installation and some sort of ESP32 development board. We will be using one based on a ESP32-C3 (single core risc-v) module.
Having the installed and configured the ESP-IDF, load the configuration by running something like:
lth@ncpws04:~$ . ~/esp/esp-idf/export.sh
Creating, configuring and building
First step is to create a new project, which will be done automatically (assuming a working ESP-IDF installation):
lth@ncpws04:~/tmp$ idf.py create-project-from-example "espressif/esp_hosted:slave" Executing action: create-project-from-example NOTICE: Example "slave" successfully downloaded to /home/lth/tmp/slave Done
Next up, we will set our target MCU:
lth@ncpws04:~/tmp$ cd slave/ lth@ncpws04:~/tmp/slave$ idf.py set-target esp32c3 Adding "set-target"'s dependency "fullclean" to list of commands with default set of options. Executing action: fullclean Build directory '/home/lth/tmp/slave/build' not found. Nothing to clean. Executing action: set-target Set Target to: esp32c3, new sdkconfig will be created. Running cmake in directory /home/lth/tmp/slave/build Executing "cmake -G Ninja -DPYTHON_DEPS_CHECKED=1 -DPYTHON=/home/lth/.espressif/python_env/idf6.0_py3.13_env/bin/python -DESP_PLATFORM=1 -DIDF_TARGET=esp32c3 -DCCACHE_ENABLE=0 /home/lth/tmp/slave"... -- Found Git: /usr/bin/git (found version "2.47.2") -- Minimal build - OFF -- The C compiler identification is GNU 15.1.0 -- The CXX compiler identification is GNU 15.1.0 -- The ASM compiler identification is GNU -- Found assembler: /home/lth/.espressif/tools/riscv32-esp-elf/esp-15.1.0_20250607/riscv32-esp-elf/bin/riscv32-esp-elf-gcc -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Check for working C compiler: /home/lth/.espressif/tools/riscv32-esp-elf/esp-15.1.0_20250607/riscv32-esp-elf/bin/riscv32-esp-elf-gcc - skipped -- Detecting C compile features -- Detecting C compile features - done -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Check for working CXX compiler: /home/lth/.espressif/tools/riscv32-esp-elf/esp-15.1.0_20250607/riscv32-esp-elf/bin/riscv32-esp-elf-g++ - skipped -- Detecting CXX compile features -- Detecting CXX compile features - done -- git rev-parse returned 'fatal: not a git repository (or any parent up to mount point /) Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).' -- Could not use 'git describe' to determine PROJECT_VER. -- Building ESP-IDF components for target esp32c3 -- Project sdkconfig file /home/lth/tmp/slave/sdkconfig warning: the int symbol ESP_HOSTED_BT_UART_PORT_ESP32 (defined at /home/lth/tmp/slave/main/Kconfig.projbuild:737) has a non-int range [BTDM_CTRL_HCI_UART_NO (undefined), BTDM_CTRL_HCI_UART_NO (undefined)] warning: the int symbol ESP_HOSTED_BT_UART_BAUDRATE_ESP32 (defined at /home/lth/tmp/slave/main/Kconfig.projbuild:743) has a non-int range [BTDM_CTRL_HCI_UART_BAUDRATE (undefined), BTDM_CTRL_HCI_UART_BAUDRATE (undefined)] warning: the int symbol ESP_HOSTED_BT_UART_PORT (defined at /home/lth/tmp/slave/main/Kconfig.projbuild:757) has a non-int range [BT_LE_HCI_UART_PORT (undefined), BT_LE_HCI_UART_PORT (undefined)] warning: the int symbol ESP_HOSTED_BT_UART_TX_PIN (defined at /home/lth/tmp/slave/main/Kconfig.projbuild:763) has a non-int range [BT_LE_HCI_UART_TX_PIN (undefined), BT_LE_HCI_UART_TX_PIN (undefined)] warning: the int symbol ESP_HOSTED_BT_UART_RX_PIN (defined at /home/lth/tmp/slave/main/Kconfig.projbuild:769) has a non-int range [BT_LE_HCI_UART_RX_PIN (undefined), BT_LE_HCI_UART_RX_PIN (undefined)] warning: the int symbol ESP_HOSTED_BT_UART_RTS_PIN (defined at /home/lth/tmp/slave/main/Kconfig.projbuild:775) has a non-int range [BT_LE_HCI_UART_RTS_PIN (undefined), BT_LE_HCI_UART_RTS_PIN (undefined)] warning: the int symbol ESP_HOSTED_BT_UART_CTS_PIN (defined at /home/lth/tmp/slave/main/Kconfig.projbuild:782) has a non-int range [BT_LE_HCI_UART_CTS_PIN (undefined), BT_LE_HCI_UART_CTS_PIN (undefined)] warning: the int symbol ESP_HOSTED_BT_UART_BAUDRATE (defined at /home/lth/tmp/slave/main/Kconfig.projbuild:789) has a non-int range [BT_LE_HCI_UART_BAUD (undefined), BT_LE_HCI_UART_BAUD (undefined)] Loading defaults file /home/lth/tmp/slave/sdkconfig.defaults... Loading defaults file /home/lth/tmp/slave/sdkconfig.defaults.esp32c3... /tmp/kconfgen_tmp5h6uq3x5:4 line was updated to CONFIG_SDIO_DAT2_DISABLED=n /tmp/kconfgen_tmp5h6uq3x5:9 line was updated to CONFIG_BT_BLUEDROID_ENABLED=n warning: unknown kconfig symbol 'ESP32_DEFAULT_CPU_FREQ_160' assigned to 'y' in /home/lth/tmp/slave/sdkconfig.defaults.esp32c3 warning: unknown kconfig symbol 'ESP32_DEFAULT_CPU_FREQ_MHZ' assigned to '160' in /home/lth/tmp/slave/sdkconfig.defaults.esp32c3 warning: unknown kconfig symbol 'SDIO_DAT2_DISABLED' assigned to 'n' in /home/lth/tmp/slave/sdkconfig.defaults.esp32c3 warning: unknown kconfig symbol 'BT_LE_SLEEP_ENABLE' assigned to 'y' in /home/lth/tmp/slave/sdkconfig.defaults.esp32c3 -- Adding linker script /home/lth/esp/esp-idf/components/riscv/ld/rom.api.ld -- Found Python3: /home/lth/.espressif/python_env/idf6.0_py3.13_env/bin/python (found version "3.13.5") found components: Interpreter -- Performing Test CMAKE_HAVE_LIBC_PTHREAD -- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Success -- Found Threads: TRUE -- Performing Test C_COMPILER_SUPPORTS_WFORMAT_SIGNEDNESS -- Performing Test C_COMPILER_SUPPORTS_WFORMAT_SIGNEDNESS - Success -- USING O3 -- App "network_adapter" version: 1 -- Adding linker script /home/lth/tmp/slave/build/esp-idf/esp_system/ld/memory.ld -- Adding linker script /home/lth/tmp/slave/build/esp-idf/esp_system/ld/sections.ld.in -- Adding linker script /home/lth/esp/esp-idf/components/esp_rom/esp32c3/ld/esp32c3.rom.ld -- Adding linker script /home/lth/esp/esp-idf/components/esp_rom/esp32c3/ld/esp32c3.rom.api.ld -- Adding linker script /home/lth/esp/esp-idf/components/esp_rom/esp32c3/ld/esp32c3.rom.bt_funcs.ld -- Adding linker script /home/lth/esp/esp-idf/components/esp_rom/esp32c3/ld/esp32c3.rom.libgcc.ld -- Adding linker script /home/lth/esp/esp-idf/components/esp_rom/esp32c3/ld/esp32c3.rom.version.ld -- Adding linker script /home/lth/esp/esp-idf/components/esp_rom/esp32c3/ld/esp32c3.rom.ble_cca.ld -- Adding linker script /home/lth/esp/esp-idf/components/esp_rom/esp32c3/ld/esp32c3.rom.ble_test.ld -- Adding linker script /home/lth/esp/esp-idf/components/esp_rom/esp32c3/ld/esp32c3.rom.eco3.ld -- Adding linker script /home/lth/esp/esp-idf/components/esp_rom/esp32c3/ld/esp32c3.rom.eco3_bt_funcs.ld -- Adding linker script /home/lth/esp/esp-idf/components/esp_rom/esp32c3/ld/esp32c3.rom.libc.ld -- Adding linker script /home/lth/esp/esp-idf/components/esp_rom/esp32c3/ld/esp32c3.rom.libc-suboptimal_for_misaligned_mem.ld -- Adding linker script /home/lth/esp/esp-idf/components/esp_rom/esp32c3/ld/esp32c3.rom.newlib.ld -- Adding linker script /home/lth/esp/esp-idf/components/soc/esp32c3/ld/esp32c3.peripherals.ld -- Components: app_update bootloader bootloader_support bt console cxx driver efuse esp_app_format esp_bootloader_format esp_coex esp_common esp_driver_ana_cmpr esp_driver_bitscrambler esp_driver_dac esp_driver_gpio esp_driver_gptimer esp_driver_i2c esp_driver_i2s esp_driver_ledc esp_driver_mcpwm esp_driver_parlio esp_driver_pcnt esp_driver_rmt esp_driver_sd_intf esp_driver_sdio esp_driver_sdm esp_driver_sdmmc esp_driver_sdspi esp_driver_spi esp_driver_tsens esp_driver_twai esp_driver_uart esp_driver_usb_serial_jtag esp_event esp_gdbstub esp_http_server esp_hw_support esp_mm esp_netif esp_netif_stack esp_partition esp_phy esp_pm esp_ringbuf esp_rom esp_security esp_system esp_timer esp_vfs_console esp_wifi esptool_py freertos hal heap http_parser log lwip main mbedtls newlib nvs_flash partition_table protobuf-c protocomm pthread riscv sdmmc soc spi_flash vfs wpa_supplicant -- Component paths: /home/lth/esp/esp-idf/components/app_update /home/lth/esp/esp-idf/components/bootloader /home/lth/esp/esp-idf/components/bootloader_support /home/lth/esp/esp-idf/components/bt /home/lth/esp/esp-idf/components/console /home/lth/esp/esp-idf/components/cxx /home/lth/esp/esp-idf/components/driver /home/lth/esp/esp-idf/components/efuse /home/lth/esp/esp-idf/components/esp_app_format /home/lth/esp/esp-idf/components/esp_bootloader_format /home/lth/esp/esp-idf/components/esp_coex /home/lth/esp/esp-idf/components/esp_common /home/lth/esp/esp-idf/components/esp_driver_ana_cmpr /home/lth/esp/esp-idf/components/esp_driver_bitscrambler /home/lth/esp/esp-idf/components/esp_driver_dac /home/lth/esp/esp-idf/components/esp_driver_gpio /home/lth/esp/esp-idf/components/esp_driver_gptimer /home/lth/esp/esp-idf/components/esp_driver_i2c /home/lth/esp/esp-idf/components/esp_driver_i2s /home/lth/esp/esp-idf/components/esp_driver_ledc /home/lth/esp/esp-idf/components/esp_driver_mcpwm /home/lth/esp/esp-idf/components/esp_driver_parlio /home/lth/esp/esp-idf/components/esp_driver_pcnt /home/lth/esp/esp-idf/components/esp_driver_rmt /home/lth/esp/esp-idf/components/esp_driver_sd_intf /home/lth/esp/esp-idf/components/esp_driver_sdio /home/lth/esp/esp-idf/components/esp_driver_sdm /home/lth/esp/esp-idf/components/esp_driver_sdmmc /home/lth/esp/esp-idf/components/esp_driver_sdspi /home/lth/esp/esp-idf/components/esp_driver_spi /home/lth/esp/esp-idf/components/esp_driver_tsens /home/lth/esp/esp-idf/components/esp_driver_twai /home/lth/esp/esp-idf/components/esp_driver_uart /home/lth/esp/esp-idf/components/esp_driver_usb_serial_jtag /home/lth/esp/esp-idf/components/esp_event /home/lth/esp/esp-idf/components/esp_gdbstub /home/lth/esp/esp-idf/components/esp_http_server /home/lth/esp/esp-idf/components/esp_hw_support /home/lth/esp/esp-idf/components/esp_mm /home/lth/esp/esp-idf/components/esp_netif /home/lth/esp/esp-idf/components/esp_netif_stack /home/lth/esp/esp-idf/components/esp_partition /home/lth/esp/esp-idf/components/esp_phy /home/lth/esp/esp-idf/components/esp_pm /home/lth/esp/esp-idf/components/esp_ringbuf /home/lth/esp/esp-idf/components/esp_rom /home/lth/esp/esp-idf/components/esp_security /home/lth/esp/esp-idf/components/esp_system /home/lth/esp/esp-idf/components/esp_timer /home/lth/esp/esp-idf/components/esp_vfs_console /home/lth/esp/esp-idf/components/esp_wifi /home/lth/esp/esp-idf/components/esptool_py /home/lth/esp/esp-idf/components/freertos /home/lth/esp/esp-idf/components/hal /home/lth/esp/esp-idf/components/heap /home/lth/esp/esp-idf/components/http_parser /home/lth/esp/esp-idf/components/log /home/lth/esp/esp-idf/components/lwip /home/lth/tmp/slave/main /home/lth/esp/esp-idf/components/mbedtls /home/lth/esp/esp-idf/components/newlib /home/lth/esp/esp-idf/components/nvs_flash /home/lth/esp/esp-idf/components/partition_table /home/lth/esp/esp-idf/components/protobuf-c /home/lth/esp/esp-idf/components/protocomm /home/lth/esp/esp-idf/components/pthread /home/lth/esp/esp-idf/components/riscv /home/lth/esp/esp-idf/components/sdmmc /home/lth/esp/esp-idf/components/soc /home/lth/esp/esp-idf/components/spi_flash /home/lth/esp/esp-idf/components/vfs /home/lth/esp/esp-idf/components/wpa_supplicant -- Configuring done (3.9s) -- Generating done (0.3s) -- Build files have been written to: /home/lth/tmp/slave/build
We can now move on to configuring the project. Run:
lth@ncpws04:~/tmp/slave$ idf.py menuconfig
First step is to configure the "Serial flasher config" to match the flash available on the development board.