自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

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

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

2024-04-08 10:09:07 893

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

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

2024-04-01 11:00:25 735

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

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

2024-03-29 14:04:14 275

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

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

2024-03-22 13:49:46 901

原创 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 1302

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

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

2024-03-20 09:36:50 1201

原创 __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 1728

原创 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 544

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

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

2024-03-19 14:28:33 926

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

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

2024-03-19 11:15:10 383

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

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

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

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

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

2024-03-19 10:27:34 931

原创 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 1320

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

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

2024-03-13 08:48:04 1227

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

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

2024-03-12 18:44:52 1082

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

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

2024-03-12 08:25:30 990

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

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

2024-03-12 08:03:52 498

原创 蓝牙系列十一: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 718

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

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

2024-03-11 09:15:05 993

原创 蓝牙系列第九:协议链路层(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 913

原创 蓝牙系列七:开源蓝牙协议栈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 735

原创 蓝牙系列六:最简单的开源蓝牙协议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 970 2

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

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

2024-03-06 11:13:20 1218

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

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

2024-03-06 10:58:06 757

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

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

2024-03-06 10:21:37 906

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

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

2024-03-06 09:38:47 399

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

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

2024-03-06 09:29:57 391

原创 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 2147

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

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

2024-03-02 12:50:09 428

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

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

2024-03-02 12:44:09 455

原创 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 507

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

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

2020-10-24 15:30:54 3312

原创 关于 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 2523

原创 Linux设备驱动学习三 设备节点的生成和调用:杂项设备驱动的注册和调用

关于杂项设备杂项设备(设备号10)对一部分字符设备的封装,还有一部分不好归类驱动也归到了杂项设备为什么引入杂项设备节省主设备号如果所有的驱动都是用字符设备,那么所有的设备号很快就用完了,总共255个设备号驱动写起来相对简单如果直接使用封装好的杂项设备,那么就可以减少一步注册主设备号的过程1.区分概念: 设备注册:platform_device,查看:/sys/devices/platform 驱动注册:platform_driver 生成设备节点:为了让应用...

2020-06-22 17:57:18 619

原创 Linux设备驱动学习二 在module中注册设备

以module的方式注册设备,并在驱动中调用设备的参数资料来源于网上和迅为提供的视频学习。前面一节的设备注册使用的是CONFIG_HELLO_CTL的形式(其实也是通过platform_device_register注册函数来注册的),通过结构体platform_device的调用直接配置,实现注册设备的功能。本节通过直接调用的注册设备的函数来是其功能。主要函数:platform_device_register :drivers/base/platform.c流程:文件dri

2020-06-22 12:31:11 209

原创 Linux设备驱动学习一 设备和驱动的注册

使用iTOP-4412开发板,用的是SCP 1G的板子。记录的内容来自于迅为的视频学习,主要是对驱动的学习,有些基础步骤省略没有记录。首先是对外部设备的操作的三部曲:1.通过原理图找到设备连接的PIN脚 (处理器的数据手册)2.通过PIN脚找到控制这个引脚的相关寄存器,并找到寄存器对应的物理地址3.编写程序实现设备的操作1. 设备和驱动的注册流程 一般都是先注册设备,再注册驱动。现在引入的热插拔设备是先注册的驱动。 1)注册设备使用结构体platform_d...

2020-06-22 11:04:51 475

原创 ARM9的中断处理

STM32F1xx以及其他CortexM3 M4内核的中断都差不多,都采用中断向量表的方式进行,中断产生时可以直接跳转到中断向量表中找到相应的中断。而且根据需要这个表可以放到非0的地方,一般都是放在程序最开始的地方。代码如下__Vectors DCD __initial_sp ; Top of Stack DCD Reset_Handler ; Reset Handler

2020-06-10 16:11:00 661

原创 linux中对于fork函数的理解

在理解fork函数之前我们需要了解什么是进程,什么是线程。一、进程的概念进程(process)和线程(thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握。进程,是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竟争计算机系统资源的基本单位。每一个进程都有一个自己的地址空 间,即进程空间或(虚空间)。进程空间的大小 只与处理机的位数有关,一个 16 位长...

2020-04-29 11:43:28 226

原创 RTL8201 PHY芯片使用总结

最近在使用RTL8201这个phy的芯片,首先是使用自协商功能,并根据协商结果来修改MAC的配置(双工、Speed),其次,是配置led指示灯。目的,只用一个灯指示link状态,一个灯指示有数据传输。一、自协商的功能不多说,很简单了,跟大多数phy芯片一样,主要是寄存器0 、1的使用,要注意,与其他芯片不一样(如DP83848)这个芯片的寄存器0作为配置寄存器,配置完,且自协商完成了,有些bi...

2019-11-28 14:39:17 43 2

原创 STM32F4 定时器TIM1输出PWM

【实验目的】输出7路占空比不同的PWM信号是各个版本ST库必备的例子。本实验的主要目的不是表现ST芯片PWM功能的强大,而是要完成输出的精确计算。【实验内容】输出7路PWM信号,并用示波器测量输出。【实验原理】1、时基单元初始化TIM1和TIM8使用内部时钟时,时钟由APB2提供。但是定时器的时钟并不是直接由APB2提供,而是来自于输入为APB2的一个倍频器。当APB2的与...

2019-09-25 10:05:18 6532

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关注的人

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