找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4230|回復(fù): 2
收起左側(cè)

stm32 IAP Bootloader V1.0程序源碼

[復(fù)制鏈接]
ID:382432 發(fā)表于 2018-8-3 11:43 | 顯示全部樓層 |閱讀模式
1.登陸進(jìn)去 root coolKids
2.殺掉之前的程序
   用 ps -ef 看一下兩個程序的PID號 run.sh 和 sbcmon2.arm
   然后用kill PID號 殺掉兩個程序

3 進(jìn)去alarm目錄 啟動程序 ./sendfile
   
就是alarm目錄下


chmod 775 sendfile 權(quán)限設(shè)置

echo 123456 >> /dev/ttyS2 串口發(fā)送數(shù)據(jù)

重啟命令:reboot

本實驗將實現(xiàn)如下功能:開機(jī)的時候先顯示提示信息,然后等待串口輸入接收APP程序(無校驗,一次性接收),在串口接收到APP程序之后,即可執(zhí)行IAP。如果是SRAM APP,通過按下KEY0即可執(zhí)行這個收到的SRAM APP程序。如果是FLASH APP,則需要先按下KEY_UP按鍵,將串口接收到的APP程序存放到STM32F4的FLASH,之后再按KEY2既可以執(zhí)行這個FLASH APP程序。通過KEY1按鍵,可以手動清除串口接收到的APP程序。DS0用于指示程序運(yùn)行狀態(tài)。


注意:
1,SRAM APP代碼的起始地址必須是:0X20001000,F(xiàn)LASH APP代碼的起始地址必須是:0X08010000。
2,大家在創(chuàng)建APP代碼的時候,切記要設(shè)置中斷向量偏移量!

stm32單片機(jī)源程序如下:
  1. #include "sys.h"
  2. #include "delay.h"  
  3. #include "usart.h"   
  4. #include "led.h"

  5. #include "key.h"   
  6. #include "stmflash.h"
  7. #include "iap.h"   

  8. #include <absacc.h>


  9. u8 uartRxBuf[DEFpUartRxBufLen];
  10. u8 uartTxBuf[DEFpUartTxBufLen];
  11. u32 FlashData[1024*28]__at(0x20002000);

  12. IapStr vIapStr = {
  13.                 FlashData,
  14.                 uartRxBuf,
  15.                 uartTxBuf,
  16.                 0,
  17.                 0,
  18.                 0,
  19.                 0,
  20.                 0,
  21.                 0,
  22.                 1
  23.         };

  24. int main(void)
  25. {
  26.         u16 t,error=0;
  27.        
  28.        
  29.         u16 flag;
  30.         u8 *pString;
  31.        
  32.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設(shè)置系統(tǒng)中斷優(yōu)先級分組2
  33.         WatchdogInit();
  34.         FeedDog();
  35.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_BKPSRAM,ENABLE);
  36.       
  37.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
  38.   FeedDog();
  39.         PWR_BackupAccessCmd(ENABLE);

  40.         PWR_BackupRegulatorCmd(ENABLE);
  41.         delay_init(168);  //初始化延時函數(shù)
  42.         uart_init(460800);                //初始化串口波特率為115200
  43.         UART4_Configuration();
  44.         printf("\r\n系統(tǒng)上電!");
  45. //        while(PWR_GetFlagStatus(PWR_FLAG_BRR) == RESET);
  46.        
  47.         FeedDog();       
  48.        
  49. //        if(*(u16 *)(BKPSRAM_BASE+2) < 50)
  50. //                *(u16 *)BKPSRAM_BASE = 0x5aa5;
  51. //        *(u16 *)(BKPSRAM_BASE+2) = 0;
  52. //        if(*(u16 *)BKPSRAM_BASE == 0x5aa5)
  53.                 vIapStr.FlashProgramFlag = 1;
  54. //        else
  55. //                vIapStr.FlashProgramFlag = 0;
  56.        
  57.         *(u16 *)BKPSRAM_BASE = 0;
  58.        
  59.         delay_init(168);  //初始化延時函數(shù)
  60.         uart_init(460800);                //初始化串口波特率為115200
  61.         UART4_Configuration();
  62.         printf("\r\n系統(tǒng)啟動!");
  63.         if(vIapStr.FlashProgramFlag)
  64.                 printf("\r\n系統(tǒng)燒寫請求。");
  65.        
  66. //        while(1)
  67. //        {
  68. //                delay_ms(1000);
  69. //                printf("\r\n系統(tǒng)啟動!");
  70. //                FeedDog();
  71. //        }
  72.         FeedDog();
  73.         while(1)
  74.         {
  75.        
  76.                 if(vIapStr.FlashProgramFlag)
  77.                 {
  78.                         printf("\r\n等待接收程序數(shù)據(jù)......");
  79.                         for(vIapStr.Rx = 0,t=0;t<10000;t++)
  80.                         {       
  81.                                 FeedDog();
  82.                                 delay_ms(1);
  83.                                 if(vIapStr.Rx >5)        //開始接收數(shù)據(jù)
  84.                                 {
  85.                                         printf("\r\n開始接收程序數(shù)據(jù)");
  86.                                         break;       
  87.                                 }       
  88.                         }
  89.                         vIapStr.OldRx = 0;
  90.                         if(vIapStr.FlashProgramFlag == 1 && t>9999)
  91.                         {       
  92.                                 vIapStr.FlashProgramFlag = 0;       
  93.                                 printf("\r\n等待超時!");
  94.                         }
  95.                         vIapStr.Fram = 0;
  96.                         t = 0;
  97.                         while(vIapStr.FlashProgramFlag&&t++<4000)
  98.                         {
  99.                                 FeedDog();
  100.                                 delay_ms(2);
  101.                                 if((vIapStr.Rx)&&(vIapStr.OldRx == vIapStr.Rx))//新周期內(nèi),沒有收到任何數(shù)據(jù),認(rèn)為本次數(shù)據(jù)接收完成.
  102.                                 {
  103.                                         t = 0;
  104.                                         delay_ms(2);
  105.                                         flag = FlashDataCrc((u8 *)vIapStr.pUartRxBuf,(u8 *)vIapStr.pData,vIapStr.Rx,&vIapStr.Fram);
  106.                                         if(flag == 0)
  107.                                         {
  108.                                                 printf("\r\n第%d包數(shù)據(jù)接收錯誤,重新請求",vIapStr.Fram+1);       
  109.                                                 error++;
  110.                                                 if(error>5)
  111.                                                 {       
  112.                                                         vIapStr.FlashProgramFlag = 0;
  113.                                                         printf("\r\n超時正常啟動");       
  114.                                                         break;
  115.                                                 }
  116.                                         }else
  117.                                                 printf("\r\n第%d包數(shù)據(jù)接收完成",vIapStr.Fram);
  118.                                         vIapStr.OldRx = 0;
  119.                                         vIapStr.Rx = 0;

  120.                                         if(flag ==2)
  121.                                         {
  122.                                                
  123.                                                 printf("\r\n程序接收完成");                                                       
  124.                                                 error = 0;       
  125.                                
  126.                                                  if(((*(vu32*)(0x20002000+4))&0xFF000000)==0x08000000)//判斷是否為0X08XXXXXX.
  127.                                                 {
  128.                                                         pString = (u8 *)(0x20002000 + 0x10000);
  129.                                                         if(pString[0] == 'd' &&
  130.                                                                 pString[1] == 'm' &&
  131.                                                                 pString[2] == 'w' &&
  132.                                                                 pString[3] == 'A' &&
  133.                                                                 pString[4] == 'p' &&
  134.                                                                 pString[5] == 'p'
  135.                                                         )
  136.                                                         {
  137.                                                                         printf("\r\n程序版本號:%s",pString);
  138.                                                                
  139.                                                                         printf("\r\n開始更新固件...");       
  140.                                                                         iap_write_appbin(FLASH_APP1_ADDR,(u8 *)vIapStr.pData,vIapStr.FlashLenth);//更新FLASH代碼   
  141.                                                                         FeedDog();
  142.                                                                         printf("\r\n固件更新完成!");
  143.                                                                         printf("\r\n開始執(zhí)行FLASH用戶代碼!!");
  144.                                                                         iap_load_app(FLASH_APP1_ADDR);//執(zhí)行FLASH APP代碼

  145.                                                         }else
  146.                                                         {
  147.                                                                 printf("\r\n程序版本錯誤!");
  148.                                                                 printf("\r\n請重新下載應(yīng)用程序!");
  149.                                                                 vIapStr.FlashProgramFlag  = 2;
  150.                                                                 vIapStr.Fram = 0;
  151.                                                         }
  152.                                                        
  153.                                                 }else
  154.                                                 {
  155.                                                          
  156.                                                         printf("\r\n非FLASH應(yīng)用程序,無法執(zhí)行!");
  157.                                                         printf("\r\n請重新下載應(yīng)用程序!");
  158.                                                         vIapStr.FlashProgramFlag  = 2;
  159.                                                         vIapStr.Fram = 0;
  160.                                                 }       
  161.                                         }
  162.                                 }
  163.                                 else
  164.                                         vIapStr.OldRx = vIapStr.Rx;
  165.                         }
  166.                                
  167.                 }       
  168.                 else
  169.                 {
  170.                         FeedDog();
  171.                         printf("\r\n開始執(zhí)行FLASH用戶代碼!!");
  172.                         if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判斷是否為0X08XXXXXX.
  173.                         {         
  174.                                 iap_load_app(FLASH_APP1_ADDR);//執(zhí)行FLASH APP代碼
  175.                         }else
  176.                         {
  177.                                 printf("\r\n非FLASH應(yīng)用程序,無法執(zhí)行!");
  178.                                 printf("\r\n請重新下載應(yīng)用程序!");
  179.                                 vIapStr.FlashProgramFlag  = 2;
  180.                                 vIapStr.Fram = 0;
  181.                         }
  182.                 }                 
  183.         }  
  184. }

復(fù)制代碼

所有資料51hei提供下載:
IAP Bootloader V1.0-18.rar (494.94 KB, 下載次數(shù): 53)



回復(fù)

使用道具 舉報

ID:359762 發(fā)表于 2019-8-1 15:31 | 顯示全部樓層
正好學(xué)習(xí)stm32的備份區(qū)怎么使用
回復(fù)

使用道具 舉報

ID:431928 發(fā)表于 2019-12-2 10:21 | 顯示全部樓層
支持一下
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表