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

STM32F103急速IAR做OTA升级

1-BOOT完成仅仅点灯

//HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);//HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin,GPIO_PIN_SET);  HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin,GPIO_PIN_RESET);  while (1)

仿真 一切正常

2-拷贝一模一样的工程

完成BLINK

  while (1)  {
  
      /* USER CODE END WHILE */HAL_Delay(100);HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);    /* USER CODE BEGIN 3 */  }

仿真 一切正常

使用J-LINK直接烧写 正常

现在完成从BOOT跳转到APP

烧写是bin+bin中间填充FF 合并脚本如下

BOOT程序的跳转函数

APP程序的设置 因为BOOT的bin是4K 设置稍微大一些就8K用作BOOT后面全部是APP

修改连接文件:

修改C文件:偏移量#define VECT_TAB_OFFSET  0x2000


/*简单合并bin的脚步 苛求名字是boot.bin+app.bin合成一个all.bin 并且app.bin的起始位置也是死的 中间填充0XFF*/

#include<stdio.h>
#include<string.h>
#include<stdlib.h>//free

#define uint8_t  unsigned char
#define uint16_t unsigned short
#define uint32_t unsigned int
#define uint64_t unsigned long long


#define ECHOLOG 1 //PC放开log  而IAR/KEIL关闭LOG
#if ECHOLOG
#define myprintf printf
#else
#define myprintf 
#endif


#define AFILE  "boot.bin"
#define BFILE  "app.bin"
#define ABFILE "all.bin"
#define LEN_PARTA (1024*8)//boot.bin的长度 尾巴填充满是这么多!

int fileSize(char *name){
    int lSize;
    FILE *fpa = fopen(name, "rb");
    if (NULL == fpa){ myprintf("NULL == fp");return 1;}
    fseek(fpa,0,SEEK_END);
    lSize = ftell(fpa);
    fclose(fpa);
    //free(fp);
    myprintf("file %s len =%d \n",name,lSize);
    return lSize;
}

int main(int argc,char **argv){
    int lSizeA = fileSize(AFILE);
    int lSizeB = fileSize(BFILE);
    uint8_t c;
    FILE *fpa = fopen(AFILE, "rb");
    FILE *fpb = fopen(BFILE, "rb");
    FILE *fpab = fopen(ABFILE, "wb");
//boot.bin  
    for(int len=0;len<lSizeA;len++){
        c = fgetc(fpa);
        fputc(c, fpab);
    }
//填充    
    c=0XFF;
    for(int len=0;len<LEN_PARTA-lSizeA;len++){
        fputc(c, fpab);
    }
//app.bin    
    for(int len=0;len<lSizeB;len++){
        c = fgetc(fpb);
        fputc(c, fpab);
    }

    fclose(fpa);
    fclose(fpb);
    fclose(fpab);
    myprintf("******FINISHED*******\r\n");
    return 0;
}

typedef  void       (*pFunction)(void);
#define             APPLICATION_ADDRESS    (uint32_t)0x08002000
pFunction           JumpToApplication;
uint32_t            JumpAddress;
void jump_application( void )
{
     JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
    if ( (JumpAddress & 0xFF000000 ) == 0x08000000) //stack use flash
    {

      /* Jump to user application */
      __set_PRIMASK(1); //must be close en all
      JumpToApplication = (pFunction) JumpAddress;
      /* Initialize user application's Stack Pointer */
      __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
      JumpToApplication();
    } 
}


http://www.kler.cn/a/521295.html

相关文章:

  • 场景设计学习-积分系统
  • Deployment 部署 Pod 流程
  • Linux——线程首尾(各个小知识及理解)
  • 自然语言处理(NLP)入门:基础概念与应用场景
  • 智能码二维码赋能智慧工厂建设
  • 126周日复盘 (166)本周回顾
  • 毛桃病害分割数据集labelme格式212张6类别
  • [文献阅读] Unsupervised Deep Embedding for Clustering Analysis (DEC)(pytorch复现)
  • 网络安全 | F5-Attack Signatures-Set详解
  • Day38:移除列表中的元素
  • python3+TensorFlow 2.x(五)CNN
  • JS高阶 - day04
  • ubuntu取消定时锁定
  • 学院失物招领 app 的设计与实现
  • 计算机图形学实验练习(实验1.2-4.1AND补充实验12)
  • 【阅读笔记】基于整数+分数微分的清晰度评价算子
  • 数据的秘密:如何用大数据分析挖掘商业价值
  • Ubuntu 24.04 安装 NVIDIA Container Toolkit 全指南:让Docker拥抱GPU
  • for...in 和 Object.keys().forEach的区别
  • GO语言 链表(单向链表