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);
}
}
版权声明:本文为CSDN博主「温人之周.」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xxxx123041/article/details/121501954
暂无评论