STMicroelectronics 系列:STM32WB 系列_(2).STM32WB系列架构与特点
STM32WB系列架构与特点
1. STM32WB系列概述
STM32WB系列是STMicroelectronics推出的一款高性能、低功耗的无线微控制器。该系列集成了双核架构,包括一个ARM Cortex-M4内核和一个ARM Cortex-M0+内核。这种双核架构使得STM32WB系列能够在处理复杂应用的同时,保持低功耗和高效的无线通信能力。此外,STM32WB系列还支持多种无线协议,包括Bluetooth Low Energy (BLE)、Bluetooth Mesh、Zigbee、Thread和IEEE 802.15.4。这些特性使得STM32WB系列在物联网(IoT)和可穿戴设备等领域具有广泛的应用前景。
2. 双核架构
2.1 ARM Cortex-M4内核
ARM Cortex-M4内核是STM32WB系列的主要处理器,负责处理复杂的计算任务和应用层逻辑。该内核具有以下特点:
高性能:最高主频可达64 MHz,支持单精度浮点运算单元(FPU)。
低功耗:支持多种低功耗模式,如睡眠模式、停机模式和待机模式。
丰富的外设:包括USART、SPI、I2C、ADC、DAC、定时器、PWM等。
2.2 ARM Cortex-M0+内核
ARM Cortex-M0+内核专门用于处理无线通信协议栈,确保无线通信的高效性和稳定性。该内核具有以下特点:
低功耗:主频为32 MHz,功耗极低。
实时性:优化的中断处理机制,响应速度快。
专用外设:支持低功耗蓝牙(BLE)、IEEE 802.15.4等无线协议的硬件加速器。
3. 无线通信协议支持
3.1 Bluetooth Low Energy (BLE)
STM32WB系列支持Bluetooth Low Energy(BLE),这是一种低功耗的蓝牙技术,适用于电池供电的设备。BLE协议栈由Cortex-M0+内核处理,Cortex-M4内核可以专注于应用层逻辑。
示例:BLE Temperature Sensor
假设我们有一个温度传感器,需要通过BLE将数据发送到手机或其他设备。以下是一个简单的示例代码,展示了如何使用STM32WB系列的BLE功能。
#include "stm32wbxx_hal.h"
#include "stm32wbxx_ble.h"
// 定义温度传感器的UUID
static const uint8_t temperatureSensorUUID[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F};
// 定义温度传感器的GATT服务
static const uint8_t temperatureServiceUUID[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F};
// 定义温度传感器的GATT特征
static const uint8_t temperatureCharacteristicUUID[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F};
// 温度传感器数据
uint8_t temperatureData[2]; // 2字节,用于存储温度值
// 初始化BLE
void BLE_Init(void) {
// 初始化BLE
BLE_InitTypeDef bleInit;
bleInit.pOwnAddress = NULL;
bleInit.AddressType = BLE_ADDRESS_PUBLIC;
bleInit.p广告数据 = NULL;
bleInit.广告数据长度 = 0;
bleInit.p扫描应答数据 = NULL;
bleInit.扫描应答数据长度 = 0;
if (HAL_BLE_Init(&bleInit) != HAL_OK) {
Error_Handler();
}
// 创建温度传感器服务
BLE_ServiceTypeDef temperatureService;
temperatureService.pUUID = temperatureServiceUUID;
temperatureService.UUID长度 = 16;
temperatureService.特征数量 = 1;
if (HAL_BLE_Service_Add(&temperatureService) != HAL_OK) {
Error_Handler();
}
// 创建温度传感器特征
BLE_CharacteristicTypeDef temperatureCharacteristic;
temperatureCharacteristic.pUUID = temperatureCharacteristicUUID;
temperatureCharacteristic.UUID长度 = 16;
temperatureCharacteristic.权限 = BLE_CHAR_PROP_NOTIFY | BLE_CHAR_PROP_READ;
temperatureCharacteristic.最大值长度 = 2;
temperatureCharacteristic.最小值长度 = 2;
temperatureCharacteristic.p初始值 = temperatureData;
if (HAL_BLE_Characteristic_Add(&temperatureService, &temperatureCharacteristic) != HAL_OK) {
Error_Handler();
}
// 启动BLE广告
if (HAL_BLE_Advertise_Start() != HAL_OK) {
Error_Handler();
}
}
// 读取温度传感器数据
void Read_Temperature(void) {
// 模拟读取温度传感器数据
int16_t temperature = 25; // 假设当前温度为25°C
temperatureData[0] = (uint8_t)(temperature & 0xFF);
temperatureData[1] = (uint8_t)((temperature >> 8) & 0xFF);
// 更新特征值
if (HAL_BLE_Characteristic_Value_Update(&temperatureCharacteristic, temperatureData, 2) != HAL_OK) {
Error_Handler();
}
}
// 主函数
int main(void) {
// 初始化HAL库
HAL_Init();
// 初始化系统时钟
SystemClock_Config();
// 初始化BLE
BLE_Init();
while (1) {
// 读取温度传感器数据
Read_Temperature();
// 延时1秒
HAL_Delay(1000);
}
}
// 系统时钟配置
static void SystemClock_Config(void) {
// 配置系统时钟
RCC_OscInitTypeDef oscInit;
RCC_ClkInitTypeDef clkInit;
oscInit.OscillatorType = RCC_OSCILLATORTYPE_HSI;
oscInit.HSIState = RCC_HSI_ON;
oscInit.PLL.PLLState = RCC_PLL_ON;
oscInit.PLL.PLLSource = RCC_PLLSOURCE_HSI;
oscInit.PLL.PLLM = 8;
oscInit.PLL.PLLN = 100;
oscInit.PLL.PLLP = 2;
oscInit.PLL.PLLQ = 2;
if (HAL_RCC_OscConfig(&oscInit) != HAL_OK) {
Error_Handler();
}
clkInit.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
clkInit.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
clkInit.AHBCLKDivider = RCC_SYSCLK_DIV1;
clkInit.APB1CLKDivider = RCC_HCLK_DIV2;
clkInit.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&clkInit, FLASH_LATENCY_1) != HAL_OK) {
Error_Handler();
}
}
// 错误处理函数
static void Error_Handler(void) {
while (1) {
// 错误处理
}
}
4. 低功耗设计
4.1 低功耗模式
STM32WB系列支持多种低功耗模式,包括睡眠模式、停机模式和待机模式。这些模式可以显著降低功耗,延长电池寿命。
睡眠模式:CPU停止运行,但外设和RAM保持供电。
停机模式:CPU和外设停止运行,但RAM保持供电。
待机模式:CPU和外设停止运行,RAM断电,仅保留RTC和一些低功耗外设。
4.2 低功耗示例
假设我们在一个电池供电的设备中使用STM32WB系列,需要在不活动时进入低功耗模式。以下是一个示例代码,展示了如何在设备不活动时进入睡眠模式。
#include "stm32wbxx_hal.h"
// 进入睡眠模式
void Enter_Sleep_Mode(void) {
// 配置PWR进入睡眠模式
HAL_PWR_EnterSLEEPMode(PWR_LOWPOWERREGULATOR_ON, PWR_SLEEPENTRY_WFI);
// 等待中断唤醒
__WFI();
}
// 主函数
int main(void) {
// 初始化HAL库
HAL_Init();
// 初始化系统时钟
SystemClock_Config();
// 初始化GPIO
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 配置LED引脚
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
while (1) {
// 模拟某些活动
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
HAL_Delay(1000);
// 进入睡眠模式
Enter_Sleep_Mode();
}
}
// 系统时钟配置
static void SystemClock_Config(void) {
// 配置系统时钟
RCC_OscInitTypeDef oscInit;
RCC_ClkInitTypeDef clkInit;
oscInit.OscillatorType = RCC_OSCILLATORTYPE_HSI;
oscInit.HSIState = RCC_HSI_ON;
oscInit.PLL.PLLState = RCC_PLL_ON;
oscInit.PLL.PLLSource = RCC_PLLSOURCE_HSI;
oscInit.PLL.PLLM = 8;
oscInit.PLL.PLLN = 100;
oscInit.PLL.PLLP = 2;
oscInit.PLL.PLLQ = 2;
if (HAL_RCC_OscConfig(&oscInit) != HAL_OK) {
Error_Handler();
}
clkInit.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
clkInit.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
clkInit.AHBCLKDivider = RCC_SYSCLK_DIV1;
clkInit.APB1CLKDivider = RCC_HCLK_DIV2;
clkInit.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&clkInit, FLASH_LATENCY_1) != HAL_OK) {
Error_Handler();
}
}
// 错误处理函数
static void Error_Handler(void) {
while (1) {
// 错误处理
}
}
5. 内存与存储
5.1 内存结构
STM32WB系列具有丰富的内存资源,包括Flash、RAM和EEPROM。这些内存资源可以满足不同应用场景的需求。
Flash:用于存储程序代码和常量数据,最大容量可达512 KB。
RAM:用于存储变量和运行时数据,最大容量可达256 KB。
EEPROM:用于存储需要持久保存的数据,如配置参数、历史记录等。
5.2 内存管理示例
假设我们需要在设备中存储一些配置参数,并在设备重启后恢复这些参数。以下是一个示例代码,展示了如何使用STM32WB系列的Flash存储和读取配置参数。
#include "stm32wbxx_hal.h"
// 定义存储在Flash中的配置参数
typedef struct {
uint16_t temperatureThreshold;
uint8_t sensorInterval;
} ConfigParams;
// 配置参数存储地址
#define CONFIG_PARAMS_ADDRESS 0x08010000
// 读取配置参数
void Read_Config_Params(ConfigParams *params) {
// 从Flash中读取配置参数
if (HAL_FLASH_Unlock() != HAL_OK) {
Error_Handler();
}
if (HAL_FLASH_Read(CONFIG_PARAMS_ADDRESS, (uint32_t *)params, sizeof(ConfigParams)) != HAL_OK) {
Error_Handler();
}
if (HAL_FLASH_Lock() != HAL_OK) {
Error_Handler();
}
}
// 写入配置参数
void Write_Config_Params(const ConfigParams *params) {
// 写入配置参数到Flash
if (HAL_FLASH_Unlock() != HAL_OK) {
Error_Handler();
}
if (HAL_FLASH_Erase(CONFIG_PARAMS_ADDRESS, sizeof(ConfigParams)) != HAL_OK) {
Error_Handler();
}
if (HAL_FLASH_Write(CONFIG_PARAMS_ADDRESS, (uint32_t *)params, sizeof(ConfigParams)) != HAL_OK) {
Error_Handler();
}
if (HAL_FLASH_Lock() != HAL_OK) {
Error_Handler();
}
}
// 主函数
int main(void) {
// 初始化HAL库
HAL_Init();
// 初始化系统时钟
SystemClock_Config();
// 初始化配置参数
ConfigParams config = {25, 10}; // 默认温度阈值为25°C,传感器间隔为10秒
// 读取配置参数
Read_Config_Params(&config);
// 模拟某些操作后更新配置参数
config.temperatureThreshold = 30;
config.sensorInterval = 5;
// 写入配置参数
Write_Config_Params(&config);
while (1) {
// 主循环
}
}
// 系统时钟配置
static void SystemClock_Config(void) {
// 配置系统时钟
RCC_OscInitTypeDef oscInit;
RCC_ClkInitTypeDef clkInit;
oscInit.OscillatorType = RCC_OSCILLATORTYPE_HSI;
oscInit.HSIState = RCC_HSI_ON;
oscInit.PLL.PLLState = RCC_PLL_ON;
oscInit.PLL.PLLSource = RCC_PLLSOURCE_HSI;
oscInit.PLL.PLLM = 8;
oscInit.PLL.PLLN = 100;
oscInit.PLL.PLLP = 2;
oscInit.PLL.PLLQ = 2;
if (HAL_RCC_OscConfig(&oscInit) != HAL_OK) {
Error_Handler();
}
clkInit.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
clkInit.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
clkInit.AHBCLKDivider = RCC_SYSCLK_DIV1;
clkInit.APB1CLKDivider = RCC_HCLK_DIV2;
clkInit.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&clkInit, FLASH_LATENCY_1) != HAL_OK) {
Error_Handler();
}
}
// 错误处理函数
static void Error_Handler(void) {
while (1) {
// 错误处理
}
}
6. 安全特性
6.1 安全启动
STM32WB系列支持安全启动功能,确保设备在启动时加载的代码是经过验证的。这有助于防止恶意代码的注入和运行。安全启动可以通过多种机制实现,包括但不限于固件签名验证、固件校验和验证等。这些机制可以确保设备在启动时加载的固件是可信的,从而提高系统的安全性。
6.2 安全示例
假设我们需要在设备启动时验证固件的完整性。以下是一个示例代码,展示了如何使用STM32WB系列的安全启动功能。
#include "stm32wbxx_hal.h"
#include "stm32wbxx_hal_flash.h"
#include "stm32wbxx_hal_rcc.h"
#include "stm32wbxx_hal_pwr.h"
// 定义固件的存储地址和大小
#define FIRMWARE_ADDRESS 0x08008000
#define FIRMWARE_SIZE 0x8000
// 定义固件的校验和存储地址
#define FIRMWARE_CHECKSUM_ADDRESS 0x08010000
// 计算固件的校验和
uint32_t Calculate_Firmware_Checksum(void) {
uint32_t checksum = 0;
uint32_t *firmwareAddress = (uint32_t *)FIRMWARE_ADDRESS;
uint32_t bytesToRead = FIRMWARE_SIZE / sizeof(uint32_t);
for (uint32_t i = 0; i < bytesToRead; i++) {
checksum += firmwareAddress[i];
}
return checksum;
}
// 验证固件校验和
void Verify_Firmware(void) {
// 读取存储在Flash中的固件校验和
uint32_t storedChecksum = 0;
if (HAL_FLASH_Unlock() != HAL_OK) {
Error_Handler();
}
if (HAL_FLASH_Read(FIRMWARE_CHECKSUM_ADDRESS, (uint32_t *)&storedChecksum, sizeof(uint32_t)) != HAL_OK) {
Error_Handler();
}
if (HAL_FLASH_Lock() != HAL_OK) {
Error_Handler();
}
// 计算当前固件的校验和
uint32_t currentChecksum = Calculate_Firmware_Checksum();
// 验证固件校验和
if (currentChecksum != storedChecksum) {
Error_Handler();
}
}
// 主函数
int main(void) {
// 初始化HAL库
HAL_Init();
// 初始化系统时钟
SystemClock_Config();
// 验证固件
Verify_Firmware();
while (1) {
// 主循环
}
}
// 系统时钟配置
static void SystemClock_Config(void) {
// 配置系统时钟
RCC_OscInitTypeDef oscInit;
RCC_ClkInitTypeDef clkInit;
oscInit.OscillatorType = RCC_OSCILLATORTYPE_HSI;
oscInit.HSIState = RCC_HSI_ON;
oscInit.PLL.PLLState = RCC_PLL_ON;
oscInit.PLL.PLLSource = RCC_PLLSOURCE_HSI;
oscInit.PLL.PLLM = 8;
oscInit.PLL.PLLN = 100;
oscInit.PLL.PLLP = 2;
oscInit.PLL.PLLQ = 2;
if (HAL_RCC_OscConfig(&oscInit) != HAL_OK) {
Error_Handler();
}
clkInit.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
clkInit.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
clkInit.AHBCLKDivider = RCC_SYSCLK_DIV1;
clkInit.APB1CLKDivider = RCC_HCLK_DIV2;
clkInit.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&clkInit, FLASH_LATENCY_1) != HAL_OK) {
Error_Handler();
}
}
// 错误处理函数
static void Error_Handler(void) {
while (1) {
// 错误处理
}
}
7. 开发工具与资源
7.1 开发工具
STM32WB系列的开发工具非常丰富,包括STM32CubeMX、STM32CubeIDE和STM32CubeProgrammer等。这些工具可以帮助开发者快速生成初始化代码、配置外设和烧录固件。
STM32CubeMX:图形化配置工具,用于初始化MCU配置和生成初始化代码。
STM32CubeIDE:集成开发环境,支持代码编写、编译和调试。
STM32CubeProgrammer:用于烧录和管理固件的工具。
7.2 开发资源
STMicroelectronics提供了丰富的开发资源,包括技术文档、应用笔记、示例代码和在线支持。这些资源可以帮助开发者更好地理解STM32WB系列的架构和特性,加快开发进度。
技术文档:包括用户手册、参考手册和数据表等。
应用笔记:提供特定应用的详细实现方案。
示例代码:包含多种应用场景的示例代码,如无线通信、传感器数据采集等。
在线支持:通过ST的论坛和社区,开发者可以获得技术支持和交流开发经验。
8. 应用案例
8.1 智能家居
STM32WB系列在智能家居领域有广泛的应用。例如,可以用于智能灯泡、智能插座和环境监测设备等。这些设备通常需要低功耗和高效的无线通信能力,STM32WB系列的双核架构和多种无线协议支持使其成为理想的选择。
示例:智能灯泡
假设我们有一个智能灯泡,可以通过BLE控制其开关状态。以下是一个简单的示例代码,展示了如何使用STM32WB系列实现这一功能。
#include "stm32wbxx_hal.h"
#include "stm32wbxx_ble.h"
// 定义灯泡控制的UUID
static const uint8_t lightControlUUID[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F};
// 定义灯泡控制的GATT服务
static const uint8_t lightServiceUUID[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F};
// 定义灯泡控制的GATT特征
static const uint8_t lightCharacteristicUUID[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F};
// 灯泡控制数据
uint8_t lightData = 0; // 0表示关闭,1表示开启
// 初始化BLE
void BLE_Init(void) {
// 初始化BLE
BLE_InitTypeDef bleInit;
bleInit.pOwnAddress = NULL;
bleInit.AddressType = BLE_ADDRESS_PUBLIC;
bleInit.p广告数据 = NULL;
bleInit.广告数据长度 = 0;
bleInit.p扫描应答数据 = NULL;
bleInit.扫描应答数据长度 = 0;
if (HAL_BLE_Init(&bleInit) != HAL_OK) {
Error_Handler();
}
// 创建灯泡控制服务
BLE_ServiceTypeDef lightService;
lightService.pUUID = lightServiceUUID;
lightService.UUID长度 = 16;
lightService.特征数量 = 1;
if (HAL_BLE_Service_Add(&lightService) != HAL_OK) {
Error_Handler();
}
// 创建灯泡控制特征
BLE_CharacteristicTypeDef lightCharacteristic;
lightCharacteristic.pUUID = lightCharacteristicUUID;
lightCharacteristic.UUID长度 = 16;
lightCharacteristic.权限 = BLE_CHAR_PROP_NOTIFY | BLE_CHAR_PROP_WRITE;
lightCharacteristic.最大值长度 = 1;
lightCharacteristic.最小值长度 = 1;
lightCharacteristic.p初始值 = &lightData;
if (HAL_BLE_Characteristic_Add(&lightService, &lightCharacteristic) != HAL_OK) {
Error_Handler();
}
// 启动BLE广告
if (HAL_BLE_Advertise_Start() != HAL_OK) {
Error_Handler();
}
}
// 控制灯泡
void Control_Light(uint8_t state) {
lightData = state;
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, state ? GPIO_PIN_SET : GPIO_PIN_RESET);
}
// 主函数
int main(void) {
// 初始化HAL库
HAL_Init();
// 初始化系统时钟
SystemClock_Config();
// 初始化GPIO
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 配置LED引脚
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// 初始化BLE
BLE_Init();
while (1) {
// 主循环
}
}
// 系统时钟配置
static void SystemClock_Config(void) {
// 配置系统时钟
RCC_OscInitTypeDef oscInit;
RCC_ClkInitTypeDef clkInit;
oscInit.OscillatorType = RCC_OSCILLATORTYPE_HSI;
oscInit.HSIState = RCC_HSI_ON;
oscInit.PLL.PLLState = RCC_PLL_ON;
oscInit.PLL.PLLSource = RCC_PLLSOURCE_HSI;
oscInit.PLL.PLLM = 8;
oscInit.PLL.PLLN = 100;
oscInit.PLL.PLLP = 2;
oscInit.PLL.PLLQ = 2;
if (HAL_RCC_OscConfig(&oscInit) != HAL_OK) {
Error_Handler();
}
clkInit.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
clkInit.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
clkInit.AHBCLKDivider = RCC_SYSCLK_DIV1;
clkInit.APB1CLKDivider = RCC_HCLK_DIV2;
clkInit.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&clkInit, FLASH_LATENCY_1) != HAL_OK) {
Error_Handler();
}
}
// 错误处理函数
static void Error_Handler(void) {
while (1) {
// 错误处理
}
}
9. 总结
STM32WB系列微控制器凭借其高性能、低功耗的双核架构和丰富的无线通信协议支持,成为物联网和可穿戴设备等领域的理想选择。该系列微控制器不仅提供了强大的计算能力,还具备高效的低功耗模式和丰富的开发工具与资源,使得开发者能够快速、高效地开发出可靠、安全的无线应用。
作者:kkchenkx