精华内容
下载资源
问答
  • DSP平台使用串口升级软件的实现(精)
  • DSP平台使用串口升级软件的实现(精)
  • 串口IAP升级软件实现

    千次阅读 2020-01-18 15:20:32
    串口IAP软件在线升级 一,IAP的原理 IAP其实是将传统的程序分为了两个部分或者三部分,一个称为BootLoader区,另一个称为APP区域(用于存放用户升级的程序,还有一个就是APP备份区,如下所示: /***************...

    串口IAP软件在线升级

    一,IAP的原理

    IAP其实是将传统的程序分为了两个部分或者三部分,一个称为BootLoader区,另一个称为APP区域(用于存放用户升级的程序,还有一个就是APP备份区,如下所示:

    	/*******************
            --------  0x08000000
       8k   | boot |  boot引导区域
            --------  0x08002000
       20k  |  app |  APP正常软件区域
            --------  0x08007000
            |  bak |
       20k  |  app |  在线升级的软件写在 此部分区域
            --------  0x0800C000
    	******************/
    

    其中BootLoader区代码是通过SWD/JTAG方式先下载到单片机中去的,这一部分代码又称为引导代码,它的主要作用有:

    1. 接收从预留通信接口传来的bin/hex文件
    2. 把程序写在IAP应用程序的存储区域
    3. 跳转到真正的应用程序去执行。
    

    二,软件实现(IAR+STM32平台)

    1、编写Boot Loader程序,实现三个功能

    1)开启串口中断,当串口中有数据过来时将数据保存;
    2)写Flash功能,将保存的数据写入Flash 的指定地址;
    3)跳转功能,写入成功后跳转至指定地址执行程序。
    

    展开全文
  • 串口升级工具

    2017-12-27 10:03:55
    用python写的带UI的自动升级工具,可以选择升级文件,版本号,并且还有显示升级结果等功能
  • 本代码基于官方提供的STM32 IAP串口在线升级程序修改,内附BootLoader与测试程序,及破解版下载工具SecureCRT软件,破解方法内部有说明文件,本代码仅供参考。本人使用的是STM32F103C8T6芯片。
  • NVR_K41_QD_CN_STD_V3.4.97_171031.zip
  • 自己写的BootLoader,可以支持任意串口升级下载程序,调试程序,内含稳定的串口协议。
  • 串口升级C8051F程序

    2021-01-01 16:52:28
    利用串口升级C8051F程序
  • 基于DSP的IAP在线软件烧写升级,通过串口SCI来烧写升级程序,程序仍然是从flash启动不需要跳线,内含例程代码,可以参考。
  • 含机顶盒串口升级软件以及STB-4机108版裸机测试程序 106版裸机测试程序和升级说明
  • DSP软件串口升级

    2015-04-21 22:16:35
    介绍了DSP 的一种程序烧录方案,此方案可行性,已测试过
  • 串口在线升级.zip

    2019-11-13 10:48:41
    Bootloader中尽可能不使用中断,因此此处串口接收数据采用查询接收方式; Bootloaderz中不要让程序卡死或者进入某个死循环,应在适当的地方进行软件复位; 注意数组长度越界或者溢出错误; 注意YModem协议第一包...
  • 介绍了一种MSP430单片机通过串口升级程序的方法,并在MSP430F5438上得以实现。通过实验,证明此方法稳定、可靠,避免了利用仿真器更新程序的繁琐,提高了效率。
  • STM32串口升级

    千次阅读 2020-01-05 18:21:08
    STM32升级功能分为2部分,一部分是bootloader程序,另一部分是用户应用程序组成(以STM32F103C8为例来说明 ) bootloader工程分析 启动文件的复位部分 ; Reset handler Reset_Handler PROC EXPORT Reset_...
    • STM32升级功能分为2部分,一部分是bootloader程序,另一部分是用户应用程序组成(以STM32F103C8为例来说明 )

    bootloader工程分析

    启动文件的复位部分

    ; Reset handler
    Reset_Handler    PROC
                     EXPORT  Reset_Handler             [WEAK]
         IMPORT  __main
         IMPORT  SystemInit
                     LDR     R0, =SystemInit
                     BLX     R0
                     LDR     R0, =__main
                     BX      R0
                     ENDP

    系统复位后会调用SystemInit函数,此函数在system_stm32f10x.c文件中,其中有个宏决定程序flash或SRAM偏移定义的宏

    /*!< Uncomment the following line if you need to relocate your vector Table in
         Internal SRAM. */ 
    /* #define VECT_TAB_SRAM */
    #define VECT_TAB_OFFSET  0x0 /*!< Vector Table base offset field. 
                                      This value must be a multiple of 0x200. */

    在SystemInit函数的最后设置这个偏移值

    #ifdef VECT_TAB_SRAM
      SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */
    #else
      SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */
    #endif 

    启动方试有SRAM和FLASH两种,由宏VECT_TAB_SRAM来决定,SRAM_BASE基地址和FLASH_BASE基地址定义如下

    #define FLASH_BASE            ((uint32_t)0x08000000) /*!< FLASH base address in the alias region */
    #define SRAM_BASE             ((uint32_t)0x20000000) /*!< SRAM base address in the alias region */
    

    通常bootloader程序会放在偏移为0开始的一段空间,刚好是FLASH_BASE基址与偏移值为0加起来的地址值,在keil中地址配置如下

    程序SystemInit执行完后进入main函数

    int main(void) 	
    {   
    	  
    	FLASH_Unlock();
    	UART_Init();
    	BspTim2Init();
    	Main_Menu ();
    	
    	if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)
             {
    
                    BspTim2Close();     
                    JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);
                    Jump_To_Application = (pFunction) JumpAddress;
                  
                    __set_MSP(*(__IO uint32_t*) ApplicationAddress);
                    Jump_To_Application();
                }
                else
                {
                    SerialPutString("no user Program\r\n\n");
                }
    	
      while(1); 
    }
    1. 首先调用FLASH_Unlock函数解锁flash操作
    2. UART_Init函数初时化,为接收升级文件操作作准备
    3. BspTim2Init函数初时化定时器,提供超时计数用
    4. Main_Menu函数升级菜单操作功能实现
    5. 测试用户app地址是不是在APPLICATION_ADDRESS位置。检测栈顶的地址,来检验app是否下载成功

      if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000){}

            其中ApplicationAddress为用户应用程序起始地址,假如从0x8003000开始,则定义如下

    #define ApplicationAddress    0x8003000

          6. APPLICATION_ADDRESS + 4对应的是app中断向量表的第二项,复位地址 

              JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);

          7.把地址强转为函数指针
              Jump_To_Application = (pFunction) JumpAddress;

            JumpAddress 和Jump_To_Application定义如下

    typedef  void (*pFunction)(void);
    pFunction Jump_To_Application;
    uint32_t JumpAddress;
    

    8.  设置主函数栈指针 

     __set_MSP(*(__IO uint32_t*) ApplicationAddress);

    9.调用函数,跳转到app复位地址去执行复位操作

    Jump_To_Application();

    写升级内容到flash,数据接收采用ymode协议进行数据接收,具体协议可找度娘了解

    /*******************************************************************************
      * @函数名称:Ymodem_Receive
      * @函数说明:通过 ymodem协议接收一个文件
      * @输入参数:buf: 首地址指针
      * @输出参数:无
      * @返回参数:文件长度
      * @历史记录:     
         <作者>    <时间>      <修改记录>
    *******************************************************************************/
    int32_t Ymodem_Receive (uint8_t *buf)
    {
        uint8_t packet_data[PACKET_1K_SIZE + PACKET_OVERHEAD], file_size[FILE_SIZE_LENGTH], *file_ptr, *buf_ptr;
        int32_t i, j, packet_length, session_done, file_done, packets_received, errors, session_begin, size = 0;
    
        //初始化Flash地址变量
        FlashDestination = ApplicationAddress;
    
        for (session_done = 0, errors = 0, session_begin = 0; ;)
        {
            for (packets_received = 0, file_done = 0, buf_ptr = buf; ;)
            {
                switch (Receive_Packet(packet_data, &packet_length, NAK_TIMEOUT))
                {
                case 0:
                    errors = 0;
                    switch (packet_length)
                    {
                        //发送端终止
                    case - 1:
                        Send_Byte(ACK);
                        return 0;
                        //结束传输
                    case 0:
                        Send_Byte(ACK);
                        file_done = 1;
                        break;
                        //正常的数据包
                    default:
                        if ((packet_data[PACKET_SEQNO_INDEX] & 0xff) != (packets_received & 0xff))
                        {
                            Send_Byte(NAK);
                        }
                        else
                        {
                            if (packets_received == 0)
                            {
                                //文件名数据包
                                if (packet_data[PACKET_HEADER] != 0)
                                {
                                    //文件名数据包有效数据区域
                                    for (i = 0, file_ptr = packet_data + PACKET_HEADER; (*file_ptr != 0) && (i < FILE_NAME_LENGTH);)
                                    {
                                        file_name[i++] = *file_ptr++;
                                    }
                                    file_name[i++] = '\0';
                                    for (i = 0, file_ptr ++; (*file_ptr != ' ') && (i < FILE_SIZE_LENGTH);)
                                    {
                                        file_size[i++] = *file_ptr++;
                                    }
                                    file_size[i++] = '\0';
                                    Str2Int(file_size, &size);
    
                                    //测试数据包是否过大
                                    if (size > (FLASH_SIZE - 1))
                                    {
                                        //结束
                                        Send_Byte(CA);
                                        Send_Byte(CA);
                                        return -1;
                                    }
    
                                    //计算需要擦除Flash的页
                                    NbrOfPage = FLASH_PagesMask(size);
    
                                    //擦除Flash
                                    for (EraseCounter = 0; (EraseCounter < NbrOfPage) && (FLASHStatus == FLASH_COMPLETE); EraseCounter++)
                                    {
                                        FLASHStatus = FLASH_ErasePage(FlashDestination + (PageSize * EraseCounter));
                                    }
                                    Send_Byte(ACK);
                                    Send_Byte(CRC16);
                                }
                                //文件名数据包空,结束传输
                                else
                                {
                                    Send_Byte(ACK);
                                    file_done = 1;
                                    session_done = 1;
                                    break;
                                }
                            }
                            //数据包
                            else
                            {
                                memcpy(buf_ptr, packet_data + PACKET_HEADER, packet_length);
                                RamSource = (uint32_t)buf;
                                for (j = 0; (j < packet_length) && (FlashDestination <  ApplicationAddress + size); j += 4)
                                {
                                    //把接收到的数据编写到Flash中
                                    FLASH_ProgramWord(FlashDestination, *(uint32_t*)RamSource);
    
                                    if (*(uint32_t*)FlashDestination != *(uint32_t*)RamSource)
                                    {
                                        //结束
                                        Send_Byte(CA);
                                        Send_Byte(CA);
                                        return -2;
                                    }
                                    FlashDestination += 4;
                                    RamSource += 4;
                                }
                                Send_Byte(ACK);
                            }
                            packets_received ++;
                            session_begin = 1;
                        }
                    }
                    break;
                case 1:
                    Send_Byte(CA);
                    Send_Byte(CA);
                    return -3;
                default:
                    if (session_begin > 0)
                    {
                        errors ++;
                    }
                    if (errors > MAX_ERRORS)
                    {
                        Send_Byte(CA);
                        Send_Byte(CA);
                        return 0;
                    }
                    Send_Byte(CRC16);
                    break;
                }
                if (file_done != 0)
                {
                    break;
                }
            }
            if (session_done != 0)
            {
                break;
            }
        }
        return (int32_t)size;
    }

    1.收到文件名及长度会计算大小然后擦除flash

     //计算需要擦除Flash的页
     NbrOfPage = FLASH_PagesMask(size);
    
     //擦除Flash
     for (EraseCounter = 0; (EraseCounter < NbrOfPage) && (FLASHStatus == FLASH_COMPLETE); EraseCounter++)
     {
      FLASHStatus = FLASH_ErasePage(FlashDestination + (PageSize * EraseCounter));
     }

    2.接收到文件内容写对应的flash,从用户程序 ApplicationAddress地址开始写

    uint32_t FlashDestination = ApplicationAddress;

    写操作如下:

     memcpy(buf_ptr, packet_data + PACKET_HEADER, packet_length);
     RamSource = (uint32_t)buf;
     for (j = 0; (j < packet_length) && (FlashDestination <  ApplicationAddress + size); j += 4)
    {
      //把接收到的数据编写到Flash中
       FLASH_ProgramWord(FlashDestination, *(uint32_t*)RamSource);
    
        if (*(uint32_t*)FlashDestination != *(uint32_t*)RamSource)
         {
                                        //结束
            Send_Byte(CA);
            Send_Byte(CA);
            return -2;
          }
        FlashDestination += 4;
        RamSource += 4;
        }
        Send_Byte(ACK);

    写入后会读回内容,如果写入的与读回的内容不一致,则会终止升级操作

    • 应用程序部分

    此部分只需注意以下几点即可

    1.  起始地址设置,即bootloader跳转到用户程序的地址

    2.偏移地址设置

    /*!< Uncomment the following line if you need to relocate your vector Table in
         Internal SRAM. */ 
    /* #define VECT_TAB_SRAM */
    #define VECT_TAB_OFFSET  0x3000 /*!< Vector Table base offset field. 
                                      This value must be a multiple of 0x200. */
    

    升级时要使用有ymode协议的串口工具才能正常升级,最后,demo下载地址:

    https://download.csdn.net/download/mygod2008ok/12082368

     

     

     

     

    展开全文
  • 采用MSTAR芯片的海信液晶彩电软件升级方法(上).pdf
  • 这个IAP已经用在产品上多年了,目的是为了在GPRS和网口远程更新上用的,支持串口和网络升级
  • 通过使用STM32F103C8T6串口1,采用YModem协议对固件进行IAP升级,手工编写,测试有效。IAP程序大小12K,因此APP程序其实地址为0x8003000,同时中断偏移量也需要修改。
  • 自己用c#写的串口升级单片机代码程序,支持HEX文件处理
  • STM32通过串口升级程序

    热门讨论 2013-10-05 16:53:54
    通过串口升级STM32应用程序,内含PC工具软件及代码的原理介绍
  • Ymodem协议串口升级【含详细协议说明】,可替代超级终端
  • 为解决特殊场合DSP程序升级困难的问题,以TMS320F28035为例,介绍了一种基于串口通信的适合于TMS320C2000系列DSP实现程序更新的在线升级方法。描述了该在线升级方法的基本思想和实现步骤,给出了关键部分的程序代码...
  • 串口烧录升级下载

    2019-02-27 16:30:16
    通过串口对STM32进行程序烧录升级下载,基于YModem协议...IAP+ymodemDown.exe :为在线升级PC端软件下载密码(0xEF 0xCD 0xAE 0xB9 0x9E)指针清零(0X00 0X0A 或大于5个字节) 占用串口Usart1 115200.8.1.N, 测试通过;
  • NRF52832串口升级

    千次阅读 2019-04-20 17:46:28
    NRF52832作为当下最流行嵌入式智能穿戴主控,其优秀的功耗控制和强大的片上功能,已在低功耗嵌入式领域占据重要的地位。本文主要对NRF52832官方串口DFU功能进行技术探讨,主要涉及升级实现流程、扩展应用。

    NRF52832串口升级

    写在前面
    刚开始入门52832的时候对于一个嵌入式主控的OTA功能感觉不到其重要性,当真正开始讲产品投入到实际环境中进行应用时,这是后即刻凸显出OTA功能的主要性,如果产品在软件上出了某些bug,没有OTA功能不能远程升级现场设备固件有时将会导致难以估计的损失。对于52832的智能穿戴设备,串口OTA功能实现意义不大,主要是通过官方空中OTA实现对设备进行升级固件。但是如果是一款搭载52832的嵌入式物联网设备,空中OTA缺点是显而易见的,不能实现远程对设备进行升级。但是如果使用设备上其它MCU对52832通过串口进行空中升级,其问题即可得到解决。笔者已实现通过远程对控制设备中的MCU对52832进行升级。其主要实现流程为:让设备连接上服务器,服务器上接收服务器本机串口升级数据,转发到控制MCU,控制MCU再转发给52832,逆向数据也一样的原理,除了数据方向变化其它都是数据转发处理。

    实现52832串口远程升级的关键主要是首先验证本地串口升级功能,主要实现过程如下:
    主要参考文档
    PS:该文档下载所需积分较贵,但文章确实写的很好,适合入门级别,也可到各大BLE群聊搜索下载。

    一、搭建环境
    文章中搭建环境需要的安装包
    52832官方OTA功能主要是用python脚本语言实现,使用时只需要调用CMD命令行窗口即可。
    首先安装Python,建议使用python-2.7,这也是官方推荐python版本,安装python过程也很简单,可自行百度。安装python完成后,接下来是使用 Python 来安装 nrfutil,下载 nrfutil 的相关文件,解压压缩包并打开有 setup.py 文件的目录,在此处打开 dos 命令(shift+右键打开)输入命令行 python setup.py install 进行nrfutil安装。输入 python setup.py install 这步骤需要有网络的时候运行,安装可能需要等待几分钟时间。中途遇到过的问题:下载pc-nrfutil-3.3.2版本并安装,但是总是报错,
    参考解决如下

    二、生成密匙
    密匙是用于打包升级固件时候使用,作用是掌握该秘钥的人才能对设备进行升级。生成方法也很简单,在一个新建文件夹下打开cmd窗口,在 cmd 命令中输入以下内容:nrfutil.exe keys generate d:\cc_test\private.key即生成密匙 .key文件,该文件用于打包升级固件时使用。接下来在 cmd 中输入:nrfutil keys display --key pk --format code d:\cc_test\private.key --out_file d:\cc_test\public_key.c 即生成密匙 .c 文件,该文件主要是用于编译bootloder使用,bootloder用于生成初次烧录文件。

    三、编译bootloder
    编译bootloder需要将文件夹下的密匙替换为自己的密匙,将步骤二中的 .c 文件改名为 dfu_public_key.c ,将<bootloader 工程>\examples\dfu\bootloader_secure这个路径下的 dfu_public_key.c 用新生成的替换掉。
    SDK bootloder路径 \examples\dfu\experimental_bootloader_secure_serial\pca10040_debug 打开工程,初次编译会报错;
    报错
    处理方法:
    1、将下载的一个叫micro-ecc-master文件夹下的四个文件拷贝到报错的路径…\components\libraries\crypto\backend\micro_ecc下
    2、然后运行external\micro-ecc目录下的批处理
    完成上述两步之后编译通过。

    然后是修改bootloder波特率为9600,在sdk_config文件中修改对应波特率,远程升级固件建议使用9600更稳定。
    在这里插入图片描述
    最后生成bootloder的hex文件。

    四、修改python脚本
    这步主要是实现波特率和bootloder中的一直,修改方法很简单,如下图打开参考nrfutil路径下dfu_transport_serial.py文件如下截图:
    在这里插入图片描述
    修改参数如下(主要是修改波特率和流控 还有下方timeout时间,这个timeout时间是关键,是控制等待远程返回数据的时间,我自己的这套环境使用的是20(PS:下图未修改)):
    在这里插入图片描述
    然后在pc-nrfutil-master文件下cmd
    执行python setup.py build
    和python setup.py install 即可。

    五、打包固件
    固件主要有两部分,初次烧录固件和升级固件两部分。初次烧录固件用于初次烧录,升级固件用于后续升级。

    ①、烧录固件打包。
    需要的文件:
    applaction.hex 这个文件为应用程序编译出来的hex文件
    bootloader.hex 这个文件为串口bootloder编译生成的hex文件
    softdevice.hex 协议栈hex文件
    nrfutil.exe nrfutil工具
    将这四个文件放在一个文件夹下,新建一个批处理:

    del output3to1.hex
    mergehex --merge softdevice.hex bootloader.hex application.hex --output output3to1.hex
    del bootloader_setting.hex
    nrfutil settings generate --family NRF52 --application application.hex --application-version 1 --bootloader-version 1 --bl-settings-version 1 bootloader_setting.hex
    del Application_xxxx.hex
    mergehex --merge output3to1.hex bootloader_setting.hex --output Application_xxxx.hex

    运行批处理生成的Application_xxxx.hex 为最终需要烧录的hex文件
    效果如下:
    在这里插入图片描述
    ②、烧录固件打包。
    需要的文件:
    applaction.hex 这个文件为应用程序编译出来的hex文件
    private.key 秘钥 .key 文件
    nrfutil.exe nrfutil工具

    将这三个文件放在一个文件夹下,新建一个批处理:

    del Application.zip
    nrfutil pkg generate --hw-version 52 --sd-req 0x98 --application-version 31 --application application.hex --key-file private.key Application.zip

    运行批处理生成的 Application.zip 为最终需要烧录的zip文件

    六、烧录固件
    需要的文件:
    Application_xxxx.hex 五中打包好的烧录固件
    nrfutil.exe nrfutil工具

    将这二个文件放在一个文件夹下,新建一个批处理:
    nrfjprog -f NRF52 --eraseall
    nrfjprog -f NRF52 --program “Application_xxxx.hex” --verify
    nrfjprog -f NRF52 --reset

    PS:烧录前检查硬件连接,Jlink驱动安装正常与否
    运行批处理等待烧录完成

    七、升级固件

    需要的文件:
    Application.zip 五中打包好的升级固件
    nrfutil.exe nrfutil工具

    将这二个文件放在一个文件夹下,新建一个批处理:
    nrfutil dfu serial –pkg app.zip –p COM7 –fc 0 –b 9600

    PS:串口COM根据自己连接选择,升级必须先进入DFU模式,进入DFU模式代码:

    uint32_t bootloader_start(void)
    {
        uint32_t err_code;
    
        err_code = sd_power_gpregret_clr(0, 0xffffffff);
        VERIFY_SUCCESS(err_code);
    
        err_code = sd_power_gpregret_set(0, BOOTLOADER_DFU_START);
        VERIFY_SUCCESS(err_code);
    
        err_code = sd_softdevice_disable();
        VERIFY_SUCCESS(err_code);
    
        err_code = sd_softdevice_vector_table_base_set(NRF_UICR->NRFFW[0]);
        VERIFY_SUCCESS(err_code);
    
        NVIC_ClearPendingIRQ(SWI2_IRQn);
        interrupts_disable();
    
        NVIC_SystemReset();
        return NRF_SUCCESS;
    }
    

    进入DFU模式后连接硬件串口到PC

    运行批处理等待升级完成,完成效果图:
    在这里插入图片描述

    展开全文
  • STM32串口在线升级程序

    热门讨论 2013-02-06 10:04:58
    带VB软件源代码,STM32源代码,以及在线升级程序操作说明、原理介绍
  • 1、支持本地串口转网络; 2、支持创建虚拟串口转网络,非常适合串口通信的上位机升级为远程网络通信; 3、支持创建多组串口,类似于VSPD功能,每组两个串口可互通,可用于开发测试工具。
  • 华亚串口升级工具

    2015-11-04 16:14:15
    然后开启STB电源即可看到升级软件下面有进度条出现。 进度条走完以后,机器升级完成,出现开机画面。 注意:不支持Flash空片升级。升级的软件名必须是扩展名为Img的文件。 可直接将*.bin文件扩展名改为*.img文件...
  • 串口IAP固件升级程序

    2017-02-23 17:54:09
    基于YModem协议使用串口为stm32f103开发板更新固件
  • 在实际工程项目中使用的STM32F2xx的通过串口升级程序的源码,串口通信协议采用常见的ymodem。注意传输块大小选择1024字节,带crc16校验。...此源码可配合securecrt或自编上位机软件实现stm32串口升级
  • 迅达电梯串口调试维修软件,调试维修软件,可以查看修改参数,可以查看状态排除故障等
  • UART串口通信软件推荐

    千次阅读 2021-02-09 13:41:49
    UART串口通信软件推荐 在我们调试单片机的时候,经常用到UART串口通信(没有足够的资金购入LCD屏、OLED屏等显示器件)。市面上这么多的串口调试软件实在是让人无从下手,下面安利3款串口调试软件,提供大家参考选择...

    UART串口通信软件推荐

    在我们调试单片机的时候,经常用到UART串口通信(没有足够的资金购入LCD屏、OLED屏等显示器件)。市面上这么多的串口调试软件实在是让人无从下手,下面安利3款串口调试软件,提供大家参考选择吧。

    number one:VOFA+

    VOFA+原名伏特加,于2018年10月启动,代码配酒,bug没有。

    Volt/伏特、Ohm/欧姆、Fala/法拉、Ampere/安培,是电气领域的基础单位,与他们的发明者——4位电子物理学领域的科学巨人,分别同名。他们的首字母共同构成了VOFA+的名字,作者想向大家传达VOFA+的愿景——在与电气打交道的领域里,如自动化、嵌入式、物联网、机器人等,都能看到VOFA+的身影。同时寓意每一位使用VOFA+的工程师,都可以站在巨人的肩膀上不断创新和探索。

    废话不说,上VOFA+官网,目前这个软件是开源免费的(无法使用付费皮肤,有资金的可以支持一波,我溜了)。

    串口调试只是VOFA+的一个不起眼的功能,但是真的挺好用的,我之所以把它放在推荐位置第一,看中的是它的潜力,拓展性高。

    VOFA+作为串口调试的优点:

    1、界面简洁,字体颜色可调,可更换样式。

    2、采样速率高,时间戳可以很小,显示不会乱码、实时性高、不会突然卡死。(后面有体现)

    3、可拓展性好,作者维护得很好,更新频繁。

    VOFA+作为串口调试的不足:

    1、时间戳好像调不了?还是我没找到调节的方法。

    2、不能实现自动发送。

    下载地址:VOFA+

    number two:fireTools+(野火多功能调试助手)

    这是野火开发的一款上位机程序,集成了多个功能,超赞!(旧版的软件用C#开发,新版的使用Qt),目前用了一下,还有些许Bug,但是对于日常是够用的。

    优点:界面美观,集成度高,可实现自动发送。

    缺点:时间戳功能有待完善(日志模式无法调节时间间隔),会卡。

    下载地址:fireTools+(野火多功能调试助手)

    number tree:XCOM

    正点原子的串口调试助手软件XCOM,相貌平平无奇,但麻雀虽小,五脏俱全,功能上什么都没落下。

    优点:时间戳可调,别人有的功能基本它都有,相对稳定。

    缺点:界面“简洁”,显示可能会丢失换行符号。

    下载地址:XCOM

    测试

    使用了stm32f103zet6进行串口中断回显+while无延迟循环发送,以下是测试情况:

    性能比较
     表现
    VOFA+优秀,基本能显示要打印的内容(时间戳有问题导致一句话分行显示),能在高速接收信息的情况下发送和接收所需信息。
    XCOM良好,能显示说打印的内容,但丢失了换行符,能在高速接收信息的情况下发送和接收所需信息。
    fireTools+及格,开始能显示内容,几秒钟之后卡住,过段时间能短暂恢复显示,无法发送和接收所需信息(软件有待优化)。

    总结:日常生活中,用不到如此高的速度去传输信息,所以这几款软件都推荐使用,具体看个人喜好。

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 25,598
精华内容 10,239
关键字:

串口升级软件

友情链接: TestLogin.zip