自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 libmodbus 源码学习笔记

接收到数据,对那些数据,从机也进行回应,第一个 modbus_send_raw_request 它是我们自己构建数据进行回应,第二个modbus_reply 则是规范好的 数据框架进行回应。<2>从机设备 也是我们要初始化我们的串口 然后随后立即设置我们的串口设备地址 最后也是连接 打开串口.<1> 主设备 我们首先要初始化 我们要使用的串口 然后 设置我们要访问的哪一个设备 最后打开串口。在这个发送数据的过程中肯定有这三个阶段: a.构建消息 b.发送消息 c.接收回应。

2024-11-26 22:47:31 177

原创 4.事件组

任务A:可以等待这个整数的"bitx,bity,bitz....."都被设置为1.也可以等待这个整数的"bitx bity bitz..."任意一个被设置为1.1.假设任务A,B都在等待bit0事件。里面的每一个bit,表示一类事件。2.任务C设置了bit0事件.事件组的本质:一个整数。这就是"AND"的关系。

2024-09-18 23:24:28 237

原创 3.信号量与互斥量

这个时候,如果我们的任务B"释放信号量",就会把"信号量里list上的第一个任务"唤醒:就是把他移到就绪链表中,那么他就会继续运行了.这个时候,我们就可以使用"信号量","信号量"的本质:item_size等于 0 的队列。2.一个"队伍",就是一个链表:用来记录等待的对应信号量的任务。这时候我们的任务就不会参与调度了:他不在就绪链表中。1.从ReadyList[1]里移除。如果不想传递数据,只是"通知"呢?假设现在我们的cnt是等于0,2.放入信号量的"list"信号量里面有什么呢?

2024-09-17 22:32:17 255

原创 ARP协议

在网络层中,源主机与目标主机都是通过IP地址进行识别的,而所有的数据传输又依赖网卡底层硬件,也就是链路层,在所有的链路层中,比如我们的以太网是使用MAC地址进行寻址,标识不同的主机。我们一台主机事实上可以支持多种网络层协议,以对不同应用采用不同的协议.因此,当以太网帧到达网卡中,网卡需要知道它应该将数据字段的内容传递给哪个网络层协议,如IP协议,ARP协议等。我们的MAC地址也叫物理地址,硬件地址,被固化在ROM中,MAC地址实际上就是网卡地址或网卡标识符.32位IP地址 <--> 48位MAC地址。

2024-09-17 21:17:01 453

原创 2.队列和队列集

在我们队列中是有一个读list 链表 和 一个写list链表 他们就是用来保存 读 或者 写阻塞 的任务。这个时候我们的A 会从读 list 中剔除 加载到 就绪链表[1]中,A又可以开始重新调度了.这个时候A 任务就会从就绪链表[1]中剔除出来,挂载到 队列里面的读链表中。假设我们 就绪链表中有A 和 B两个任务 他们正常情况下都是轮流运行,那这个时候 我们的 B 会唤醒 读list中的A。

2024-09-11 23:08:23 267

原创 1.任务的创建与状态

d.这个任务运行中被切换出去的那一个瞬间,所有寄存器的值就被存进"栈"b.FreeRTOS里的malloc函数,从这个大数组里分配内存。c.创建任务时,我们就是从这个数组中分配内存,用作"栈"a.在FreeRTOS里定义了一个大数组。保存进"内存",这块内存被称为栈。就是程序暂停瞬间所有寄存器的值。b.静态分配内存 可以直接建立一个数组去当作栈。a.动态分配内存 就是在函数内部分配。除了"栈",最重要的就是"入口函数"

2024-09-11 22:26:37 244

原创 LWIP一探究竟

Lwip中使用tcpip_msg_type枚举类型定义了系统中可能出现的消息的类型,消息结构msg字段是一个共用体,其中定义了各种消息类型的具体内容,每种类型的消息对应了共用体中的一个字段,其中定义了各种消息类型的具体内容,每种类型的信息对应了共用体中的一个字段,其中注册与删除事件的消息使用了同一个tmo字段.LWIP中的API相关的信息内容很多,不适合直接放在tcpip_msg中,所以Lwip用一个api_msg结构体来描述API消息,在tcpip_msg中只存在指向api_msg结构体的指针.

2024-04-10 22:43:07 1116

原创 CAN的回环测试实验

我只有一个STM32F429的开发板,所以这次我就做个回环测试.

2024-04-06 14:41:03 1206

原创 STM32的CAN外设

我们的CAN控制器支持最高的通讯速率为1Mb/s,可以自动地接收和发送CAN报文,支持使用标准ID和扩展ID地报文,外设中具有3个发送邮箱,发送报文的优先级可以使用软件控制,还可以记录发送的时间,具有两个3级深度的接收FIFO,可使用过滤功能只接受或不接收某些ID号,可配置成自动重发,不支持使用DMA进行数据收发。

2024-04-04 23:13:22 1091

原创 CAN的协议层

CAN属于异步通讯,没有时钟信号线,连接在同一个总线网络中的各个节点会像串口异步通讯那样,节点间使用约定好的波特率进行通信,特别的,CAN还会使用“位同步”的方式来抗干扰,吸收误差,实现对总线电平信号进行正确的采样,确保通讯正常。

2024-04-04 02:20:29 996

原创 CAN总线的物理层

通过上图我们可以发现CAN通讯节点是一个控制器和一个收发器构成的,控制器和收发器是由CAN_Rx和CAN_Tx连接的,收发器和CAN总线之间就是CAN_High和CAN_Low信号线相连的。为什么要分隐形电平和显性电平,是因为我们的CAN总线协议物理层只有一对差分线,在一个时刻只能表示一个信号,所以对通讯节点来说,CAN通讯是半双工,收发数据需要分时进行,在同一个时刻,我们只能一个节点发送,其他接收,所以这时候就是类似I2C总线的“线与”特性将使它处于显性电平状态,可以认为显性具有优先的意思,

2024-04-01 21:09:24 524

原创 项目:USB键盘和鼠标的复合设备

第四步,我们的复合设备是两个接口,每个接口就是对应一个HID设备类,因此我们的主机必须对每个接口获取相应的HID描述符与报告描述符,那么怎么样提交这些描述符的数据呢?第二个就是使用多个接口来实现复合设备,每一个接口实现一个功能,这个做法比较复杂,能让我们更加深入的了解USB,所以这次我们使用这种做法来实现复合设备。第三步就是复合设备需要相应总线枚举,我们的主机首先要对设备进行复位,所以会进入Joystick_Reset函数中,加上键盘的端点2的初始化。第二步,我们修改完报告描述符以后就是修改配置描述符,

2024-03-31 21:06:54 1975 4

原创 USB的报告描述符(2)

比如我们的光标大小,形状,颜色,双击速度,轨迹长度等等,这些都不是正常使用鼠标的过程中可以正常改变的,而Feature标签就可以用来描述这些属性(要记住哈,我们鼠标这些特征都是从操作系统层面实现的,并没有在报告描述符中指定,仅仅用来方便理解特征),相当于另外开辟了一个通道来改变设备的特征了。主机与显示设备之间可以有多种数据传输方式。他是一个八位的数据,逻辑值最大定义2,这是一个输入装置,当我们的显示装置状态发生改变的时候,中断端点会产生输入报告,它包含未准备好状态已准备好,不可加载字符错误,相应报告如下。

2024-03-26 22:33:31 992 2

原创 USB的报告描述符(1)

如果我们的设备,将自己枚举成HID设备以后,那么我们的HID描述符是必不可少的,报告描述符也是必需的。报告描述符就是对传输数据的用途与格式的具体定义,他是拥有属于自己的一个格式定义。报告描述符是以标签的方式排列而成,长度不定,后面跟随的括号中为该标签携带的数据。下面是鼠标的报告描述符上述是报告描述符的伪代码,我们实际运行的代码还是编译后的二进制数据。我们可以使用USB-IF提供的HID描述符编辑工具(HID Descripor Tool)快速进行报告描述符的设计与转换。如下图,与上面是一样的。

2024-03-24 17:39:25 1721

原创 HID描述符

键盘,鼠标就是HID设备,它们如果要将自己枚举成HID设备类,就必须要有对应的HID描述符,报告描述符,以及可选的实体描述符。设备描述符的第四个字段(bDeviceClass)就是表示USB设备所属的设备类,如果是0,那么我们就在接口描述符中进一步定义其具体功能为0x03,设置为HID设备。低五位就是表示用户需要用多大的力气才能影响相应的控制项,我们为0的时候就越容易,越大越难,高三位就是进一步修饰身体部位,左手,右手,左脚,右脚。获取特定类描述符的请求数据和之前的标准描述符有所不同,但是结构是一样的。

2024-03-20 23:09:44 1749

原创 USB主机是如何获取设备描述符

当针对设备的时候,我们的wIndex必须为0,当针对设备的接口时候,wIndex字段就要给出对应的端口号,针对设备的端点时候wIndex就要给出相应的端点号,D6和D5都是种类,种类是针对于请求的,其值为0表示USB标准请求.为1就是特定类请求,比如HID设备就有获取报告描述符的请求,他是不属于标准请求的。在USB定义的八种标准请求的表中,bmRequestType,他是具体用途的细分,用来定义请求的性(含传输方向,类型,及接收方),具体如下图。举个例子,我们要获取设备描述符,需要发送的请求是啥呢?

2024-03-19 22:52:53 892

原创 USB接口与端点描述符

主机在第一次发送获取配置描述符的命令时,只会读取配置描述符的前九个字节,它包含了配置描述符以及所有从属的接口,端点(及其他特定类描述符)的总长度。获取其他长度不固定的描述符也是这样分成两步执行如果一个配置描述符不只支持一个接口描述符,并且每个接口描述符都有自己从属的端点描述符,那么我们USB设备在响应USB主机发送获取配置描述符命令时,第一个字段(bLength)表示接口描述符的长度,第二个字段(bDescriptorType)表示描述符类型 此处应该为0x04。

2024-03-17 19:24:18 978

原创 USB配置描述符

我们的主机在枚举过程中会读取设备所支持的所有配置描述符,最后才发送命令来选择一个配置,如果我们选择的配置值与该字段值一样,说明该值对应的配置被激活。第七位 D6 表示USB设备的供电模式,1 就是自供电 它主要供电来源不是USB电源,而是单独配置了一个供电电源接口,0就不是自供电,就是可以USB供电,比如键盘,鼠标啥的。USB主机对于设备描述符的获取是有两次的,第一次只是获取如上图的8个字段,也就是前9个字节,这9个字节就是配置描述符信息(暂时还不包括接口与端点描述符的具体信息),下节讲接口和端点描述符。

2024-03-17 13:35:38 469

原创 USB的设备描述符

第十三个字段(iserialNumber)表示设备序列号字符串描述的索引值,如果没有就是0,它可以区分多个相同设备,就是同一个USB系统连接了多个相同厂家生产的同一型号设备,这些设备的VID,PID,设备的版本号都是一样的,那该怎么区分,厂商会根据该iserialNumber字段中针对每一个产品设置不同的序列号即可,我们ST的官方例程也是这样做的,它根据单片机的唯一96位ID来设置iserialNumber字段。低速设备为8字节,全速可以为8,16,32,64字节,高速设备直接为64字节。

2024-03-17 00:02:05 1344

原创 USB的字符串描述符

如果设备没有字符串描述符 我们索引值必须为0,主机一般分成两个步骤获取字符串描述符,首先从设备获取索引值为0的Joystick_StringLangID这个数组,也就是获得设备支持的语种(可多个语种)然后再向设备其他索引值不为0的字符串描述符,并用选择的语种解析。第三个(bString)是指语种的语言标识符,上面的是0x0409 代表英语 0x0804代表中国,可以设置多个。设备描述符这里的1,2,3对应的是这数组里的1,2,3元素。分别是总的字节长度和描述符种类。1.表示语种的字符串描述符。

2024-03-16 23:57:56 630

原创 USB枚举过程中的各种获取描述符的标准请求

如果确实是获取状态请求,就紧接着判断是获取设备,接口还是端点状态。首先我们判断是不是设备,如果是的话,我们就应该返回“支持唤醒与供电模式与否”的状态数据,所以我们首先取出Current_Feature,这个变量在Joystick_Reset函数中已经设置为了配置描述符数据Joystick_ConfigDescriptor索引值为7的数据,他保存的恰好就是“设备是否支持远程唤醒与自供电模式”那个字节(bmAttributes字段),所以接下来根据Current_Feature来逐步设置数据,最后返回。

2024-03-14 00:16:34 1222

原创 USB设备响应主机的枚举中端点0的控制传输

最近学习了USB2.0的一些知识,这里就当笔记,回顾记录一下,参考的资料是。

2024-03-07 23:01:33 1257 1

原创 USB设备响应主机的枚举-复位

最近学习了USB2.0的一些知识,这里就当笔记,回顾记录一下,参考的资料是。

2024-03-04 23:01:30 1001 1

原创 USB的初始化

首先注意在这里面定义了几个全局变量,都是很重要的第一个就是 EPindex 用来保存当前的端点号,指出当前传输完成的事务是针对哪个端点,对应我们上面USB_ISTR寄存器中的EP_ID[3:0],实际工作中我们会把其数据读出来放在EPindex中DEVICE_INFO,DEVICE_PROP,USB_STANDARD_REQUESTS 这三个结构体都在usb_core.h。

2024-03-03 20:07:51 1781 1

原创 USB学习笔记

注意: NAK STALL NYET只有设备才可以返回,因为请求都是主机发送的 ,NYET握手包只有在高速设备输出事务中使用,表示设备的本次事务成功接收,但没有足够的缓冲区来接收下一次数据,主机在下一次输出数据的时候,先使用PING令牌包来询问一下是否有足够的接收缓冲区,防止带宽浪费。校验字段是类型字段的。

2024-03-03 01:13:36 872

空空如也

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

TA关注的人

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