学习STM32的蓝牙BLE通信

引言

蓝牙低功耗(BLE)是一种无线通信技术,适用于低功耗应用,如物联网设备、传感器和健康监测器等。STM32系列微控制器具有内置的蓝牙无线通信模块,可以方便地实现BLE通信功能。本文将介绍如何使用STM32实现蓝牙BLE通信,并提供代码案例作为参考。

内容大纲

本文将介绍以下内容来实现蓝牙BLE通信:

  1. STM32开发环境配置

  2. 创建BLE项目

  3. 初始化蓝牙BLE模块

  4. 设置蓝牙BLE广播

  5. 建立BLE连接

  6. 实现BLE数据传输

  7. 结束BLE连接

  8. STM32开发环境配置

首先,我们需要配置STM32开发环境。如果你还没有安装开发环境,可以从STMicroelectronics官方网站下载和安装最新版的STM32CubeIDE。安装完成后,打开STM32CubeIDE,创建一个新的STM32项目。

  1. 创建BLE项目

在STM32CubeIDE中,选择File -> New -> STM32 Project创建新的项目。在弹出的对话框中,选择你的STM32开发板型号和芯片型号,然后点击Next。

在下一步选择界面,你可以选择使用HAL库或标准外设库进行开发。选择你熟悉的库,然后点击Finish创建项目。

  1. 初始化蓝牙BLE模块

在创建BLE项目后,我们需要初始化蓝牙BLE模块。在main.c文件中,找到MX_BLE_Init函数。该函数会在main函数前调用,我们需要在此处初始化蓝牙BLE模块。

以下是一个示例代码:

void MX_BLE_Init(void)
{
    // 初始化蓝牙BLE模块

    // 1. 开启蓝牙BLE模块时钟
    __HAL_RCC_BLE_CLK_ENABLE();

    // 2. 配置蓝牙BLE引脚
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    GPIO_InitStruct.Pin = GPIO_PIN_13 | GPIO_PIN_14;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF7_USART2;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    // 3. 初始化蓝牙BLE模块
    hble.Instance = USART2;
    hble.Init.BaudRate = 115200;
    hble.Init.WordLength = USART_WORDLENGTH_8B;
    hble.Init.StopBits = USART_STOPBITS_1;
    hble.Init.Parity = USART_PARITY_NONE;
    hble.Init.Mode = USART_MODE_TX_RX;
    hble.Init.HwFlowCtl = USART_HWCONTROL_NONE;
    hble.Init.OverSampling = USART_OVERSAMPLING_16;
    HAL_USART_Init(&hble);

    // 4. 启动蓝牙BLE模块
    HAL_USART_Start(&hble);
}

上述代码中,我们使用USART2作为蓝牙BLE模块的串口。根据你的开发板型号和引脚连接,可能需要修改引脚配置。

  1. 设置蓝牙BLE广播

在初始化蓝牙BLE模块后,我们需要设置蓝牙BLE广播以使其可被其他设备发现。在main.c文件中,找到MX_BLE_Advertising函数。该函数会在main函数后调用,我们需要在此处设置蓝牙BLE广播。

以下是一个示例代码:

void MX_BLE_Advertising(void)
{
    // 设置蓝牙BLE广播

    // 1. 创建广播参数
    BLE_Advertising_ParamsTypeDef advParams;
    advParams.Mode = BLE_ADV_MODE_CONNECTABLE_UNDIRECTED;
    advParams.Type = BLE_ADV_TYPE_ADV_IND;
    advParams.Interval = 160; // 广播间隔为160ms
    advParams.TxPower = BLE_ADV_TX_POWER_HIGH;

    // 2. 设置广播参数
    HAL_BLE_SetAdvertisingParams(&advParams);

    // 3. 创建广播数据
    uint8_t advData[] = {0x02, 0x01, 0x06, 0x1A, 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A};

    // 4. 设置广播数据
    HAL_BLE_SetAdvertisingData(advData, sizeof(advData));

    // 5. 启动广播
    HAL_BLE_StartAdvertising();
}

上述代码中,我们创建了一个广播参数结构体advParams,设置了广播模式、类型、间隔和发射功率。然后,我们创建了一个广播数据数组advData,并设置广播数据。最后,我们启动了广播。

  1. 建立BLE连接

当其他设备接收到我们的广播后,可以发起BLE连接。在main.c文件中,找到MX_BLE_Connection函数。该函数会在main函数后调用,我们需要在此处建立BLE连接。

以下是一个示例代码:

void MX_BLE_Connection(void)
{
    // 建立BLE连接

    // 1. 等待连接事件
    BLE_Connection_EventTypeDef connEvent;
    HAL_BLE_WaitForConnectionEvent(&connEvent);

    // 2. 建立连接
    HAL_BLE_EstablishConnection(&connEvent);

    // 3. 等待连接完成事件
    BLE_Connection_Complete_EventTypeDef connCompEvent;
    HAL_BLE_WaitForConnectionCompleteEvent(&connCompEvent);

    // 4. 打印连接信息
    printf("Connected to device: %s\n", connCompEvent.DeviceName);
    printf("Connection address: %x:%x:%x:%x:%x:%x\n", connCompEvent.Address[0], connCompEvent.Address[1],
           connCompEvent.Address[2], connCompEvent.Address[3], connCompEvent.Address[4], connCompEvent.Address[5]);
}

上述代码中,我们使用HAL_BLE_WaitForConnectionEvent函数等待连接事件,然后使用HAL_BLE_EstablishConnection函数建立连接。接着,我们等待连接完成事件,并打印连接信息。

  1. 实现BLE数据传输

当BLE连接建立后,我们可以通过蓝牙BLE通信传输数据。在main.c文件中,找到MX_BLE_DataTransmit函数。该函数会在main函数后调用,我们需要在此处实现BLE数据传输。

以下是一个示例代码:

void MX_BLE_DataTransmit(void)
{
    // 实现BLE数据传输

    // 1. 发送数据
    uint8_t data[] = {0x01, 0x02, 0x03, 0x04, 0x05};
    HAL_BLE_SendData(data, sizeof(data));

    // 2. 等待数据接收完成
    HAL_BLE_WaitForDataReceived();

    // 3. 接收数据
    uint8_t receivedData[10];
    HAL_BLE_ReceiveData(receivedData, sizeof(receivedData));

    // 4. 打印接收到的数据
    printf("Received data: ");
    for (int i = 0; i < sizeof(receivedData); i++)
    {
        printf("%02x ", receivedData[i]);
    }
    printf("\n");
}

上述代码中,我们使用HAL_BLE_SendData函数发送数据,然后使用HAL_BLE_WaitForDataReceived函数等待数据接收完成。接着,我们使用HAL_BLE_ReceiveData函数接收数据,并打印接收到的数据。

  1. 结束BLE连接

当BLE通信完成后,我们需要结束BLE连接。在main.c文件中,找到MX_BLE_Disconnection函数。该函数会在main函数后调用,我们需要在此处结束BLE连接。

以下是一个示例代码:

void MX_BLE_Disconnection(void)
{
    // 结束BLE连接

    // 1. 断开连接
    HAL_BLE_Disconnect();

    // 2. 等待断开连接事件
    BLE_Disconnection_EventTypeDef disconnEvent;
    HAL_BLE_WaitForDisconnectionEvent(&disconnEvent);

    // 3. 打印断开连接

  • 17
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32可以通过蓝牙模块进行通。在实际开发中,每套设备都会装一套蓝牙模块,通常使用HC-08作为蓝牙模块的初始化名称。为了避免误连情况,我们需要在初次使用时设置一个唯一的蓝牙名称,可以使用STM32的ID作为蓝牙名称,以保证名称的唯一性,并符合一机一密的规则。\[1\] 蓝牙模块可以作为主从一体的蓝牙串口模块,当蓝牙设备与蓝牙设备配对连接成功后,可以将蓝牙当做串口使用。建立连接后,两个设备可以共享同一个通道,也就是同一个串口,一个设备发送数据到通道中,另一个设备可以接收通道中的数据。\[2\] 对于STM32蓝牙,可以通过蓝牙模块与STM32进行连接,然后通过消息透传的方式进行通。可以使用APP输入数据,通过蓝牙STM32连接进行消息透传,STM32对数据进行解析,获取有用的数据段,然后进行相应的处理。例如,可以使用蓝牙配网的模式,通过APP输入WiFi名称与密码,STM32解析并发送给WiFi模块进行配网。\[3\] #### 引用[.reference_title] - *1* *3* [STM32基于WiFi和蓝牙的内外网通](https://blog.csdn.net/qq_52565563/article/details/125624805)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Stm32 基于蓝牙的串口通 详细篇](https://blog.csdn.net/qq_42177385/article/details/96502182)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值