0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

app如何通过多种固件下载器实现OTA升级

RTThread物联网操作系统 来源:RTThread物联网操作系统 2020-06-24 16:37 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

前言:前边讲过stm32通用bootloader的实现方法,没有看过的,可以参考这一篇文章:STM32通用Bootloader——FOTA,这次将在上篇bootloader的基础上,介绍app如何通过多种固件下载器实现OTA升级。

此项目硬件使用的是STM32F429开发板,代码全部使用RT-Thread Studio搭积木的方式实现,仅仅改动了几行代码,开发效率非常高。此项目的地址:https://gitee.com/Aladdin-Wang/RT-FOTA-STM32L431.git

使用到的软件包和组件:

在这里插入图片描述

1.准备工作

1.1 新建工程


由于此项目使用的esp8266需要一个串口,我使用的是uart2,所以需要还需要配置uart2:


增加uart接收缓冲区大小:

1.2 打开fal和at device软件包

配置fal软件包


配置sfud组件


配置SPI

配置fal_cfg.h

1#ifndef_FAL_CFG_H_ 2#define_FAL_CFG_H_ 3 4#include 5#include 6 7#defineFLASH_SIZE_GRANULARITY_16K(4*16*1024) 8#defineFLASH_SIZE_GRANULARITY_64K(64*1024) 9#defineFLASH_SIZE_GRANULARITY_128K(7*128*1024) 10 11#defineSTM32_FLASH_START_ADRESS_16KSTM32_FLASH_START_ADRESS 12#defineSTM32_FLASH_START_ADRESS_64K(STM32_FLASH_START_ADRESS_16K+FLASH_SIZE_GRANULARITY_16K) 13#defineSTM32_FLASH_START_ADRESS_128K(STM32_FLASH_START_ADRESS_64K+FLASH_SIZE_GRANULARITY_64K) 14/*=====================FlashdeviceConfiguration=========================*/ 15externconststructfal_flash_devstm32_onchip_flash_16k; 16externconststructfal_flash_devstm32_onchip_flash_64k; 17externconststructfal_flash_devstm32_onchip_flash_128k; 18externstructfal_flash_devnor_flash0; 19 20/*flashdevicetable*/ 21#defineFAL_FLASH_DEV_TABLE 22{ 23&stm32_onchip_flash_16k, 24&stm32_onchip_flash_64k, 25&stm32_onchip_flash_128k, 26&nor_flash0, 27} 28/*======================PartitionConfiguration==========================*/ 29#ifdefFAL_PART_HAS_TABLE_CFG 30/*partitiontable*/ 31#defineFAL_PART_TABLE 32{ 33{FAL_PART_MAGIC_WROD,"bootloader","onchip_flash_16k",0,FLASH_SIZE_GRANULARITY_16K,0}, 34{FAL_PART_MAGIC_WROD,"param","onchip_flash_64k",0,FLASH_SIZE_GRANULARITY_64K,0}, 35{FAL_PART_MAGIC_WROD,"app","onchip_flash_128k",0,FLASH_SIZE_GRANULARITY_128K,0}, 36{FAL_PART_MAGIC_WROD,"ef","W25Q128",0,1024*1024,0}, 37{FAL_PART_MAGIC_WROD,"download","W25Q128",1024*1024,512*1024,0}, 38{FAL_PART_MAGIC_WROD,"factory","W25Q128",(1024+512)*1024,512*1024,0}, 39} 40#endif/*FAL_PART_HAS_TABLE_CFG*/ 41 42#endif/*_FAL_CFG_H_*/

初始化spi flash和fal软件包

1#include 2#include"spi_flash.h" 3#include"spi_flash_sfud.h" 4#include"drv_spi.h" 5 6#ifdefined(RT_USING_SFUD) 7staticintrt_hw_spi_flash_init(void) 8{ 9__HAL_RCC_GPIOF_CLK_ENABLE(); 10rt_hw_spi_device_attach("spi5","spi50",GPIOF,GPIO_PIN_6); 11 12if(RT_NULL==rt_sfud_flash_probe("W25Q128","spi50")) 13{ 14return-RT_ERROR; 15} 16 17returnRT_EOK; 18} 19INIT_COMPONENT_EXPORT(rt_hw_spi_flash_init); 20#endif1intfs_init(void) 2{ 3/*partitioninitialized*/ 4fal_init(); 5return0; 6} 7INIT_ENV_EXPORT(fs_init);

配置at device软件包

1.3 配置中断重定向

1/** 2*Functionota_app_vtor_reconfig 3*DescriptionSetVectorTablebaselocationtothestartaddrofapp(RT_APP_PART_ADDR). 4*/ 5staticintota_app_vtor_reconfig(void) 6{ 7#defineNVIC_VTOR_MASK0x3FFFFF80 8/*SettheVectorTablebaselocationbyuserapplicationfirmwaredefinition*/ 9SCB->VTOR=0x8020000&NVIC_VTOR_MASK; 10 11return0; 12} 13INIT_BOARD_EXPORT(ota_app_vtor_reconfig);


烧录bootloader:
bootloader的制作方法请参考官方的教程https://www.rt-thread.org/document/site/application-note/system/rtboot/an0028-rtboot/或者STM32通用Bootloader——FOTA

2.阿里云物联网平台OTA

注册 LinkPlatform 平台


创建产品


产品详情:


添加设备


添加自定义Topic


配置ali iotkit软件包
将刚才新建的阿里云设备信息填写到配置信息里:


将软件包的示例mqtt-example.c和ota_mqtt-example.c拷贝到applications目录备用


配置mbedtls软件包


更改ota_mqtt-example.c中的部分代码:

1staticint_ota_mqtt_client(void) 2{ 3#defineOTA_BUF_LEN(16385) 4#defineDEFAULT_DOWNLOAD_PART"download" 5intrc=0,ota_over=0; 6void*pclient=NULL,*h_ota=NULL; 7iotx_conn_info_ptpconn_info; 8iotx_mqtt_param_tmqtt_params; 9 10//FILE*fp; 11staticcharbuf_ota[OTA_BUF_LEN]; 12conststructfal_partition*dl_part=RT_NULL; 13 14//if(NULL==(fp=fopen("ota.bin","wb+"))){ 15//EXAMPLE_TRACE("openfilefailed"); 16//gotodo_exit; 17//} 18 19/**< get device info*/ 20    HAL_GetProductKey(g_product_key); 21    HAL_GetDeviceName(g_device_name); 22    HAL_GetDeviceSecret(g_device_secret); 23    /**< end*/ 24 25    /* Device AUTH */ 26    if (0 != IOT_SetupConnInfo(g_product_key, g_device_name, g_device_secret, (void **)&pconn_info)) { 27        EXAMPLE_TRACE("AUTH request failed!"); 28        rc = -1; 29        goto do_exit; 30    } 31 32    /* Initialize MQTT parameter */ 33    memset(&mqtt_params, 0x0, sizeof(mqtt_params)); 34 35    mqtt_params.port = pconn_info->port; 36mqtt_params.host=pconn_info->host_name; 37mqtt_params.client_id=pconn_info->client_id; 38mqtt_params.username=pconn_info->username; 39mqtt_params.password=pconn_info->password; 40mqtt_params.pub_key=pconn_info->pub_key; 41 42mqtt_params.request_timeout_ms=2000; 43mqtt_params.clean_session=0; 44mqtt_params.keepalive_interval_ms=60000; 45mqtt_params.read_buf_size=OTA_MQTT_MSGLEN; 46mqtt_params.write_buf_size=OTA_MQTT_MSGLEN; 47 48mqtt_params.handle_event.h_fp=event_handle; 49mqtt_params.handle_event.pcontext=NULL; 50 51/*ConstructaMQTTclientwithspecifyparameter*/ 52pclient=IOT_MQTT_Construct(&mqtt_params); 53if(NULL==pclient){ 54EXAMPLE_TRACE("MQTTconstructfailed"); 55rc=-1; 56gotodo_exit; 57} 58h_ota=IOT_OTA_Init(g_product_key,g_device_name,pclient); 59if(NULL==h_ota){ 60rc=-1; 61EXAMPLE_TRACE("initializeOTAfailed"); 62gotodo_exit; 63} 64 65 66do{ 67uint32_tfirmware_valid; 68 69EXAMPLE_TRACE("waitotaupgradecommand...."); 70 71/*handletheMQTTpacketreceivedfromTCPorSSLconnection*/ 72IOT_MQTT_Yield(pclient,200); 73 74if(IOT_OTA_IsFetching(h_ota)){ 75uint32_tlast_percent=0,percent=0; 76charmd5sum[33]; 77charversion[128]={0}; 78uint32_tlen,size_downloaded,size_file; 79IOT_OTA_Ioctl(h_ota,IOT_OTAG_FILE_SIZE,&size_file,4); 80/*Getdownloadpartitioninformationanderasedownloadpartitiondata*/ 81if((dl_part=fal_partition_find(DEFAULT_DOWNLOAD_PART))==RT_NULL) 82{ 83LOG_E("Firmwaredownloadfailed!Partition(%s)finderror!","download"); 84rc=-1; 85gotodo_exit; 86} 87 88LOG_I("Starteraseflash(%s)partition!",dl_part->name); 89 90if(fal_partition_erase(dl_part,0,size_file)< 0) 91                { 92                    LOG_E("Firmware download failed! Partition (%s) erase error!", dl_part->name); 93rc=-1; 94gotodo_exit; 95} 96LOG_I("Eraseflash(%s)partitionsuccess!",dl_part->name); 97 98rt_uint32_tcontent_pos=0,content_write_sz; 99 100do{ 101 102len=IOT_OTA_FetchYield(h_ota,buf_ota,OTA_BUF_LEN,1); 103if(len>0){ 104content_write_sz=fal_partition_write(dl_part,content_pos,(uint8_t*)buf_ota,len); 105if(content_write_sz!=len) 106{ 107LOG_I("WriteOTAdatatofilefailed"); 108 109IOT_OTA_ReportProgress(h_ota,IOT_OTAP_BURN_FAILED,RT_NULL); 110 111gotodo_exit; 112} 113else 114{ 115content_pos=content_pos+len; 116LOG_I("receive%dbytes,totalrecieve:%dbytes",content_pos,size_file); 117} 118}else{ 119IOT_OTA_ReportProgress(h_ota,IOT_OTAP_FETCH_FAILED,NULL); 120EXAMPLE_TRACE("otafetchfail"); 121} 122 123/*getOTAinformation*/ 124IOT_OTA_Ioctl(h_ota,IOT_OTAG_FETCHED_SIZE,&size_downloaded,4); 125IOT_OTA_Ioctl(h_ota,IOT_OTAG_FILE_SIZE,&size_file,4); 126 127last_percent=percent; 128percent=(size_downloaded*100)/size_file; 129if(percent-last_percent>0){ 130IOT_OTA_ReportProgress(h_ota,percent,NULL); 131} 132IOT_MQTT_Yield(pclient,100); 133}while(!IOT_OTA_IsFetchFinish(h_ota)); 134 135IOT_OTA_Ioctl(h_ota,IOT_OTAG_MD5SUM,md5sum,33); 136IOT_OTA_Ioctl(h_ota,IOT_OTAG_VERSION,version,128); 137IOT_OTA_Ioctl(h_ota,IOT_OTAG_CHECK_FIRMWARE,&firmware_valid,4); 138if(0==firmware_valid){ 139EXAMPLE_TRACE("Thefirmwareisinvalid"); 140}else{ 141EXAMPLE_TRACE("Thefirmwareisvalid"); 142IOT_OTA_ReportVersion(h_ota,version); 143 144LOG_I("Downloadfirmwaretoflashsuccess."); 145LOG_I("Systemnowwillrestart..."); 146 147HAL_SleepMs(1000); 148 149/*Resetthedevice,Startnewfirmware*/ 150externvoidrt_hw_cpu_reset(void); 151rt_hw_cpu_reset(); 152} 153 154ota_over=1; 155} 156HAL_SleepMs(2000); 157}while(!ota_over); 158 159HAL_SleepMs(1000); 160 161do_exit: 162 163if(NULL!=h_ota){ 164IOT_OTA_Deinit(h_ota); 165} 166 167if(NULL!=pclient){ 168IOT_MQTT_Destroy(&pclient); 169} 170 171returnrc; 172}

编译工程,将bin文件上传到阿里云:

阿里云不支持rbl格式的文件,直接将rt_ota_packaging_tool生成的rbl文件后缀改为bin,上传即可。


最后使用ali_ota_sample命令升级:

3.HTTP OTA和Ymodem OTA

配置ota_downloader软件包


如果暂时没有自己的服务器,可以使用MyWebServer进行测试:


配置完MyWebServer,可以打开浏览器输入IP地址查看:

使用http_ota命令进行http_ota升级:


使用ymodem_ota命令进行ymodem_ota升级:

4.不使用APP进行升级

rt-fota集成了ymodem_ota,上电短按恢复出厂设置按钮即可进入rt-fota命令行模式,通过ymodem_ota命令即可进行升级:

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • OTA
    OTA
    +关注

    关注

    7

    文章

    623

    浏览量

    37949
  • 阿里云
    +关注

    关注

    3

    文章

    1028

    浏览量

    45487
  • 物联网平台
    +关注

    关注

    7

    文章

    115

    浏览量

    21573

原文标题:零代码玩转OTA升级

文章出处:【微信号:RTThread,微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    MCU固件几种Flash(闪存)划分方式

    通过U盘、OTA远程等方式下载的程序,其实你还是需要提前下载BootLoader程序,才能进一步下载A
    的头像 发表于 11-27 18:20 952次阅读

    OTA下载新的固件后,设备无法正常启动,回滚到旧固件也失败怎么解决?

    OTA下载新的固件后,设备无法正常启动,回滚到旧固件也失败
    发表于 11-26 07:36

    Bootloader固件升级的步骤

    ,也可以不更新,在项目中,我们通常会对 FW 版本号进行对比,会将 MCU 中的 App 程序更新最新的版本,起到固件升级的效果。更新的话,BootLoader 更新完程序后,跳转到新程序运行;不更新
    发表于 11-19 07:41

    使用RTT的维护云进行远程固件升级OTA),怎么没有网络升级的方式?

    使用RTT的维护云进行远程固件升级OTA),怎么没有网络升级的方式的?只有蓝牙,近距离的固件升级
    发表于 10-13 06:36

    ota升级完成后,bootloader没有将download区的新代码搬运到app区?

    ota升级完成后,bootloader没有把download区的新固件搬运到app区,版本也改了,可以保证是和上次的版本不一样,也没有打印任何错误的信息,可以明确的是它能正确把
    发表于 09-29 10:04

    OTA采用ymodem_ota升级app分区出现CRC校验错误是怎么回事?

    芯片:STM32F103VET6 环境:MDK5 使用的相关软件包:ota_downloader; 如上图,使用官方例程,BOOT运行起来之后,发现APP区CRC校验不对,但是会强制升级,并且
    发表于 09-10 06:57

    ESP32通过OTA无线局域网远程升级下载程序

    本文介绍了ESP32通过OTA无线局域网远程升级固件的基本方法
    的头像 发表于 07-22 13:21 1470次阅读
    ESP32<b class='flag-5'>通过</b><b class='flag-5'>OTA</b>无线局域网远程<b class='flag-5'>升级</b><b class='flag-5'>下载</b>程序

    蓝牙空中升级(OTA)原理

    DFU,即通过空中无线方式实现设备固件升级。只不过大家为了方便起见,直接用OTA来指代固件空中
    发表于 07-21 14:50

    详解蓝牙空中升级(OTA)原理与步骤

    如何实现Bluetooth LE OTA?什么叫DFU?如何通过UART实现固件升级?又如何
    的头像 发表于 07-04 09:56 4027次阅读
    详解蓝牙空中<b class='flag-5'>升级</b>(<b class='flag-5'>OTA</b>)原理与步骤

    瑞萨电子MCU无感OTA升级功能介绍

    在工业控制、电机驱动乃至物联网边缘节点中,固件在线升级OTA)已成为产品生命周期管理的标配。然而传统OTA往往伴随停机、风险与低效。瑞萨电子MCU中的Dual‑Bank闪存架构为工程
    的头像 发表于 05-15 14:36 1378次阅读
    瑞萨电子MCU无感<b class='flag-5'>OTA</b><b class='flag-5'>升级</b>功能介绍

    有没有大神使用cubeMX生成初始代码开发实现通过USB(HID)进行OTA升级功能的?

    求助,有没有大神使用cubeMX生成初始代码开发实现通过USB(HID)进行OTA升级功能的
    发表于 04-22 13:35

    一文解锁OTA远程升级方案!基于RK3562全国产平台

    在设备维护成本高、用户体验难提升的双重难题下,OTA(Over-the-Air)空间下载技术的出现,无疑成为破解困境的“金钥匙”,它是一种通过无线网络实现设备远程
    的头像 发表于 04-07 10:15 1072次阅读
    一文解锁<b class='flag-5'>OTA</b>远程<b class='flag-5'>升级</b>方案!基于RK3562全国产平台

    浅谈车规MCU (MGEQ1C064) OTA升级

    upgrade)即空中下载技术,简单来说,是通过外部方式(有线或无线)对产品进行更新,而不是传统的编程刷入固件的方式。 随着智能网联汽车技术的飞速发展,
    发表于 03-04 12:52

    OTA软件升级管理系统

    OTA(Over-the-Air Technology,空中下载技术)是通过空中下载的方式对车辆中的软件进行远程升级。经纬恒润
    的头像 发表于 01-13 09:39 1599次阅读
    <b class='flag-5'>OTA</b>软件<b class='flag-5'>升级</b>管理系统

    OTA升级】无需数据线,一条命令即可完成固件升级

    OTA无线升级过程视频演示:OTA介绍OTA(Over-The-Air,空中升级)是一种通过无线
    的头像 发表于 12-11 01:00 5434次阅读
    【<b class='flag-5'>OTA</b><b class='flag-5'>升级</b>】无需数据线,一条命令即可完成<b class='flag-5'>固件</b><b class='flag-5'>升级</b>!