rt-thread-official/bsp/nrf5x
hyhkjiy d42e66cb0d [ADD]vscode support for nrf52832 2021-03-02 13:47:40 +08:00
..
docs [bsp/nrf5x] rebuild the readme and doc 2020-10-17 20:46:34 +08:00
libraries 解决底层驱动格林威治时间与当地时间胡乱使用的问题 mktime函数改为timegm函数 2021-02-07 21:08:41 +08:00
nrf52832 [ADD]vscode support for nrf52832 2021-03-02 13:47:40 +08:00
nrf52840 add the FAQ about hardfault 2021-02-18 06:23:53 +08:00
README.md add the FAQ about hardfault 2021-02-18 06:23:53 +08:00

README.md

nRF5x BSP 说明

简介

Nordic nRF5x 系列 MCU 应用广泛,且功能齐全、灵活性高,非常适用于 Bluetooth 低功耗蓝牙和 2.4 GHz 超低功耗无线应用。

基于官方sdk16.0版本的基础上该BSP将官方的SDK和RT-THREAD生态结合让开发者可以既可以基于官方的sdk开发自己的应用也可以使用RT-Thread生态的软件包。

目前支持硬件平台:nrf52832(pca10040)nrf52840pca10056

在搭建bsp的时候通过参考STM32的架构预留出支持多种nordic芯片的框架理论上可以支持更多的nordic的平台限于目前社区小伙伴手上的开发板有限如果您手上有相关nordic的开发板欢迎添加对应的nordic的芯片的bsp。

Nordic nRF5x系列BSP 目前支持情况如下:

nordic主芯片 开发板名称 bsp所在文件夹 备注
nrf52840 官方pca10056 nrf52840
nrf52832 官方pca10040 nrf52832
nrf52840 青风52840 nrf52840

主要支持功能

  • 支持官方softdevice的sample ble_app_uart、ble_app_blinky、ble_app_hrssoftdevice是官方nordic的协议栈名称
  • 支持nimble的软件包及对应的sample
  • 官方softdevice的sample和RT-THREAD驱动框架结合。

目录结构

nrf5x
├───docs 
│   └───images                      // nrf5x文档使用图片
│   └───nRF5x系列BSP制作教程.md
├───libraries                       // nrf5x系列支持BSP
│   └───drivers                     // nRF5x 系列设备通用驱动文件 
│   └───templates                   // 通用设备 BSP 工程模板
│   │   └───nrf52x                  // nrf52x 系列 BSP 工程模板
│   │   └───nrf5x_board_kconfig     // 通用 BSP 工程配置文件
├───nrf52832                        // nrf52832 BSP 工程
│   └───application                 // 应用代码
│   │   board                       // 链接脚本文件,开发板硬件初始化和配置文件
│   │   package                     // 软件包目录
│   │   └───nRF5_SDK                // nordic 官方 nRF5x SDK
│   │   kconfig                     // 工程配置文件
│   └───rtconfig.h
├───nrf52840                        // nrf52840 BSP 工程
└───README.md                       // nordic 工程整体介绍

如何使用

RT-THREAD的使用

默认的RT-THREAD工程是不带有蓝牙协议栈功能的方便客户先搭建对应的bsp平台后续可以选择任意协议栈运行蓝牙。

默认的BSP是支持UART和GPIO的烧入即可亮灯。

准备工作

需要env环境和keil环境并且对RT-THREAD使用稍微熟悉一些即可。

  • 首先下载代码,git clone https://github.com/RT-Thread/rt-thread.git
  • 进入到目录rt-thread/bsp/nrf5x/nrf52840
  • 右击进入env命令行模式
  • menuconfig 选择需要加载的BSP配置并且保存
  • 执行pkgs --update 下载对应的硬件软件包这里的HAL库采用软件包的方式需要客户自行下载
  • 执行scons --target=mdk5 生成keil工程烧入即可看到LED小灯闪烁
  • 需要注意的是如果之前板子上已经烧入softdevice的话烧入可能会出现烧不进的情况需要将整颗芯片擦除之后再运行rt-thread裸工程

Softdevice 的使用

首先可以熟悉上述工程的运行在上述运行的基础上我们可以试着跑一下ble_app_beacon(这个在SDK16.0中的peripheral 的sample中)

  • menuconfig 进入Hardware Drivers Config BLE STACK 选择Nordic softdevice

image-20201017191936859

  • menuconfig 进入peripheral libraries and drivers目录中选中nrf5x_sdk

image-20201017190154925

  • 进入目录选择对应的sample

image-20201017190301705

  • 保存配置,然后pkgs --update, 执行scons --target=mdk5
  • 打开keil 工程softdevice的工程需要烧入官方的协议栈所以先要烧入softdevice(如果之前已经烧入SDK16.0的softdevice可以不用执行这一步)点击softdevice工程烧入即可

image-20201017192453525

  • 重新选择rtthread工程进行编译烧入通过串口看到如下的输出即代表成功

image-20201017192639096

  • 这个时候我们执行命令 ble_app_beacon 不同的sample对应不同的命令看到如下log代表beacon已经跑起来了

image-20201017192807997

  • 这个时候用nrf connect 来测试可以搜索到对应的beacon

image-20201017193633608

nimble的使用

如果使用nimble就不能选择softdevice了所以要清空之前的配置为了防止误操作可以选择将nrf52840的目录下面的内容全部执行git reset --hard 之后重复上述操作,然后执行git clean -xfd清理掉无效的文件

  • menuconfig进入BLE STACK 选择nimble

  • menuconfig选择nimble

image-20201017194305048

  • 进入Controller Configuration 选择nrf52840
  • 进入Bluetooth Samples 选择ble beacon sample
  • 执行pkgs --update 下载需要的软件包
  • 执行scons --target=mdk5
  • 打开keil工程烧入代码这个时候需要注意的是如果之前有softdevice存在flash中需要擦除芯片中的softdevice。
  • 烧入之后执行cmd ble_ibeacon
  • 之后用nrf connect 软件可以搜索到对应的beacon设备。

FAQ:

1. 如果烧入的时候出现如下状况:

image-20200912144630334

说明板子上已经烧入了softdevice需要擦除掉才能烧入不带有softdevice的程序。

下面提供一种擦写softdevice的方法。在keil中选择softdevice Erase的FLASH算法这个时候就烧写之前可以擦除之前的softdevice。

image-20201017194935643

2.如果在使用softdevice的时候连上手机时候出现一些hardfault

如下所示:

psr: 0x8100000f
r00: 0x00000000
r01: 0x200034e6
r02: 0x00000000
r03: 0x200034dc
r04: 0x200034dc
r05: 0x00000000
r06: 0x200034e6
r07: 0xdeadbeef
r08: 0xdeadbeef
r09: 0xdeadbeef
r10: 0xdeadbeef
r11: 0xdeadbeef
r12: 0x00000000
 lr: 0x000369af
 pc: 0x00036972
hard fault on handler

这个hardfault发生在SOFTDEVICE内部由于代码不开源这边尝试了修改如下函数可以不触发hardfault。

rt_hw_interrupt_disable    PROC
    EXPORT  rt_hw_interrupt_disable
    ;MRS     r0, PRIMASK
    ;CPSID   I
    BX      LR
    ENDP

;/*
; * void rt_hw_interrupt_enable(rt_base_t level);
; */
rt_hw_interrupt_enable    PROC
    EXPORT  rt_hw_interrupt_enable
    ;MSR     PRIMASK, r0
    BX      LR
    ENDP