博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NRF52832初步使用
阅读量:5037 次
发布时间:2019-06-12

本文共 4657 字,大约阅读时间需要 15 分钟。

  1. 开发环境搭建
  • 开发环境涉及到协议栈SDK版本、keil PACK版本的匹配问题,目前测试通过的环境如下:
  • windows系统:win10
  • 硬件:NRF52832测试板、JLINK-V8仿真器
  • Keil uVision5 For ARM 5.14
  • nrfgostudio_win-64_1.21.2_installer
  • nRF5_SDK_11.0.0
  • NordicSemiconductor.nRF_DeviceFamilyPack.8.5.0.pack

 

  软件都安装完毕后,就可以开始进行调试了。

  1.   协议栈烧录

  开发板通过SWD接口连接调试仿真,通过nrfgo官方工具烧写蓝牙协议栈(s132);

  协议栈hex文件在sdk的路径:nRF5_SDK_11.0.0_89a8197\components\softdevice\s132\hex.

  先擦除,写入s132协议栈,应用部分在keil上编程烧写及调试。

 

  2.NRF52832添加串口私有服务透传实现

  • 打开nRF5_SDK_11.0.0_89a8197\examples\ble_peripheral\ble_app_uart\pca10040\s132\arm5_no_packs例程,我们的开发基于例程修改就可以了;
  • NRF52832初始化分一般流程,主要需要设置的是连接参数(时间间隔)、广播间隔、扫描响应数据等

  

int main(void){    uint32_t err_code;    bool erase_bonds;    // Initialize.    //APP_TIMER_INIT(APP_TIMER_PRESCALER, APP_TIMER_OP_QUEUE_SIZE, false);    uart_init();    //串口硬件初始化    APP_LOG("\r\nNRF52832例程测试!\r\n");        timers_init();    //定时器创建    APP_LOG("\r\n应用定时器初始化!\r\n");        buttons_leds_init(&erase_bonds);    //使用BSP驱动功能较完善,到时修改    APP_LOG("\r\nBSP按键、LED初始化!\r\n");//    leds_init();//    buttons_init();        ble_stack_init();    APP_LOG("\r\nBLE协议栈初始化!\r\n");    gap_params_init();    APP_LOG("\r\nGAP参数设置初始化:\r\n");    APP_LOG("   最小连接间隔:20ms\r\n");    APP_LOG("   最大连接间隔:75ms\r\n");    APP_LOG("   从机延迟:0\r\n");    APP_LOG("   连接超时:4s\r\n");        services_init();        //添加私有服务,需要初始化在广播初始化之前    APP_LOG("\r\n添加私有服务\r\n");    advertising_init();    APP_LOG("\r\n广播初始化\r\n");    conn_params_init();    err_code = ble_advertising_start(BLE_ADV_MODE_FAST);    APP_ERROR_CHECK(err_code);          application_timers_start();//开始定时,时间间隔    // Enter main loop.    for (;;)    {        power_manage();    }}
  • 串口私有服务主要在services_init()中添加

  #include "ble_nus.h"        //蓝牙串口服务

  同时工程中添加对应文件及引用路径如下图:

 

static void services_init(void){    uint32_t        err_code;    ble_nus_init_t  nus_init;//    ble_lbs_init_t  lbs_init;        memset(&nus_init, 0, sizeof(nus_init));    nus_init.data_handler = nus_data_handler;       //蓝牙接收数据串口处理    err_code = ble_nus_init(&m_nus, &nus_init);     //添加nus的GATTS服务UUID    APP_ERROR_CHECK(err_code);    //    memset(&lbs_init, 0, sizeof(lbs_init));//    lbs_init.led_write_handler = led_write_handler;//    err_code = ble_lbs_init(&m_lbs, &lbs_init);     //特性:按键字节、LED字节//    APP_ERROR_CHECK(err_code);}
  •  蓝牙串口服务的接收数据处理函数,实现蓝牙接收串口发送

  services_init

  nus_data_handler

static void nus_data_handler(ble_nus_t * p_nus, uint8_t * p_data, uint16_t length){    for (uint32_t i = 0; i < length; i++)    {        while(app_uart_put(p_data[i]) != NRF_SUCCESS);  //数据串口发送    }    while(app_uart_put('\n') != NRF_SUCCESS);}

  

  • 串口接收蓝牙发送(数据以回车为结束位)

  uart_init  //串口初始化,注册串口接收事件处理函数

  uart_event_handle  //串口数据接收处理函数

void uart_event_handle(app_uart_evt_t * p_event){    static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];    //蓝牙规范限长20字节    static uint8_t index = 0;    uint32_t       err_code;    switch (p_event->evt_type)    {        case APP_UART_DATA_READY:            UNUSED_VARIABLE(app_uart_get(&data_array[index]));            index++;            if ((data_array[index - 1] == '\n') || (index >= (BLE_NUS_MAX_DATA_LEN)))            {                err_code = ble_nus_string_send(&m_nus, data_array, index);  //蓝牙无线发送                if (err_code != NRF_ERROR_INVALID_STATE)                {                    APP_ERROR_CHECK(err_code);                }                                index = 0;            }            break;        case APP_UART_COMMUNICATION_ERROR:            APP_ERROR_HANDLER(p_event->data.error_communication);            break;        case APP_UART_FIFO_ERROR:            APP_ERROR_HANDLER(p_event->data.error_code);            break;        default:            break;    }}static void uart_init(void){    uint32_t                     err_code;    const app_uart_comm_params_t comm_params =    {        RX_PIN_NUMBER,        TX_PIN_NUMBER,        RTS_PIN_NUMBER,        CTS_PIN_NUMBER,        APP_UART_FLOW_CONTROL_DISABLED, //禁止硬件流控制        false,        UART_BAUDRATE_BAUDRATE_Baud115200    };    APP_UART_FIFO_INIT( &comm_params,                       UART_RX_BUF_SIZE,                       UART_TX_BUF_SIZE,                       uart_event_handle,   //串口接收事件处理(串口接收-蓝牙发送)                       APP_IRQ_PRIORITY_LOW,                       err_code);    APP_ERROR_CHECK(err_code);}
  • 串口私有服务UUID

  

  私有服务UUID服务的添加在ble_nus_init中实现:

  rx_char_add(p_nus, p_nus_init);  //添加串口接收特征字节

  tx_char_add(p_nus, p_nus_init);  //添加串口发送特征

 

  串口私有服务通过扫描响应的方式告诉主设备对应的服务UUID信息,在advertising_init()中添加扫描响应数据;

  static ble_uuid_t                       m_adv_uuids[] = {

{BLE_UUID_NUS_SERVICE, NUS_SERVICE_UUID_TYPE}};

  

 

  3.调试

  通过keil编译下载程序到测试板中,通过手机BLE调试助手和PC的串口调试助手即可实现蓝牙串口简单的数据透传。

 

转载于:https://www.cnblogs.com/silencehuan/p/9045669.html

你可能感兴趣的文章
lcx端口转发 linux版
查看>>
arcgis server 10.1 发布动态图层展示海量及频繁更新的数据步骤
查看>>
strncat_s
查看>>
避免复制引用程序集的XML文件
查看>>
C IO(一般性)
查看>>
机器学习中的贝叶斯方法---先验概率、似然函数、后验概率的理解及如何使用贝叶斯进行模型预测(2)...
查看>>
SQL Server 2005 数据库 可疑状态
查看>>
L1-Day4
查看>>
搭建mocha测试环境并使用selenium进行测试
查看>>
Javascript测试之karma + mocha
查看>>
双城记开头
查看>>
烦人的幻灯片问题
查看>>
最大密度子图
查看>>
基于SSM-EasyUI的权限管理系统
查看>>
观察者模式
查看>>
[CSAPP-II] 链接[符号解析和重定位] 静态链接 动态链接 动态链接接口
查看>>
一起啃PRML - 1 Introduction 绪论
查看>>
git 的基本命令
查看>>
性能优化1
查看>>
Git 分支 - 远程分支
查看>>