该测试基于官方BLE_DataThroughput_Server例程,测试了蓝牙吞吐量,该例程可以在WBA例程中Projects/NUCLEO-WBA64RI/Applications/BLE/BLE_DataThroughput_Server中看到
该程序的核心逻辑主要位于main.c和app_entry.c两个文件中
系统复位后,首先执行main()函数,在这里主要完成外设的初始化以及WPAN的初始化
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* Config code for STM32_WPAN (HSE Tuning must be done before system clock configuration) */
MX_APPE_Config();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* Configure the peripherals common clocks */
PeriphCommonClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_GPDMA1_Init();
MX_RAMCFG_Init();
MX_RTC_Init();
MX_ICACHE_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Init code for STM32_WPAN */
MX_APPE_Init(NULL);
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
MX_APPE_Process();
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
接着程序进入对于无线网络初始化MX_APPE_Init()函数,它位于app_entry.c文件中,该函数主要完成
系统初始化(System_Init())
电源配置(SystemPower_Config(),配置低功耗模式和系统时钟管理器,特别的,它还需要设置GPIO引脚为模拟模式以节省电源)
内存管理分配(APPE_AMM_Init(),初始化高级内存管理器用于动态内存分配)
随机数生成器初始化(APPE_RNG_Init(),用于安全相关操作)
Flash管理器初始化(APPE_FLASH_MANAGER_Init(),初始化Flash管理器,处理Flash访问)
BPKA初始化(APPE_BPKA_Init(),初始化BLE公钥加速器,用于加密操作)
SNVMA初始化(初始化简单非易失性内存仲裁器,用于存储持久数据)
BLE应用程序初始化(APP_BLE_Init(),初始化BLE栈、GATT服务器、服务和特征(如数据吞吐量服务))
Flash访问设置(禁用RFTS Bypass,确保Flash操作正确)
具体程序如下
uint32_t MX_APPE_Init(void *p_param)
{
APP_DEBUG_SIGNAL_SET(APP_APPE_INIT);
UNUSED(p_param);
/* System initialization */
System_Init();
/* Configure the system Power Mode */
SystemPower_Config();
#if (USE_TEMPERATURE_BASED_RADIO_CALIBRATION == 1)
/* Initialize the Temperature measurement */
TEMPMEAS_Init ();
#endif /* (USE_TEMPERATURE_BASED_RADIO_CALIBRATION == 1) */
/* Initialize the Advance Memory Manager module */
APPE_AMM_Init();
/* Initialize the Random Number Generator module */
APPE_RNG_Init();
/* Initialize the Flash Manager module */
APPE_FLASH_MANAGER_Init();
/* USER CODE BEGIN APPE_Init_1 */
#if (CFG_LED_SUPPORTED == 1)
APP_BSP_LedInit();
#endif /* (CFG_LED_SUPPORTED == 1) */
#if (CFG_BUTTON_SUPPORTED == 1)
APP_BSP_ButtonInit();
#endif /* (CFG_BUTTON_SUPPORTED == 1) */
/* USER CODE END APPE_Init_1 */
/* Initialize the Ble Public Key Accelerator module */
APPE_BPKA_Init();
/* Initialize the Simple Non Volatile Memory Arbiter */
if( SNVMA_Init((uint32_t *)CFG_SNVMA_START_ADDRESS) != SNVMA_ERROR_OK )
{
Error_Handler();
}
APP_BLE_Init();
/* Disable RFTS Bypass for flash operation - Since LL has not started yet */
FD_SetStatus (FD_FLASHACCESS_RFTS_BYPASS, LL_FLASH_DISABLE);
/* USER CODE BEGIN APPE_Init_2 */
/* USER CODE END APPE_Init_2 */
APP_DEBUG_SIGNAL_RESET(APP_APPE_INIT);
return WPAN_SUCCESS;
}
对于BLE初始化,位于app_ble.c中的APP_BLE_Init()中,它主要完成以下操作:
初始化BLE主机栈(HOST_BLE_Init()),配置缓冲区和其他参数
初始化GAP和GATT层(Ble_Hci_Gap_Gatt_Init()):
设置BD地址、IRK、ERK
配置TX功率、GAP服务、设备名称、外观
设置安全参数(IO能力、认证需求等)
初始化数据吞吐量服务(DT_SERV_APP_Init())
开始广告(Adv_Request(APP_BLE_ADV_FAST)),等待客户端连接
相关代码如下
void APP_BLE_Init(void)
{
/* USER CODE BEGIN APP_BLE_Init_1 */
/* USER CODE END APP_BLE_Init_1 */
LST_init_head(&BleAsynchEventQueue);
/* Register BLE Host tasks */
UTIL_SEQ_RegTask(1U << CFG_TASK_BLE_HOST, UTIL_SEQ_RFU, BleStack_Process_BG);
UTIL_SEQ_RegTask(1U << CFG_TASK_HCI_ASYNCH_EVT_ID, UTIL_SEQ_RFU, Ble_UserEvtRx);
/* Initialise NVM RAM buffer, invalidate it's content before restauration */
host_nvm_buffer[0] = 0;
/* Register A NVM buffer for BLE Host stack */
SNVMA_Register(APP_BLE_NvmBuffer,
(uint32_t *)host_nvm_buffer,
(CFG_BLE_NVM_SIZE_MAX * 2));
/* Realize a restore */
SNVMA_Restore(APP_BLE_NvmBuffer);
/* USER CODE BEGIN APP_BLE_Init_Buffers */
/* USER CODE END APP_BLE_Init_Buffers */
/* Initialize the BLE Host */
if (HOST_BLE_Init() == 0u)
{
/* Initialization of HCI & GATT & GAP layer */
Ble_Hci_Gap_Gatt_Init();
/* Initialization of the BLE Services */
SVCCTL_Init();
/* Initialization of the BLE App Context */
bleAppContext.Device_Connection_Status = APP_BLE_IDLE;
bleAppContext.connectionHandle = 0xFFFF;
/* From here, all initialization are BLE application specific */
/* USER CODE BEGIN APP_BLE_Init_4 */
UTIL_SEQ_RegTask(1U <<CFG_TASK_LINK_CONFIG_ID, UTIL_SEQ_RFU, LinkConfiguration);
/* USER CODE END APP_BLE_Init_4 */
/* Initialize Services and Characteristics. */
LOG_INFO_APP("\n");
LOG_INFO_APP("Services and Characteristics creation\n");
DT_SERV_APP_Init();
LOG_INFO_APP("End of Services and Characteristics creation\n");
LOG_INFO_APP("\n");
/* USER CODE BEGIN APP_BLE_Init_3 */
/**
* Start to Advertise to be connected by a Client
*/
Adv_Request(APP_BLE_ADV_FAST);
/* USER CODE END APP_BLE_Init_3 */
}
/* USER CODE BEGIN APP_BLE_Init_2 */
/* USER CODE END APP_BLE_Init_2 */
return;
}
在主循环中,调用MX_APPE_Process(),不断处理后台任务和事件
对于BLE数据吞吐量测试功能,开发板作为GATT服务器,提供数据吞吐服务,包括以下几点:
通知(Notification):服务器向客户端发送数据(通过特征值通知)
写入无响应(Write without Response):客户端向服务器写入数据
按钮控制:
B1:启动/停止通知(服务器端),蓝色LED指示状态
B2:发送L2CAP连接更新请求(切换连接间隔)或清除数据库(空闲时)
B3:切换PHY(1Mbps或2Mbps)
吞吐量计算:使用定时器测量数据传输速率(字节/秒),并通过串口日志输出
测试软件使用的是ST BLE Toolbox,可以在ST官网下载
在软件中与开发板连接成功后就能在串口助手中看到相关信息的打印

以下是PHY1和PHY2的吞吐能力,即上传和下载的能力
PHY1上传

PHY1下载

PHY2上传

PHY2下载

也可以在串口助手中查看传输的相关数据
