- 博客(66)
- 收藏
- 关注
原创 USB学习【13】STM32+USB接收数据过程详解
***//***/// 计算需要处理的16位数据单元的数量(每个单元包含2个字节),比如接收了64字节,>>1,变成了32字节// 计算USB外设的基地址// 用于循环计数和临时存储数据的变量// 定义一个指向PMA中16位数据的指针// 定义一个指向用户缓冲区的指针// 计算PMA中目标数据的起始地址// 循环处理每个16位数据单元for (i = n;i!= 0U;i--)// 从PMA中读取一个16位数据pdwVal++;
2025-05-20 13:30:16
983
2
原创 USB学习【12】基于STM32+USB枚举过程详解
经过前面的一篇文章,已经了解到了STM32如何进行初始化,下面的就是上电之后的枚举,进行的下一步准备操作。
2025-05-18 22:25:09
793
原创 USB学习【11】STM32 USB初始化过程详解
为了管理USB,HAL首先构建了一下几个结构体USB速度、PHY接口类型、端点0参数等每个端点(ep_in/ep_out)都有自己的配置,类型为USB_EPTypeDef,
2025-05-18 18:28:31
405
原创 USB学习【10】stm32的USB模块PMA设置详解
本来应该继续写USB传输中的中断传输,同步传输的包内容的,但是个人认为有必要先把下位机的部分写完,最后作为一个整体来分析数据的交互会比较有立体感。前提:把USB模块手册部分仔细读一遍。
2025-05-17 08:56:53
1034
原创 USB学习【10】描述符-HID描述符
HID描述符功能上面相对独立一些,所以单分一篇专门整理。原文链接:https://blog.csdn.net/weiaipan1314/article/details/112504129USB设备中有一大类就是HID设备,即Human Interface Devices,人机接口设备。这类设备包括鼠标、键盘、游戏手柄等,主要用于人与计算机进行交互。HID设备可以作为低速、 全速、高速设备用。由于HID设备要求用户输入能得到及时响应,故其传输方式通常采用中断传输。
2025-05-12 20:05:19
821
原创 USB学习【9】描述符-配置描述符集合
设备描述符:这个是属于独立的描述符配置描述符集合:里面包含了标准配置描述符、接口描述符、端点描述符、字符串描述符,HID设备有HID描述符、报告描述符和物理描述符。集合的意思就相当于一个文件夹把这些描述符封装在一起了。描述符的结构开头是一样的,都是先说描述符长度,然后说类型,每种描述符的类型是不一样的,如下表格,可速查。
2025-05-12 13:16:51
927
原创 USB学习【8】描述符-设备描述符
前面经过学习,已经实现了中断传输,控制传输,批量传输,实时传输。中断传输:键盘,鼠标。批量传输:U盘实时传输:摄像头,音频设备可以发现,这些都是完全不同的产品和设备,有一个共同点传输的都是二进制,但是对数据传输要求完全不同,所以USB出现了各种传输模式。也就是说各种设备是和各种传输模式绑定在一起的,USB协议是怎么做到呢?用我的话说,USB协议用各种描述符对USB设备进行了设备虚拟建模!文章借用了这位博主的部分内容,他的系列文章写的很棒!
2025-05-12 08:31:22
836
原创 USB学习【7】控制传输+中断传输+同步传输+批量传输
对于全速端点,中断传输的时间间隔在1ms到255ms之间,对于低速端点,时间间隔限制在10ms到255ma之间,对于高速端点,时间间隔为2^(bInterval-1) x 125us,bInterval的值在1-16之间。实时事务不需要握手阶段,一个示例的场景是:为了传输摄像头的实时数据,偶尔的数据错误是可以忍受的,大不了出现短暂的花屏。所以,完整的数据传输,需要涉及多个包:令牌包、数据包、握手包。有些事务需要握手包,有些事务不需要握手包,有些事务可以传输很大的数据,有些事务只能传输小量数据。
2025-05-11 20:09:26
1045
原创 USB学习【6】USB传输错误的处理
我们从物理层到信号层,到协议层,他们分别在不同的层面完成不同的功能。总结一下:物理层实现了高低电平的检测。信号层更进一步,通过一些方法,实现了二进制的传输。协议层,因为可以二进制传输了,就自然可以实现一些协议方面的事情了。但是我们会发现,信号层可能会发生异常,比如干扰导致信号错误,我们通过技术手段可以检测出来,但是应该怎么处理呢?协议层也会出现异常,比如我数据包发过去了,对方没有空接收等等,那又应该怎么处理呢?
2025-05-11 19:48:08
254
原创 USB学习【2】设备连接,断开和速率检测
USB2.0设备在未连接设备时候(电脑USB没插U盘时候):D+和D-均为被下拉电阻拉下拉低电平(接近0V),也就是D+和D-仅仅是两根电线,电平状态全凭上下拉电阻决定,但是却有电路实时监控电路电平状态。
2025-05-11 14:41:37
346
原创 USB学习【5】协议层数据格式
对于高速设备,每1毫秒里有8个微帧,这8个微帧的帧号是一样的,每125us发送一个SOF令牌包。实时事务不需要握手阶段,一个示例的场景是:为了传输摄像头的实时数据,偶尔的数据错误是可以忍受的,大不了出现短暂的花屏。在单片机中的世界里面,数据的传输是一个矢量,有方向,有起点,有重点,毕竟编程是一个很机械的东西,没有这三个指标,传输没办法完成,通俗的讲法是,主,客是谁?注意:所有的USB文档提到的"输入"、“输出”,都是基于Host的角度,"输出"表示从Host输出到设备,"输入"表示Host从设备得到数据。
2025-05-09 13:09:19
600
原创 USB学习【4】USB中的信号(信息传输层)
全速设备内部的D+有1.5K的上拉电阻,低速设备内部的D-有1.5K的上拉电阻,连接到Hub后会导致Hub的D+或D-电平变化,Hub根据变化的引脚分辨接进来的是全速设备还是低速设备。全速设备内部的D+有1.5K的上拉电阻,低速设备内部的D-有1.5K的上拉电阻,连接到Hub后会导致Hub的D+或D-电平变化,Hub根据变化的引脚分辨接进来的是全速设备还是低速设备。工作于高速模式时,D+的上拉电阻是断开的,所以对于工作于高速模式的USB设备,无法通过D+的引脚电平变化监测到它已经断开。
2025-05-07 22:45:03
647
原创 USB学习【3】通讯的基础-反向不归零编码
所有的通讯协议,发送端和接收端必须按照同一节奏发送信号和接受信号才能保证通讯的正常进行,否则会出现错位。这个节奏用我自己的话说:时间卡尺。
2025-05-06 21:40:47
683
原创 USB学习【1】USB系统硬件框架(物理层)
测试:把USB设备比如U盘接到电脑上面,会发现右下角弹出"发现**U盘",引申出以下问题。问题1:USB设备插到电脑上去,接触到的对方设备是什么?答1:是USB控制器,是USB控制器内嵌的root hub。问题2. 电脑主机如何知道,设备是U盘?答2. windows里已经有了USB的总线驱动程序,接入USB设备后,是"总线驱动程序"知道你是"U盘"问题3. 为什么一接入USB设备,PC机就能发现它?答3. PC的USB口内部,D-和D+接有15K的下拉电阻,未接USB设备时为低电平。
2025-05-05 22:56:25
266
原创 工业控制【1】NPN,PNP,二线式传感器区别
传感器:对外界某些信号产生反应的部件。开关器件:简单用光电模拟信号来说明,检测到有物体和没有物体,信号端会输出有电还是没电两种状态。==如果电流够大,闭着眼睛用手摸,人也是可以作为PLC来用的。==至于有电代表是有检测到还是没检测到,这个就和NPN和PNP有关系了。
2025-05-01 08:31:08
344
原创 FreeRTOS【3】任务调度算法
在运行的任务,被称为"正在使用处理器",它处于运行状态。在单处理系统中,任何时间里只能有一个任务处于运行状态。非运行状态的任务,它处于这 3 中状态之一:阻塞(Blocked)、暂停(Suspended)、就绪(Ready)。就绪态的任务,可以被调度器挑选出来切换为运行状态,调度器永远都是挑选最高优先级的就绪态任务并让它进入运行状态。阻塞状态的任务,它在等待"事件",当事件发生时任务就会进入就绪状态。事件分为两类:时间相关的事件、同步事件。
2025-04-24 23:07:38
766
原创 FreeRTOS【2】任务、优先级知识重点
这篇文章只写关键的知识。在 FreeRTOS 中,任务就是一个函数,原型如下注意点:这个函数不能返回同一个函数,可以用来创建多个任务;换句话说,多个任务可以运行同一个函数函数内部,尽量使用局部变量:-每个任务都有自己的栈每个任务运行这个函数时任务 A 的局部变量放在任务 A 的栈里、任务 B 的局部变量放在任务 B的栈里不同任务的局部变量,有自己的副本函数使用全局变量、静态变量的话只有一个副本:多个任务使用的是同一个副本。要防止冲突。
2025-04-24 18:22:31
1251
原创 机械设计【】技术要求(实际使用)
6.焊缝外观美观,无焊渣、气孔、裂纹、飞溅等缺陷,焊缝均匀,不得使用氩弧焊;6.焊缝外观美观,无焊渣、气孔、裂纹、飞溅等缺陷,焊缝均匀,不得使用氩弧焊;1.所有尺寸为最终尺寸,焊后加工的,供应商需要自行预留加工余量;1.所有尺寸为最终尺寸,焊后加工的,供应商需要自行预留加工余量;1.所有尺寸为最终尺寸,焊后加工的,供应商需要自行预留加工余量;6.焊缝外观美观,无焊渣、气孔、裂纹、飞溅等缺陷,焊缝均匀;7.焊后退火去应力,焊接件上所有加工特征必须要焊后加工;5.未注尺寸公差按GB/T 1804-m;
2025-04-19 19:07:55
598
原创 GIT工具学习【4】:推送到远程仓库
公共服务平台:github国际大平台,gitee国内最大的平台私人服务平台:gitlab企业级,功能最全,gitea:中型团队,gogs:个人使用目前个人的配置:开源项目github,私人项目:NAS搭载gitea。
2025-04-15 21:59:29
757
原创 数学思考【1】关于弧度制
机械设计中,电机计算中,经常要用的弧度和角度的转换,以前总是感觉很麻烦,最近去思考,为什么非要用弧度,数学家为什么一定要麻烦一遭呢?
2025-04-06 21:47:35
962
原创 机械设计系列【】关于直线轴承和无油衬套的区别和选取
写在前面在机械设计中,如何选择轴承呀之类的配件,其实没那么符合,和企业员工用人是一样的,把合适的人放在合适的岗位,同时兼顾价格,注意,先合适再价格。在举一个例子,stm32单片机就是运算用的,这么多型号怎么选择,当然是满足flash,主频的前提下,兼顾价格,各行各业都是一样的。
2025-03-29 08:50:26
322
原创 STM32【8】堆栈和段的概念(1)
C函数的第1个参数,放在寄存器R0里(这个是定死的,第一个参数在R0,第二个参数在R2.。在我们这个场景里面,你没有办法知道buf2的地址,就没办法通过buf2-buf1确定buf1的长度。这种方法巧妙地把分配的内存的长度,记录了下来以后 free(buf1)时,怎么得到buf1的长度?它的初始值肯定是保存在flash上,运行的时候,因为他是可读可写,所以运行时它肯定是在内存里。你申请的内存,你想用来做什么都可以。,至于大于4个参数的话,就是其他的方式,具体没有研究过,不过肯定没有这个效率高。
2025-03-26 19:28:26
962
转载 STM32【7】关于stm32的储存空间以及启动起始地址
基于ARM内核的芯片代码区都是从0x00000000开始执行的,但是通过boot启动模式选择从不同的地址进行重映射到0x0000 0000执行。0x08000000中存放的并不是main()函数的地址,是STM32中的主FLASH(用户代码空间)的起始地址。上电后执行复位程序,先执行SystemInit()函数初始化系统时钟,然后执行main()函数。
2025-03-26 14:43:09
172
原创 STM32学习【6】更高视角看UART才能真正的学懂串口
通过我们上面的对比,可以发现,在寄存器之间转移所耗费的时间,程序读取数据和发送数据的时间,和乌龟一般的串口发送数据速度,都是可以认为是瞬间的。因为串口发送太过缓慢,不可能总是等待它,不然严重影响程序的效率,所以stm32公司设计了各种状态寄存器,每次读取的时候看看有没有接收到数据,接收到了再读取。每次发送的时候看看有没有发送完成,发送完成了在写入(会覆盖)。这篇文章并没有去写各种寄存器的应用,这个网上一找一大把,反而写了一些框架层面的一些东西,这个东西有一些和技术无关,但是却是技术的内核!
2025-03-24 22:31:25
662
原创 STM32学习【5】用按键控制LED亮灭(寄存器)以及对位运算的思考
我们使用KEY1来控制红色LED:按下KEY1则灯亮,松开后灯灭KEY1用的是PA0引脚。
2025-03-18 22:44:30
796
原创 机械设计【1】直线导轨用法
在直线导轨和直线模组(动力提供者)之间,用凸轮随动器,解耦了横向偏差以及带来的扭矩,确实是一个比较好的思路。这里的固定直接用的放射型的固定块挤压固定,车间人员调试过程中,可能会有麻烦(两侧均无靠肩基准)这个用法还是第一次见,挺别致的!
2025-03-18 11:15:13
254
2
原创 气路设计【1】气缸配件的设计
写在前面:以往都是把资料放在自己的网盘里,现在放在公共空间,两个目的,第一:可以分享大家一起使用,共同进步,第二:方便查询。
2025-03-17 10:54:50
160
原创 STM32学习【5】底层的知识使用_汇编_反汇编_机器码
对一些底层的知识一定要知道了解清楚的,但是有人就说了,我了解这么多干什么,我都是用的java,C语言等等高级语言,根本涉及不到寄存器之类,其实不然,我们学的所有的技能和知识并不仅仅是表面上的东西,而是学习里面最接近本质的东西,可以用古人的道来形容。这里面借用了韦东山的一些文字和图片。C: 为了方便人类方便使用,发明的高级语言,要转换为汇编。汇编:为了解放人类的记忆,发明的“助记符”,不用去记各类机器码。最终要转换为机器码。机器码:给CPU使用。
2025-03-11 11:31:14
714
原创 硬件学习【1】74HC165D-并行信号输入-串行输出
这个世界有很多是需要并行输入信号,整合成串行数据的需求的。这个时候可以用74HC165芯片。74HC165。并行输入是为了响应迅速,比如我们要检测1百万个信号,一个个轮训检测,黄花菜都凉了,如果并行就不一样了,那为什么要转串行呢,串行方便CPU处理数据,否则都零零散散的不成体系。手有正反,光有亮暗,然而这个世界同样也有很多,串行数据的需求打散成并行输出信号的需求的,这个使用: [74HC595]。
2025-03-06 20:54:04
484
原创 GIT工具学习【2】:基本操作
我坚持认为,用得上的知识才是有用的,所以学习技能要以实际需求为导向,比如git工具可以管理linux这种庞大的项目,但是问题是,你需要嘛?我们可以先找把自己的项目实现版本管理,git工具已经有极大的帮助了。
2025-03-02 22:49:10
1109
原创 STM32学习【4】ARM汇编(够用)
在CPU的世界里,一切外设都被抽象为寄存器或带有地址的内存数据。CPU只关心其内部的16个寄存器以及内存数据,外设寄存器虽然物理上与内存不同,但在CPU眼中并无区别,唯一的差异在于地址空间。
2025-02-27 23:00:35
888
原创 STM32【3】芯片的底层组成概论
单片机的意思是,小小计算电脑,麻雀虽小,五脏俱全,里面包含了CPU,ROM,RAM,各种外设。CPU地位最高,可以访问ROM和RAM,Flash,GPIO等外设,也就是ROM、RAM、Flash这些在CPU的眼里,地位是一样的。CPU访问外设是通过内存管理器来协调的。
2025-02-25 21:36:43
431
原创 python学习【1】time库
在Python中包含了若干个能够处理时间的库,而time库是最基本的一个,是Python中处理时间的标准库。time库能够表达计算机时间,提供获取系统时间并格式化输出的方法,提供系统级精确计时功能(可以用于程序性能分析)。time库包含三类函数,以下介绍常用的函数:- 时间获取:time()、ctime()、gmtime()- 时间格式化:strftime()、strptime()- 程序计时:sleep()、perf_counter()
2025-02-25 11:49:20
837
原创 STM32学习【2】时钟的配置和选择
在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。①、HSI是高速内部时钟,RC振荡器,频率为8MHz。精度较差。②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。③、LSI是低速内部时钟,RC振荡器,频率为40kHz。④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。⑤、PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。
2025-02-23 11:55:44
477
原创 STM32学习【1】GPIO工作原理(八种工作方式)
推挽结构一般是指两个参数相同的三极管或MOS管分别受两互补信号的控制,总是在一个三极管或MOS管导通的时候另一个截止。高低电平由输出电平决定。推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务。电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高。输出既可以向负载灌电流,也可以从负载抽取电流。推拉式输出级既提高电路的负载能力,又提高开关速度。
2025-02-23 11:03:22
844
原创 C语言学习【2】关于指针的记忆方式
前言:C语言的指针,用的最多的是普通指针,在RTOS中函数指针用的多,我觉得指针是非常美妙的,是对内存世界可以随意操纵。
2025-02-21 11:59:15
225
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人