- 博客(266)
- 收藏
- 关注
原创 KEIL调试技巧(bug调试心得)
(1)现象:初始化配置串口3函数时,程序卡死并且进入搜索发现程序卡死在B. 的原因有:访问越界;堆栈溢出(是否有浪费的堆栈空间,比如malloc空间是否释放、是否定义过多无用的变量、数组是否太长);开启中断但未定义中断服务函数。(2)加入串口3中断处理函数,发现一直卡死在串口3中断处理函数里面,即一直有中断触发并且没有处理,但查看串口初始化函数发现,我并没有初始化定义任何中断处理函数,为什么会进入中断处理函数。
2025-03-31 14:43:38
344
原创 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
243
原创 以太网协议和LWIP协议详解
Light weight IP(LWIP)轻量化的 TCP/IP协议, LwIP 的设计初衷是:用少量的资源消耗(RAM)实现一个较为完整的 TCP/IP 协议栈, 在保持TCP协议主要功能的基础上减少对 RAM 的占用。
2025-01-03 16:09:49
1320
原创 内存 对齐
其中这两种方法都可以往EEPROM中读写数据,但是他们的差别在哪里呢?首先我们知道大小端,不同的编译环境对于大小端定义(window一般采用小端存储,网络字节序采用大端存储),结构体的对齐方式不一样(常规按照4字节对齐,也有的按照1字节对齐)。实际上没有任何区别。
2024-12-09 16:48:27
179
原创 KEIL5软件介绍
尽量不要用最高优先级,之前有碰到过调试器在最高优先级时生成的代码跑飞,不管怎么调试,总有一小块功能出问题,有尝试过去keil官网找优先级高的代码编写说明,但是没有找到,最终只能选择去优化代码结构,降低优先级来解决问题了。如果一份文件已经在整个工程中发挥出了我们期待的作用,现在想要将其封装成库,则可以在已经成型的工程文件中将不需要编译的文件从工程全部移出掉,只留下我们需要封装的文件,这样就可以提高我们的运行效率。在运用自制库中的函数时,编译提示函数没有声明,包含库里面的头文件时,会显示这个头文件不存在。
2024-11-15 13:37:21
1591
原创 单片机内存管理
FLASH又称为闪存,不仅具备电子可擦除可编程(EEPROM)的性能,还不会断电丢失数据同时可以快速读取数据,U盘和MP3里用的就是这种存储器。在以前的嵌入式芯片中,存储设备一直使用ROM(EPROM),随着技术的进步,现在嵌入式中基本都是FLASH,用作存储Bootloader以及操作系统或者程序代码或者直接当硬盘使用(U盘)。RAM随机存储器(Random Access Memory)表示既可以从中读取数据,也可以写入数据。当机器电源关闭时,存于其中的数据就会丢失。比如电脑的内存条。
2024-11-01 15:55:07
1321
原创 FreeRTOS确定任务栈大小
所有任务共用一个堆空间,所以当调用xPortGetFreeHeapSize这个函数时,返回的就是现在所有可用堆空间的消息所有任务都有自己的栈空间,比如在任务中定义一个uint32_t data[100]的数组,此时调用uxTaskGetStackHighWaterMark函数返回栈空间就会减少100。
2024-10-31 23:16:20
1195
原创 bootloader跳转app卡死(IAP卡死)
一般bootloader跳转到APP时要关闭app中用到的中断(防止中断打断程序的运行,导致程序跑飞),那么查看系统中用到的中断:串口中断、滴答定时器中断,所以,跳转之前要关闭这两个中断:_disable_irq()和systick。更新的程序主函数中需要再次使能中断。
2024-10-23 11:10:38
2340
3
原创 STM32Cubemx 配置ADC(HAL库)
1、扫描模式: 使用STM32CUBEMX配置了多通道后,这一项默认开启且无法设置成关闭。这个模式就是自动扫描你开启的所有通道进行转换,直至转换完。例如你开启了CH0、CH1、CH2、CH3这四个通道,启动转换后ADC会自动将这4个通道全部转换完,但是这种连续性是可以被打断的,所以就引出了间断模式。2、连续模式: 在CUBE中选中ENABLE就是连续模式,DISABLE就是单次模式。开启连续模式后,ADC的转换不由其他控制。
2024-10-19 11:30:18
5990
原创 C# 自适应屏幕分辨率
如果出现 引发的异常:“System.InvalidOperationException”(位于 System.Windows.Forms.dll 中)“System.InvalidOperationException”类型的未经处理的异常在 System.Windows.Forms.dll 中发生。列 AutoSize 模式不能设置为 Fill,原因是至少有一个可见列将继承此 AutoSize 模式并被冻结。解决方法:修改else部分。
2024-10-08 16:23:22
1074
原创 逻辑分析仪看波形方法
异步串行数据的一般格式是:起始位+数据位+停止位,其中起始位1 位,数据位可以是5、6、7、8位,停止位可以是1、1.5、2位。对于正逻辑的TTL电平,a.起始位是一个值为0的位,低电平;b.停止位是一个值为1的位,高电平;c.线路路空闲或者数据传输结束,线路总是1,高电平;第一个:数据为0x55AA。
2024-09-21 16:23:06
1053
原创 环形缓冲区定义
为什么需要这个概念了,因为从机发送数据之后主机可能来不及处理,比如从机发送频率是每10ms发送一次,当主机接收到数据处理需要15ms,那么此时主机就会出现丢帧的概念,因此最好的解决办法是,定义一个缓冲区,当接受到数据后存储下来,然后一帧一帧的处理,这样就不会出现丢帧的情况。下面以CAN通信举例。
2024-09-21 11:41:26
314
原创 SOC的几种估算方法
一般来说,业内可以将SOC的精度做到5%左右,如果想要让SOC精度进一步提升,这时需要提高电流采样的精度或者提高电流在0点的宽度(业内一般是判断电流小于一定的值,则说明电流为0),但这种提高电流采样的方法成本很高,然而一套BMS价格只在300-500元左右,所以就出现了SOC估算,下面开始介绍SOC的几种估算方法。
2024-09-21 10:11:43
4130
原创 RTT调试打印LOG
1、前言:一般使用JLINK都会安装他的驱动,然后一般默认安装位置是2、解压Jlink版本的RTT驱动的压缩包3、解压,可以见到驱动文件4、在工程中新建一个文件夹,RTT,然后将上述的驱动文件加入到RTT文件夹中5、添加对应的头文件路径6、编写测试代码。
2024-09-12 14:50:18
741
原创 VS2019开发CAN上位机
1、CAN分析仪,主要功能就是把CAN信号转换成电脑能接收的USB信号。索引号是指电脑连接了几台CAN分析仪设备,一般情况下都是一台,该值为0。不同CAN盒的二次开发文件不同。2、CAN上位机一般只能适应一个CAN盒,如果需要实现多个CAN盒通信,那么需要加入多个CAN盒驱动。3、一般选择在别人提供的CAN程序上进行二次开发,例如周立功,广成等等。注意事项:二次开发不需要太多功能,可以裁剪(删完控件在删代码)下载C#版本,然后用VS2019运行,然后测试工程,通信正确。
2024-08-31 11:51:01
729
原创 串口通信(包含HAL库配置)
产生原因如上所述。ORE标志位在USART_SR寄存器,但值得注意的是使能了接收中断,那么ORE中断也同时被开启了。使能了接收中断,那么ORE中断也同时被开启了。使能了接收中断,那么ORE中断也同时被开启了。
2024-08-26 21:51:54
1615
原创 USB详解,配置及难点
USB有USB1.0/1.1/2.0/3.0多个版本,标准USB由4根线组成,VCC,GND,D+,D-,其中D+和D-是数据线,采用差分传输。在USB主机上,D-和D+都是接了15K的电阻到地,所以而在USB设备中,如果是,而如果是,当设备接入主机时,主机就可以判断是否有设备接入,并能判断设备是高速设备还是低速设备。有些芯片内部有两个USB控制器,名称分别为USB_OTG_FS和USB_OTG_HS。其中HS代表实现高速480Mbps速度模式通信。FS意为全速,速度为12Mbps。
2024-08-26 21:14:26
4332
原创 单片机存储外设 FLASH、EEPROM、FRAM
W25Q128是华邦公司推出的一款SPI接口的NOR Flash芯片,其存储空间为128Mbit,相当于16M字节。W25Q128V芯片是串行闪存,可以通过标准/两线/四线SPI控制。W25Q128一次最多可编程256个字节。页面可以按扇区擦除、块擦除、整个芯片擦除。
2024-08-21 21:55:16
2012
原创 STM32CubeMX 配置CAN通信 HAL库
/标识符屏蔽位模式中标识符寄存器,配置ID//标识符屏蔽位模式中屏蔽寄存器//标识符列表模式中为2个标识符寄存器,配置ID例如:屏蔽位寄存器的bit15=1,标识符寄存器的bit15=0,那么接受的Message里面的标识符的bit15必须为0才可能被硬件接受。如果屏蔽位寄存器的bit15=0,Message里面的标识符的bit15无论为什么值,bit15都能匹配通过。32位屏蔽位模式下:1个过滤器。FR2指定需要关心哪些位,FR1指定这些位的标准值。
2024-08-20 22:19:54
4834
原创 STM32CubeMX 配置定时器 HAL库
4、当我们使用cubemx配置时,我们可以发现APB1的时钟和APB1的外设时钟频率不一致,因此可以得知TIM6的时钟实际上时APB1时钟的2倍。3、我们可以调用下面函数获取APB1时钟,我们发现TIM6的时钟并不是APB1的时钟频率,而是它的2倍。1、首先我们可以根据下图得知 定时器的定时周期计算公式,但我们不知道TCLK的值。2、打开芯片手册,查看TIM6挂载在哪个时钟树上 ,TIM6挂载在APB1上。方法一:寻找到这个弱定义的函数,在里面编写定时器定时的时间到了以后要执行的动作。
2024-08-20 21:51:38
751
原创 FreeRTOS任务间通信
消息队列:不同任务或进程之间传递消息互斥锁:侧重于保证同一时刻只有一个线程可以访问共享资源信号量:控制对共享资源访问的同步机制,用于控制多个线程对共享资源的访问数量。事件组:管理多个事件的同步机制,允许多个任务等待多个事件的发生任务通知:任务之间直接发送通知,任务间通信线程间同步:信号量,互斥锁,事件组线程间通信:消息队列,任务通知。
2024-08-19 21:55:47
2005
原创 需量控制和动态增容
我国的电价主要分为:居民用电、农业用电、一般工商业用电和大工业用电,前两者实行的是单一制电价,二后两者一般实行的是两部制电价“两部制电价”主要应用范围:凡以电为原动力,或以电冶炼、烘焙、熔焊、电解、电化的一切工业生产,受电变压器总容量在315KVA及以上的企业,以及其它符合上述容量规定的特殊用电。用电容量在100千伏安至315千伏安之间的,可选择执行单一制或两部制电价;315千伏安及以上的,执行两部制电价,现执行单一制电价的用户可选择执行单一制或两部制电价,选择执行两部制后不再变更。
2024-08-18 20:52:54
1423
原创 磷酸铁锂电池
SEI膜生成原因:在电池首次充放电过程中,石墨负极、电解液和LI离子发生反应生成SEI膜(不可逆反应),SEI膜的主要成分是Li2CO3、LiF、Li2O、LiOH 等和各种有机成分。SEI膜坏处:一方面,SEI 膜的形成消耗了部分锂离子和负极材料C,使得电池容量降低;SEI膜好处:另一方面,SEI 膜具有有机溶剂不溶性,在有机电解质溶液中能稳定存在,并且溶剂分子不能通过该层钝化膜,从而能有效防止溶剂分子的共嵌入,避免了因溶剂分子共嵌入对电极材料造成的破坏,因而大大提高了电极的循环性能和使用寿命。
2024-08-16 08:47:24
1375
原创 最小二乘法(校准电流)
在工程应用中,我们经常会用一组观测数据去估计模型的参数,模型是我们根据先验知识定下的。例如常见的直线模型就是y=ax+b。但实际应用生活中,往往找不到一条直线可以经过所有数据,如下图。针对找不到唯一的a和b去组成直线模型,即方程无解,但我们需要根据未知来预测结果,那么就需要数据拟合。
2024-08-13 20:30:13
444
原创 单片机内存映射
在一些桌面程序中,整个内存映射是通过虚拟内存来进行管理的,使用一种称为内存管理单元(MMU)的硬件结构来将程序的内存映射到物理RAM。在对于 RAM 紧缺的嵌入式系统中,是缺少 MMU 内存管理单元的。因此在一些嵌入式系统中,比如常用的 STM32 来讲,内存映射被划分为闪存段(也被称为Flash,用于存储代码和只读数据)和RAM段(用于存储读写数据)。
2024-08-12 19:57:18
625
原创 VS使用openFileDialog读写txt和bin文件(C#语言)
(1) 创建布局文件并添加openFileDialog和saveFileDialog(2)打开按钮事件(3)写入按钮事件。
2024-08-05 13:51:24
535
原创 光伏逆变器、MPPT、PCS储能变流器、BMU、BCU、BDU和液冷机组
光伏逆变器(PV inverter或solar inverter)可以将(PV)产生的可变电压转换为市电频率(AC)的逆变器,可以反馈回商用输电系统,或是供离网的电网使用。
2024-08-05 09:29:47
4157
原创 磷酸铁锂电池用铜箔和铝箔包裹正负极的原因
(1)铝箔导电性好,质地软,价格便宜。(2)在普通材料中,金属材料是导电性最好的材料而在金属材料里价格便宜导电性又好的就是铜箔和铝箔。(3)在锂离子电池中,我们重要有卷绕和叠片两种加工方式。相关于卷绕来说,要用于制备电池的极片具有一定的柔软性,才能保证极片在卷绕时不发生脆断等问题,而金属材料中,铜铝箔也是质地较软的金属。(4)铜铝箔价格相对便宜,世界上铜和铝元素资源丰富。(5)铜铝箔在空气中也相比较较稳定。
2024-07-31 16:36:53
750
原创 浮点数如何存储
(sign) s是符号位,1表示负,0表示正(exponent) E的作用是对浮点数加权,这个权重是2的E次幂(significand) M是一个二进制小数。
2024-07-31 15:20:45
331
原创 STS静态转换开关
STS静态转换开关用于在两个独立的AC电源之间转换供电,第一路出现故障后STS自动切换到第二路给负载供电,第二路故障的话STS自动切换到第一路给负载供电。与传统的自动转换开关ATS不同,静态转换开关提供快速负载转换(一般为1/4周期),保证精密的电子设备不间断工作。适合用于UPS与UPS,UPS与发电机,UPS与市电,市电与市电等任意两路电源的不断电转换。既对负载可靠供电,同时又能保证STS在不同相切换时的安全性。在主电源发生故障时,负载自动切换到备用电源,主电源恢复正常后,负载自动切换到主电源。
2024-07-30 22:15:47
792
原创 UART和USART的区别
(1)同步通信(比特位同步)(2)异步通信(字符间同步,字符内比特位异步)同步通信会利用一根额外的信号线,其实也就是时钟信号线,它往往是发送设备提供的时钟信号,发送设备和接收设备在发送设备提供的同一时钟频率下完成同步。异步通信没有额外的一根信号线用于同步,接收者和发送者使用各自的时钟信号,接收者根据与发送者按事先约定的规来确定数据发送的开始与结束以及数据单位的持续时间。例如异步串行通信中,一般接收双方会确定一致的停止位,数据位的个数、波特率的大小以及是否采用奇偶校验位。
2024-07-26 10:40:34
2760
原创 KEIL代码编程技巧
*宏*///使用例如:我有一个PCS模组,其中这个模组有保持寄存器和输入寄存器的数据其中输入寄存器中有以下数据,保持寄存器数据忽略501 uwDSPVer_V DSP版本V u16 R502 uwHardFault_1 硬件故障字1 u16 R"按位解析:bit0 -- EPO故障标志;bit1 -- IGBT硬件过流标志;bit2 -- 母线硬件过压标志;bit3 -- 预留。
2024-07-22 17:41:02
1452
原创 函数形参是void*类型如何转换
让void作为形参的目的在于,可以让一个函数处理更多的数据类型,并且各个类型参数的处理方式类似,就没有必要写多个函数进行处理。void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。
2024-07-22 17:22:38
396
原创 Sourve insight 如何导入一个keil工程
1、新建一个工程2、修改工程名字,任意。修改文件路径,将其修改到KEIL工程文件路径下面3、点击OK4、点击Add All,添加全部。然后勾选两个选项,然后点击OK5、添加成功后点击close关闭。
2024-07-18 11:32:07
1393
1
原创 C语言丢失精度 如何实现高精度计算
int :占4个字节,也就是32位,及最大值是2^32-1=1024*1024*1024*4-1=4294967295以上说法错误,因为Int是有符号类型整数,所以最高位是符号位,及int的最大值应该是2^31-1由上面的程序可以得到,int的最大值是多少,以及如果计算值超过了Int的最大值之后数据如何存储。
2024-07-14 22:18:45
279
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人