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();
}
}