自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(62)
  • 资源 (7)
  • 收藏
  • 关注

原创 USB系列七:通用USB驱动程序解析(重要)

在Windows操作系统中,一个硬件设备的驱动程序是由驱动程序文件(*.sys)和相应的INF文件(*.inf)来描述的。驱动程序文件(*.sys):硬件设备驱动程序的核心文件,提供了应用程序与外部硬件设备的通信通道和方法。INF文件(*.inf):即DeviceInformationFile(设备信息文件),用来指示安装Windows驱动程序(*.sys)。INF文件包含了相应的硬件设备及其驱动程序的详细信息,这些信息包括硬件设备名称、使用什么驱动程序文件,硬件设备信息在系统注册表中的存储等等

2024-05-10 13:04:45 2771

原创 USB系列六:USB HID设备配置

HID的全称为HumanInterfaceDevices,即人机接口设备。HID设备是USB协议中最早提出并支持的一种设备类。USBHID类设备使用非常普遍,例如USB接口的鼠标、键盘、游戏手柄等等。本章将对USBHID设备进行介绍,特别是USBHID类设备的描述符和设备请求

2024-05-10 09:00:31 4994

原创 USB系列五:USB设备配置描述符(重要)

在USB总线接口协议中,对于USB外部设备功能特征是通过端点(Endpoint)、配置(Configuration)和接口(Interface)来描述的,这些就是典型的USB描述符。USB主机通过设备请求来读取外部设备的USB描述符,可以掌握该设备的接口信息和功能。USB设备请求提供了USB设备描述符的读取和写操作,包括标准设备请求和自定义请求两种。USB描述符和USB设备请求是USB外设的主要内容,是USB设备功能的体现。

2024-05-10 08:49:44 4416

原创 USB系列四:USB数据传输类型(重要)

USB总线技术协议具有极大的灵活性,可以针对不同的应用场合需求来采用最适合的数据传输方式。USB标准中规定了4种传输类型,分别为块传输、中断传输、同步传输和控制传输。设计者可以根据传输数据量的大小、传输速率的高低、容错性以及对实时性的要求来进行选择。本章便主要介绍USB的数据传输,以及USB块传输、USB中断传输、USB同步传输和USB控制传输的实现。USB数据传输概述

2024-05-09 13:45:13 2898 1

原创 USB系列三:USB事务处理(2)

USB事务处理是USB总线接口技术协议中数据传输和通信的基础。一个完整的USB事务处理包括令牌阶段、数据阶段和握手阶段3部分,其中令牌阶段是必须的。由于,在USB总线技术接口协议中还细分了7种令牌包。因此,根据令牌包类型的不同,可以将USB事务处理划分为如下7种: USB IN 事务处理 USB OUT 事务处理 USB SETUP 事务处理 USB PING 事务处理 USB SOF 事务处理 USB SPLIT 事务处理 USB PRE 事务处理

2024-05-09 10:12:25 1448

原创 USB系列二:USB事务处理(1)

USB的数据传输按照事务处理的方式来划分,一个完整地事务处理又细分为各种信息包。USB的信息包和事务处理具有特定的格式。USB事务处理是USB总线通信协议的基础,本章主要介绍USB事务处理方式,以及USB信息包的字段格式、USB信息包、令牌包、数据包和握手包等格式。USB事务处理是USB主机和USB设备之间进行数据通信的基础。一般来说,一个完整的USB事务处理按照顺序包含令牌阶段、数据阶段和握手阶段,如图

2024-05-09 08:59:04 987

原创 USB系列一:USB技术概念

USB-IF组织与2000年4月27日公布了USB2.0总线技术规范,其中规定了新的高速传输速率(High-SpeedUSB)为480Mbps,是USB全速的40倍。USB2.0总线技术具有如下的典型特征:a、具有480Mbps的高速传输能力,向下兼容低速1.5Mbps和全速12Mbps两种速率模式。b、继承了良好的热插拔特性,在开机的情况下,也可以安全地任意连接或断开USB设备。c、广泛的操作系统支持,最新的Windows、Linux操作系统都提供了对USB的完整支持,很多USB设备可以直

2024-05-08 17:10:16 930

原创 曼彻斯特编码与解码(含驱动源码)

曼彻斯特编码方式, 这种编码方式利用信号的边沿来表示二进制数据“0”和“1”,比如信号的上身沿表示“1”,下降沿表示“0”,而这种跳变一般发生在位帧的中间。

2024-04-08 10:09:07 2623

原创 CAN总线系列二:时序以及数据帧分析

若通讯节点检测到总线上信号的跳变沿被包含在SS段的范围之内,则表示节点与总线的时序是同步的,当节点与总线同步时,采样点采集到的总线电平即可被确定为该位的电平。总线上的各个通讯节点只要约定好1个Tq的时间长度以及每一个数据位占据多少个Tq,就可以确定CAN通讯的波特率。,主要用来补偿边沿阶段的误差,它的时间长度在重新同步的时候可以加长。,其中SS段占1Tq, PTS段占6Tq, PBS1段占5Tq, PBS2段占7Tq。,通过控制各段的长度,可以对采样点的位置进行偏移,以便准确地采样。

2024-04-01 11:00:25 2437

原创 CAN总线系列一:初识CAN总线

多主通信(不分主从),CAN总线的端点没有地址(除非自己在帧里定义地址),CAN总线通信不用地址,用标识符(CAN总线采用了一个11位或29位的标识符来识别不同的数据帧),不是单独的谁发给谁,而是,你总是发送给整个网络。然后每个节点都有过滤器,对网络上的传播的帧的标识符进行过滤,自己想要什么样的帧,可以设置自己的过滤器,接收相关的帧信息。如果两个节点同时发送怎么办?这个不用我们担心,CAN控制器会自己仲裁,让高优先级的帧先发

2024-03-29 14:04:14 511

原创 STM32不使用中断实现定时器微秒级精确延时

我们在写代码的时候避免不了要使用延时函数,很多延时函数都是使用中断或者tick来实现的,tick的方式最大到毫秒ms级别,通过中断方式的通用定时器来实现,如果实现1us的延时那么每1us就来一次中断,很影响cpu的效率。,并且很简单的方式实现的微秒级精确定时。代码如下(基于stm32f103)通过使用通用定时器来实现。

2024-03-22 13:49:46 1356

原创 STM32关于使用定时器触发ADC转换的理解

模式才能生效,通过配置TIM2_CCMR1_CC2S来控制TIM2_CC2究竟是处于哪种模式(CC2S=0为比较输出,>0为输入捕捉),请注意:这里蓝框的其中一个输出是TIMx_CH2,而TIM2_CH2又是ADC规则通道的触发源,也就是说如果要触发ADC,则需要每次比较匹配时,在TIM2_CH2上产生一次上升沿。CCMR1_CCxS(x为1、2、3、4,决定是哪个通道)是选择为捕捉输入还是比较输出,这里我们需要配置为输出。要使用TIM2的CC2来触发ADC,看懂这个图是关键。模式才能生效,蓝框是配置为。

2024-03-21 09:40:14 3158

原创 ESP32蓝牙系列三:BLE 安全管理控制器

根据蓝牙核心规范中的描述,绑定的目的是为了两个 BLE 设备在进⾏ SMP 加密后,再进行重连时能够使用相同的密钥对链路路进行加密,从而能简化两个设备再连接时的加密流程。• 当两个 BLE 设备之间未进⾏行行过绑定时,两个设备间将会通过配对步骤进⾏行行加密,并根据配对时的信息决定是否需要进⾏行行绑定;BLE 安全管理理是采⽤用调⽤用 BLE GAP 的 API 相关的加密函数,注册 BLE GAP callback,并通过事件返回获取当前的加密状态。1、BLE 加密流程。2、BLE 绑定流程。

2024-03-20 09:36:50 1573

原创 __main代码分析(针对RO RW 从ROM到RAM的加载和初始化ZI)

__main代码分析(针对RORW 从ROM到RAM的加载和初始化ZI)STM32启动代码主要是分配堆栈及设置向量表,然后跳转到__main函数。跳转具体到代码段部分如下:[cpp] view plain copyReset_HandlerPROC EXPORTReset_Handler[WEAK] IMPORT__main L...

2024-03-20 08:44:23 2053

原创 RO段、RW段和ZI段的理解

RO段、RW段和ZI段一直以来对于ARM体系中所描述的RO,RW和ZI数据存在似是而非的理解,这段时间对其仔细了解了一番,发现了一些规律,理解了一些以前书本上有的但是不理解的东西,我想应该有不少人也有和我同样的困惑,因此将我的一些关于RO,RW和ZI的理解写出来,希望能对大家有所帮助。 要了解RO,RW和ZI需要首先了解以下知识: ARM程序的组成 此处所说的“ARM程序”是指在ARM系统中正在执行的程序,而非保存在ROM中的bin...

2024-03-20 08:40:02 850

原创 ESP32蓝牙系列二:协议和规范

ESP32 BLE 通⽤用访问规范 (GAP) 接口 API 的实现和使⽤用流程, GAP 协议层定义了了 BLE 设备的发现流程,设备管理理和设备连接的建立。BLE GAP 协议层采⽤用 API 调⽤和事件 (Event) 返回的设计模式,通过事件返回来获取 API在协议栈的处理理结果。当对端设备主动发起请求时,也是通过事件返回获取对端设备的状态。 BLE 设备定义了了四类 GAP ⻆色

2024-03-19 14:28:33 1506

原创 蓝牙协议栈系列学习目录汇总(已完结)

蓝牙系列二、BLE协议各层的形象化理解。蓝牙系列一:初识蓝牙。

2024-03-19 11:15:10 702

原创 蓝牙系列十七:BLE安全机制--地址类型与LL层设备过滤

上一篇我们讲了BLE的安全机制,引入白名单和安全地址的感念,使用白名单来过滤安全设备是BLE种最简单的方法。这一篇我们来详细讲一下这些概念。

2024-03-19 10:32:33 1339 1

原创 蓝牙系列十六:BLE安全机制概述

蓝牙安全模型包括五个不同的安全特性:配对,绑定,设备鉴权,加密和消息完整性。配对:创建一个或多个共享密钥的过程绑定:保存配对中创建的密钥的行为,用于后续的连接,形成一个信任的设备对设备鉴权:验证两个设备有相同的密钥加密:消息保密性消息完整性:防止消息伪造

2024-03-19 10:27:34 1518

原创 ESP32蓝牙系列一:初识ESP32的蓝牙

从整体结构上,蓝⽛牙可分为控制器器 (Controller) 和主机 (Host) 两⼤大部分:控制器器包括了了PHY、 Baseband、 Link Controller、 Link Manager、 Device Manager、 HCI 等模块,⽤用于硬件接⼝口管理理、链路路管理理等等;主机则包括了了 L2CAP、 SMP、 SDP、 ATT、 GATT、 GAP 以及各种规范,构建了了向应⽤用层提供接⼝口的基础,⽅方便便应⽤用层对蓝⽛牙系统的访问。主机可以与控制器器运⾏行行在同⼀一个宿主上,

2024-03-15 15:56:28 5317

原创 蓝牙系列十五:协议栈GAP层分析

Generic Access Profile(通用访问规范) 它在用来控制设备连接和广播,用于提供蓝牙设备的通用访问功能,包括设备发现、连接、鉴权、服务发现等等。GATT是建立连接后通信规范, 而蓝牙是通过GAP建立通信的。GAP 使你的设备被其他设备可见,并决定了你的设备是否可以或者怎样与合同设备进行交互。GAP 给设备定义了若干角色,其中主要的两个是:外围设备(Peripheral)和中心设备(Central)。 外围设备:这一般就是非常小或者简单的低功耗设备,用来提供数据,并连接

2024-03-13 08:48:04 1915

原创 蓝牙系列十四:协议栈GATT层分析

所谓“声明”也就是一个属性,这个属性的type为0x2800或0x2801,表示这是一个首要服务(Primary Service)或次要服务(Secondary Service)。一个Characteristic定义,从它的“声明”开始,到下一个Characteristic的声明结束,或是直到下一个Service的声明结束,或一直持续到最大的handle值。在BLE里,通过ATT层可以读写对端设备的属性,但是属性之间有什么联系、各个属性怎么组合起来提供服务,由上层GATT负责。

2024-03-12 18:44:52 1369

原创 蓝牙系列十三:协议栈L2CAP层

然后它也会构造一个头部,根据HCI层传入的handle得到access address(代表一个连接,也就是对端的设备), 它还会根据HCI中的PB构造一个header,header中的LLID设为10b,也就是代表了起始包,还会根据HCI中length构造header中的length。应用程序通过L2CAP传送数据给对方,不应该限制数据包的大小,但是蓝牙控制器是使用单片机来实现的,它里面的内存是有限的,较大的数据包传进来,它的内存就不够用了。收发室里面的人是医院的内部员工,它可以在医院内部来传动包裹。

2024-03-12 08:25:30 1935

原创 蓝牙系列十二:协议栈ATT层分析

这些检查结果之间有什么联系,它们组合起来体现了什么,化验室是不知道的,这些得由上层来负责。即把32位UUID的低96位去掉,就得到32位的UUID;ATT层构造好数据后,由下层的L2CAP发给对端设备。L2CAP层是收发室,它怎么知道这些数据是发给对端设备的ATT层?通过ATT层可以读写对端设备的属性,但是属性之间有什么联系、各个属性怎么组合起来提供服务,由上层GATT负责。ATT层负责去获得对端设备的属性,去读写对端设备的属性,如何读取对端设备的属性呢?读写对端设备的属性,就是ATT的关键词。

2024-03-12 08:03:52 730

原创 蓝牙系列十一:HCI层的数据格式

Controller就是一个芯片,它封装了LL层、PHY层那些复杂的操作;Host不需要理解芯片内部复杂的操作,只需要遵守Controller的规范,向它提供command,从它获得event,与它交互acl data。HCI层跟LL层的关系:a. 有些HCI command只是用来设置本地Controller,不导致无线传输b. 有些HCI command会导致LL层发出各类广播包, 比如“LE Set Scan Enable Command”在主动扫描时会导致LL层发出SCAN_RE

2024-03-11 09:31:57 1114

原创 蓝牙系列十:HCI层的硬件接口

对于蓝牙来说分为Host和Controler,那么他们之间的通信是需要一个接口的,这个接口就是HCI层的接口,落实到硬件可以为UART USB等。如何控制链路层让其发出广播包、数据包?通过HCI层向它发出命令,也可以通过ATT层、L2CAP层向LL层发出数据。

2024-03-11 09:15:05 1348

原创 蓝牙系列第九:协议链路层(LL)分析

连接事件计数器为0时(一个事件对应一个channel),fn =0, hop=7----->fn+1= 7,从数组used中可以看出,fn+1是不能用的。因为used 数组中元素的个数为9,所以remappingIndex =7 mod 9 =7------->used[7]=35。连接事件计数器为1时,fn =7, hop=7----->fn+1=14,从数组used中可以看出,fn+1是不能用的。L2CAP的数据包很大时,可以拆分来多次发送,有起始包(LLID=01b)、延续包(LLID=10b)

2024-03-11 08:27:45 1226

原创 蓝牙系列七:开源蓝牙协议栈BTStack数据处理(Wireshark抓包分析)

hci_initializing_run()函数内部,会根据hci_stack->substate等于HCI_INIT_SEND_RESET而发出复位命令,并令substate等于HCI_INIT_W4_SEND_RESET,这表示等待收到该命令的回复信息。hci_initializing_event_handler将调用hci_initializing_next_state(),把subsate设置为HCI_INIT_SEND_READ_LOCAL_VERSION_INFORMATION。

2024-03-06 11:23:37 1309

原创 蓝牙系列六:最简单的开源蓝牙协议BTStack框架代码分析(2)

hci_register_sco_packet_handler就是真接设置hci_stack->sco_packet_handler。btstack_data_source_t结构体中的process函数是数据处理的起点,该“起点”会调用hci.c中的packet_handler函数。各个句柄对应的处理函数,是该句柄数据的处理起点,它将会调用上面各层提供的处理函数。2) 并调用btstack_run_loop_add_data_source把这个结构体告诉btstack_run_loop,

2024-03-06 11:19:52 1361 2

原创 蓝牙系列五:最简单的开源蓝牙协议BTStack代码分析(1)

对于蓝牙协议栈的理解,最好的办法是找一个最简单的开源协议栈进行学习,BTStack整个协议栈都是C语言编写,非常适合刚入门的同学来学习借鉴。

2024-03-06 11:13:20 2126

原创 蓝牙系列四:开源蓝牙协议BTStack框架分析

同样,上面的各个层都可以处理自己感兴趣的数据,因此都可以提供处理数据的函数。这个main函数处于不同的文件里面(不同的硬件接口以及操作系统,main.c所处的文件都是不同的。不同文件中的main.c中的main函数回去操作不同的硬件。然后再去创建一个循环。在循环里面,从蓝牙模块里面获取数据,然后依次调用各个层次提供的处理函数,在这些处理函数里面它会分辨那些数据,如果对数据感兴趣就去处理,不感兴趣就不管。1.main函数会调用操作系统相关的代码(下图中的①)、硬件接口相关的代码(下图中的②),进行初始化。

2024-03-06 10:58:06 1191

原创 蓝牙系列三:BLE协议栈各层数据格式解析

这个B部门的人一看到数据包有A这个头部,就知道数据包是发给A部门的,于是就将for A2'的数据包取出来,由A部门的派件员根据里面的信息发给A2',这样A2'就收到了甲公司中A1发给它的数据包了。,由快递员发给乙公司的B部门。B部门一看这个数据包就是发给本部门的人,于是它就直接看了看这个数据包,哦是发给B2’,于是就发给了B2'通过对公司中上下部门传送数据包的流程大概能知道A、B部门数据包的格式。对方在收到数据包的时候,首先根据头部信息进行解析,它是发给哪一层的,确定了哪一层之后,它再去确定数据的格式。

2024-03-06 10:21:37 1455 1

原创 蓝牙系列二:BLE协议各层的形象化理解

在客户端手机这边需要定义如何发现服务,如何发现服务里面的特性,读写服务里面的特性。https://blog.csdn.net/caodaxia/article/details/78567996,描述了一个真实的蓝牙设备,里面有24个属性,这24个属性如何组合起来提供服务呢?客户端手机想去读取某个属性,它需要利用ATT这一层来发起请求,请求的数据需要经过L2CAP层以及下面的几层到达服务端的L2CAP层。在这里还要引入一个概念,从L2CAP传过来的数据包可能很大,此时就需要分段,把经过分段的数据传给LL层。

2024-03-06 09:38:47 790

原创 蓝牙系列一:初识蓝牙

1、协议栈模型如下图,在图中,它将蓝牙协议栈分为好几层,比如说物理层、链路层等等。蓝牙采用了2.4G ISM频段。蓝牙中无线信道的划分,对于BLE低功耗蓝牙,它将。蓝牙技术分经典蓝牙(Classic BT)和低功耗蓝牙(BLE),2.4GHZ频率的周围划分出了0到39,总共40个信道。,其他信道为数据信道,也就是建立链接后使用的信道)。37/38/39信道为广播信道。

2024-03-06 09:29:57 853

原创 ESP32系列四:搭建http的webserver的服务器

最近在使用ESP32搭建web服务器测试,发现esp32搭建这类开发环境还是比较方便的。具体的http协议这里就不再赘述,我们主要说一下如何使用ESP32提供的API来搭建我们的http web。一、web服务器搭建过程1、配置web服务器在中,Web服务器使用httpd组件实现。我们需要先创建httpd_config_t结构体,指定服务器的端口、最大并发连接数、URI匹配处理器等选项。然后,我们通过调用httpd_start函数来启动Web服务器。

2024-03-05 10:06:12 8410 7

原创 ESP32系列一: partitions分区表的配置

ESP32修改分区表的方法。之前一直摸索如何使用自己的分区方式来对代码进行规划

2024-03-02 12:50:09 1275

原创 ESP32系列三: IDF 如何给工程新增文件夹与源文件(2)

对于使用习惯MDK的人来说换一种工具感觉很麻烦,特别是EPS32使用Cmake这种方式,之前研究了很久如何添加自己的源文件,以及添加后的种种问题,今天终于完全研究明白,通过本文可以了解所有的ESP32添加文件以及引用组件的方法。

2024-03-02 12:44:09 946

原创 ESP32系列二: IDF 如何给工程新增文件夹与源文件(1)

1、乐鑫官方对 components 路径的介绍:“可选的 “components” 目录中包含了项目的部分自定义组件,并不是每个项目都需要这种自定义组件,但它有助于构建可复用的代码或者导入第三方(不属于 ESP-IDF)的组件。1 新建自定义的 components 路径,比如我在 PROJECT_DIR 中新建名为 /import/oled_driver 的文件夹。2 在PROJECT_DIR/components 中添加我们自定义的组件,比如我添加了 oled_driver。

2024-03-02 12:35:52 1229

原创 RT-Thread使用CmBacktrace进行HardFault_Handler 追踪

大家在用STM32的时候有没有遇到过HardFault的问题呢:下面针对这个问题做个小总结。现象还原:在debug模式下进行仿真调试,全速运行再停止运行,程序会跑到 HardFault_Handler函数中,产生 HardFault,即硬错。其产生的原因大概有如下几类:​ (1)数组越界操作;​ (2)内存溢出,访问越界;​ (3)堆栈溢出,程序跑飞;​ (4)中断处理错误;针对HardFault问题的定位,网上有几种方法,大概都是围绕着:在debug模式下,查看一些地址,分

2020-10-24 15:30:54 4334

原创 关于 Cortex-M3 的双堆栈机制

寄存器简介Cortex-M 系列 CPU 的寄存器组里有 R0~R15 共 16 个通用寄存器组和若干特殊功能寄存器,如下图所示。下图中我看可以看到MSP和PSP两个堆栈指针寄存器。通用寄存器组里的 R13 作为堆栈指针寄存器 (Stack Pointer,SP);R14 作为连接寄存器 (Link Register,LR),用于在调用子程序时,存储返回地址;R15 作为程序计数器 (Program Counter,PC),其中堆栈指针寄存器可以是主堆栈指针(MSP),也可以是进程堆栈指针(P.

2020-06-23 17:19:18 2972

CCC联盟数字钥匙Release 3

CCC(Car Connectivity Consortium)车联网联盟是一个致力于制定智能手机到汽车连接解决方案标准的全球跨行业组织。2021年7月CCC将UWB定义为第三代数字钥匙的核心技术,并发布CCC R3(第三代数字钥匙)规范。

2024-03-11

Keil.STM32F4xx_DFP.2.13.0.rar

使用Keil的必备安装软件,不安装就会报确实库的问题。Keil.STM32F4xx_DFP.2.3.0 用于STM32F4XX的DFP文件,Keil官网下载起来非常的慢而且基本下载一会就断。这个也是下载很久才下来的,亲测好用。

2020-07-30

Keil.STM32F1xx_DFP.2.3.0.rar

Keil.STM32F1xx_DFP.2.3.0 用于STM32F1XX的DFP文件,Keil官网下载起来非常的慢而且基本下载一会就断。

2019-07-10

manchester.rar

曼彻斯特编码的驱动代码,基于stm32F4xx上的代码。将字节转换为曼彻斯特编码,并通过gpio输出。编码具有前导码(高电平),和stop结束标志码(低电平)

2019-06-06

ymodem协议源码

ymodem协议源码,c语言,已经验证。比xmodem协议快,是通用的bootload的通过串口升级的协议。带crc校验

2017-01-03

Ucos2 s3c2440 ADS环境下

可以在ADS下调试,可以把bin文件直接下载到内存运行,也可以把bin文件直接烧写到MyAPP分区运行,运行地址:0x32000000

2013-04-07

keil_led灯裸机程序 KEIL4工程s3c2440

keil_led灯裸机程序 KEIL4工程s3c2440 工程源码

2013-04-07

S3C2440重要资料

S3C2440与SDRAM 的地址连线分析

2013-04-05

空空如也

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

TA关注的人

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