自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(82)
  • 收藏
  • 关注

原创 Linux NFC 子系统剖析

linux源码中NFC在net/nfc下,文件结构如下图:hci:Host Controller Interface主要是针对NFC的主机-控制器接口协议 nci:NFC Controller Interface主要是NFC的控制器接口协议,用于NFCC(NFC Controller)和DH(Device Host)之间core.c:NFC子系统的核心,NFC整个协议栈从这里加载到内核中af_nfc.c:Address Family注册NFC协议族digital_core.c、digital_dep.c、d

2024-02-24 15:50:41 1289

原创 linux-nfc neard移植ARM之交叉编译

至此neard的移植就完成了,关于交叉编译的总结:1.首先要在需要移植的库或者程序下生成configure文件,通常有以下几种方式:--默认存在configure--项目提供autogen.sh可以生成configure文件--按照上一篇博客方式生成,一般都有configure.ac--最复杂的是没有提供任何配置工具,这种情况只能自己写makefile了。

2024-01-24 16:45:47 1096

原创 linux-nfc neard 编译、安装与运行

首先确定安装成功了,但是有时候安装成功pkg-config还是会找不到,这时候需要在目录/usr下查找。当./configure运行不再出错时,可以进行make了,然后使用make install安装。目前这个项目里面的configure和Makefile都要重新生成的。clone完源码切换到目录neard里。如果报错找不到Netlink library,则根据上文安装。笔者的ubuntu18.04默认安装的是2.56.4。目的是为了生成aclocal.m4这个文件。

2024-01-17 18:23:28 526

原创 【PHY6222】绑定详解

设置绑定参数。获取绑定参数。,配对模式,可以选择:,不允许配对,等待配对请求(被动),直接发起配对请求(主动),等待配对的时间,单位ms,默认是1000ms,是否启用中间人保护,IO能力设置,可以选择:,仅仅可以显示,仅仅可以显示YES和NO,仅仅具有键盘输入,既没输入也没输出,既有显示也有键盘输入,使能OOB配对方式,OOB数据,即密钥,详细参考蓝牙传统OOB配对方式。,使能绑定,将会在配对之后发起绑定请求,绑定过程中分发的密钥种类,多选。支持以下参数:,从机加密密钥(LTK)

2023-12-23 17:58:52 1645

原创 【PHY6222】simpleBLEPeripheral剖析

main函数中所有使用extern引用外部的函数均无源码,具体细节不可知。可以看到源码函数有以下几个:相关参数:因为rom的code是不开源的,rom代码调用app就需要一个跳转表。这个文件中包含应用所包含的所有任务初始化。注意在所有任务初始化函数中,初始化每个任务都传入了一个序号,所有所有函数都要按顺序排列。具体按顺序排列指的是和上面任务函数指针数组中函数指针的顺序:在osalInitTasks函数中对于我们最重要的是应用初始化:SimpleBLEPeripheral_Init函数。

2023-11-21 17:59:08 961

原创 蓝牙安全管理(SM:Security Manager)规范详解

配对(Pairing)分为三个阶段,前两个阶段是必须的,而第三阶段是可选的,三个阶段如下:阶段1:配对功能交换(阶段2(LE传统配对):短期密钥(STK:)生成阶段2(LE安全连接LE Secure Connections,也叫LESC):长期密钥(LTK:)生成阶段3:分发特定密钥的传输(可以看到阶段2分为两种:一种是LE传统配对,或者叫做LE遗留配对,它为了兼容低功耗蓝牙以前的配对而存在。另一种是蓝牙4.2新引入的LE安全连接,它安全性会更高。

2023-11-09 18:10:54 3490

原创 剖析Linuxptp中ptp4l实现--OC

源码克隆地址:git://git.code.sf.net/p/linuxptp/code项目官网文档:https://linuxptp.nwtime.org/documentation/关于linuxptp的相关配置可以参考以下博文:linuxptp/ptp4l PTP时钟同步配置选项ptp4l的main函数在ptp4l.c中,命令行解析使用的是 getopt_long ,具体使用方法可以百度,这个是现成的命令行解析API。可以看到解析不同命令行参数后都是调用的 config_set_int 函数设置,li

2023-07-25 19:54:36 4003 3

原创 STM32F407移植1588v2(ptpd)

硬件:STM32F407ZGT6开发板软件:VSCodeopenOCDst-link在github搜到一个在NUCLEO-F429ZI开发板上移植ptpd的example,因为和F407差别很小,所以就打算用这个demo移植到手头的开发板上。因为目前只需要slave,所以只调试了slave。据介绍,master好像原作者没有充分测试过。

2023-06-09 16:49:22 3712

原创 (GCC)从零开始的ETH开发--STM32F407ZGTX

windows10STM32F407ZGT6开发板,ETH原理图:​根据硬件可知MAC和PHY之间的接口类型为RMII,且PHY使用的外部晶振,这种情况下不需要单片机给PHY芯片提供时钟,而是由PHY的REF-CLK引脚给单片机的MAC控制器提供一个时钟用于同步,此时单片机MAC控制器和PHY芯片的时钟其实都来自于PHY的外部晶振。(还有一种方式是PHY芯片不使用外部晶振,而是单片机给它提供时钟)

2023-05-18 13:59:56 1696 1

原创 深入浅出1588v2(PTP)里的时间同步原理

简单的方法是你把sync包给网卡,但是里面的时间并不填充,而是让网卡在发送时,把这个时间填写进去,这也需要网卡支持,但是明显更符合实际一点。是15:00的时候发送了一个sync包,包里面带有时间t1即15:00,slave在自己时间是15:40的时候收到了这条信息,接收时间点是t2,slave看到包里面数据显示这条信息发送时间点是master的15:00,假如slave已经知道了它和master之间传递消息需要30分钟,那它可以很简单的算出它现在比master快了10分钟,否则它现在应该是15:30。

2023-02-27 18:04:48 14509 9

原创 (GCC)STM32进阶详解之栈回溯

由上一篇大概了解了函数是如何被调用,中断或者说异常又是如何被调用,而这一篇相当于上一篇知识的一个应用,也是上一篇遗留的思考,即在hardfault中如何判断是从何处触发这个异常的。本来打算自己写demo,但是查到github上有一个开源的CmBacktrace,既然有大牛已经写了开源的库,就直接拿来分析印证吧。硬件我使用的是STM32F103ZET6最小系统板,demo是项目中提供的,直接下载即可。

2022-12-22 17:57:09 3165 3

原创 为什么你的程序跑不满CPU?——简单聊聊多核多线程

最近同事测试自己的程序,感觉处理耗时太长,一看CPU使用率,才25%。想要提高CPU使用率降低处理时长,于是向我询问。以此为契机写了这篇,聊聊多核多线程。

2022-12-19 17:50:07 14725 6

原创 (STM32)从零开始的RT-Thread之旅--SPI驱动ST7735(4)使用LVGL

我们仔细看一下这lv_rt_thread_port.c 这个文件,发现里面包含一个自动初始化的 lvgl_thread_init 函数,然后这个函数创建了一个 "LVGL" 的线程,现在是线程入口函数找不到相关定义。我们想刷新整个屏幕时,刷新的区域是坐标(0,0)到(159,79)的矩形范围,但是转化为宽高则是起点为(0,0),宽为160,高为80的范围。经过前几章的搭建,底层显示已经没有问题了,现在需要添加上层的库,我选择了比较火的开源GUI库--LVGL。可以修改lv_hal_disp.h中的。

2022-11-23 18:07:23 2822

原创 (STM32)从零开始的RT-Thread之旅--SPI驱动ST7735(3)使用DMA

上一篇完成了ST7735驱动的移植,并已经可以通过SPI在屏幕上显示字符了,这一章会把SPI修改为DMA的传输方式。由于RTT对于STM32H7的SPI的DMA传输方式目前支持的并不好,这就让上一章裸机方式驱动屏幕派上了用场。我们可以先把SPI+DMA打通,然后再修改内核驱动框架。

2022-11-22 14:55:17 2446

原创 (STM32)从零开始的RT-Thread之旅--SPI驱动ST7735(2)

需要的可以直接git clone下来移植,核心代码无关,可移植性很不错!第一篇中我们打通了SPI,读取到了芯片ID,这一篇只要完善几个接口函数就可以直接使用官方的驱动库了。至于要完善哪几个接口,需要看一下官方驱动库需要哪些函数。

2022-11-18 17:10:05 2896 3

原创 (STM32)从零开始的RT-Thread之旅--PWM驱动ST7735调光

上一章我们先用SPI读取到了LCD的ID,这一章则是使用PWM调光点亮屏幕,因为测试这块屏幕时,发现直接设置背光引脚为高好像无法点亮,好像必须使用PWM调光,不过反正后面调节亮度还是需要PWM,索性先打通PWM。比如这个寄存器的值是 110,即6,D1CorePrescTable[6] = 3,HCLK的时钟右移3,相当于除以8,正好和上图中计算110:rcc_pclk2的情况相同。这个应该是硬汉出的教程,别人转载的。这里我讲一下我是用的TIM1是怎么配置的,你可以根据需要配置你自己的定时器。

2022-11-18 11:37:02 1946 1

原创 (STM32)从零开始的RT-Thread之旅--SPI驱动ST7735(1)

我使用的开发板是WeAct的H743板子,板子带一个0.96的SPI驱动的LCD,给的有现成的测试用例,看源码应该是ST的工程师写的ST7735的驱动,打算把这个驱动直接拿到RTT工程里面使用。这里按正常流程来,先打通SPI,再进行上层功能实现。一般当我们用SPI读取到LCD的ID时,即认为SPI没问题了。这里这块由ST7735驱动的LCD屏幕的SPI接口和一般的不太一样,接线如下:首先SPI是3线制的,MOSI可以读也可以写,然后通过一根线控制读写的是寄存器还是缓存。

2022-11-16 17:12:24 3992 3

原创 (STM32)从零开始的RT-Thread之旅--GPIO

因为我们选择好MCU后RTT Studio就知道了我们芯片的封装,它会自动根据你芯片封装确定你芯片引脚个数,从而知道你的芯片有哪几个GPIO组,这些都不用我们关系和设置。无论什么开发板,最先调试的肯定是GPIO,一般用来用作指示灯或者按键输入。本篇只是很简单的GPIO应用,没有具体分析RTT框架实现。准备工作做好,就可以添加驱动代码。这里我的开发板上的LED是PE3,按键输入是PC13。测试完成可以开始后续模块开发。

2022-11-14 12:10:23 1838

原创 (STM32)从零开始的RT-Thread之旅--基础项目构建与时钟配置

硬件:WeAct-STM32H743VIT6软件:RT-Thread Studio记得最开始听到RT-Thread还是在4年前,刚毕业的新人,入职的公司有个项目用的RTT,在学校的时候从来没听过也没用过RTOS。一开始就和老板说了自己什么也不懂,结果老板很霸气的直接拉了一个4人群,群里除了我和老板,还有两个大牛,其中一个就是熊总。但其实我从来没有在群里提问过,因为我想问的问题我自己也知道都是些低级问题,哈哈哈。人贵在有自知之明。

2022-11-11 14:35:45 1899

原创 ZephyrOS--添加自定义STM32开发板

本文使用开发板为STM32F103ZET6最小系统板和STM32H743VIT6最小系统板,不涉及架构移植。

2022-08-29 17:54:02 4230 15

翻译 nRF52840的Radio模块详解

2.4 GHz Radio收发器兼容多种无线电标准,如1 Mbps、2 Mbps和远程低功耗蓝牙。完全支持IEEE 802.15.4的250 kbps模式,以及Nordic专用的1 Mbps和2 Mbps操作模式。下面列出了Radio的主要功能:•多域2.4 GHz无线电收发器:•1 Mbps、2 Mbps和长距离(125 kbps和500 kbps模式)低功耗蓝牙•250 kbps的IEEE 802.15.4模式•1 Mbps和2 Mbps的Nordic专有模式•一流的链路预算和低功耗运行•具有支持Eas

2022-08-19 11:39:07 3494

原创 (GCC)STM32基础详解之全局资源的使用

在使用一个共享的全局资源时,多个地方修改这个资源可能会引发问题。可以使用原子操作、关闭中断或者屏蔽中断解决。它们各有利弊:1.原子操作并不一定是一条指令,而可能是很多条指令,只是通过独占访问等实现,所以原子操作可能更加耗时,对于时间敏感的地方需要衡量是否会影响功能。但是好处是它不对其他中断有影响,比如这个例子中的定时器中断,它的响应并不会被延迟。2.关闭所有中断简单粗暴,但在实际项目中,可能使用了很多中断,并不是所有中断都可以随意关闭,有些中断被关闭可能引发一些问题。.........

2022-08-08 10:12:41 1621

原创 SEGGER Embedded Studio找不到xxx.c或者xxx.h文件

感觉这个IDE有点坑,Nordic新的SDK——NCS已经不再支持这个软件了,改用了VSCode+插件的方式,不过旧的芯片因为工程问题更换不太可能。

2022-07-18 10:46:45 2125

翻译 低功耗蓝牙协议指南(The Bluetooth® Low Energy Primer)

《低功耗蓝牙入门指南》

2022-07-08 16:47:34 1424

原创 开源LC3编解码器测试Demo

本文开源LC3编解码器实现来自于Zephyr项目下的一个模块,github仓库:https://github.com/zephyrproject-rtos/liblc3codec使用本demo只需复制test.c和Makefile到clone下来的文件夹内,使用的测试文件名为test_48K_16.pcm,编码后的文件名为encodedata,解码后的文件名为decode.pcm音频测试文件格式为:如果你想使用自己的音频文件测试,请根据实际文件修改代码。 LC3支持两种格式:16bit格式LC3_PCM_F

2022-06-30 17:10:25 1458

原创 NCS再探--nRF5340 Audio

1.前情提要官方文档介绍:nRF5340 Audio — nRF Connect SDK 1.9.99 documentation截止到本文发布,该应用仅仅是实验性的。开发板:PCA10121-nRF5340 Audio DK(22-05-10发布)nRF5340 Audio DK - nordicsemi.com开发环境:Ubuntu 18.04(环境搭建可以参考笔者另一篇博客:NCS初探--搭建Linux下VSCode开发环境_我我我只会printf的博客-CSDN博客)

2022-06-02 17:05:59 3278 17

原创 NCS初探--搭建Linux下VSCode开发环境

1.IDE与插件笔者使用的Ubuntu 18.04,先下载VSCode,然后在拓展中搜索nRF:直接安装nRF Connect for VS Code Extension Pack这个插件,注意VSCode的版本要新。否则会提示版本低无法安装。这个安装包其实是一个拓展集合,里面包含了8个NCS需要的拓展插件。安装完之后可以在侧边栏看到它:2.开发工具开发NCS需要使用git、cmake、python、gcc、等等很多工具,安装这些工具可以使用以下指令:wget https://

2022-05-18 10:42:11 2350

原创 从零开始的nrf52832蓝牙开发(9)--连接参数与MTU

1.连接参数更新注意,连接参数一开始是主机设置的,连接参数更新是从机发起,主机决定要不要更改成从机请求的参数。1.1主机端很简单,只需要在蓝牙事件回调中添加,当从机请求更新连接参数,更新为从机发过来的参数即可:1.2从机端从机端如何发起连接参数更新?只要使用 ble_conn_params_init 这个函数设置了连接参数,从机会在连接后自动发起连接参数更新。但是注意,这个函数内使用了nrf的定时器,所以必须先要初始化定时器:其次,就是调用 ble_conn_para

2022-05-10 16:00:36 2373

原创 从零开始的nrf52832蓝牙开发(8)--连接

因为笔者周围蓝牙设备过多,所以就不做直接连接实验了,但是仍就会先从直接连接讲。1.过滤连接1.1主机端想要连接设备,我们的主机要发起连接,但是发起之后,怎么进行连接,这个是由连接参数决定,这就又回到了设置扫描初始化那个结构体:连接参数结构体定义:typedef struct{ uint16_t min_conn_interval; /**< Minimum Connection Interval in 1.25 ms units, see @ref

2022-05-10 14:32:56 2494 2

原创 从零开始的nrf52832蓝牙开发(7)--广播与扫描白名单

1.主机端开启白名单的选项在之前章节的扫描参数里:我们需要更改为:关于扫描策略:BLE_GAP_SCAN_FP_ACCEPT_ALL:接收所有的广播包,除去广播地址不是指向该设备的定向广播。BLE_GAP_SCAN_FP_WHITELIST:接收在白名单里所有的广播,除去广播地址不是指向该设备的定向广播。BLE_GAP_SCAN_FP_ALL_NOT_RESOLVED_DIRECTED:接收所有的广播包,包含定向广播包。这里如果广播MAC地址是私密地址,这里是无法被解析的。B..

2022-05-10 11:03:26 2142

原创 从零开始的nrf52832蓝牙开发(6)--广播与扫描过滤

1.主机端最重要的,相较于上一篇只是多加了一个过滤初始化: // 设置扫描的UUID限制 err_code = nrf_ble_scan_filter_set(&m_scan, SCAN_UUID_FILTER, &m_nus_uuid); APP_ERROR_CHECK(err_code); // 使能扫描的UUID限制 err_code = nrf_ble_scan_filters_enable(&m_scan, NRF_BLE_

2022-05-10 10:25:37 2513

原创 从零开始的nrf52832蓝牙开发(5)--广播与扫描

前言前段时间看到了谷雨系列的教程感觉不错,就在自己手头的板子上测试了一遍。这个系列更多的是自己的学习记录,如有错误,欢迎评论指正。1.硬件笔者手中一个nRF52832和一个nRF52840,本系列都使用这两个做测试。52832:52840:1.下载SDK与测试demodownload.recurser.com注意选择自己需要的版本,理论上版本越新越好。因为笔者之前下载过15.3,所以本系列都使用15.3测试,如下图:前文已经说过,本系列是基于谷..

2022-05-09 18:22:14 4968 2

原创 ZephyrOS--浅谈Bluetooth LE

1.相关工具版本Zepher版本:3.0.99(非正式版)工具链:zephyr-sdk-0.14.1硬件:nrf52dk_nrf52832(PCA10040)2.环境搭建https://docs.zephyrproject.org/latest/develop/getting_started/index.html3.编译与烧写本文会使用peripheral_hr这个例子,去浅谈zephyr蓝牙相关开发。编译使用指令west build -b nrf52dk_

2022-05-06 17:24:19 3701 1

原创 Bluetooth LE 专有名词

BLUETOORH LE相关专有名词全称

2022-04-27 16:45:32 1094

原创 C语言计数排序

深入浅出计数排序的原理与实现方法。

2022-04-20 17:00:15 2354

原创 (GCC)STM32进阶修炼之ELF文件剖析

本文拟通过分析一个普通的elf文件去剖析elf文件结构。一、数据格式上图表示:比如Elf32_Addr表示无符号程序地址,其大小为4bytes,字节对齐为4。对于STM32来说,其地址是32位,这个毋庸置疑。在Linux下/usr/include/elf.h中也有定义:typedef uint16_t Elf32_Half;typedef uint16_t Elf64_Half;typedef uint32_t Elf32_Word;typedef int32_t Elf32

2022-04-07 10:05:11 3611

原创 C语言冒泡法排序

冒泡法核心思想在于在未排序集合里找最大(小)值,每次找到的这个元素就像水底的泡泡一样浮出水面。展开来说就是,假如有一个数组元素有5个,我们要对它进行从小到大排序,用冒泡法解决就是:1.先找到5个里面的最大值,放在数组最后一个2.既然最后一个元素已经确定是最大值了,那就在剩下的前4个元素里面找最大值,把它放在数组倒数第二个3.依次类推,范围越来越小,直到最后一个元素那每次如何在一个集合里找到最大值?很简单,如果一个元素比这个集合里所有数都大,那它肯定是最大值,如果有比它大的,那就把它替

2022-03-25 14:42:57 4953

原创 死锁条件解析

下图是百度百科对于死锁产生的必要的四个条件描述:如何在实际的例子中印证这些条件?用线程1和线程2同时写文件A和文件B举例:假设,线程1先写文件A,写之前对文件A加互斥锁。同时线程2写文件B,写之前也对文件B加锁。然后线程1写到一半,要再写文件B,注意这个时候它文件A并没有写完。同样的线程2在没有写完文件B的情况下,也要求再写文件A。结果就是,线程1陷入阻塞,因为它要等待线程2释放文件B的互斥锁,同时线程2也陷入阻塞,因为它要等待线程1释放文件A的互斥锁。两个线程都阻...

2022-03-24 10:29:12 1286

原创 Ubuntu虚拟机开机卡在failed to start Raise network interface

虚拟机因为下载了一个很大的文件,下载过程中显示内存不足了,看网上说可以拓展内存,但是需要关机。于是关机设置拓展内存,但是这个内存还需要开机后重新挂载才能生效,但是此时虚拟机卡在 failed to start Raise network interface ,同时屏幕会闪烁。等待一会后,闪烁停止,不过界面仍旧停留在启动界面,打印的是Started Hold until boot procss finishes up 。查找原因发现是因为分配给虚拟机的内存满了,可以把大文件删除即可正常开机。方法是重启

2022-03-03 14:44:42 5479

原创 (GCC)STM32基础详解之函数调用

介绍不再赘述,接上一篇:内存分配本文会分析一个简单的普通函数调用和中断函数调用。其中涉及Cortex-M3架构与AAPCS相关知识。但并不打算从Cortex-M3寄存器组开始讲起,相关知识请参考文末参考资料。函数调用就一句话:有调有还,再调不难1.起始代码void fun(unsigned int tmp){ if(tmp) { }}int main(void){ unsigned int tmp1 = 0x11111111; fun(tmp1); w

2022-02-07 17:07:20 8562 3

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除