STM32远程升级基本思路

STM32远程升级基本思路
STM32远程升级基本思路
开发环境:IAR for ARM 8.30.1
MCU:STM32F103RCT6
对照物
存储介质:w25q32
1.实现思路
1.需要⼀个bootloader程序和APP程序
2.APP程序通过⽹络或者串⼝等⽅式将要升级的代码写到spiFlash中约定的位置,然后重启
3.bootloader判断spiFlash中是否有⽂件需要更新,有就将⽂件更新到stm32的内部Flash的App区域,然后跳 转到APP,否则直接
跳转
2.知识储备
STM32闪存模块组织
水松纸激光打孔机stm32F103RCT6属于⼤容量型产品,ROM:256K,RAM:48K,页⼤⼩为2k,闪存分为三个块:
存储器:页⼤⼩为2K,256K也就是128页
信息块:分为两个部分:
系统存储器(存放启动程序代码,ST出⼚固化,不可更改,⽤于ISP编程)
⽤户选项字节(Option Bytes,可以⽤它设置读写保护,硬件看门狗使能啥的)
闪存存储器接⼝寄存器:操作stm32内部Flash要⽤到这些寄存器;
启动配置
● 从主闪存存储器启动:主闪存存储器被映射到启动空间(0x0000 0000)
● 从系统存储器启动:系统存储器被映射到启动空间(0x0000 0000)
● 从内置SRAM启动:只能在0x2000 0000开始的地址区访问SRAM
3.Bootloader和App的⼯程设置
Bootloader和App公⽤RAM,占⽤不同ROM空间,16K给Bootloader,240K给App
燕窝饼Bootloader:
Vector Table Start:0x0800 0000
ROM:0x0800 0000 ~ 0x0800 4000
RAM:0x0800 0000 ~ 0x0800 BFFF
CSTACK: 0x400
Heap: 0x0
App:
Vector Table Start:0x0800 4000
ROM:0x0800 4000 ~ 0x0803 FFFF
RAM:0x0800 0000 ~ 0x0800 BFFF
CSTACK: 0x400
Heap: 0x0
App程序中还要注意到的地⽅:修改中断向量偏移VECT_TAB_OFFSET,偏移量就是bootloader程序⼤⼩
4.Bootloader程序编写
话不多说,下⾯就是代码:
头⽂件
#define FLASH_MAX_ADDR(0x0803FFFFU)//MCU的Flash最⼤地址
#ifndef FLASH_PAGE_SIZE
#define FLASH_PAGE_SIZE(0x800U)//MCU的Flash的页⼤⼩,⼤容量的为2K,其他是1K #endif
#define APP_BASEADDR(0x08004000U)//升级程序地址
#define APP_PAGE_NUM((FLASH_MAX_ADDR-APP_BASEADDR)/FLASH_PAGE_SIZE+1) #define SPIFLASHBUF_MAX_LEN(0x1000U)//spi flash最⼤缓冲4096字节C⽂件
void JumpToApplication(void)
{
typedef  void(*pFunction)(void);
pFunction Jump_To_Application;
u32 JumpAddress;
/* Test if user code is programmed starting from address "ApplicationAddress" */
if(((*(__IO uint32_t*)APP_BASEADDR)&0x2FFE0000)==0x20000000)
{
DBG_LOG("----[Boot]Jump to Application\r\n");
LED_ALL_OFF();
__disable_irq();
/* Jump to user application */
JumpAddress =*(__IO uint32_t*)(APP_BASEADDR+4);
Jump_To_Application =(pFunction) JumpAddress;
/
* Initialize user application's Stack Pointer */
__set_MSP(*(__IO uint32_t*)APP_BASEADDR);
Jump_To_Application();
}
else
{
玻璃框架
DBG_LOG("----[Boot]Application Address is ERROR\r\n");
LED_ALL_ON();
}
}
union {
u32 stm32[SPIFLASHBUF_MAX_LEN/4];
u8  spi[SPIFLASHBUF_MAX_LEN];
}Flash;
void Boot_Initializes(void)
{
u16 i,j;
u32 update_file_mark;
u32 writeFlashData;
HAL_StatusTypeDef status;
FLASH_EraseInitTypeDef f;
f.TypeErase =FLASH_TYPEERASE_PAGES;
f.PageAddress =APP_BASEADDR;
f.NbPages =APP_PAGE_NUM;
//1.判断spi flash DFU区是否有⽂件需要升级
SFlash_Read(SECTOR_ADDR(SECTOR_DFU_START),(u8 *)&update_file_mark,4);
if(update_file_mark ==0xFFFFFFFF){
DBG_LOG("[Boot] No Firmware Need to Update.");
LED_ON(ERR);
JumpToApplication();
return;
}
//有⽂件需要升级
DBG_LOG("[Boot] New Firmware Exist! ");
//2.Flash解锁
status =HAL_FLASH_Unlock();
if(status !=HAL_OK){
DBG_LOG("[Boot] FLASH Unlock Failed.");
LED_ON(ERR);
return;
}
DBG_LOG("[Boot] FLASH Unlock Ok.");
DBG_LOG("[Boot] Ready to Erase Flash ...");
//3.擦除Flash
用电信息采集
status =HAL_FLASHEx_Erase(&f,&writeFlashData);
if(status !=HAL_OK){
DBG_LOG("[Boot] Flash Erase Failed.");
LED_ON(ERR);水晶面膜
return;
}
DBG_LOG("[Boot] Flash Erase OK.");
//4.从SPIFlash中读出数据然后copy到内部Flash中
for(i =0;i <(APP_PAGE_NUM/2);i++){
SFlash_Read(SECTOR_ADDR(SECTOR_DFU_START)+SPIFLASHBUF_MAX_LEN*i, Flash.spi,SPIFLASHBUF_MAX_LEN); DBG_LOG("[Boot] Write Flash Progress:%d%%",(i*100/(APP_PAGE_NUM/2)));
LED_TOGGLE(WIFI);
for(j =0;j <(SPIFLASHBUF_MAX_LEN/4);j++){
//注意基地址是在变化的
HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,APP_BASEADDR+SPIFLASHBUF_MAX_LEN*i+4*j, Flash.stm32[j]); }
}
DBG_LOG("[Boot] Write Flash Progress:100%%");
DBG_LOG("[Boot] Program Complete");
//5.Flash上锁
HAL_FLASH_Lock();
//6.跳转到⽤户程序区
JumpToApplication();
}

本文发布于:2024-09-23 16:14:34,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/3/142958.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:启动   存储器   程序   升级   闪存   地址   系统   字节
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议