自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 linux操作系统点亮一个LED灯

主设备号主要用来描述一个驱动的种类,而次设备号主要描述这个种类下,它是第几个设备,就比如,我现在要控制4个LED灯,那么他们的主设备号都是10,次设备号分别是0,1,2,3,这样做的好处是我可以只写一份驱动代码,但可以同时操控4个led灯,除开led灯,其他的设备都是如此,这样可以做到代码去重,高度精简。因此编写设备树的过程,我们要让内核能够理解我们的语言,因此创建设备树的人就创建了一系列的子系统,我们如果想要使用一些外设,就是根据我们的原理图,用设备树提供的模板,把这些信息分门别类地填写到对应的节点中。

2025-08-29 11:28:59 559

原创 linux和RTOS架构区别

现阶段单片机的内核有cortex-M3或者cortex-A7等,一般M3内核主要用来移植一些轻量级操作系统,例如FreeRTOS,rtthread等,但是A7内核一般会用来移植linux操作系统,问题来了,我该怎么知道我要用什么系统了。​。

2025-08-29 11:27:23 564

原创 网络是如何传输的

最开始两台电脑通过一个网线连接就可以互相通信,后面慢慢的,越来越多的电脑需要互相通信,这样网线的连接越来越麻烦,两台电脑通信时只需要一根网线,三台电脑通信时就需要三根网线,四台电脑通信时就需要(3+2+1)根网线,五台电脑通信时就需要(4+3+2+1)根网线,这样子一直下去,那么网络的连接特别杂乱,并且可能很难分清谁和谁没有连接,因此集线器就此产生。

2025-08-26 15:06:40 626

原创 深入理解底层通信协议和应用层协议的区别

了解协议之前,我们首先需要清楚的概念底层通信协议:USART、IIC、SPI、CAN、TCP、UDP应用层协议:MQTT、HTTP、Modbus RTU/TCP底层通信协议的作用:仅提供数据的传输,不关注数据的含义,只需要保证数据从一头可以传递到另一头即可应用层协议的作用:赋予数据的含义,主机需要按照协议规定的格式发送数据,从机需要按照协议规定的格式读取数据,如果不知道这个协议,那么也就解析不了数据。

2025-08-22 14:23:39 763

原创 C#中的LOCK

【代码】放大算法规范化的。

2025-08-22 10:16:15 194

原创 带你了解网络通信五层架构

所以通过上述描述,我们知道了以太网主要用于计算机之前传递消息,那么我们知道这个原则之后,我们如果想要使用以太网需要满足那些条件呢?以太网定义了从。

2025-08-20 17:12:38 138

原创 VS Studio开发modbus RTU上位机(附赠源码)

5、增加通信状态显示,10S内没有接收到数据就默认离线。3、采用异步发送机制,防止阻塞,导致程序卡顿。2、封装了03 04 06 10 的写。4、采用模拟单片机空闲中断接收一帧数据。6、提供03 04 数据处理模板。1、正常的发送和接收数据。

2025-08-18 16:39:07 196

原创 手把手教你写变长参数函数(printf,scanf)

在C语言中,​。

2025-08-15 14:42:16 139

原创 C语言+安全函数+非安全函数

例如,当我们将一个字符串要赋值到另一个数组中时,我们一般会使用C语言自带的strcpy函数,但是针对该函数的底层实现,仅仅只是傻瓜式的将源地址的数据存储到目的地址,不会注意缓冲区是否溢出,如果目的地址空间不够,那么相邻的地址的值会被改变,然后读取的数据不对,严重的可能会造成程序崩溃。而这更重要的一点就是始终检查边界、验证输入、启用编译器警告,需要让代码做到0警告,以后调用一些C语言函数时,可以先了解一下是否有安全函数,如果有就可以直接用,虽然这是一个小问题,但是会无意间增加代码的鲁棒性。

2025-08-15 10:22:17 216

原创 手把手教你理解内存对齐

Arm对内存的访问支持字(4byte)、半字(2byte)、字节(1byte)的直接访问,但是呢他们是有一定的要求的:存取字时要求地址按字对齐,也就是地址要是4的整数倍,如0x0000、0x0004、0x0008(该地址只是举例,mcu的地址分配请参考具体手册的地址映射图)存取半字是要求地址按半字对齐,也就是地址是2的倍数,这样假如通过0x0001、0x0003这样非2倍数的地址来读取一个半字就会进入硬件中断错误存取字节简单,只要地址不超范围就可以。

2025-08-14 11:32:16 980

原创 从0-1理解指针

如果可以很清楚的明白下面这些的含义,那么后面的讲解可以跳过。

2025-08-13 14:54:55 463

原创 RS485+DMA+空闲中断+HAL库收发数据

(1)DMA是单片机集成在芯片内部的一个数据搬运工,它可以代替单片机对数据进行传输、存储,节约CPU资源。一般应用场景,ADC多通道采集,串口收发(频繁进入接收中断),SPI和IIC通信等(2)STM32F2系列的DMA控制器最多有2个,每个控制器有8个数据流,每个数据流可以映射到不同的通道。例如,DMA2的数据流7可能用于某个特定外设,比如USART1的TX。(每个数据流同一时间只能服务一个外设。

2025-08-12 14:38:22 987

原创 DMA伟大的数据搬运工

上述的一些配置参数不需要背诵,需要理解,当自己配置DMA时,首先会找例程代码或者晚上搜索代码,然后复制下来,自己只需要知道要配置哪一些参数,如何使用即可。

2025-08-08 16:51:50 713

原创 MODBUS代码框架详解

3、代码中如何存储数据,首先一定会有一个结构体A用来存储模块数据,但是当很多模块都要和上位机通信时,这时候本能反应还是采用结构体A发送数据,但是考虑代码的可拓展性,会发现如果还用结构体A发送数据就会有点混乱,例如,结构体A存储0-56的数据,结构体B存储57-86的数据,这时候对于读写数据的处理都特别麻烦(可以自己思考一下如何写代码),因为读写数据时没有一个严格的规范,需要自己人为记住偏移量,自己看代码也会很麻烦,而且如果结构体A需要新增协议,这时候还会打乱原有结构。成本低:只需要RS485芯片+双绞线。

2025-08-08 10:04:33 425

原创 PID理解(入门级)

有一条y=x的曲线,我要求x=1处的微分,实际上就是y=x的斜率,也就是1,那么就有人问了,为什么这么简单还会出现微分这个词语,原因在于有很多不规则的曲线,直接求去某一点的斜率很难,比如抛物线,在曲线上面任意一点斜率都不一样,此时我们求取就十分困难,所以就出现了微分的概念。就比如,现在有一条直线y=x,我要计算0到1的面积,通过上面的微分或者口算结果都是1,那为什么还有积分的概念了,原因在于,这条曲线可以是无规则的,我们不容易计算出面积,所以就出现了积分的概念。1、计算控制量的变化量。

2025-08-01 10:38:53 717

原创 多设备自动分配地址

给多个设备分配地址有很多种办法,只是每种办法都存在一些弊端(1)拨码开关:它可以通过几个IO口控制设备的地址,但通过这种方式,从设备的数量已经受限,其次是如果产品较多,负责拨码的工作人员很容易遗漏或者跳码(2)每个设备单独接线配置固定的地址,操作麻烦,人工配置效率低下。

2025-07-31 14:19:42 41

原创 功率 裕量

储能系统,并网,有PCS,EMS,BMS和负载,PCS的最大功率是100KW,现在设定PCS的功率为10KW,负载所需12KW,此时会向电网取电,但由于功率裕量的存在,此时会将PCS的功率调节到12KW,但如果此时不调节,PCS的功率还是10KW,请问有什么问题?(2)系统响应能力下降,如果负载突然增加到20KW,此时PCS只能从10KW快速爬坡到20KW,如果响应较慢,则需要更大的电网支持。负载尖峰功率 > (PCS设定功率 + 功率裕量),PCS设定功率 = 负载尖峰功率。来减少负载实际消耗的功率)

2025-07-29 13:42:45 315

原创 终端电阻120Ω(CAN+485)

4、在实验室测试时,一般使用CAN盒和单片机进行通信,此时不接入终端电阻或者CAN盒接入一个终端电阻,都可以正常通信,这是由于通信距离较短且波特率较低,干扰较少,一旦出现通信不上或者通信不稳定,丢包的情况,就需要按照拓扑严格保证总阻抗为120Ω。2.当焊接3个120Ω终端电阻时,回路电阻在40Ω,此时总线上会偶尔有一个或两个节点不上传信息,有可能过段时间会继续上传,或者下电再次上电的情况下,或许能够正常通信;3、CAN通信,随着通信速率的增大,总线的长度越短,可接入的结点个数越少。R:每个分支的终端电阻。

2025-07-23 11:28:26 260

原创 VS studio如何安装拓展

4、下载好后开始离线安装,首先关闭VS studio,然后双击vsix文件(双击没有反应看第五步),此时会弹出来一个安装进度框,等待安装即可(注意:如果安装几十分钟都没有好,可能和网络有关,可以尝试用自己的手机热点在试一下)5、如果双击vsix文件没有反应,那么使用vs自带的vsixinstaller.exe,安装visual studio 插件程序 “xxx.vsix”;3、直接点击下载,但是大概率网络较差,需要下载很久,可以采用离线下载方式。在步骤2中右上角有一个在浏览器中查看,点击,然后下载。

2025-07-22 11:41:21 436

原创 LiFePO4电池的安全详解

锂离子电池的:正极、负极、电解液、隔膜和外壳。正极:把正极材料(如LiFePO₄)+ 导电剂(如炭黑)+ 粘结剂(如PVDF)混合成浆料,涂覆在铝箔上,然后烘干、辊压。负极:把负极材料(如石墨)+ 导电剂 + 粘结剂混合成浆料,涂覆在铜箔上,同样烘干、辊压。组装1、首先,电池会按照下面的顺序叠起来隔膜 → 铝箔(正极)→ 隔膜 → 铜箔(负极)→ 隔膜 → 铝箔(正极)→ 隔膜 → 铜箔(负极)→ 隔膜...( 卷绕时,正极和负极的边缘可能因机械应力产生毛刺。

2025-07-16 15:36:48 128

原创 霍尔传感器和分流器

在新能源汽车中,电流采样的器件有分流器和霍尔传感器,分流器虽然成本相对低很多,但是其精度慢慢的无法满足现在相关计算的需求,除非控制成本,不然很少会使用到量产产品中,目前大部分使用霍尔传感器,根据场景使用,选择不同精度标准。霍尔传感器是根据霍尔效应制作的一种磁场传感器。用它可以检测磁场及其变化,可在各种与磁场有关的场合中使用。霍尔传感器的工作基础是霍尔效应,是由霍尔元件和它的附属电路组成的集成传感器。

2025-07-02 09:57:58 538

原创 CRC校验

CRC一般用于数据传输过程中,保证数据的准确性;进行远程升级时,对接收到的整个BIN包进行CRC校准。实际上,人们根据不同的需要,做了很多种计算方式,他们主要差别在于CRC长度、多项式、初始值、结果是否需要异或、是否需要翻转等等。: CRC的长度(按bit算,如8,16,32): CRC的名字,让人一看就知道这是哪种CRC: 多项式,通过该多项式来计算CRC: CRC的初始值: CRC结果做异或运算的值: 指示输出是否需要翻转: 指示输出是否需要翻转。

2025-06-24 09:53:53 232

原创 GPIO模式详解

GPIO支持4种输入模式(浮空输入、上拉输入、下拉输入、模拟输入)和4种输出模式(开漏输出、开漏复用输出、推挽输出、推挽复用输出)。开漏输出:mos管导通,输出强低电平;mos管截止,此时mos管电阻无穷大,如果无外部上拉电路,输出为高阻态,如果有外部上拉电路,输出为弱高电平(驱动能力较弱)推挽输出:NMOS管导通,PMOS管截止,输出强低电平;NMOS管截止,PMOS管导通,输出强高电平。

2025-06-23 09:20:22 891

原创 FreeRTOS获取任务运行状态和运行时间

Status:任务当前状态,B:阻塞,R:就绪,D:删除,S:挂起,X:运行。RunTime:程序占用CPU的时间,一直累加,单位是定时器6的时钟频率。四、在某个任务中加入打印代码(生产过程中要屏蔽,因为占用较长时间)三、tack.c文件中加入#include “tim6.h"一、FreeRTOSConfig.h文件中使能下面宏。RemainStack:历史中最小剩余栈空间大小。Task Name:任务名字,如果过长会被截断。CPU Usage:程序占用CPU的资源情况。TaskID:任务创建的顺序。

2025-06-19 14:17:39 272

原创 CLASSB类移植(满足IEC 60730-1和60355-1标准)

针对软件认证需要满足IEC 60730-1和60335-1标准,ST公司专门提供的软件扩展包X-CUBE-CLASSB,它包含自测库和文档,支持多种STM32系列芯片,通过预集成测试库和标准化流程,帮助开发者快速满足国际安全标准,适用于家电、工业控制等高可靠性场景。ClassB软件包程序检测内容分为两个主要部分:启动时的自检和运行时的周期自检,MCU在上电的时候会进行复位启动,在启动完成以后会进行运行自检。

2025-06-17 13:49:43 876

原创 AFE之MC33772B详解

有6个GPIO口,可以配置为输入和输出模式有两个使能引脚,移植代码需要。

2025-06-13 15:32:44 899

原创 FreeRTOS实时操作系统详解

最开始我们想要每一秒钟去读取一次温度的数据,所以代码如下但是此时我们会发现在延时的那一秒钟里面CPU没有并没有干任何事情,死延时很占用CPU资源,后面我们开始用一个定时器计时,时间到了则调用读取温度的数据,这样可以大大提高CPU空闲时间。随着任务的复杂,代码逻辑的增多,我们在while(1)中写了无数个if语句,这很不利于我们去观看代码,并且逻辑也很复杂,所以出现了任务调度,也就是小型操作系统。

2025-06-11 15:11:11 849

原创 ADES1831和ADBMS6830

1、上电默认进入STANDBY模式,SPI发送0xFF也可以进入STANDBY模式2、看门狗定时器超时后,进入SLEEP状态3、配置寄存器中的REFON位使用WRCFGA命令将组A设置为1进入REFUP状态,此状态比待机状态更快地启动ADC转换。i<TOTAL_IC;i++)注意:读AFE数据时会随着AFE片数增加而增加,原因是唤醒时间和AFE片数密切相关,如果需要缩短时间,那么减少唤醒频次。

2025-06-05 16:46:29 31

原创 LTC6820

(1)EN (引脚 16/引脚 1):设备使能输入。如果为低电平,则 LTC6820 将在 CS 引脚为高电平 5.7ms 后(当 MSTR 引脚为高电平)或 IP/IM 引脚上无信号 5.7ms 后(当 MSTR 引脚为低电平)后进入空闲模式。(7)MSTR (引脚 11/引脚 12):串行接口主/从选择器输入。(2)SLOW (引脚 12/ 引脚 13):慢速接口选择输入。(5)IM(引脚 9/引脚 10):隔离接口,减去输入/输出。(6)IP(引脚 10/引脚 11):隔离接口加输入/输出。

2025-05-26 13:49:14 340

原创 典型问题+分析过程+解决办法(嵌入式)

2、当在STM32中使用printf打印浮点数时,如果没有正确配置微库(MicroLib),或者使用了double类型而没有勾选微库支持,会导致硬件错误中断。当SOC>=98&MaxV>3500时,限流0.2C,此时电池极化内阻较大,电流下降,电压下降,导致限流满足一下不满足,即0.5C和0.2C来回跳动。3、boot和app时钟配置不一样,卡死在时钟配置(STM32F207参考手册写道,PLL使能后PLL配置参数不可更改,即app初始化时钟失败)2、USB接在拓展坞上,但拓展坞质量较差,电压不够。

2025-05-14 15:31:38 1024

原创 GD32F470移植CH395Q实现TCP协议

此处编译后肯定会多处报错,比如UINT8没有定义,stm32f10x_dma.h文件找不到等等,这些都是正常的,按照自己的经验进行修改即可,直到编译无警告,无报错。(3)将例程代码中的main.c内容全部加入到自己的main.c文件中,如果觉得函数较多,可以自己放置到CH398CMD.c函数中。状态(持续2*MSL,默认约60秒),导致原端口暂时无法复用,如果服务器没有做端口复用这个功能,可能会出现这个现象。ch395Q支持SPI和串口通信,本文采用SPI通信,我们需要配置6个GPIO口,分别如下。

2025-05-06 16:28:50 1347

原创 GD32F470移植LWIP协议,PHY芯片DP83848I

也就是说前24位是有规定的,其中48位MAC中的前几位也是有着对应的含义的。2、旧版LWIP(如1.4.1)存在DHCP状态机卡死问题,建议升级至2.1.3+。

2025-05-06 10:03:48 974

原创 MQTT协议(云平台通信 + 单片机移植)

一个 MQTT 数据包由: 固定头(Fixed header)、可变头(Variable header)、消息体(payload)三部分构成(1) 固定头(Fixed header)。存在于所有 MQTT 数据包中,包含内容如(连接,断开连接,发布,订阅,心跳请求,心跳响应等)、(0:最多分发一次,1:最少分发一次,2:只分发一次)等。(2) 可变头(Variable header)。存在于部分 MQTT 数据包中,数据包类型决定了可变头是否存在及其具体内容。

2025-04-27 11:10:00 1014

原创 FreeRTOS有一个任务进不去,其他任务正常运行

该任务依赖的硬件外设(如CAN、SPI)在App中未正确初始化,解决办法:每几个函数初始化完毕后等待一定时间在开始下一个函数的初始化。:该任务的优先级与其他任务或中断服务程序(ISR)冲突,导致无法被调度。:该任务的堆栈大小设置不足,导致无法正常创建或运行时溢出。

2025-04-14 15:22:48 394

原创 KEIL调试技巧(bug调试心得)

(1)现象:初始化配置串口3函数时,程序卡死并且进入搜索发现程序卡死在B. 的原因有:访问越界;堆栈溢出(是否有浪费的堆栈空间,比如malloc空间是否释放、是否定义过多无用的变量、数组是否太长);开启中断但未定义中断服务函数。(2)加入串口3中断处理函数,发现一直卡死在串口3中断处理函数里面,即一直有中断触发并且没有处理,但查看串口初始化函数发现,我并没有初始化定义任何中断处理函数,为什么会进入中断处理函数。

2025-03-31 14:43:38 511

原创 嵌入式常见显示屏

原理:共阴极,让a,b,g,c,d输出高电平,数码管上面可以显示出一个3。

2025-03-04 15:41:54 328

原创 MB85RC16--IIC协议

注意:FRAM的大小是2KByte,即可写最大地址是0x800,但是常规的读写地址只有8位,因此MB85RC16将写地址的高3位放到从机地址处,低8位放到写地址。调试过程中发现读数据一直都是0xFF,然后使用逻辑分析仪分析波形,发现发送读0x01地址时从机没有应答,后面查看原理图,发现发送地址错误,更改后可以成功接收数据。(1) STM32CubeMX配置IIC通信(HAL库)标准模式,100KHz时钟,7位地址。(2) MB85RC16驱动代码。

2025-02-05 17:07:05 431

原创 LWIP协议详解

Light weight IP(LWIP)轻量化的 TCP/IP协议, LwIP 的设计初衷是:用少量的资源消耗(RAM)实现一个较为完整的 TCP/IP 协议栈, 在保持TCP协议主要功能的基础上减少对 RAM 的占用。

2025-01-03 16:09:49 1786

原创 KEIL5软件介绍

尽量不要用最高优先级,之前有碰到过调试器在最高优先级时生成的代码跑飞,不管怎么调试,总有一小块功能出问题,有尝试过去keil官网找优先级高的代码编写说明,但是没有找到,最终只能选择去优化代码结构,降低优先级来解决问题了。如果一份文件已经在整个工程中发挥出了我们期待的作用,现在想要将其封装成库,则可以在已经成型的工程文件中将不需要编译的文件从工程全部移出掉,只留下我们需要封装的文件,这样就可以提高我们的运行效率。在运用自制库中的函数时,编译提示函数没有声明,包含库里面的头文件时,会显示这个头文件不存在。

2024-11-15 13:37:21 2061

原创 单片机+内存管理+启动流程

FLASH又称为闪存,不仅具备电子可擦除可编程(EEPROM)的性能,还不会断电丢失数据同时可以快速读取数据,U盘和MP3里用的就是这种存储器。在以前的嵌入式芯片中,存储设备一直使用ROM(EPROM),随着技术的进步,现在嵌入式中基本都是FLASH,用作存储Bootloader以及操作系统或者程序代码或者直接当硬盘使用(U盘)。RAM随机存储器(Random Access Memory)表示既可以从中读取数据,也可以写入数据。当机器电源关闭时,存于其中的数据就会丢失。比如电脑的内存条。

2024-11-01 15:55:07 1470

MQTT第三方库,方便移植

里面有两个文件夹,一个是MQTT,可以直接修改tranport.c文件后使用,一个是压缩包,里面讲述了很多种使用mqtt方法

2025-08-19

VSStudio开发串口上位机,使用C#语言,通信协议采用modbus RTU

VSStudio开发串口上位机,使用C#语言,通信协议采用modbus RTU

2025-08-18

ADBMS中英文数据手册,驱动代码等

ADBMS中英文数据手册,驱动代码等

2025-08-13

VS2019开发CAN上位机

VS2019开发CAN上位机

2025-05-30

空空如也

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

TA关注的人

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