NRF52832初步使用
- 开发环境搭建
- 开发环境涉及到协议栈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
其他部分链接:
软件都安装完毕后,就可以开始进行调试了。
- 协议栈烧录
开发板通过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, , 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 = ; 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 = ;
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 - ] == '\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 = ;
}
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的串口调试助手即可实现蓝牙串口简单的数据透传。
NRF52832初步使用的更多相关文章
- nrf52832板子焊接后总结的经验
将之前打的nrf52832的板子拿到手了,经过一番焊接和调试后,发现了一些问题,因为是第一次画板焊接调试,很多地方做的不好,现在将自己的一些经验总结如下: 1 在制板之前,丝印层有必要好好的检查,建议 ...
- 移动端之Android开发的几种方式的初步体验
目前越来越多的移动端混合开发方式,下面列举的大多数我都略微的尝试过,就初步的认识写个简单的心得: 开发方式 开发环境 是否需要AndroidSDK 支持跨平台 开发语言&技能 MUI Win+ ...
- CSharpGL(29)初步封装Texture和Framebuffer
+BIT祝威+悄悄在此留下版了个权的信息说: CSharpGL(29)初步封装Texture和Framebuffer +BIT祝威+悄悄在此留下版了个权的信息说: Texture和Framebuffe ...
- Android自定义View初步
经过上一篇的介绍,大家对于自定义View一定有了一定的认识,接下来我们就以实现一个图片下显示文字的自定义View来练习一下.废话不多说,下面进入我们的正题,首先看一下我们的思路,1.我们需要通过在va ...
- 初步认识Node 之Node为何物
很多人即便是在使用了Node之后也不知道它到底是什么,阅读完本文你应该会有一个初步的.具体的概念了. Node的目标 提供一种简单的构建可伸缩网络程序的方法.那么,什么是可伸缩网络程序呢?可伸缩 ...
- [入门级] 基于 visual studio 2010 mvc4 的图书管理系统开发初步 (二)
[入门级] 基于 visual studio 2010 mvc4 的图书管理系统开发初步 (二) Date 周六 10 一月 2015 By 钟谢伟 Category website develop ...
- 基于C/S架构的3D对战网络游戏C++框架_05搭建系统开发环境与Boost智能指针、内存池初步了解
本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...
- Azure底层架构的初步分析
之所以要写这样的一篇博文的目的是对于大多数搞IT的人来说,一般都会对这个topic很感兴趣,因为底层架构直接关乎到一个公有云平台的performance,其实最主要的原因是我们的客户对此也非常感兴趣, ...
- CozyRSS开发记录14-RSS源管理初步完工
CozyRSS开发记录14-RSS源管理初步完工 1.添加源的响应 DialogHost.Show有几个版本的重载,加一个DialogClosingEventHandler参数.我们让添加源对话框的添 ...
随机推荐
- .hivehistory
在当前用户的家目录下有个.hivestory文件,里面存放了用户执行的hive操作记录,如下: [hadoop@hadoop1 hive-0.14]$ cat ~/.hivehistory show ...
- 初次使用git就遭遇不测,提示没有这个服务连接和需要配置git的一个http参数 NO network connection,SSl host could not be verified ...
第一次使用git 拉取服务上的项目到本地,结果,在拿到访问的url地址后,输入用户名密码,失败了. --eclispe 4.5.3 继承了git客户端插件的版本 ------下一步后,报错 NO n ...
- spring boot(13)-logback和access日志
logback logback出自log4j的作者,性能和功能相比log4j作出了一些改进,而配置方法和log4j类似,是spring boot的默认日志组件.在application.propert ...
- 使用python来建立http服务
python建立http服务 首先我们的windos上要安装python解释器,然后进入我要想要传递的文件的目录下,从当前的目录下进入cmd 然后通过Python解释器输入 python -m htt ...
- Linux 系统的用户和组详解_【all】
1.Linux 用户和用户组详解 2.Linux 文件特殊权限详解 3.Linux 文件的读写执行权限的说明 4.Linux 架构之简述企业网站 5.Linux 环境变量设置详解 6.企业生产环境用户 ...
- Sublime Text3 使用总结
一.简介: Sublime Text 3是一款强大而精巧的文本编辑器 [点击下载].它的界面友好.功能非凡.性能极佳可令代码高亮.语法提示.自动完成更重要的是,它支持众多插件扩展——锦上添花.强之又强 ...
- centos7.4 nfs-2.3.2
http://www.linuxfromscratch.org/blfs/view/svn/basicnet/libtirpc.html 注释:安装环境centos7.4; 安装完软件成后会升级系 ...
- MapReduce实例&YARN框架
MapReduce实例&YARN框架 一个wordcount程序 统计一个相当大的数据文件中,每个单词出现的个数. 一.分析map和reduce的工作 map: 切分单词 遍历单词数据输出 r ...
- Stacks And Queues
栈和队列 大型填坑现场,第一部分的还没写,以上. 栈和队列是很基础的数据结构,前者后进先出,后者先进先出,如下图: 下面开始将客户端和具体实现分开,这样有两个好处:一是客户端不知道实现的细节,但同时也 ...
- lambda表达式和groovy闭包的区别
groovy定义的闭包是 Closure 的实例,lambda表达式只是在特定的接⼝或者抽象类的匿名实现,他们之间最主要区别闭包可以灵活的配置代理策略⽽labmda表达式不允许