
STM32学习笔记
文章平均质量分 75
分享在学习stm32系列单片机时遇到的问题及解决方法
嵌入式@hxydj
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
stm32单片机例程下载链接
在这篇文章中将自己上传的资源做一个下载链接的目录方便查找下载STM32单片机实现DMA+ADC+UART功能STM32F103单片机+ULN2003驱动直流电机STM32F103单片机使用TM1637芯片驱动4位数码管stm32f103c8t6+ESP8266 模块设置为Station模式向电脑发送数据stm32f103c8t6+ESP826 设置为AP模式STM32F103用串口空闲中断+DMA实现modbus通信示例STM32F103单片机用DMA+串口空闲中断接收不定.原创 2021-04-23 22:27:35 · 896 阅读 · 0 评论 -
IAR软件中测量函数执行时间
摘要:本文介绍了在IAR开发环境中测量代码执行时间的两种方法。第一种通过ST-LINK的Data Log Summary工具,在调试时记录断点前后的时间差(如测量到200.996ms延时)。第二种利用CYCLECOUNTER寄存器差值计算指令周期数,再结合CPU时钟频率(如170MHz)换算为实际时间(34,169,410周期对应200.996ms)。两种方法均可准确测量代码段执行时长,适用于不同调试需求。原创 2025-08-06 19:30:00 · 167 阅读 · 0 评论 -
IAR软件中变量监控的几种方法
IAR软件中分别使用watch、live watch、Locals、printf()、Debug log这几种显示需要实时监控的变量值。原创 2025-08-05 17:25:00 · 848 阅读 · 0 评论 -
使用Simulink和STM32Cube联合生成LED闪烁程序
本文详细介绍了如何将Simulink仿真模型生成的代码集成到STM32单片机工程中。主要内容包括:1)设置仿真参数与代码生成路径;2)建立状态机模型并设置状态转移条件;3)创建数据字典定义参数和信号变量;4)绑定模型与数据字典,配置仿真参数;5)设置符号变量和输出端口。通过这一系列步骤,可实现Simulink模型到嵌入式代码的完整转换流程,为嵌入式开发提供可视化建模支持。原创 2025-07-17 08:46:36 · 478 阅读 · 0 评论 -
在STM32CubeMonitor中使用j-link显示变量曲线
本文介绍了使用J-Link连接STM32F103C8T6开发板并通过STM32CubeMonitor监控变量波形的方法。首先将工程中的ST-Link模块替换为J-Link模块,配置J-Link参数并添加MCU型号。加载工程中的.axf文件后选择需要监控的变量,部署成功后即可显示波形曲线。文中还详细说明了如何调整波形显示的时间坐标轴,并通过重新部署使设置生效。整个过程展示了从硬件连接到软件配置的完整流程,实现了与ST-Link相同的变量监控功能。原创 2025-06-30 09:38:14 · 370 阅读 · 0 评论 -
使用STM32CubeMonitor实时修改变量值
本文演示了使用STM32CubeMonitor实时修改变量值及存储数据的方法。在原有代码基础上,通过添加write panel控件实现对max和max1变量的动态修改,从而控制time_cnt和time_cnt1的计数上限。操作步骤包括:连接控件输入输出、配置变量组、设置目标变量,部署后通过界面直接修改数值并观察波形变化。此外,还展示了将time_cnt变量值保存为CSV文件的功能,通过single value控件筛选数据,写入文件控件指定存储路径。实验结果表明,该方法能有效实现运行时的变量修改和数据记录,原创 2025-06-27 17:55:32 · 720 阅读 · 2 评论 -
使用STM32CubeMonitor仪表显示功能
本文介绍了如何使用STM32CubeMonitor实现变量数据的仪表盘可视化监控。通过STM32代码生成三个测试变量:两个线性递增变量(time_cnt和time_cnt1)和一个正弦变量(sin_value),详细演示了在CubeMonitor中配置仪表(gauge)和文本(text)显示模块的方法。文章包含完整的配置步骤:从变量添加、模块布局调整到显示效果优化,最终实现了波形曲线与仪表盘的协同显示。通过调整模块尺寸和布局,获得了清晰直观的监控界面,为嵌入式系统实时数据可视化提供了实用参考方案。原创 2025-06-26 11:37:11 · 494 阅读 · 0 评论 -
使用STM32CubeMonitor实时监控变量曲线
STM32CubeMonitor实时变量观测指南 摘要:本文介绍使用ST官方工具STM32CubeMonitor实时观测单片机变量的方法。首先从官网下载安装软件,配置工程路径并选择.axf文件,添加需要观测的变量。通过ST-LINK连接硬件后,在Dashboard界面启动波形显示,可调整时间轴范围(默认10秒可改为100秒)。演示了同时观测两个变量(自增和自减变量)的方法,并提醒修改程序时需先停止波形显示再下载,避免ST-LINK连接失败。该工具为STM32调试提供了便捷的实时数据可视化方案。原创 2025-06-25 17:53:49 · 515 阅读 · 0 评论 -
嵌入式编程时如何分层设计代码
代码量少的话还可以,如果代码里比较多,需要在一堆代码中去找这些需要的代码也很费时间,假如某一个功能需要升级了,代码需要修改了,那么每个产品都需要找到对于的代码去修改,那工作量岂不是很大。串口数据接收的函数,由统一的一个函数就被分离成了 串口中断----->数据接收 两个部分,如果后面还需要对接收到的数据进行内部解析,按照这种思维再抽象一个协议解析的函数。将接收函数的参数,由一个修改为2个。将接收到的数据存储到数组中,并使用一个值来标记接收到数据的状态和接收到数据个数,如果收到回车换行符,就结束数据接收。原创 2024-12-22 13:59:28 · 888 阅读 · 0 评论 -
STM32CubeMX生成代码后汉字乱码解决方法
总的来说汉字乱码的原因就是UTF-8和GB2312这两种格式再IAR这个编译器中不会自动转换,需要使用vscode软件手动转换代码格式。这是由于,STM32CubeMX生成的代码默认的是UTF-8格式,这里虽然把编译器的编码格式改了,但是代码本身其实还是UTF-8格式。这个打印函数是在main.c文件中,在VScode 使用UTF-8格式打开,然后编码格式另存为GB2312。此时代码中的汉字是正常的,接着再点击右下角的编码格式。此时代码的注释是汉字,但是使用IAR软件打开之后汉字是乱码。原创 2024-12-19 21:55:14 · 2345 阅读 · 0 评论 -
IAR中如何而将定义的数组放在指定的位置
注意添加的第一行代码中内存地址的范围要在RAM地址范围之内,否则就会出错。使用这种方法的话,就不需要修改 stm32f103xb_flash.icf 这个文件内容了,直接使用默认的内容就行。但是这个方法在IAR中是用不了的,通过网上查找各种资料,发现了两种可用的方法。我这里测试的单片机是stm32f103c8t6,其他单片机的操作方法是一样的。这里要注意一个问题,如果使用第2种方法的时候,数组大小必须是4的倍数,否则编译会报错。好了,这两种方法就分享到这,如果后面发现了其他新的方法再补充。原创 2024-12-19 21:04:35 · 644 阅读 · 0 评论 -
关于CAN通信中同步机制的通俗理解
所以在上升沿或者下降沿的过程中有识别你是0,也有可能识别你是1,这样判断你的电平的时候就可以引起误差。现在唯一确定的时间就是你数数是1秒钟变化1次的,那么在你变化的一瞬间我就开始对你计时,然后在对比我自己数数的计时,这样就可以知道我和你的时间差是多少,如果我比你慢,那么下次我就提前变,如果我比你快,我就晚一点变。比如上图中的状态,当你从0变为1的时候,我开始计时,我这边开始变的时候我也计下时间,此时我就发现了,你比我快了0.1秒,那我我此时就可以推算出,如果你到了1秒钟变化的时候,我才数到0.9秒。原创 2024-12-14 16:35:40 · 822 阅读 · 0 评论 -
STM32F103单片机HAL库串口通信卡死问题解决方法
所以分析造成串口卡死或者数据丢失的原因主要原因应该是直接在接收中断中直接发送数据,由于是接收一个字节,立即发送一个字节,如果每次发送几十个字节的时候,每两个字节之间的时间是很短的。在接收回调函数中接收到数据之后先存放到数组之中,当收到回车换行符之后结束接收,然后在main函数中检测接收标志位,如果接收完成,再将接收的数据打印出来。在网上查资料发现造成这个原因主要是HAL的流程问题,当串口在发送数据的时候,如果又接收到了数据,程序中就会出现死锁的情况。所以就将正点原子的串口接收方法移植过来。原创 2024-12-09 21:40:58 · 1965 阅读 · 0 评论 -
STM32F103单片机使用STM32CubeMX创建IAR串口工程
最后编译下载程序,在串口回调函数中打个断点,使用USB转TTL连接单片机的PA10和PA9引脚,使用串口工具发送一个字母q,可以看到串口中断已经进去了,接收到的数据也是q。接下来设置时钟,选择时钟配置,左下角时钟源选择HSE,然后在HCLK的位置直接输入需要输出的时钟值,这里设置72,按回车键。接下里设置串口参数,这里直接使用默认值,波特率115200,8位数据位,1位停止位,无校验位,发送和接收模式。接下来设置工程名,选择工程存储的位置,设置编译器的类型,和编译器最低版本。这里的编译器选择为IAR。原创 2024-12-08 18:03:42 · 849 阅读 · 0 评论 -
STM32F103单片机使用STM32CubeMX新建IAR工程步骤
STM32F103单片机上,使用STM32CubeMX生成IAR工程设置步骤。原创 2024-12-07 22:24:34 · 866 阅读 · 0 评论 -
Modbus协议学习方法
在刚开始接触modbus协议的时候,很容易被里面的各种功能码搞晕,同时在编写程序的时候也容易搞不清楚每一位数据代表的含义。如果在学习的过程中有实际的发送和接收数据的例子话,那么理解modbus协议就会更容易一些。下面我将自己借助软件学习的方法分享给大家原创 2023-06-28 18:16:14 · 1518 阅读 · 1 评论 -
如何将bootloader和APP程序一次性烧录到单片机中
首先将bootloader程序烧写到单片机中,然后通过串口将app程序写入到单片机内容,在平时学习和测试的时候这种方法没啥问题,但是如果产品需要量产,每次少些程序的时候都有通过这种方法的话,那效率就要低很多。这里添加刚才新合并的hex文件,将文件添加进来之后,在底下的信息框中就可以看到这个hex文件是由两部分构成的。这个地址分别是bootloader和app文件的地址。将bootloader的hex文件和app的hex文件合并成一个新的hex文件,接下来使用j-link的烧写软件进行烧写。原创 2023-06-11 11:05:45 · 3173 阅读 · 4 评论 -
使用Notepad++查看16进制文件遇到的大坑
按理说这个插件是直接从官方渠道安装的,没有什么问题。在调试程序的时候就发现,单片机接收到的数据和在这个notepa++里面看到的数据不一样,还以为是自己的串口受到了干扰,单片机和串口模块检查了好久都没发现啥问题,又在程序上排查了好久,还是没找到问题。最近在调试单片机的IAP升级功能,需要将bin文件直接通过串口发送给单片机然后升级程序,在调试代码的时候,为了方便观察发送的数据是否正确,就直接使用了Notaped++里面的16进制插件来查看bin文件,谁知道这个插件却给自己埋下了一个大坑。原创 2023-06-11 09:38:04 · 4163 阅读 · 7 评论 -
keil从非0x08000000地址调试STM32单片机程序方法
在使用stm32单片机的串口IAP升级功能时,需要调试bootloader程序和app程序,一般bootloader的程序都是从0x08000000地址开始运行的,使用keil软件可以直接进行仿真,但是如果调试app程序的话,由于它不是从0x08000000地址开始的,使用keil仿真的时候,仿真不了。为了可以直接使用keil仿真APP程序,在网上找了好多方法,不过好多方法都讲的比较凌乱,看起来也不方便。下面就将自己总结的2种方法分享出来。原创 2023-06-07 19:59:55 · 6905 阅读 · 8 评论 -
STM32F407单片机HAL库CAN2不能接收数据解决方法
下面就就是can的时钟,这里要注意一个就是使用can1的时候,开启can1的时钟就行,但是使用can2的时候,也必须开启can1的时钟。在can的控制器中,存储访问控制器是由can1控制的,当使用can2的时候,can2要访问存储访问控制器时,必须通过can1才能访问,所以使用can2的时候,can1为主机,can2为从机。当使用can2的时候,直接将值设置为14。的值就很关键了,这个值的含义是,从机滤波器的起始地址,那么当使用can2时,can2就是从机,那么这个值就是can2滤波器的起始地址,而上面。原创 2023-05-27 17:08:41 · 4019 阅读 · 4 评论 -
jlink-v8刷固件及解决keil报错 j-link is defective,j-link clone
今天在调试STM32F407的程序时,下载程序时突然keil识别不到jlink了,还以为是驱动的问题,重新装了好几次驱动,结果还是不行,于是就网上找各种办法,最后决定重新刷固件。网上的方法很多,好多都失败了。现在把我刷成功的过程分享给大家。原创 2023-05-26 20:59:34 · 2828 阅读 · 0 评论 -
STM32F407+LWIP+DP83848以太网驱动移植
最近有个项目上需要用到网络功能,于是开始移植网络相关代码。在移植的过程中感觉好难,网上找各种资料都没有和自己项目符合的,移植废了废了好的大劲。不过现在回头看看,其实移植很简单,主要是当时刚开始接触网络,各种新的知识和概念扑面而来,加上LWIP这个协议的相关资料,一下接触的太多,大脑已经混乱了。所以就感觉很难,当各种逻辑梳理清楚的时候,移植起来就很简单了。原创 2023-05-20 14:10:32 · 8018 阅读 · 5 评论 -
如何使用Understand软件查看STM32单片机HAL库函数调用关系
但是Understand软件在工程代码中却找不到这两个宏定义,所以就默认这两个宏定义没有定义,相关的代码就不会被编译。在使用STM32单片机的HAL库函数编程时,会发现好多中断函数里面都有各种回调函数,还有好多函数的调用深度比较深,在编写代码的时候,有时候想查看某个函数是如何被调用的,查看起来非常麻烦。通过这种手动增加宏定义的方法,就可在Understand软件中查看HAL库函数的调用关系了,通过图形化的界面帮助我们在写程序的时候更加高效。函数,而这个函数又调用了can.c文件里面的。原创 2023-05-17 21:56:58 · 2115 阅读 · 0 评论 -
stm32f407单片机上通过HAL库实现can总线数据的收发
最近在使用can总线,由于这个以前接触的比较少,所以调试代码的时候直接是下载的正点原子的例程,在这个基础上修改调试的。现在将调试中遇到的问题,总结一下,避免以后踩坑。目前写了一个查询方式的,一个中断方式的。原创 2023-05-17 20:11:23 · 5031 阅读 · 3 评论 -
TCP协议三次握手四次挥手详细分析
服务器收到客户端的SYN包之后,必须确认客户的SYN,也就是将客户端的上次发来的序号加1,上次客户端发来的序号是1213270320,加上1之后是1213270320=1,同时自己也发送一个SYN包,即SYN+ACK包,由于由于服务器是第一次给客户端发送数据,所以服务器也会随机生成一个序号6510,此时服务器进入SYN_RECV状态;客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK,第二次握手时服务器发来的序号为6510,所以本次向服务器确认时,需要将服务器的序号加1返回,也就是返回6510。原创 2023-05-10 22:38:37 · 998 阅读 · 0 评论 -
嵌入式代码查看分析利器---Understand
平时在开发嵌入式程序的时候大多数使用的都是keil软件,一般小的工程使用keil没感觉到有什么问题,但是当工程比较大的时候,比如移植了FreeRTOS系统或者LWIP网络系统时,代码全部编译一次就要花费很长世间,特别是开启了点击函数右键跳转的功能之后,速度更加慢。通过上面这个6种功能,可以对main函数和其他函数的调用关系进行各种方式的分析,让我们对这个工程代码能进一步的深入了解。如果想进一步了解这个函数的其他信息,可以在这个函数上单机鼠标右键,在属性中查看,这里就不再一一列举了。原创 2023-04-29 13:16:01 · 12996 阅读 · 26 评论 -
STM32F407软件仿真时不能进入main函数解决方法
最近在用keil软件仿真功能仿真STM32F407单片机时,发现进不到main函数位置处。下来点OK按钮,保存设置。这时候再使用软件仿真的时候,就可以直接进入到main函数中了。开始仿真的时候总是卡在Wait till HSE is ready 这块。网上找了好久解决方法,总算是搞定了。接下来在keil软件中点击魔术棒工具,切换到Debug选项设置界面。然后使用记事本打开该文件,在里面输入下面的内容。然后选择keil安装目录下的这个。接下来打开keil的安装目录。复制到keil的安装目录中。原创 2023-03-07 16:52:10 · 3323 阅读 · 8 评论 -
STM32系列单片机标准库移植FreeRTOS V10.4.6详解
最近看正点原子新录制了手把手教你学FreeRTOS的视频教程,看了一下教程发现视频里面讲的是使用HAL移植 FreeRTOS V10.4.6 版本,以前的标准库移植的是FreeRTOS V9.0 版本。而自己平时写代码使用的都是标准库,就想着能不能把FreeRTOS V10.4.6 版移植到标准库中去。为了移植简单,直接下载正点原子的代码在上面修改。原创 2023-01-07 15:48:46 · 5326 阅读 · 4 评论 -
由一个按键程序引发的思考(下)
上文[由一个按键程序引发的思考(中)]讨论了如何实现按键单次按下后能立即执行按键动作,同时又能滤除掉按下时间非常短的无效按键。但是在实际项目中,一个按键往往会具有多种功能,可以通过单击、双击、长按等方式切换不同的功能。 那对于单击、双击、长按这些功能要如何有效区分呢?下面就从按键的波形和判断逻辑来讨论这三种情况如何区分?原创 2022-11-05 11:55:29 · 1184 阅读 · 3 评论 -
由一个按键程序引发的思考(中)
按键的波形无非就是高、低、高三种状态。要判断按键从根本上来说就是对这三种状态的检测和分析。由于按下未按下时和弹起时都是高电平,那么直接通过电平判断不能有效区分这两个高电平的状态,就不能直接同电平来判断。观察按键波形可以发现,按键按下的一瞬间电平出现了下降沿,按键弹起的一瞬间出现了上升沿。这样通过上升沿和下降沿就能区分出按键按下或者弹起。原创 2022-10-30 10:24:09 · 2777 阅读 · 9 评论 -
由一个按键程序引发的思考(上)
说起按键程序,只要会单片机的肯定都很熟悉。一般开始学习单片机的时候,入门程序基本都是LED灯和按键。那么这个按键程序有什么特别的吗,还需要专门去思考吗?如果我刚开始学单片机的时候也会这么想,但是随着项目的积累,经验的增加,越来越觉得`复杂的事情简单做,简单的事情复杂做`,这句话很有哲理,越是看起来简单的事情,真正做好却很不容易。下面就抽丝剥茧的来慢慢分析下这个按键程序有什么特别之处。原创 2022-10-29 19:21:35 · 3808 阅读 · 6 评论 -
IAR自定义文件注释模板和函数注释模板
在IAR编辑器中自定义函数注释模板和文件说明模板,在写代码的时候可以一键插入自己定义的代码段或者注释。原创 2022-10-28 17:21:47 · 2303 阅读 · 1 评论 -
从代码层面分析STM32 标准库和HAL库的差异
相当于每个设置都是独立的函数。HAL库将一段代码通过宏定义的方式封装成了一个函数,每个端口的时钟都单独的定义了一个名称,标准库是一个独立的函数,通过参数传递的方式来设置每个端口的时钟。这两个版本的函数本质上操作的还是寄存器,不过HAL库操作的只是BSRR寄存器,而标准库端口置1的时候操作的是BSRR寄存器,端口清0的时候操作的是BRR寄存器。标准库设置端口模式的时候,是在if语句中判断之后直接设置的,而HAL端口模式设置时,却使用了switch语句去设置,说明在HAL库中,端口模式和标准库中发生了改变。原创 2022-09-08 20:24:41 · 21808 阅读 · 12 评论 -
在嵌入式开发中如何提高自己的代码水平
但是随着项目的增加和需求的各种变化,就会发现,第一种代码修改起来比较麻烦,比如LED口发生了变化,那么头文件和和初始化函数都需要修改,变动一次要修改好几个地方,修改的时候容易漏掉有些地方,导致调试起来各种问题不断,增加了调试的难度。如果感觉自己的技术比较好了,那么就可以去看库函数的源码,或者操作系统的源码,看看官方的源码是如何将不同类型不同型号的单片机抽象为统一的函数。如果哪天你看到别人的代码之后,一眼就能看出代码的优缺点时,那么就说明你的水平已经很高了,已经突破了自己的瓶颈了。这是 led.h 的代码。原创 2022-09-07 19:37:43 · 36733 阅读 · 42 评论 -
为什么要在单片机程序中使用结构体和指针
在刚开始学习单片机写程序的时候,大多数人都比较喜欢使用全局变量。因为这样写程序写起来比较简单,也容易理解。但是看官方例程的时候,大多数都喜欢使用结构体和指针。感觉指针和结构体看起来麻烦,写起来更麻烦,往往都是一长串字母。但是为什么官方都爱这样用呢?这样用的好处是什么,自己写程序怎么才能写成这种方式。下面通过一个实际的工程例子来说明,如何一步一步将全局变量改为指针和结构体的方式。原创 2022-09-05 14:18:15 · 5154 阅读 · 13 评论 -
STM8单片机通过PWM触发ADC同步采样
在做数字开关电源开发过程中使用最多的就是PWM功能和ADC采样功能。ADC采样时采样的时间点很重要,必须在PWM输出高电平的时候取采样,这样采样出来的数据才是最准确的。在STM8单片机中,可以通过定时器的TRG信号去触发ADC采样,这样就可以将PWM波形的输出和ADC采样结合在一起了。 下面就演示一下,如何在输出PWM波的过程中触发ADC采样。 首先看ADC的初始化代码。#include "adc.h"#include "main.h"#include "led.h"u16 DATA原创 2021-12-13 17:30:03 · 7625 阅读 · 3 评论 -
STM8单片机ADC采样功能通过定时器触发
在使用STM8单片机的ADC功能时,读取ADC数据时一般有两种方式,一种是通常不断地读取采样标志位,来判断ADC采样是否结束,一种是通过中断的方式来通知系统采样是否结束。 有时候采样ADC数据的时候,需要按照一定的时间间隔,定点的去采样数据。一般使用的方式就是通过定时器定时,然后在定时中断函数中再去读取ADC采样的数据。但是这种方式采样的时间是不固定的,比如进入定时器中断后,ADC采样刚结束,就可以直接使用当前采样到的数据。但是如果运气不好的话,进入定时中断后,ADC采样刚开始,那么此时就需要等到A原创 2021-12-13 15:50:48 · 6266 阅读 · 4 评论 -
单片机快速将库函数版代码移植为寄存器代码方法
现在单片机开发越来越多用的是库函数版本的,寄存器版本使用越来越少了。但是在有些项目中使用库函数会导致程序运行速度比较慢,没有直接操作寄存器运行起来速度快。所以在对时间要求比较严格的项目中,还是需要使用寄存器来开发。如果不能够找到寄存器相关示例代码的时候,开发起来还是比较困难的。今天就来总结一个快速将库函数移植为寄存器的方法,这个方式为通用方法,在任何单片机上都可以使用。 现在就用一个STM8单片机库函数的工程来举例。 这个代码的主要功能就是使用定时器1的捕获功能来计算输入波形的频率。对于定时原创 2021-12-13 10:29:43 · 1705 阅读 · 4 评论 -
STM8单片机串口同时识别自定义协议和Modbus协议
在单片机开发中,串口是最常用的和外界交换数据的渠道,要使用串口,那必不可少的就是通信协议,通信协议就是单片机和外界通信的语言,要想正常和其他设备正常交流,首先语言必须相通。 在实际开发过程中由于各种原因,导致很多时候单片机和外界其他设备协议不兼容,在使用的时候就比较麻烦。比如单片机要和两个设备通信,但是这两个设备的通信协议的不一样,在使用时单片机就必须使用两个串口分别和两个设备通信。如果这两个设备同时使用时还不感觉到资源浪费,如果每次只接一个设备,那么另一个串口也不能作为其他功能使用,还得留着备用。原创 2021-12-03 21:16:58 · 6442 阅读 · 6 评论 -
串口示波器---伏特加 彻底的爱了
最近在调试代码的时候发现了一款串口示波器软件,功能相当强大,而且上手起来非常容易。目前是我自己使用过的多款串口显示软件里功能最强大的,而且是免费的。 软件名字叫 VOFA+,中文名称叫伏特加。官网地址:https://www.vofa.plus/ ,官网界面如下: 点立即下载按钮进入到下载界面 支持在多个系统上运行,其中Windows版本还可以下载免安装版,也就是下载的文件夹解压后就可以直接运行。功能和安装版没有任何区别。这里下载的是免安装版。解压后文件夹如下: 双击vofa+.原创 2021-11-23 22:11:54 · 15850 阅读 · 14 评论