前言:前邊講過stm32通用bootloader的實現(xiàn)方法,沒有看過的,可以參考這一篇文章:STM32通用Bootloader——FOTA,這次將在上篇bootloader的基礎(chǔ)上,介紹app如何通過多種固件下載器實現(xiàn)OTA升級。
此項目硬件使用的是STM32F429開發(fā)板,代碼全部使用RT-Thread Studio搭積木的方式實現(xiàn),僅僅改動了幾行代碼,開發(fā)效率非常高。此項目的地址:https://gitee.com/Aladdin-Wang/RT-FOTA-STM32L431.git
使用到的軟件包和組件:
在這里插入圖片描述
1.準備工作
1.1 新建工程
由于此項目使用的esp8266需要一個串口,我使用的是uart2,所以需要還需要配置uart2:
增加uart接收緩沖區(qū)大小:
1.2 打開fal和at device軟件包
配置fal軟件包
配置sfud組件
配置SPI
配置fal_cfg.h
1#ifndef_FAL_CFG_H_ 2#define_FAL_CFG_H_ 3 4#include
初始化spi flash和fal軟件包
1#include
配置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.阿里云物聯(lián)網(wǎng)平臺OTA
注冊 LinkPlatform 平臺
創(chuàng)建產(chǎn)品
產(chǎn)品詳情:
添加設(shè)備
添加自定義Topic
配置ali iotkit軟件包
將剛才新建的阿里云設(shè)備信息填寫到配置信息里:
將軟件包的示例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/**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軟件包
如果暫時沒有自己的服務(wù)器,可以使用MyWebServer進行測試:
配置完MyWebServer,可以打開瀏覽器輸入IP地址查看:
使用http_ota命令進行http_ota升級:
使用ymodem_ota命令進行ymodem_ota升級:
4.不使用APP進行升級
rt-fota集成了ymodem_ota,上電短按恢復(fù)出廠設(shè)置按鈕即可進入rt-fota命令行模式,通過ymodem_ota命令即可進行升級:
-
OTA
+關(guān)注
關(guān)注
7文章
583瀏覽量
35302 -
阿里云
+關(guān)注
關(guān)注
3文章
969瀏覽量
43138 -
物聯(lián)網(wǎng)平臺
+關(guān)注
關(guān)注
7文章
99瀏覽量
20768
原文標題:零代碼玩轉(zhuǎn)OTA升級
文章出處:【微信號:RTThread,微信公眾號:RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論