从硬件到软件玩转Nordic nRF52840 低功耗蓝牙

电路板设计

nRF52840在数据手册中给出了几种不同供电方案下的参考电路,其外围电路相对简单。对个人而言,开发过程中尽可能的降低成本,简化电路,在业余时间中完成快速开发。

考虑到元器件购买数量较小的情况下,其最小系统成本大约30元,然而nRF52840的封装需要开钢网,增加成本和焊接难度。因此,在某宝找了一个很便宜的模组,约30多一些吧,感觉挺划算的,其电路如图:
在这里插入图片描述
从商品描述中可以看到实物的尺寸和预留的引脚如下:
在这里插入图片描述上述两张图为商品描述,暂不添加链接,避免广告嫌疑。如有侵权,请及时相告。

到此为止,主芯片已经搞定,接下来是芯片的供电方式,避免额外使用稳压器,直接从USB供电,同时,将芯片VDD作为输出电压,预留一些测试IO口即为原理图方案,绘制PCB如图:
在这里插入图片描述
将模组正下方开槽,露出模组底下焊盘,输出gerber文件。打板回来的板子如图所示,测试电源地是否短路,测试开槽孔的连接性是否完好,接下来完成焊接。在这里插入图片描述
至此,焊接好的电路板如图所示:
在这里插入图片描述
确认好电路板焊接无误后接上USB线,测试nRF52840的电源输出正确。

开发环境准备

工具名称
开发环境Keil 523
PacknRF_DeviceFamilyPack.8.35.0.pack
SDKnRF5SDK160098a08e2.zip
Jlink驱动V630
AppnRF Connect

SDK 下载地址
Jlink驱动 下载地址

从点灯开始

打开nordic提供的例程,nRF5SDK160098a08e2\examples\peripheral\blinky\pca10056\blank\arm5_no_packs,发现找不到相应的pack,幸好发现网上有同样的问题,解决方法参考CSDN文章《nRF52840(一) 环境搭建》。在pca10056.h中修改例程中对应LED的引脚位置,编译工程。
在这里插入图片描述该工程中不存在协议栈,直接下载程序,下载后装上LED灯,可以看到LED闪烁。
在这里插入图片描述

直奔串口蓝牙

打开nordic提供的例程,
nRF5SDK160098a08e2\examples\ble_peripheral\ble_app_uart\pca10056\s140\arm5_no_packs,先下载协议栈,然后下载应用程序,终于到了见证奇迹的时刻,打开nRF connect开始搜索附近的蓝牙,该例程中的蓝牙名称始终没有出现,从此开始了查找bug之路。

借助CSDN中的一些文章,总算拨开云雾见青天。现总结一下,在调试的过程中,主要是由于官网例程与硬件结合紧密,在初始化时会进行相关检查,程序容易出现APP_CHECK_ERROR,所以针对当前硬件电路板,去掉不相关的LED和BUTTON初始化,配置好串口,另外协议栈始采用外部晶振,需要设置为内部RC时钟。

再次打开搜索蓝牙设备,Nordic_UART出现了,终于看见了曙光。
在这里插入图片描述
做一些简单的测试,在手机端发送字符串如图:
在这里插入图片描述
在串口助手中可以接收到手机端发送的数据。
在这里插入图片描述
在这里感谢CSDN中一些介绍蓝牙串口的相关文章,才得以实现本DIY。

化繁为简

该蓝牙DIY要应用在实际中时,为避免冗余,将去除串口和按键功能,该项工作需要以下操作:

  1. 去除下列5个文件不做编译
    nrf_drv_uart.c
    nrfx_uart.c
    nrfx_uarte.c
    app_uart_fifo.c
    retarget.c
  2. 注释main.c中串口按键相关代码
    nus_data_handler函数中串口发送代码
    uart_event_handle函数定义
    uart_init函数定义
    main函数中uart_init和printf
  3. 设置sdk_config.h中宏定义
    将nRF_Libraries中串口相关宏定义置位0
  4. 设置boards.h中宏定义
    设置BSP_INIT_BUTTONS为0

经上述修改,可以保留源代码中的4个LED指示灯,这里可以通过蓝牙发送控制命令点亮或者熄灭LED灯。
在这里插入图片描述
上图为即将完成的蓝牙控制跑马灯。

nRF52840驱动0.96寸OLED

在nRF52840蓝牙实现了LED灯的状态之后,可以说该DIY没有什么大的毛病,接下来就是根据兴趣实现一些想实现的东西。

闲暇之余,不经意间发现了之前用过的OLED显示屏,于是有一种点亮它的冲动。该OLED模块出厂默认配置为并行通信方式,考虑到该DIY模块预留的IO数量有限,接线困难,在这里通过修改电路板上BS1和BS2的为低电平,设置为SPI通信方式。

其实不管是SPI还是并行通信方式,字符和图片的显示代码是一致的,仅仅是底层驱动方式不一样。网上基于STM32和51单片机的代码很多,可参考CSDN文章《OLED驱动 0.96寸 模拟SPI驱动(STM32)》。

除了可以显示最近本的字符之外,还可以通过Img2LCD软件和取字模软件实现图片和汉字的显示,相关操作也很多。
在这里插入图片描述
上图为OLED显示效果,其中显示了年份、月份和二维码图片。个人通过手机蓝牙发送自己的姓名之后,在OLED上即可显示自己的毕业年份和简单的信息。

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值