Nordic GPIO硬件原理与NCS应用详解
本文主题
Nordic MCU的GPIO硬件简介、GPIOTE是什么、PPI是什么
Zephyr中GPIO的使用、与外设引脚复用的方法(pinctrl)
声明:本文在解释硬件方面会比较详细,其目的是让读者在遇到问题时方便查阅,并debug底层寄存器信号。并非是推荐开发者直接进行寄存器开发,大多数情况下直接使用Nordic提供的外设API进行开发即可,可参考本文第3、4、5章。
1. GPIO硬件介绍在介绍NCS中的GPIO和引脚复用(pinctrl)之前,有必要先介绍Nordic平台的GPIO相关硬件。
1.1. GPIO编号与分配表每个Port上最多有32个GPIO,编号为0 ~ 31。Port从0开始,根据芯片封装的不同,可能还会有Port 1。例如,在代码中,P0.12对应的引脚编号就是12,而P1.12对应的引脚编号就是32+12,也就是44。
在每个手册的“Hardware and layout”章节,有不同MCU封装的GPIO功能说明,我们点进去可以看到每个引脚的用途。不仅是GPIO,还有一些电源和晶振引脚也包含其中:
这里面值得一提的一些信息有:
模拟引 ...
在NCS中使用NRFX外设驱动库——以I2C为例
1. 前言之前编写了两篇与Zephyr设备树和驱动相关的文章:
详解Zephyr设备树与驱动模型
Zephyr设备树与驱动实战——串口
如果你看完这两篇文章,相信你对Zephyr的驱动模型已经有一定概念了。开发者能够直接使用厂商写好的高效、完善的驱动程序,无需再埋头于寄存器手册、波形时序、引脚配置等底层程序,只需专注于自己的应用即可。
但是,做嵌入式开发,总还有各种各样的原因,让人不得不陷入底层软件调试之中,包括但不限于:
厂商提供的外设驱动都只有标准的,但我的应用场景是非标准的
我需要多个外设在底层进行深入的联动,厂商提供的驱动无法满足我的需求
我不想学Device Tree和驱动模型,我就喜欢老的nRF5 SDK那种开发方法
……
话先说在前面,Nordic的nRF5 SDK从17.10开始就不再更新了。从nRF53系列(也就是nRF5340)、nRF91蜂窝网络、nRF70 Wi-Fi系列以及马上要出的强力的nRF54系列产品,都只能使用NCS了。并且,今后单片机的嵌入式软件开发会越来越复杂:TCP/IP、蓝牙、USB、Matter、OTA、文件系统、显示屏…… ...
Zephyr驱动与设备树实战——串口
1. 前言之前写了一篇详细的博文,详细介绍了Zephyr设备树(DeviceTree)的语法和Zephyr驱动模型的原理。但有些读者反馈,内容还是比较泛且杂,只感觉多了一些新的语法和规则,没有感受到这设备树和驱动模型的意义所在,希望能够结合实例来讲解。
今天本文就通过串口这样一个最常见的外设,来实际感受一下Zephyr的驱动模型。本文将会以nRF Connect SDK中zephyr/samples/hello_world例程为基础。分别添加串口、USB CDC ACM、低功耗串口的功能。采用完全相同的应用层代码,只需要修改config和dts即可切换。
2. Hello world工程解析开发板我选择nRF52840DK。首先以zephyr/samples/hello_world例程为模板,创建一个新工程,我在这里把工程命名为learning_zephyr_serial。
工程目录结构|--src| || `--main.c|--CMakeLists.txt`--prj.conf
CMakeLists.txt中先把Zephyr作为包来导入,然后把main.c添加为源码。
prj ...
在nRF7002开发板上运行MQTT例程
1. 简介本文面向零基础读者,将一步一步介绍如何通过nRF7002DK开发板来运行MQTT例程,并分析此例程的框架、代码,以及用到的库。
本文包含以下内容:
MQTT协议简介
手把手教你运行MQTT over WiFi例程
MQTT例程解析
线程间通信框架:ZBus
Zephyr状态机框架:SMF (State Machine Framework)
NCS中的Wi-Fi连接方法
NCS中的MQTT连接方法
MQTT加密连接配置(TLS配置)
1.1. nRF7002DK
nRF7002DK是Nordic的WiFi6开发板,上面有nRF7002和nRF5340两颗芯片。其中nRF7002是Wi-Fi6双频IC,nRF5340是双核蓝牙主控MCU,二者通过QSPI连接。此开发板提供了5GHz和2.4GHz双频WiFi和蓝牙共存的功能。
此外如果你在今年的Nordic Tech Tour上获得了免费的Clever Connect Kit(CCK),也可以使用。它和7002DK的主要电路都相同(7002, 5340,Jlink和外挂Flash),只是缺少一些外围保护电路和IO口切换用 ...
详解Zephyr设备树(DeviceTree)与驱动模型
1. 前言 Nordic最新的开发包NCS(nRF Connect SDK)相对于原来的nRF5 SDK来说,最大的更新莫过于采用了Zephyr系统。而Zephyr不单单是一个用来做多线程的RTOS,它更大的价值在于其自带的各种开源的协议栈、框架、软件包、驱动代码等。如果不是为了使用这些现成的协议栈和软件包,只是单纯使用RTOS,实际上并不会产生什么价值。可以说,Zephyr是为物联网而生的。
Zephyr采用Kconfig对这些软件包进行管理,可以方便地使能或剪裁。而为了使Zephyr自带的硬件驱动代码能够通用,Zephyr采用了DeviceTree来描述硬件。各个半导体厂商把自己的硬件描述成标准DeviceTree,并且按照Zephyr的接口提供驱动代码,然后一起提交给Zephyr。在方便地使用Zephyr中协议栈的同时,用户还能简单方便地使用到各个半导体厂家的硬件功能,这多是一件美事。
但由于目前中文互联网上没有一个很详细的从零开始的教程,导致很多人遇到Zephyr的DeviceTree感到很厌烦:「我之前配一下寄存器、调一下库函数就能操作硬件,怎么现在搞这么复杂?」
...
使用Ubuntu进行WiFi抓包
1. 前言 在之前的文章里,我介绍了如何在Windows中使用NPCAP把无线网卡变为monitor模式,并用Wireshark进行抓包。但是Windows下支持monitor的无线网卡实在是太少了,笔记本自带的PCIE无线网卡更是无法支持。
本文介绍如何在Linux系统下进行WiFi的抓包,并且在本地或者用另一台Windows电脑的Wireshark进行实时分析。
本文使用的硬件环境:
Ubuntu笔记本电脑:
操作系统:Ubuntu 22.04
WiFi网卡:Intel(R) Wi-Fi 6E AX211 160MHz (支持WiFi6E)
有线网口(可选):WiFi网卡变成monitor模式后,用有线网让Windows电脑远程连接到Ubuntu电脑
路由器:支持wifi6的路由器
手机:支持wifi6的手机
Windows笔记本电脑(可选)
示意图如下,虚线内容是可选的:
在linux下查看自己的WiFi网卡是否支持抓包:
网卡驱动已经安装的情况:
查看自己电脑上的所有网卡,并查看其驱动:
$ sudo lshw -C network ...
在Windows上使用Wireshark和Npcap进行WiFi嗅探
1. 前言 我们知道,无线网卡有四种工作模式:
Managed:电脑网卡最常用的模式,用于连接到无线AP进行上网,被AP管理通信过程。
Master:AP模式,提供无线接入和路由的功能。Master能管理与Managed模式的网卡的通信过程。
Ad-hoc:点对点通讯模式,通信双方地位对等,共同承担AP的任务
Monitor:监听模式
本文讲解如何在Windows电脑上,把无线网卡变为Monitor模式,对空中的wifi进行抓包,并用Wireshark进行包的分析。
本文参考了:在Windows电脑上通过wireshark直接无线抓包的方式 - 知了社区 (h3c.com)
2. 安装Npcap在Windows上安装Wireshark时,会问你是否要同时安装Npcap,这里要勾选:
安装Npacp时,不勾选管理员模式,勾选802.11流量抓包支持:
注!
经过亲自测试,发现Npcap 1.71/1.70版本在Windows 11 上均存在bug,明明勾选了Support raw 802.11 traffic,但是实际使用时却提示没有勾选。
后来 ...
利用Wireshark和tcpdump对整个局域网进行实时抓包
1. 前言 有时我们需要对局域网中两个设备之间的通讯进行抓包调试,一种比较方便的方式就是在路由器上通过tcpdump抓包,然后传回电脑上,利用Wireshark查看抓包内容。
本文将以一个OpenWrt路由器为例,展示抓包过程。
参考文章:使用 tcpdump 和 Wireshark 进行远程实时抓包分析 - This Cute World
2. 软件安装2.1. PC上安装Wireshark 官网下载安装包然后安装即可,安装时,一定要勾选:
2.2. 路由器上需要有tcpdump 我是在路由器固件编译时就编译了tcpdump和libcap。选择为<*>号是随固件一起编译,选择为<M>是作为包进行编译。-*-表示强制随固件一起编译,因为有其他包依赖它,所以它必须选中。
Network —> tcpdump
Libraries —> libcap:
如果你不是自己编译的固件,也可以网上下载别人编译好的ipk传到OpenWrt上安装即可:
在路由器上进行测试:
tcpdump --help
3. 利用Wires ...
最简洁清爽的ssh使用方案
1. 前言 已经2022年了,看到很多朋友还在使用Putty、MobaXTerm之类的软件,ssh连接到自己的各种linux开发板、服务器等。每次都要回忆IP地址、用户名、密码。如果要传输文件,scp又要又要输一遍IP地址、用户名、密码。整个搞下来,精神聚焦不了,烦躁程度直线上升。
今天把最方便的ssh使用方式分享给大家。先放一个演示效果如下:
(1)在Linux shell终端,或者Windows Git Bash中,直接输入ssh <主机名>,就可ssh连接到指定主机,无需输入密码.
上图为Windows11 Terminal中打开的Git Bash
(2)scp远程拷贝,也只需主机名,无需用户名、密码:
注:我的远程主机是OpenWrt,没安装sftp,所以这里scp要加-O参数。一般支持sftp的可以不加-O参数。
(3)VS Code Remote,直接选择远程主机,无需密码
注:VS Code Remote要求对方主机要有glibc和libstdc++,实际上OpenWrt的C运行库是musl,是不能用VS Code Remote连的 ...