当前位置: 首页 > news >正文

Clion开发STM32之OTA升级模块(一)

什么是OTA

  1. 百度百科解释
  2. 个人理解:就是不通过烧录的方式,通过串口、网口、无线对主板运行的程序进行升级。
  3. 减少后期的一个维护迭代程序的一个成本。

STM32的OTA升级模块的一个设计

程序启动的一个框架流程图(大致流程)

在这里插入图片描述

FLASH的一个划分框图

在这里插入图片描述

BootLoader程序

Flash配置头文件(app_flash_conf.h)

#define SIZE_8B (8)
#define SIZE_256B (256)
#define SIZE_512B (512)
#define SIZE_1K   (1024)
#define SIZE_2K   (2048)
#define SIZE_3K   (3072)
#define SIZE_4K   (4092)
#define SYS_CONVERT(type, val) ((type)(val))
// 引导程序大小: 10KB
#define BOOT_AREA_SIZE (SIZE_1K*10)
#define BOOT_START_ADDR FLASH_BASE
// APP: 150KB (应用程序)
#define APP_AREA_SIZE (SIZE_1K*150)
#define APP_START_ADDR SYS_CONVERT(uint32_t,BOOT_START_ADDR+BOOT_AREA_SIZE)
// APP UPGRADE: 150KB (应用升级)
#define APP_UPGRADE_AREA_SIZE (SIZE_1K*150)
#define APP_UPGRADE_START_ADDR SYS_CONVERT(uint32_t,APP_START_ADDR+APP_AREA_SIZE)
// 配置区域: 50KB
#define CONF_AREA_SIZE (SIZE_1K*50)
#define CONF_START_ADDR SYS_CONVERT(uint32_t,APP_UPGRADE_START_ADDR+APP_UPGRADE_AREA_SIZE)
// 数据区域: 130KB
#define DATA_AREA_SIZE (SIZE_1K*130)
#define DATA_START_ADDR SYS_CONVERT(uint32_t,CONF_START_ADDR+CONF_AREA_SIZE)
// 引导数据配置信息:
#define BOOT_INF_ADDR SYS_CONVERT(uint32_t,DATA_START_ADDR+DATA_AREA_SIZE)

OTA配置

头文件(ota_boot_info.h)

#define OTA_UPGRADE_FLAG (0x1389)
typedef struct {uint8_t app_version[6]; // 应用版本uint32_t app_new_version_flag; // 应用新版本标志位
//    uint32_t app_run_addr; // 应用运行地址
//    uint32_t app_upgrade_data_addr; // 应用升级数据地址uint32_t app_upgrade_data_size; // 应用升级数据大小
} APP_Info_t;void Load_App_Info(APP_Info_t *info);void Update_App_Info(APP_Info_t *info);
void Jump_To_App(uint32_t run_addr);void Jump_To_BootLoader(void);

源文件

#include "ota_boot_info.h"
#include "bsp_flash.h"
#include "app_flash_conf.h"typedef void (*pFunction)(void);/*** 加载APP信息* @param dst*/
void Load_App_Info(APP_Info_t *info) {STMFLASH_Read_Base(BOOT_INF_ADDR, info, sizeof(APP_Info_t));
}/*** 更新APP信息* @param dst*/
void Update_App_Info(APP_Info_t *info) {STMFLASH_Write_Base(BOOT_INF_ADDR, info, sizeof(APP_Info_t));
}void Jump_To_BootLoader(void) {__disable_irq();uint32_t JumpAddress;pFunction Jump_To_Application;JumpAddress = *(volatile uint32_t *) (0x00000004);Jump_To_Application = (pFunction) JumpAddress;__set_MSP(*(volatile uint32_t *) JumpAddress);__set_PSP(*(volatile uint32_t *) JumpAddress);Jump_To_Application();
}void Jump_To_App(uint32_t run_addr) {__disable_irq();pFunction jump_app;jump_app = (pFunction) (*(volatile uint32_t *) (run_addr + 0x04));__set_MSP(*(volatile uint32_t *) run_addr);jump_app();
}

待续

http://www.lryc.cn/news/67386.html

相关文章:

  • Java供应链安全检测SDL方法论
  • Magic-API的部署
  • 程序进制换算
  • Packet Tracer - 使用 CLI 配置并验证站点间 IPsec VPN
  • 【华为OD机试真题】最小的调整次数(python版)100%通过率 超详细代码注释 代码解读
  • WPF中嵌入web网页控件 WebBrowser
  • Kafka原理之消费者
  • PCIe的capability扩展空间字段解释
  • 力扣sql中等篇练习(二十)
  • 【神经网络】tensorflow -- 期中测试试题
  • 计算机基础--计算机存储单位
  • 大数据Doris(十六):分桶Bucket和分区、分桶数量和数据量的建议
  • 【webrtc】web端打开日志及调试
  • C++ Primer第五版_第十六章习题答案(61~67)
  • python定时任务2_celery flower计划任务
  • 地狱级的字节跳动面试,6年测开的我被按在地上摩擦.....
  • 怎么开发外贸网站
  • 从 Elasticsearch 到 Apache Doris,10 倍性价比的新一代日志存储分析平台|新版本揭秘
  • H5 + C3基础(H5语义化标签 多媒体标签 新表单标签)
  • 低代码平台选择指南:如何选出最适合你的平台?
  • 软考A计划-重点考点-专题十二(JAVA程序设计)
  • 亚马逊云科技工业数据湖解决方案,助力企业打通各业务场景数据壁垒
  • 修改lib64/l.ibc.so6导致系统命令都不能用
  • Web(一)-- 创建一个简单的Web项目(idea 2022版)
  • 前一篇文章最后一个算法校正
  • 测试外包干了4年,我废了...
  • CPU组成元素:运算器+控制器
  • 计算机网络——主机IP地址、子网掩码、广播地址、网络数、主机数计算方法
  • Unity 后处理(Post-Processing) -- (1)概览
  • Ajax + axios + 常用状态码(笔记)