×
单片机 > 单片机程序设计 > 详情

STM32F051 IAP源码分享

发布时间:2020-06-01 发布时间:
|

IAP需要有两个工程,第一个是Bootloader,第二个是Application

同时将这两份程序放在mcu的flash里的不同位置,启动时自动进入bootloader(可选择)进行iap,成功后跳转至application。

  

那么IAP问题简化成三个步骤,

Step1:做Bootloader工程

Step2:做Application工程

Step3:烧进Flash的不同位置

 

Step1:需要做这些事情:

1:初始化IAP相关外设

2:下载文件(ymodem协议)

3: 写入Application程序存储空间

鸡:

     IAP_Init();

     SerialDownload();

具体实现: 

  1.   

  2. void IAP_Init(void)  

  3. {  

  4.   uint32_tt;  

  5.  LEDInit();                    

  6.  SysTickInit();                   

  7.  USART_Configuration();              

  8.  FLASH_If_Init();                       

  9.  for(t = 2000; t > 10; t >>= 1 )          

  10.   {  

  11.    LEDTogle(1); delayms(t);  

  12.   }  

  13. }  

  14.    

  15.    

  16. void SerialDownload(void)  

  17. {  

  18.  uint8_t Number[10] = {0};  

  19.  int32_t Size = 0;  

  20.    

  21.   SerialPutString("Waitingfor the file to be sent ... (press 'a' to abort)\n\r");  

  22.  Size = Ymodem_Receive(&tab_1024[0]);  

  23.   if(Size > 0)  

  24.   {  

  25.    SerialPutString("\n\n\r Programming CompletedSuccessfully!\n\r--------------------------------\r\n Name: ");  

  26.    SerialPutString(FileName);  

  27.    Int2Str(Number, Size);  

  28.    SerialPutString("\n\r Size: ");  

  29.    SerialPutString(Number);  

  30.    SerialPutString(" Bytes\r\n");  

  31.    SerialPutString("-------------------\n");  

  32.   }  

  33.  else if (Size == -1)  

  34.   {  

  35.    SerialPutString("\n\n\rThe image size is higher than the allowedspace memory!\n\r");  

  36.   }  

  37.  else if (Size == -2)  

  38.   {  

  39.    SerialPutString("\n\n\rVerification failed!\n\r");  

  40.   }  

  41.  else if (Size == -3)  

  42.   {  

  43.    SerialPutString("\r\n\nAborted by user.\n\r");  

  44.   }  

  45.  else  

  46.   {  

  47.     SerialPutString("\n\rFailedto receive the file!\n\r");  

  48.   }  

  49. }  


Step2:需要这样干:

在Application工程中程序运行的一开始加上如下中断拷贝即可

  1. void InterruptRemap(void)  

  2. {  

  3.        u8 i;  

  4.        u32 Data;  

  5.        u32 Address;  

  6.        for(i=1;i<48;i++)  

  7.        {  

  8.                Data =  *(__IOu32*)(0x08003000+i*4);  

  9.                Address = 0x20000000 + (i*4);  

  10.                 *(__IO u32*)Address= (u32)Data;  

  11.        }  

  12.        SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);  


Step3:这就样

将两个工程分别烧在不同的flash地址段中

A:bootloader

 

1:点Project选项卡,然后点Optionsfor Target选项如图:


2:Target选项卡下有on-chip地址设置,bootloader放在0x8000000开头的0x3000空间内

如图:


 


然后正常手段烧入flash即可。

 

B:application

和上述设置手段一样,只不过in-chip的IROM1设置起始地址为0x8003000,Size为mcu的Flash大小减去0x3000即可(注意是16进制哦)

 

然后就祝你幸福了   0.0

 


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
浅谈AVR中定时器几种工作模式