nRF52840是NORDIC公司基于ARM Cortex-M4 CPU和浮点计算单元(FPU)设计的单片机,具有1MB闪存和256kB RAM。主频速率可以达到64MHz,
  无线特性:
  (1)数据速率:蓝牙5: 2 Mbps/ 1 Mbps/500 kbps/ 125 kbps
  (2)发射功率:可編程:从+8 至 -20 dBm,每步4 dB
  (3)接收灵敏度:蓝牙5: 125 kbps 时-103 dBm 1Mbps 时-95 dBm
  封装特性:
  带有48个GPIO的7 x 7 aQFN73
  带有48个GPIO的3.5 × 3.6 WLCSP94
  关于nrf52840的详细介绍可以参考官网介绍https://www.nordicsemi.com/Products/nRF52840。

一、协议栈

  在使用Nordic 芯片的时候一般都会使用 Nordic 协议栈, 因此评估的时候一定要把协议栈占用的资源扣除, 然后再评估剩下的资源够不够用。
  Nordic协议栈,是预编译的二进制文件,并不依赖运行时(runtime)。兼容nrf52840的协议栈有S140和S340
  S140是用于nRF52840 SOC的完整蓝牙5协议栈
  S340是用于nRF52840 SOC并且结合了蓝牙5和ANT的协议栈
  此外,S132协议栈也可适用于nRF52840。

二、蓝牙工程包SDK

  由于 nordic Semiconductor 的低功耗蓝牙芯片 NRF52 系列的协议栈是不开源的, 为了鼓励开发者快速进行 nrf52 系列单片机的开发, 节省对基础硬件寄存器的操作的程序编写时间, 使开发者方便快速的编写程序, 官方提供专业的 SDK 工程开发包。
  SDK 全程为软件开发工具包(英文全称: Software Development Kit) , 是nordic Semiconductor 设计的为特定的软件包、 软件框架、 硬件平台、 操作系统等建立应用软件时的开发工具的集合。

2.1、SDK开发包的基本结构

  官方 SDK 可以在其官网免费下载,下载的网址为:https://www.nordicsemi.com/Products/nRF52840/Compatible-downloads?lang=zh-CN打开官方 SDK 文件包 nRF5_SDK_17.1.0_ddde560, 出现如下图所示的文件夹

2.1.1、components 文件夹

  该文件夹存放的是各类驱动、 蓝牙协议栈、 芯片库程序等文件, 是 SDK 的核心部分, 具体说明如下:
   802_15_4 文件夹: IEEE 802.15.4 无线通信协议, 该协议栈用于低速无线个人域网(LR-WPAN)的物理层和媒体接入控制层规范。 支持两种网络拓扑, 即单跳星状或当通信线路超过 10 m 时的多跳对等拓扑。 这个协议栈只能使用在 nrf52840 的芯片。
   ant 文件夹: nrf52840 系列处理器在蓝牙 5.x 基础上添加了 ANT+的功能, ANT+是运动领域内最通用最普及的无线传输协议。 该协议栈也是以 2.4G 通信为基础的, 本文件夹为官方提供的关于ANT+的驱动文件。
  ble 文件夹: ble 蓝牙协议相关的文件, 对接协议栈 softdevice 提供的 API 接口的驱动函数库。编写蓝牙应用的核心部分。
  boards 文件夹: 对应的开发板头文件定义, 定义了诸如 nrf51 和 nrf52 的各类开发板的头文件。
  device_ext 文件夹: 第三方传感器文件, 一些外接传感器的驱动文件。 比如 mpu6050、 ds1624等的驱动文件。
  device_nrf 文件夹: 处理器硬件外设的驱动。 老版本里包含了比如时钟、 串口等外设驱动,新版本 SDK15 把这部分分离到 modules 文件夹中了, 所以这里面只剩下部分驱动, 读者可以直接调用编程。
  iot 文件夹: Internet of Things 的缩写, 物联网的一些驱动文件库。
  libraries 文件夹: 外设应用的库文件。 以上面 device_nrf 文件和 modules 文件夹为基础来编写的二级应用驱动。 比如串口, PWM, 校验等应用的驱动文件。
  nfc 文件夹: NFC 的驱动文件库。
  propertary_rf 文件夹: 2.4G 应用的配置文件, nrf5x 系列处理器兼容普通的 2.4G 的通信协议。
  serialization 文件夹: 该文件夹主要提供了一下公共配置文件, 包括协议栈不同版本需要使用的配置文件。
  softdevice 文件夹: 协议栈的说明文档以及对应 hex, 不同的版本的协议栈的 hex 文件, 以及相关说明文档, 还有相关的头文件。 说明文档对各个版本的协议栈对应程序所需要的 ROM 大小有明确说明:
  toolchain 文件夹: 提供给不同开发环境使用的配置文件。 可以用于开发 nRF5x 系列处理器的开发环境包括: keil、 acc、 iar 等环境需要的配置文件。

2.1.2、config 文件夹

  Config 文件夹提供开发环境以及库函数的配置, 程序里主要需要使用的是 sdk_config.h 函数, 这个函数在提供一个芯片配置使能模板,
documentaion 文件夹打开后, 里面提供一个 index.html 的网页引导文件。 点开这个文件就可以打开官方对整个 SDK 支持包的说明网站, 说明文档包含了各个函数定义以及官方例程的简介说明, 特别是对应协议栈函数和库函数,

2.1.3、example 文件夹

  example 文件夹内包含了官方提供给开发者的应用实例, 通过参考官方的演示实例, 便于开发者快速的开发出自己的应用。 文件夹中根据不同的类型, 把例子分为了多个文件夹:
  802_15_4:提供的 nrf52840 的 802_15_4 通信应用实例。
  ant:该文件夹提供多个 ANT+通信的应用实例。
  ble_central:该文件夹提供多个蓝牙 BLE 主机的应用实例。
  ble_central_and_peripheral: 该文件夹提供蓝牙主从一体的应用实例。
  ble_peripheral: 该文件夹提供多个蓝牙 BLE 从机的应用实例。
  connectivity: 蓝牙直接连接方式的几个测试代码。该文件提供定义官方开发工具的 IO 管脚分配的文件。
  dfu: 该文件夹内提供官方 dfu 的 bootloader 工程和 dfu 的演示实例。
  dtm: Direct Test Mode, 也就是直接连接测试模式的演示实例。
  multiprotocol:混合协议的演示实例。
  nfc:提供的 nfc 的演示实例。
  peripheral: 该文件夹提供多个 nrf51822 外部设备的应用实例。
  Proprietal_rf:2.4G 通信下的演示实例。
  Usb_driver:usb 驱动设备声明。
2.1.4、external 文件夹和 external_tool 夹
  external 文件夹打开后, 里面包含一些第三方的驱动文件夹。
  External_tool 工具包, 放置一些外部工具包, 目前该文件夹里只包含了 CMSIS 的配置向导。

2.2: SDK外设例子和蓝牙例程说明

2.2.1、外设硬件例子

  在官方 sdk 中, 外设硬件实例在nRF5_SDK_15.0.0_a53641a/examples 这个文件夹内, 这个文件夹里包含了 nrf5x 系列芯片的硬件外设各种驱动代码实例, 非常丰富, 对我们编写外设代码是一个很好的参考, 基本能够解决我们绝大多数需求。 其中我们打开一个例子 blinky进行说明。打开 sdk 工程 examples/peripheral/blinky
  Hex 文件夹: 官方提前发的工程 hex 文件, 可以直接下载。
  pca… 文件夹: 提供的是各个芯片 nrf52840 的芯片支持工程, 需要使用的 相应芯片的外设可以打开这个工程。
  main.c 文件: 工程的主函数, 工程主函数是几个芯片公用的, 这样非常方便不同芯片之间的移植
  我们使用的是 nrf52840,打开 pca10040 工程里的 blank 文件夹,会出现多个工程目录:
  arm5_no_packs:keil5 的工程文件包。
  armgcc:gcc 的编译支持文件。
  config: nrf52840 的配置文件。
  iar:IAR 的工程文件包。
  ses:segger embedded studio 的工程文件包。

2.2.2 蓝牙例子说明

  Nrf52840 芯片实际上是多协议芯片, 我们主要关心其中的蓝牙部分。 蓝牙实例包含三个部分,
  ble_central : 主机设备实验
  ble_perpheral: 从机设备实验
  ble_central_and_perpheral: 主从一体实验, 作为中继节点使用
  工程内部的分布和布局和前面的外设部分相同, 可以参考前面的说明。

2.3、基于蓝牙工程包 SDK 的开发环境 keil建立

  关于 KEIL MDK 的 pack包的安装。直接 到 MDK 官 方 网 站 上 去 下 载 Pack 支 持 包 , 点 击 安 装 包 的 网 站 地 址 :http://www.keil.com/dd2/Pack/找到nordic Semiconductor的支持包。

三、GPIO应用

  GPIO 称为输入输出端口, 根据封装最大具有 32 个 I/O 口, 可以通过 P0 这样一个端口访问和控制多达 32 个端口。 而且每个端口都可以独立访问。 GPIO 可以通过寄存器配置来进行控制。 GPIO 端口的控制十分简单, 官方提供了一个库,对寄存器进行了封装。 我们可以很简单的进行调用。

3.1、结构体和枚举

3.1.1、 nrf_gpio_port_dir_t

  nrf52840 官方提供的库函数编程, 可以在"nrf_gpio.h库文件中找到设置 IO 口方向的枚举类型 nrf_gpio_port_dir_t

/** @brief Pin direction definitions. */
typedef enum
{NRF_GPIO_PIN_DIR_INPUT  = GPIO_PIN_CNF_DIR_Input, ///< Input.NRF_GPIO_PIN_DIR_OUTPUT = GPIO_PIN_CNF_DIR_Output ///< Output.
} nrf_gpio_pin_dir_t;

  GPIO_PIN_CNF_DIR_Input的定义在nrf51_bitfields.h文件内

/* Bit 0 : Pin direction. */
#define GPIO_PIN_CNF_DIR_Pos (0UL)/*!< Position of DIR field. */
#define GPIO_PIN_CNF_DIR_Msk (0x1UL << GPIO_PIN_CNF_DIR_Pos)/*!< Bit mask of DIR field. */
#define GPIO_PIN_CNF_DIR_Input (0UL)/*!< Configure pin as an input pin. */
#define GPIO_PIN_CNF_DIR_Output (1UL)/*!< Configure pin as an output pin. */

3.2、库函数

3.2.1、nrf_gpio_cfg 函数

  GPIO 管脚的配置参数都在库函数中封装了一个 nrf_gpio_cfg 函数, 该函数就是来配置 PIN_CNF[n]寄存器的, 通过调用这个函数容易就配置出 GPIO 的端口状态, 代码如下所示:

__STATIC_INLINE void nrf_gpio_cfg(uint32_t             pin_number,nrf_gpio_pin_dir_t   dir,nrf_gpio_pin_input_t input,nrf_gpio_pin_pull_t  pull,nrf_gpio_pin_drive_t drive,nrf_gpio_pin_sense_t sense)
{NRF_GPIO_Type * reg = nrf_gpio_pin_port_decode(&pin_number);reg->PIN_CNF[pin_number] = ((uint32_t)dir << GPIO_PIN_CNF_DIR_Pos)| ((uint32_t)input << GPIO_PIN_CNF_INPUT_Pos)| ((uint32_t)pull << GPIO_PIN_CNF_PULL_Pos)| ((uint32_t)drive << GPIO_PIN_CNF_DRIVE_Pos)| ((uint32_t)sense << GPIO_PIN_CNF_SENSE_Pos);
}

3.2.2、nrf_gpio_cfg_output函数

  GPIO 的输出函数:

__STATIC_INLINE void nrf_gpio_cfg_output(uint32_t pin_number)
{nrf_gpio_cfg(pin_number,NRF_GPIO_PIN_DIR_OUTPUT,NRF_GPIO_PIN_INPUT_DISCONNECT,NRF_GPIO_PIN_NOPULL,NRF_GPIO_PIN_S0S1,NRF_GPIO_PIN_NOSENSE);
}

3.2.2、nrf_gpio_cfg_input函数

  GPIO 的输入函数:

__STATIC_INLINE void nrf_gpio_cfg_input(uint32_t pin_number, nrf_gpio_pin_pull_t pull_config)
{nrf_gpio_cfg(pin_number,NRF_GPIO_PIN_DIR_INPUT,NRF_GPIO_PIN_INPUT_CONNECT,pull_config,NRF_GPIO_PIN_S0S1,NRF_GPIO_PIN_NOSENSE);
}

3.2.3、NRF_GPIO_PIN_MAP函数

/** @brief Macro for mapping port and pin numbers to values understandable for nrf_gpio functions. */
#define NRF_GPIO_PIN_MAP(port, pin) (((port) << 5) | ((pin) & 0x1F))

四、点亮 LED 灯

  一个低电平点亮LED灯的demo:

#include "nrf52840.h"
#include "nrf_gpio.h"
#include "led.h"
#define LED_0          NRF_GPIO_PIN_MAP(0,13)
void LED_Init(void)
{nrf_gpio_cfg_output(LED_0);
}void LED_Open(void)
{nrf_gpio_pin_clear(LED_0);
}void LED1_Close(void)
{nrf_gpio_pin_set(LED_0);}
void LED1_Toggle(void)
{nrf_gpio_pin_toggle(LED_0);
}int main(void)
{LED_Init();while(true){LED1_Open();nrf_delay_ms(500);  LED1_Close();nrf_delay_ms(500);}
}

nrf52840芯片入门相关推荐

  1. FLASH芯片入门资料 原装片与黑白片的区别(转贴)

    FLASH芯片入门资料 原装片与黑白片的区别(转帖)   闪存的级别标准是由闪存芯片厂商制订的,目前国内没有国家标准. 最优秀的是A+级,然后是A级和B级.在读写次数/速度.功耗等方面,同种规格的A+ ...

  2. nRF52840芯片全面支持蓝牙 5.0

    随着蓝牙版本的不断更新,大部分用户都倾向于蓝牙5.0.2018年3月28日,Nordic Semiconductor发布了nRF52840低功耗蓝牙系统级芯片(SoC)产品, 这是同级领先的nRF52 ...

  3. c语言烧录芯片,入门扫盲!芯片程序的烧录过程,没想象那么难跟着走就行!...

    大家好!之前就说过从上个月起,创客e工坊在原本讲解电路知识的基础上会逐渐加入单片机的教程. 并且也如约出了三期的单片机视频:什么是单片机:C语言如何控制单片机:单片机小制作自动加湿器: 那么,今天我们 ...

  4. 甲基化芯片入门学习-基础知识(一)

    基本概念梳理 什么是DNA甲基化 DNA甲基化是表观遗传学的中最为常见的一种修饰,其主要形式包括:5-甲基胞嘧啶 (5-mC).少量的N6-甲基腺嘌呤 (N6-mA) 以及7-甲基鸟嘌呤(7-mG). ...

  5. nRF52840低功耗蓝牙模块芯片

    nRF52840是一种先进的.高度灵活的单芯片解决方案,适用于当今要求越来越高的ULP无线应用程序,用于我们个 人的连接设备.连接的生活环境和一般的物联网.它的设计为蓝牙5的主要功能进步做好准备,并利 ...

  6. 一款强大的芯片nRF52840及利用蓝牙5.0实现数据远程采集

    一.nRF52840蓝牙芯片简介 自从nordic在2018年强势推出nRF52840这颗重磅级芯片后,蓝牙5.0技术开始在业界流行起来,随后蓝牙5.0技术开始成为了各大品牌的旗舰手机标配功能. 1. ...

  7. 好书推荐:21天入门 低功耗蓝牙5.x开发

    低功耗蓝牙5 及其后续版本围绕物联网创新应用而不断更新迭代,如何高效的学习低功耗蓝牙5 相关知识,并通过实践来掌握其开发方法,是广大学子和开发人员非常感兴趣的内容.作为低功耗蓝牙技术在国内最早推广及应 ...

  8. 【学习笔记】人类为什么最终选择了芯片

    备注:李铁夫老师的芯片入门常识学习笔记,整理总结,个人学习收藏使用,请CSDN管理员高抬贵手,万分感谢. 人类为什么最终选择了芯片 1822年--巴贝奇发明了机械计算机,能实现精度达到6位小数的运算. ...

  9. 【转载】单片机入门经验

    随着岁月的增长,我学的越来越深,实验也越做越多,我对单片机的了解也越来越深刻.这样心中就会有越来越多的想法. 2004年,12月份,一次偶然的机会,触发了我一年的奋斗的开始. 某一天,我在本地一个准二 ...

  10. “困”在芯片里的小米、OV,为何集体踏上 ISP 芯赛道?

    本文转载自IT之家 过去十多年,中国的手机厂商们借高通和联发科的 SoC 芯片,推动了智能手机的普及,同时也跻身全球手机行业的前列.然而,随着手机市场竞争的加剧,以及消费者对手机使用体验的更高追求,通 ...

最新文章

  1. 非线性优化:徒手实现LM算法
  2. 调整图像- 自动对比度、自动色阶算法
  3. MSM8225 thermal设计
  4. R树 mysql_为什么MySQL使用B+树作为索引
  5. Base64Util 用户名和密码Base64编码Java代码
  6. Working with FBX SDK (2)
  7. BeanUtils自定义转换器
  8. 如何在生产中检测和诊断慢速代码
  9. 实现推拉ui样式_这推拉门隔断,我从没见过!直角设计同时划分3大功能区,太牛了...
  10. JDBC操作(基础篇)
  11. Python+django网页设计入门(7):常用ORM操作
  12. directdraw显示yuv视频,出现屏保时,yuv显示不出来,表面丢失
  13. 求2020 CFA二级notes资源,谢谢!
  14. Asp.Net Core 系列教程 (一)
  15. java tic tac toe_Tic Tac Toe java
  16. Google Chrome崩溃图片
  17. 企业开源办公虚拟专用网工具
  18. 案例3-数据驱动测试-从excel导入数据
  19. 从Java 9 到 Java 17之Java 11
  20. python练习实例——水仙花数判断

热门文章

  1. Maxwell 介绍
  2. SATI阅读重点有哪些?
  3. 游戏契合度提示音_产品/市场契合度
  4. python在虚拟解释器环境中使用pip安装第三方库出现Requirement already satisfied错误
  5. 魔域来袭H5游戏源码
  6. 《机器学习基石》笔记:第一讲
  7. 关于2020年全国大学生数学建模竞赛——我的感想
  8. java企业员工考勤请假工资人事管理系统springboot+vue
  9. Arduino IDE 烧录 ESP8266教程
  10. jdk动态代理的原理