OTA远程升级STM32固件

STM32内部的内存结构,注意.data和.bss是后续搬运到RAM空间的。

可以看到在.s文件当中,对单片机的堆栈大小都做了明确的定义。

bash 复制代码
Stack_Size		EQU     0x400

                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp


; <h> Heap Configuration
;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>

Heap_Size      EQU     0x200

                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem        SPACE   Heap_Size
__heap_limit

                PRESERVE8
                THUMB

然后看中断向量表,第一条__initial_sp是咱们的主堆栈指针,发生复位、中断保护现场都需要它来调度。第二条Reset_Handler是一个复位函数,CPU会将它放置到PC寄存器中。

bash 复制代码
__Vectors       DCD     __initial_sp               ; Top of Stack
                DCD     Reset_Handler              ; Reset Handler
                DCD     NMI_Handler                ; NMI Handler
                DCD     HardFault_Handler          ; Hard Fault Handler
                DCD     MemManage_Handler          ; MPU Fault Handler
                DCD     BusFault_Handler           ; Bus Fault Handler
                DCD     UsageFault_Handler         ; Usage Fault Handler
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     SVC_Handler                ; SVCall Handler
                DCD     DebugMon_Handler           ; Debug Monitor Handler
                DCD     0                          ; Reserved
                DCD     PendSV_Handler             ; PendSV Handler
                DCD     SysTick_Handler            ; SysTick Handler

具体来看复位句柄的实现,SystemInit中实现了时钟的初始化配置与flash的初始化,然后将.data段从flash搬运到ram当中(主要是我们已经赋予变量的初值),之后将.bss段清0。

bash 复制代码
Reset_Handler    PROC
                 EXPORT  Reset_Handler             [WEAK]
        IMPORT  SystemInit
        IMPORT  __main

                 LDR     R0, =SystemInit
                 BLX     R0
                 LDR     R0, =__main
                 BX      R0
                 ENDP

假设我们使用的是512KB内存的单片机,那么可操作的Flash地址就相当于从0x0800 0000到

0x0808 0000。普通User BootLoader存储在起始地址到0x0800 8000之间,剩余空间是User

Application的存储地址。我们这边实现的 BootLoader逻辑是开机之后检查按键进入IAP模式。

进入IAP模式后, BootLoader首先会擦除原有的APP数据,然后接收新的bin文件,之后将bin文件写入单片机Flash,最后复位运行。

相关推荐
xuxg200517 小时前
4G 模组 AT 命令解析框架课程正式发布
stm32·嵌入式·at命令解析框架
CODECOLLECT18 小时前
京元 I62D Windows PDA 技术拆解:Windows 10 IoT 兼容 + 硬解码模块,如何降低工业软件迁移成本?
stm32·单片机·嵌入式硬件
BackCatK Chen19 小时前
STM32+FreeRTOS:嵌入式开发的黄金搭档,未来十年就靠它了!
stm32·单片机·嵌入式硬件·freertos·低功耗·rtdbs·工业控制
全栈游侠1 天前
STM32F103XX 02-电源与备份寄存器
stm32·单片机·嵌入式硬件
辰哥单片机设计1 天前
STM32项目分享:车辆防盗报警系统
stm32·单片机·嵌入式硬件
風清掦1 天前
【江科大STM32学习笔记-05】EXTI外部中断11
笔记·stm32·学习
小龙报1 天前
【51单片机】从 0 到 1 玩转 51 蜂鸣器:分清有源无源,轻松驱动它奏响新年旋律
c语言·数据结构·c++·stm32·单片机·嵌入式硬件·51单片机
czwxkn1 天前
4STM32(stdl)TIM定时器
stm32·单片机·嵌入式硬件
Love Song残响1 天前
NVIDIA显卡终极优化指南
stm32·单片机·嵌入式硬件
BackCatK Chen2 天前
第 8 篇:TMC2240 电机正反转实现|DIR 引脚控制 + 代码优化(稳定不抖动)
stm32·单片机·嵌入式硬件·保姆级教程·电机正反转·tmc2240·dir引脚控制