STM32 HAL OTA 小白教程

1. OTA基础知识
2. 手把手教你写Boot Loader(引导程序)
3. OTA理论基础


提示:这一系列文章还没有更新完... ...

文章目录

  • STM32 HAL OTA 小白教程
  • 前言
  • 一、OTA基础知识
  • 二、创建Boot Loader(引导程序)
    • 1.ota_bootloader.h
    • 2.ota_bootloader.c
    • 3. 查看引导程序的大小
  • 总结

前言

感谢这些前辈分享的资料,
在此我只是整理了前辈们的资料,然后使用通俗易懂的方法再介绍给大家,方便大家学习


一、OTA基础知识

我是懒得再写了,这里有个很完整的
OTA基础知识链接

二、创建Boot Loader(引导程序)

1.ota_bootloader.h

代码如下(示例):

#ifndef __OTA_BOOTLOADER_H
#define __OTA_BOOTLOADER_H
#include "main.h"
#include <stdbool.h>// Bootloader代码区域
#define BLOCK_BOOTLOADER_START  ((uint32_t)0x08000000)//16k
// 系统参数区域
#define BLCOK_SYS_PARAM_START   ((uint32_t)0x08004000)//16k
#define UPDATE_FLASH_FLAG 0x08004000    //更新标志位
// APP1代码区域
#define BLOCK_APP1_START        ((uint32_t)0x08008000)//224k
// APP2代码区域
#define BLOCK_APP2_START        ((uint32_t)0x08040000)//256k
#define BLCOK_APP2_SPACE        ((uint32_t)224*1024)//256ktypedef  void (*pFunction)(void);void FlashErase(uint32_t StartAddress);
void FlashWrite(uint32_t StartAddress,uint32_t data);
uint32_t FlashRead(uint32_t StartAddress);
void jump_to_app(uint32_t app_addr);
bool check_update_flag(void);
void FlashErases(uint32_t StartAddress,uint8_t num);
void updateInterface_CopyCode_FromApp2ToApp1(void);#endif

2.ota_bootloader.c

代码如下(示例):

#include "ota_bootloader.h"//F411CEU6 512k 8个扇区
uint32_t sectStartAddr[8]=
{0x08000000,//00x08004000,//10x08008000,//20x0800c000,//30x08010000,//40x08020000,//50x08040000,//60x08060000 //7
};
//获取Sector的编号
int GetSectorFromAddress(uint32_t address)
{int sect;if( address < 0x08000000 || address > 0x0807FFFF )return -1;for( int i=0; i<8; i++ ){if( address >= sectStartAddr[i] && address < sectStartAddr[i+1] ){sect = i;break;}}return sect;
}//清除扇区
void FlashErase(uint32_t StartAddress)
{int sect = 0;HAL_FLASH_Unlock();//解锁__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);//清除一些错误标志sect = GetSectorFromAddress(StartAddress);//获取地址所在的扇区FLASH_Erase_Sector(sect,FLASH_VOLTAGE_RANGE_3);//擦除指定的闪存扇区(0~7)    HAL_FLASH_Lock();//上锁
}//清除多个扇区
void FlashErases(uint32_t StartAddress,uint8_t num)
{int sect = 0;HAL_FLASH_Unlock();//解锁__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);//清除一些错误标志sect = GetSectorFromAddress(StartAddress);//获取地址所在的扇区for(uint8_t i = 0;i<num;i++){FLASH_Erase_Sector(sect+i,FLASH_VOLTAGE_RANGE_3);//擦除指定的闪存扇区(0~7)   FLASH_WaitForLastOperation(1000);}        HAL_FLASH_Lock();//上锁
}//写数据
void FlashWrite(uint32_t StartAddress,uint32_t data)
{HAL_FLASH_Unlock();//解锁HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,StartAddress,data);HAL_FLASH_Lock();//上锁
}//读数据
uint32_t FlashRead(uint32_t StartAddress)
{return *(uint32_t *)StartAddress;
}//更新标志位
bool check_update_flag(void)
{bool status = false;if (FlashRead(UPDATE_FLASH_FLAG) == 0x55555555){status = true;}return status;
}//将APP2代码复制到APP1中
void updateInterface_CopyCode_FromApp2ToApp1(void)
{uint32_t i = 0;for (i = 0; i < BLCOK_APP2_SPACE; i += 4){FlashWrite(BLOCK_APP1_START + i, *(uint32_t *)(BLOCK_APP2_START + i));}
}//跳转到应用程序
//appxaddr:用户代码起始地址.
void jump_to_app(uint32_t app_addr)
{ pFunction jump_to_application;    if (((*(__IO uint32_t*)app_addr) & 0x2FFE0000 ) == 0x20000000)//检查栈顶地址是否合法.{jump_to_application = (pFunction)*(__IO uint32_t*) (app_addr + 4);/* 跳转到用户应用程序 */__set_MSP(*(__IO uint32_t*) app_addr);/* 初始化用户应用程序的堆栈指针 */jump_to_application();}
}

3. 查看引导程序的大小

生成 bin 文件


总结

结合视频看更加详细
下一篇介绍怎么写APP程序

STM32 HAL OTA 小白教程相关推荐

  1. STM32 HAL库 CubeMX教程(五)串口通信基础

    STM32 HAL库 CubeMX教程(五)串口通信基础 串口通信简介 CubeMX配置 初始化程序分析 程序编写 参考文献 STM32 HAL库 CubeMX系列教程 目录 串口通信简介 UART: ...

  2. 【STM32】HAL库 STM32CubeMX教程十五---FMC-SDRAM(二)

    前言: 本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 上一讲我们说了CubeMX配置SDRAM的一些基本配置,还有FMC跟SDRAM的讲解,这一讲我们 ...

  3. 【STM32】HAL库 STM32CubeMX教程十五---FMC-SDRAM(一)

    前言: 本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 本文 1首先讲解什么是FMC及SDRAM,W9825G6KH芯片原理,2基于CubeMx创建工程 ...

  4. 【STM32】HAL库 STM32CubeMX教程十四---SPI

    前言: 本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 在我们的HAL库中,对硬件SPI函数做了很好的集成,使得之前SPI几百行代码,在HAL库中,只需 ...

  5. 【STM32】HAL库 STM32CubeMX教程十一---DMA (串口DMA发送接收)

    前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1.芯片: STM32F407ZET6/ STM32F103ZET6 ...

  6. 【STM32】HAL库 STM32CubeMX教程十---DAC

    前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1.芯片: STM32F407ZET6/ STM32F103ZET6 ...

  7. 【STM32】HAL库 STM32CubeMX教程九---ADC

    前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1.芯片: STM32F407ZET6/ STM32F103ZET6 ...

  8. 【STM32】HAL库 STM32CubeMX教程十二---IIC(读取AT24C02 )

    前言: 本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 在之前的标准库中,STM32的硬件IIC非常复杂,更重要的是它并不稳定,所以都不推荐使用. 但是 ...

  9. stm32 hal uart_STM32 非阻塞HAL_UART_Receive_IT解析与实际应用

    本文章主要探讨如何使用STM32中HAL库的UART_Receive_IT非阻塞接收数据.其他网络教程(包括正点原点相关教程)可能个人原因无法完全理解,苦苦挣扎后才完成非阻塞UART接收. 希望可以通 ...

  10. STM32 HAL CubeMX 串口IDLE接收空闲中断+DMA

    关于DMA原理部分讲解,及CubeMx配置部分,请参考该文章 [STM32]HAL库 STM32CubeMX教程十一-DMA (串口DMA发送接收) 本篇文章我们仅针对例程进行详解剖析 历程详解 详解 ...

最新文章

  1. golang break label 与goto label
  2. python注释_Python头条:python基础知识了解___注释、变量、Debug
  3. druid连接池初始化慢_从零开始手写 mybatis (三)jdbc pool 从零实现数据库连接池
  4. RowTime field should not be null, please convert it to a non-null long value.
  5. python进阶教程day_python从零进阶之路——day4
  6. 微博上的网红,为什么更能红得发紫?
  7. mPaas 运维流程介绍
  8. 微信公众号每次调用接口正确或错误的返回码
  9. 富文本编辑器 CKeditor
  10. 告别ASP.NET操作EXCEL的烦恼(总结篇)(转)
  11. grpc(3):使用 golang 开发 grpc 服务端和client
  12. 深入理解css中position属性及z-index属性
  13. Android源码:1、如何下载源码详解(一)
  14. 微信即时通信原理_企业即时通讯工具需注意哪些问题
  15. POI 模板生成word PDF——牛X神器
  16. 自媒体平台做网赚不要指望着,平台广告分成!
  17. 疯狂java讲义(李刚)6.2
  18. 云日记_登出操作个人中心页面js和jsp知识点补充
  19. JetBrains系列pycharm等设置主题皮肤
  20. 独立同分布的中心极限定理

热门文章

  1. 三只松鼠上半年营收41亿:净利降77% IDG一年套现超12亿
  2. 2022年茶艺师(初级)考试练习题模拟考试平台操作
  3. php实现mysql备份_php实现备份mysql数据库
  4. 2019-11软考报名网站汇总,陆续更新
  5. 3.关联查询和属性文件
  6. Swift 读标准库源码笔记 -- Integers(基本数据类型篇)
  7. 用java制作扑克牌_java实现简易扑克牌游戏
  8. 用java制作扑克牌_JAVA入门第三季-简易扑克牌程序-个人编写-源代码(含截图)...
  9. 目标检测算法之CVPR 2019 Guided Anchoring
  10. Xbox360自制系统GOD包安装教程