概述
文章目录
- 一、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…
二、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
- 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到官网申请注册即可。
- Application
存放应用程序文件,主要有main.c和sdk_config.h文件。
- Board Definition
此处主要包含开发板相关硬件的定义,主要涉及的是各种板载相关的外设。
- Board Support
此处主要是提供系统状态指示(扫描、广播、绑定、连接成功等)功能,根据系统状态控制LED。以及提供通过按键控制系统状态的功能(配对、断开连接、唤醒等)。
- None
存放与芯片相关的启动文件、系统时钟配置文件,此处在修改芯片的时候需要替换对应文件。
- nRF_BLE
存放低功耗蓝牙相关的广播、建立连接、服务、连接上下文管理器和GATT等文件。
- nRF_BLE_Services
存放NUS串口服务的文件。
- nRF_Drivers
存放外设驱动文件。
- nRF_Libraries
存放库文件,用于实现多种功能。
- nRF_Log
存放日志输出相关的文件。
- nRF_Segger_RTT
存放SEGGER RTT相关(Teal Time Transfer)文件,和printf类似(但占用时间极短 us级),可多通道双向传输调试信息,需要使用软件“J-Link RTT Viewer”。
- nRF_SoftDevice
存放协议栈相关的文件。
- Segger Startup Files
存放SEGGER启动文件。
- UTF/UTF16 converter
存放UTF编码转换文件。
- 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(); /* 进入空闲模式,节省电量 */
}
}
在应用中,我们主要修改的是传输速率相关的宏定义以及各种回调函数,其他大部分功能已经封装好。
parameter | range | default | description |
---|---|---|---|
MTU(Maximun Transmission Unit) | 23~247 | 23 | 最大传输单元 |
Data Length | 27~251 | 251 | 最大数据长度 |
Connect Event Length | - | 400(*1.25 = 500ms) | 连接事件长度 |
Connection Event Extension | True/False | True | 连接时间拓展功能(延长) |
PHY(physical layer) | 1Mbps/2Mbps/Coded | 1Mbps | 物理层协议,其中coded protocol仅限于nRF52840 |
函数名 | 函数说明 | 函数作用 |
---|---|---|
cdc_acm_user_ev_handler | CDC ACM回调函数 | 处理USB串口端口开启/关闭/发送/接收等事件 |
nus_data_handler | BLE串口服务回调函数 | 处理BLE串口服务发送/接收/notification开启或停止等事件 |
on_adv_evt | 广播事件回调函数 | 处理广播事件 |
ble_evt_handler | ble事件回调函数 | 处理GAP连接/断开/请求/超时等事件 |
gatt_evt_handler | gatt事件回调函数 | 处理GATT MTU和数据长度更新请求完毕等事件 |
bsp_event_handler | 底层事件回调函数 | 处理系统休眠/GAP断开连接/关闭白名单/绑定/复位等事件 |
usbd_user_ev_handler | usb用户事件回调函数 | 处理USB设备端点挂起/恢复/开启/停止和插入检测等事件 |
六、内存分配表
Nordic nRF5系列芯片使用的flash存储器是NOR flash,程序代码无须加载到RAM就可直接在flash上执行。Nordic Flash是带cache机制的,以保证大部分代码执行速度可以达到64MHz,在cache失败的时候,等待周期也只有1个cycle。另外,Nordic芯片是纯Flash产品,里面没有其他NVM(Non-Volatile Memory),所有非易失性数据都放在Flash中,包括蓝牙协议栈,这也是为什么Nordic蓝牙协议栈也可以OTA的根本原因所在。
(一)、不带bootloader时的内存分配
内存地址 | 区块 |
---|---|
Application_size + SoftDevice_size | — |
Application | |
SoftDevice_size | — |
SoftDevice | |
0x00000000 | — |
SoftDevice_size根据不同的Softdevice进行配置
(二)、带bootloader时的内存分配
此图详见官网bootloader memory map
注意,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、配置为输出模式
- 初始化函数
- GPIO操作函数
2、配置为输入模式
- 初始化函数
其中,BUTTON_PULL可选项如下
- GPIO操作函数
另外Nordic已集成好按键事件处理的代码,详见nRF_Libraries下的app_buttons.c和bsp.c
(二)、TWI(I2C/UART)
打开examplesperipheraltwi_sensorpca10040blankses目录下的emProject项目。
1、TWI初始化函数
2、TWI操作函数
- TWI写操作函数
各参数的含义如下所示:
-
p_instance:初始化时的实例
-
address:I2C设备的地址
-
p_data:发送的数据buffer,传入的数据为数组{reg_addr, reg_val(有的话),…}
-
length:传入数据的长度
-
no_stop:是否发送停止信号
-
TWI读操作函数
图7-9 TWI(I2C)读操作函数
各参数的含义如下所示:
- 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…)
最后
以上就是爱笑耳机为你收集整理的NORDIC nrf52833使用笔记的全部内容,希望文章能够帮你解决NORDIC nrf52833使用笔记所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复