MCUXpresso SDK Release Notes
Overview
These Release Notes are associated with MCUXpresso SDK supporting K32W148 devices and K32W148-EVK development boards. This is an early adopter release provided as preview for early development and should not be used for final product firmware.
The MCUXpresso SDK is a comprehensive software enablement package designed to simplify and accelerate application development with Arm Cortex-M-based devices from NXP, including its general purpose, crossover and Bluetooth-enabled MCUs. MCUXpresso SW and Tools for DSC further extends the SDK support to current 32-bit Digital Signal Controllers. The MCUXpresso SDK includes production-grade software with integrated RTOS (optional), integrated enabling software technologies (stacks and middleware), reference software, and more.
In addition to working seamlessly with the MCUXpresso IDE, the MCUXpresso SDK also supports and provides example projects for IAR. Support for the MCUXpresso Config Tools allows easy cloning of existing SDK examples and demos, allowing users to leverage the existing software examples provided by the SDK for their own projects.
Underscoring our commitment to high quality, the MCUXpresso SDK is MISRA compliant and checked with Coverity static analysis tools. For details on MCUXpresso SDK, see MCUXpresso-SDK: Software Development Kit for MCUXpresso.
MCUXpresso SDK
As part of the MCUXpresso software and tools, MCUXpresso SDK is the evolution of Kinetis SDK, includes support for LPC, DSC, and i.MX System-on-Chip (SoC). The same drivers, APIs, and middleware are still available with support for Kinetis, LPC, DSC, and i.MX silicon. The MCUXpresso SDK adds support for the MCUXpresso IDE, an Eclipse-based toolchain that works with all MCUXpresso SDKs. Easily import your SDK into the new toolchain to access to all of the available components, examples, and demos for your target silicon. In addition to the MCUXpresso IDE, support for the MCUXpresso Config Tools allows easy cloning of existing SDK examples and demos, allowing users to leverage the existing software examples provided by the SDK for their own projects.
In order to maintain compatibility with legacy Freescale code, the filenames and source code in MCUXpresso SDK containing the legacy Freescale prefix FSL has been left as is. The FSL prefix has been redefined as the NXP Foundation Software Library.
Development tools
The MCUXpresso SDK was compiled and tested using these development tools:
IAR Embedded Workbench for Arm version 9.60.3
MCUXpresso IDE 24.12.00
MCUXpresso for VS Code v24.12
GCC Arm Embedded Toolchain 13.2.1
Supported development systems
This release supports boards and devices listed in Table 1. The boards and devices in bold were tested in this release.
Development boards |
MCU devices |
---|---|
K32W148-EVK board |
K32W1480 |
MCUXpresso SDK release package
The MCUXpresso SDK release package content is aligned with the silicon subfamily it supports. This includes the boards, CMSIS, devices, documentation, middleware, and RTOS support.
Release contents
Table 1 provides an overview of the MCUXpresso SDK release package contents and locations.
Deliverable |
Location |
---|---|
Boards |
|
CMSIS Arm Cortex-M header files, DSP library source |
|
Demo applications |
|
Documentation |
|
Driver examples |
|
Driver, SoC header files, extension header files and feature header files, utilities |
|
Middleware, including wireless stacks |
|
Peripheral Drivers |
|
RTOS examples |
|
RTOS Kernel Code |
|
Tools |
|
Utilities such as debug console |
|
Wireless examples |
|
What is new
The following changes have been implemented compared to the previous SDK release version (25.06.00-pvw2).
Bluetooth LE host stack and applications
No support.
Bluetooth LE controller
Stability improvements. New features: Four advertising set support (“Early Access Release” state).
Transceiver Drivers (XCVR)
Added API to control PA ramp type and duration
Connectivity framework
Major Changes
[wireless_mcu][wireless_nbu] Introduced PLATFORM_Get32KTimeStamp() API, available on platforms that support it.
[RNG] Switched to using a workqueue for scheduling seed generation tasks.
[Sensors] Integrated workqueue to trigger temperature readings on periodic timer expirations.
[wireless_nbu] Removed outdated configuration files from wireless_nbu/configs.
[SecLib_RNG][PSA] Added a PSA-compliant implementation for SecLib_RNG. ⚠️ This is an experimental feature and should be used with caution.
[wireless_mcu][wireless_nbu] Implemented PLATFORM_SendNBUXtal32MTrim() API to transmit XTAL32M trimming values to the NBU.
Minor Changes (no impact on application)
[MWS] Migrated the Mobile Wireless Standard (MWS) service to the public repository. This service manages coexistence between connectivity protocols such as BLE, 802.15.4, and GenFSK.
[HWParameter][NVM][SecLib_RNG][Sensors] Addressed various MISRA compliance issues across multiple modules.
[Sensors] Applied a filtering mechanism to temperature data measured by the application core before forwarding it to the NBU, improving data reliability.
[Common] Relocated the GetPowerOfTwoShift() function to a shared module for broader accessibility across components.
[RNG] Resolved inconsistencies in RNG behavior when using the fsl_adapter_rng HAL by aligning it with other API implementations.
[SecLib] Updated the AES CMAC block counter in AES_128_CMAC() and AES_128_CMAC_LsbFirstInput() to support data segments larger than 4KB.
[SecLib] Utilized sss_sscp_key_object_free() with kSSS_keyObjFree_KeysStoreDefragment to avoid key allocation failures.
[WorkQ] Increased workqueue stack size to accommodate RNG usage with mbedtls.
[wireless_mcu][ot] Suppressed chip revision transmission when operating with nbu_15_4.
[platform][mflash] Ensured proper address alignment for external flash reads in PLATFORM_ReadExternalFlash() when required by platform constraints.
[RNG] Corrected reseed flag behavior in RNG_GetPseudoRandomData() after reaching gRngMaxRequests_d threshold.
[platform][mflash] Fixed uninitialized variable issue in PLATFORM_ReadExternalFlash().
[platform][wireless_nbu] Fixed an issue on KW47 where PLATFORM_InitFro192M incorrectly reads IFR1 from a hardcoded flash address (0x48000), leading to unstable FRO192M trimming. The function is now conditionally compiled for KW45 only.
Details can be found in CHANGELOG.md
IEEE 802.15.4
API cleanup: remove unmaintained slotted support
support for MAC split architecture
fix condition to enter low power
minor fixes and stability improvements for connectivity_test example application
Zigbee
NCP Host Updates and fixes
R23 fixes
Device can’t establish a new TCLK through ZDO Start Key Update procedure
Security Start Key Update Request is not relayed to joining ZED in multi hop key negotiation
propagate APS ACK to end-user application
documentation updates
Release contents
Provides an overview of the MCUXpresso SDK release package contents and locations.
Deliverable |
Location |
---|---|
Boards |
INSTALL_DIR/boards |
Demo Applications |
INSTALL_DIR/boards/<board_name>/demo_apps |
Driver Examples |
INSTALL_DIR/boards/<board_name>/driver_examples |
eIQ examples |
INSTALL_DIR/boards/<board_name>/eiq_examples |
Board Project Template for MCUXpresso IDE NPW |
INSTALL_DIR/boards/<board_name>/project_template |
Driver, SoC header files, extension header files and feature header files, utilities |
INSTALL_DIR/devices/<device_name> |
CMSIS drivers |
INSTALL_DIR/devices/<device_name>/cmsis_drivers |
Peripheral drivers |
INSTALL_DIR/devices/<device_name>/drivers |
Toolchain linker files and startup code |
INSTALL_DIR/devices/<device_name>/<toolchain_name> |
Utilities such as debug console |
INSTALL_DIR/devices/<device_name>/utilities |
Device Project Template for MCUXpresso IDE NPW |
INSTALL_DIR/devices/<device_name>/project_template |
CMSIS Arm Cortex-M header files, DSP library source |
INSTALL_DIR/CMSIS |
Components and board device drivers |
INSTALL_DIR/components |
RTOS |
INSTALL_DIR/rtos |
Release Notes, Getting Started Document and other documents |
INSTALL_DIR/docs |
Tools such as shared cmake files |
INSTALL_DIR/tools |
Middleware |
INSTALL_DIR/middleware |
Annexure: Zigbee PRO 2023 dynamic link key negotiation
There are two types of DLK negotiations. When the requester of a new TCLK is not yet authorized in the network (does not have the network key), the process is called off-network DLK negotiation. This occurs after the parent replies with the Network Commissioning Response. Once a node is fully joined and authorized, it can request a new TCLK from the trust center. If both nodes, the TC and the requester, supports DLK, they shall use the on-network DLK Negotiation method instead of the Zigbee 3.0 Request Key method. The on-network DLK can be triggered using the Node Descriptor request from the initiator to the trust center. The stack appends the Supported Key Negotiation method TLV to the request and the response contains the Selected Key Negotiation method TLV. If the Trust Center approved the DLK, the stack of the initiator initiates the key negotiation process.
The coordinator R23 and Router R23 examples contain code which activates the DLK, off- and on-network. The code is provided for experimentation as the DLK feature set is not fully implemented nor tested. It is enabled by changing the following macro:
**\#ifdef** R23_UPDATES
/* Uncomment this to enable DLK with AES-128 */
//#define R23_DLK_AES128_ENABLE 1
**\#endif**
AIB attributes {#aibattributes .section}
The AIB attribute apsSupportedKeyNegotiationMethods
is a bit mask, which indicates the set of supported key negotiation methods by the local device. The set of valid values corresponds to the Supported Key Negotiation Methods Global TLV, which can be found in the ZigbeeCommon/Include/tlv.h
file. Only the Hash AES-MMO-128 method is supported in this experimental preview.
**\#define** ZPS_TLV_G_SUPPKEYNEGMETH_STATKEYREQ (1) /* Zigbee 3.0 Mechanism */
**\#define** ZPS_TLV_G_SUPPKEYNEGMETH_SPEKEAES128 (2) /* SPEKE using Curve25519 with Hash AES-MMO-128 */
**\#define** ZPS_TLV_G_SUPPKEYNEGMETH_SPEKESHA256 (4) /* SPEKE using Curve25519 with Hash SHA-256 */
At a minimum the device SHALL support one method, the key request method.
The AIB attribute u8SharedSecretsMask
is a bit mask which indicates the set of supported shared secrets by the local device. The set of valid values corresponds to the supported key negotiation methods global TLV, which can be found in the ZigbeeCommon/Include/tlv.h
file. Only the values (1) and (4) are supported, together with the default apscWellknownPSK
.
**\#define** ZPS_TLV_G_PSK_SYMMETRIC (1) /* Symmetric authentication token */
**\#define** ZPS_TLV_G_PSK_INSTALLCODE (2) /* Pre-configured link-ley derived from installation code */
**\#define** ZPS_TLV_G_PSK_PASSCODE (4) /* Variable-length pass code (for PAKE protocols) */
**\#define** ZPS_TLV_G_PSK_BASICAUTH (8) /* Basic Authorization Key */
**\#define** ZPS_TLV_G_PSK_ADMINAUTH (16) /* Administrative Authorization Key */
Setting these attributes in the AIB is done using the API ZPS_teStatus ZPS_eAplAibSetKeyNegotiationOptions(uint8 u8Methods, uint8 u8SharedSecrets)
. The return value is always ZPS_E_SUCCESS
.
Joiner TLVs
The device wanting to join an R23 network shall send the Network Commissioning Request command communicates information to the parent device with the Joiner TLVs directly in the message. The device shall include the Joiner Encapsulation Global TLV. In a multi-hop joining scenario the Trust Center and parent device will not be the same entity. Information about the sending device is communicated to the Trust Center through the Joiner Encapsulation Global TLV, which will be relayed in its entirety in the Update Device message. When a device creates the Joiner Encapsulation Global TLV it shall contain the following TLVs inside it:
Fragmentation Parameters Global TLV
If the device is not rejoining: Supported Key Negotiation Methods Global TLV
The Router R23 example contains the following code to set the Joiner TLVs before calling the stack initialization. These TLVs will be used by the stack as additional payload in the joining command. Their content is configured independently from the AIB attributes configuring the local node’s key negotiation options.
TLV_ENCAPS(g_sJoinerTlvs,
APP_SIZE_JOINREQ_TLV,
m_, tuTlvTestSpecific1,
m_, tuFragParams,
m_, tuSupportedKeyNegotiationMethods,
m_, tuTlvTestSpecific2) =
{
.u8Tag = ZPS_TLV_G_JOINERENCAPS, .u8Len = APP_SIZE_JOINREQ_TLV - 1,
/* This TLV is sent inside the Joiner Encapsulation */
{ .u16ZigbeeManufId = 0x1234, .au8Extra[0] = 0xAA, .au8Extra[1] = 0xBB,
.u8Tag = ZPS_TLV_G_MANUFSPEC, .u8Len = sizeof(tuTlvTestSpecific1) - 1 - ZPS_TLV_HDR_SIZE
},
{ .u16NodeId = 1, .u8FragOpt = 2, .u16InMaxLen = 10,
.u8Tag = ZPS_TLV_G_FRAGPARAMS, .u8Len = sizeof(tuFragParams) - 1 - ZPS_TLV_HDR_SIZE
},
{ .u8KeyNegotProtMask = ZPS_TLV_G_SUPPKEYNEGMETH_STATKEYREQ
| R23_DLK_KEY_PROTO_NEGOTIATION_MASK,
.u8SharedSecretsMask = R23_DLK_SHARED_SECRETS_MASK,
),