NORDIC nrf52833使用笔记

news/2024/10/22 12:24:48/

文章目录

    • 一、SoftDevice命名规则
      • (一)、通用规则
      • (二)、特定规则
    • 二、nRF52833关键特性
    • 三、SoftDevice目录框架
    • 四、代码目录框架
    • 五、应用代码结构
    • 六、内存分配表
      • (一)、不带bootloader时的内存分配
      • (二)、带bootloader时的内存分配
    • 七、外设举例说明
      • (一)、GPIO
      • (二)、TWI(I2C/UART)
    • 八、移植不同型号DK
    • 九、参考文档

刚开始可以先看这两篇文档,看懂了就不用看我写的了 😃
nRF5 SDK软件架构及softdevice工作原理
Nordic nRF5 SDK和softdevice介绍

一、SoftDevice命名规则

Sxyz为例,其中S表示Software,各字母的含义如下所示。不同的协议栈的具体描述可见此处。

(一)、通用规则

x - 协议栈类型

  • 1:BLE stack
  • 2:ANT stack
  • 3:BLE&ANT stack

y - BLE角色

  • 1:peripheral role
  • 2:central role
  • 3:all roles(central/peripheral/advertiser/observer)

z - 系列芯片

  • 0:nRF51 series
  • 2:nRF52 series
  • 3:misc series

例如S113代表的是 低功耗BLE协议栈,从设备,针对nRF52805, nRF52810, nRF52811, nRF52820, nRF52832, nRF52833 and nRF52840系列的SoC。

(二)、特定规则

x - 协议栈类型

同上

yz - 芯片型号

  • 40:针对芯片52840

tips: S140是一个大而全的协议栈,包含蓝牙所有功能。

注意不同的softdevice所占用的ROM和RAM是不一样的,具体看其手册S112、S113、S122、S130、S132、S140、S212、S312、S332、S340…

在这里插入图片描述

图1-1 s113属性图

在这里插入图片描述

图1-2 s140属性图

二、nRF52833关键特性

  • 该SoC主频为64MHz、内核为Arm Cortex-M4且带FPU。
  • Flash大小为512KB,RAM大小为128KB。
  • 支持PHY为2 Mbps,1 Mbps, Long Range。
  • 支持蓝牙定位功能。
  • 支持低功耗蓝牙BLE、蓝牙Mesh组网、ANT、NFC、Thread和Zigbee协议。
  • 发射功率最大为+8dBm。
  • 支持CCM(CTR加密模式和CMAC认证算法的混合)模式的128-bit AES加密。
  • 支持的外设有UART, SPI, TWI(Two Wire Interface), PDM, HS-SPI, I2S, PWM, 12-bit ADC, USB 2.0。

TWI就是双线接口,支持类似I2C这种只有时钟线/数据线的协议。

三、SoftDevice目录框架

当前最新的nRF5 SDK版本为17.02

在这里插入图片描述

图3-1 nRF5 SDK17目录框架

  • components:Nordic开发的各种SDK,只包含头文件、源文件以及库文件,切勿修改
  • config:不同类型芯片的配置文件。
  • documentation:SDK和不同softdeviceAPI的参考文档。
  • examples:根据不同传输协议/BLE角色/外设等应用场景所设计的例程。此目录很常用
  • external:第三方库或源码。
  • external_tools:第三方工具。
  • integration:集成旧版本SDK(≤SDK14)的驱动(又称legacy)。
  • modules:新版本SDK(>SDK14)驱动nrfx,同时支持nRF5 SDK(用于nRF51/52芯片)以及nRF Connect SDK(支持nRF91/53芯片)。

四、代码目录框架

以usbd_ble_uart为例,具体代码位置在./examples/peripheral/usbd_ble_uart/s113。
NORDIC在此支持三种IDE,分别是Keil、IAR和SES(SEGGER Embedded Studio),我们用SES进行开发。注意SES一定要使用最新版,因为新版本的IDE是完全免费的,相关license到官网申请注册即可。

在这里插入图片描述

图4-1 代码目录图

  • Application
    存放应用程序文件,主要有main.c和sdk_config.h文件。
    在这里插入图片描述
图4-2 Application目录图
  • Board Definition
    此处主要包含开发板相关硬件的定义,主要涉及的是各种板载相关的外设。

在这里插入图片描述

图4-3 Board Definition目录图
  • Board Support
    此处主要是提供系统状态指示(扫描、广播、绑定、连接成功等)功能,根据系统状态控制LED。以及提供通过按键控制系统状态的功能(配对、断开连接、唤醒等)。
    在这里插入图片描述
图4-4 Board Support目录图
  • None
    存放与芯片相关的启动文件、系统时钟配置文件,此处在修改芯片的时候需要替换对应文件。
    在这里插入图片描述
图4-5 None目录图
  • nRF_BLE
    存放低功耗蓝牙相关的广播、建立连接、服务、连接上下文管理器和GATT等文件。
    在这里插入图片描述
图4-6 nRF_BLE目录图
  • nRF_BLE_Services
    存放NUS串口服务的文件。
    在这里插入图片描述
图4-7 nRF_BLE_Services目录图
  • nRF_Drivers
    存放外设驱动文件。
    在这里插入图片描述
图4-8 nRF_Drivers目录图
  • nRF_Libraries
    存放库文件,用于实现多种功能。
    在这里插入图片描述
图4-9 nRF_Libraries目录图
  • nRF_Log
    存放日志输出相关的文件。
    在这里插入图片描述
图4-10 nRF_Log目录图
  • nRF_Segger_RTT
    存放SEGGER RTT相关(Teal Time Transfer)文件,和printf类似(但占用时间极短 us级),可多通道双向传输调试信息,需要使用软件“J-Link RTT Viewer”。
    在这里插入图片描述
图4-11 nRF_Segger_RTT目录图
  • nRF_SoftDevice
    存放协议栈相关的文件。
    在这里插入图片描述
图4-12 nRF_SoftDevice目录图
  • Segger Startup Files
    存放SEGGER启动文件。
    在这里插入图片描述
图4-13 Segger Startup Files目录图
  • UTF/UTF16 converter
    存放UTF编码转换文件。
    在这里插入图片描述
图4-14 UTF/UTF16 converter目录图
  • Output Files
    存放编译输出文件。
    在这里插入图片描述
图4-15 Output Files目录图

五、应用代码结构

主函数如下所示。

int main(void)
{ret_code_t ret;static const app_usbd_config_t usbd_config = { /* USB设备配置结构体 */.ev_state_proc = usbd_user_ev_handler /* 注册usb设备用户事件函数 */};// Initialize.log_init(); /* 初始化信息输出接口 */timers_init(); /* 初始化定时器,此处使用LED标识BLE和CDC状态 */buttons_leds_init(); /* 初始化按键和LED */app_usbd_serial_num_generate(); /* 生成usb设备序列号 */ret = nrf_drv_clock_init(); /* 初始化设备时钟 */APP_ERROR_CHECK(ret); /* 检测返回值是否正常 */NRF_LOG_INFO("USBD BLE UART example started.");ret = app_usbd_init(&usbd_config); /* 传入usb配置结构体初始化usb设备 */APP_ERROR_CHECK(ret);app_usbd_class_inst_t const * class_cdc_acm = app_usbd_cdc_acm_class_inst_get(&m_app_cdc_acm); /* 获取USB CDC-ACM实例  */ret = app_usbd_class_append(class_cdc_acm); /* USB设备追加注册CDC ACM类 */APP_ERROR_CHECK(ret);ble_stack_init(); /* 初始化协议栈 */gap_params_init(); /* 初始化GAP参数 */gatt_init(); /* 初始化GATT */services_init(); /* 初始化服务 */advertising_init(); /* 初始化广播 */conn_params_init(); /* 初始化连接参数 */// Start execution.advertising_start(); /* 开始广播 */ret = app_usbd_power_events_enable(); /* 使能usb设备插入检测 */APP_ERROR_CHECK(ret);// Enter main loop.for (;;){while (app_usbd_event_queue_process()) /* 处理队列事件 */{/* Nothing to do */}idle_state_handle(); /* 进入空闲模式,节省电量 */}
}

在应用中,我们主要修改的是传输速率相关的宏定义以及各种回调函数,其他大部分功能已经封装好。

表5-1 与传输速度相关的宏定义表
parameterrangedefaultdescription
MTU(Maximun Transmission Unit)23~24723最大传输单元
Data Length27~251251最大数据长度
Connect Event Length-400(*1.25 = 500ms)连接事件长度
Connection Event ExtensionTrue/FalseTrue连接时间拓展功能(延长)
PHY(physical layer)1Mbps/2Mbps/Coded1Mbps物理层协议,其中coded protocol仅限于nRF52840
表5-2 各回调函数表
函数名函数说明函数作用
cdc_acm_user_ev_handlerCDC ACM回调函数处理USB串口端口开启/关闭/发送/接收等事件
nus_data_handlerBLE串口服务回调函数处理BLE串口服务发送/接收/notification开启或停止等事件
on_adv_evt广播事件回调函数处理广播事件
ble_evt_handlerble事件回调函数处理GAP连接/断开/请求/超时等事件
gatt_evt_handlergatt事件回调函数处理GATT MTU和数据长度更新请求完毕等事件
bsp_event_handler底层事件回调函数处理系统休眠/GAP断开连接/关闭白名单/绑定/复位等事件
usbd_user_ev_handlerusb用户事件回调函数处理USB设备端点挂起/恢复/开启/停止和插入检测等事件

六、内存分配表

Nordic nRF5系列芯片使用的flash存储器是NOR flash,程序代码无须加载到RAM就可直接在flash上执行。Nordic Flash是带cache机制的,以保证大部分代码执行速度可以达到64MHz,在cache失败的时候,等待周期也只有1个cycle。另外,Nordic芯片是纯Flash产品,里面没有其他NVM(Non-Volatile Memory),所有非易失性数据都放在Flash中,包括蓝牙协议栈,这也是为什么Nordic蓝牙协议栈也可以OTA的根本原因所在。

在这里插入图片描述

图6-1 nRF52833芯片内存分布图

(一)、不带bootloader时的内存分配

表6-1 不带bootloader时内存分配表
内存地址区块
Application_size + SoftDevice_size
Application
SoftDevice_size
SoftDevice
0x00000000

SoftDevice_size根据不同的Softdevice进行配置

(二)、带bootloader时的内存分配

此图详见官网bootloader memory map

在这里插入图片描述

图6-2 带bootloader时不同芯片不同softdevice的内存分配图

在这里插入图片描述

图6-3 内存划分配置图

注意,S140的大小为0x1C000,表格上面SoftDevice的地址范围是错误的(应该为0x0000 1000-0x0001 D000)。

七、外设举例说明

各外设的API说明请看SDK离线文档

//IO映射,如P1.12 --> NRF_GPIO_PIN_MAP(1, 12)
#define NRF_GPIO_PIN_MAP(port, pin) (((port) << 5) | ((pin) & 0x1F))

下面举例说明GPIO和TIMER如何使用,在哪找相关API。其实最好的方法就是看examples/peripheral里面相关外设的demo,简单快速上手。

(一)、GPIO

打开examples/peripheral/blinky/pca10040/s132/ses目录下的emProject项目。

1、配置为输出模式

  • 初始化函数

在这里插入图片描述

图7-1 GPIO输出模式下初始化函数
  • GPIO操作函数

在这里插入图片描述

图7-2 GPIO控制函数

2、配置为输入模式

  • 初始化函数

在这里插入图片描述

图7-3 GPIO输入模式下初始化函数

其中,BUTTON_PULL可选项如下

在这里插入图片描述

图7-4 GPIO输入模式下上下拉的可选配置
  • GPIO操作函数

在这里插入图片描述

图7-5 GPIO输入模式下操作函数

另外Nordic已集成好按键事件处理的代码,详见nRF_Libraries下的app_buttons.c和bsp.c

(二)、TWI(I2C/UART)

打开examples\peripheral\twi_sensor\pca10040\blank\ses目录下的emProject项目。

1、TWI初始化函数

在这里插入图片描述

图7-6 TWI(I2C)初始化函数

2、TWI操作函数

  • TWI写操作函数

在这里插入图片描述

图7-7 TWI(I2C)写操作函数

在这里插入图片描述

图7-8 TWI(I2C)写操作函数API各参数的详细说明

各参数的含义如下所示:

  • p_instance:初始化时的实例

  • address:I2C设备的地址

  • p_data:发送的数据buffer,传入的数据为数组{reg_addr, reg_val(有的话),…}

  • length:传入数据的长度

  • no_stop:是否发送停止信号

  • TWI读操作函数
    在这里插入图片描述

    图7-9 TWI(I2C)读操作函数

在这里插入图片描述

图7-10 TWI(I2C)读函数API各参数的详细说明

各参数的含义如下所示:

  • p_instance:初始化时的实例
  • address:I2C设备的地址
  • p_data:存放接收数据的buffer
  • length:接收数据的长度

八、移植不同型号DK

最直接的方法就是参照其他pca10100的项目文件,直接修改emProject文件内部与芯片相关的参数

  • 开发板相关的配置(如开发板pca10040->pca10100)
  • 适配RAM和Flash地址和大小(如RAM和Flash大小,以及带softdevice时剩余的flash大小)
  • 芯片相关的启动文件(如52832->52833)

九、参考文档

  • 芯片手册
    nRF52833芯片说明
    nRF58233芯片手册

  • SES相关
    SEGGER Embedded Studio IDE下载链接
    SES激活

  • SDK开发相关
    nRF5 nRF5-SDK下载
    nRF5 SDK (离线)文档
    Getting Started
    start developing
    USB examples

  • 开发工具
    wireshark 网络分析工具
    Nordic E2E Forum
    Nordic 开发工具(nRF Sniffer、nRF Connect…)


http://www.ppmy.cn/news/893795.html

相关文章

Spark(24):Spark内核概述

目录 0. 相关文章链接 1. Spark核心组件 1.1. Driver 1.2. Executor 2. Spark通用运行流程概述 0. 相关文章链接 Spark文章汇总 1. Spark核心组件 1.1. Driver Spark 驱动器节点&#xff0c;用于执行 Spark 任务中的 main 方法&#xff0c;负责实际代码的执行工作。Dr…

创建一门简单的解释性编程语言并实现它的解释器

背景 最近刷到大佬的教程&#xff0c;跟着学一下 效果 开始时 输入姓名和年龄后 代码 自创编程语言SimpleScript: 自创一门简易脚本支持中文编程 (gitee.com) 解析 1.词法分析 将程序的每个字符串精准划分出来&#xff0c;形成多个单词Token 2.语法分析 将各段Token再…

注册表:HKCR, HKCU, HKLM, HKU, HKCC,注册表中常用的5种数据类型

注册表是Microsoft Windows中的一个重要数据库、用于存储系统和应用程序的系统信息。 Windows 3.0注册表已经出现Windows NT广泛使用注册表的操作系统Microsoft Windows 95成为windows用户经常接触的内容 HKEY:根键 句柄项&#xff1a;附加的文件夹和一个或多个值 子项&#…

wordpress仿站常用功能代码

wordpress调用代码 调用内容循环标签 目标&#xff1a;循环调用某个文章类型&#xff1b;可以设置调用的分类&#xff0c;数量&#xff0c;排序&#xff1b;显示的内容列表包括调用图片、链接、标题。 <?php // 设置查询参数 $args array(post_type > your_post_typ…

macOS 开发 - NSAlert

文章目录 关于 NSAlert代码实现简单弹出Alert 类型贴着窗口 beginSheetModalForWindow添加按钮关于 NSAlert 官方文档:https://developer.apple.com/documentation/appkit/nsalert代码实现 简单弹出 - (void)showAlert3{NSAlert *alert

我被感动了!世间自有真爱 - 林林与静静

其实很早就有了&#xff0c;不过今天才知道&#xff0c;内容不知是否属实&#xff0c;但它动感动了我。 你会被感动吗&#xff1f; 原文&#xff1a; 我是一名搞计算机的,记得2001年那年我去了北京,然后一直在北京工作,日子过的挺苦的拉,因为一个自己到了一个陌生的城市,也没有…

一篇感人的文章

我是一名搞计算机的,记得2001年那年我去了北京,然后一直在北京工作,日子过的挺苦的拉,因为一个自己到了一个陌生的城市,也没有什么朋友,那就叫一个郁闷那,我是住在玄武门那边的,住了个破四合院,为了省钱每天早上就随便吃点门口卖的点心,记的那个点心店是叫清真寺,回族人开的,他…

感人的爱情故事

我是一名搞计算机的,记得2001年那年我去了北京,然后一直在北京工作,日子过的挺苦的拉,因为一个自己到了一个陌生的城市,也没有什么朋友,那就叫一个郁闷那,我是住在玄武门那边的,住了个破四合院,为了省钱每天早上就随便吃点门口卖的点心,记的那个点心店是叫清真寺,回族人开的,他…