久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4184|回復(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 看一下兩個(gè)程序的PID號(hào) run.sh 和 sbcmon2.arm
   然后用kill PID號(hào) 殺掉兩個(gè)程序

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


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

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

重啟命令:reboot

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


注意:
1,SRAM APP代碼的起始地址必須是:0X20001000,F(xiàn)LASH APP代碼的起始地址必須是:0X08010000。
2,大家在創(chuàng)建APP代碼的時(shí)候,切記要設(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)先級(jí)分組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í)函數(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í)函數(shù)
  60.         uart_init(460800);                //初始化串口波特率為115200
  61.         UART4_Configuration();
  62.         printf("\r\n系統(tǒng)啟動(dòng)!");
  63.         if(vIapStr.FlashProgramFlag)
  64.                 printf("\r\n系統(tǒng)燒寫請(qǐng)求。");
  65.        
  66. //        while(1)
  67. //        {
  68. //                delay_ms(1000);
  69. //                printf("\r\n系統(tǒng)啟動(dò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等待超時(shí)!");
  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ù)接收錯(cuò)誤,重新請(qǐng)求",vIapStr.Fram+1);       
  109.                                                 error++;
  110.                                                 if(error>5)
  111.                                                 {       
  112.                                                         vIapStr.FlashProgramFlag = 0;
  113.                                                         printf("\r\n超時(shí)正常啟動(dòng)");       
  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程序版本號(hào):%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程序版本錯(cuò)誤!");
  148.                                                                 printf("\r\n請(qǐng)重新下載應(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請(qǐng)重新下載應(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請(qǐng)重新下載應(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ù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 热99| 中文字幕一区二区三区四区五区 | 国产亚洲欧美另类一区二区三区 | 日韩1区| 成人免费视频在线观看 | 99精品网站 | 一区二区三区国产视频 | 日本天天操 | 欧美一级特黄aaa大片在线观看 | 亚洲中午字幕 | 国产线视频精品免费观看视频 | 亚洲精品一区二区三区蜜桃久 | 日日干干夜夜 | 国产伦一区二区三区视频 | 国产精品乱码一二三区的特点 | 欧美激情精品久久久久久 | 久久高清精品 | h网站在线观看 | 国产精品成人国产乱一区 | 亚洲精品电影在线 | 亚洲一区成人 | 国产真实乱全部视频 | www.日韩 | 亚洲欧洲日韩精品 中文字幕 | 一区二区三区四区av | 欧美一区二区在线观看视频 | 欧美成人免费在线视频 | 蜜桃视频在线观看免费视频网站www | 黄色免费三级 | 99久久中文字幕三级久久日本 | 亚洲精品免费在线观看 | 国产乱码精品1区2区3区 | 黄视频网站免费观看 | 久久这里只有精品首页 | 99草免费视频| 欧美区在线 | 久久久青草 | 91丨九色丨国产在线 | 日韩在线免费视频 | 成人精品一区二区三区中文字幕 | 日韩a在线观看 |