找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3858|回复: 2
收起左侧

stm32 IAP Bootloader V1.0程序源码

[复制链接]
ID:382432 发表于 2018-8-3 11:43 | 显示全部楼层 |阅读模式
1.登陆进去 root coolKids
2.杀掉之前的程序
   用 ps -ef 看一下两个程序的PID号 run.sh 和 sbcmon2.arm
   然后用kill PID号 杀掉两个程序

3 进去alarm目录 启动程序 ./sendfile
   
就是alarm目录下


chmod 775 sendfile 权限设置

echo 123456 >> /dev/ttyS2 串口发送数据

重启命令:reboot

本实验将实现如下功能:开机的时候先显示提示信息,然后等待串口输入接收APP程序(无校验,一次性接收),在串口接收到APP程序之后,即可执行IAP。如果是SRAM APP,通过按下KEY0即可执行这个收到的SRAM APP程序。如果是FLASH APP,则需要先按下KEY_UP按键,将串口接收到的APP程序存放到STM32F4的FLASH,之后再按KEY2既可以执行这个FLASH APP程序。通过KEY1按键,可以手动清除串口接收到的APP程序。DS0用于指示程序运行状态。


注意:
1,SRAM APP代码的起始地址必须是:0X20001000,FLASH APP代码的起始地址必须是:0X08010000。
2,大家在创建APP代码的时候,切记要设置中断向量偏移量!!

stm32单片机源程序如下:
  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);//设置系统中断优先级分组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);  //初始化延时函数
  42.         uart_init(460800);                //初始化串口波特率为115200
  43.         UART4_Configuration();
  44.         printf("\r\n系统上电!");
  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);  //初始化延时函数
  60.         uart_init(460800);                //初始化串口波特率为115200
  61.         UART4_Configuration();
  62.         printf("\r\n系统启动!");
  63.         if(vIapStr.FlashProgramFlag)
  64.                 printf("\r\n系统烧写请求。");
  65.        
  66. //        while(1)
  67. //        {
  68. //                delay_ms(1000);
  69. //                printf("\r\n系统启动!");
  70. //                FeedDog();
  71. //        }
  72.         FeedDog();
  73.         while(1)
  74.         {
  75.        
  76.                 if(vIapStr.FlashProgramFlag)
  77.                 {
  78.                         printf("\r\n等待接收程序数据......");
  79.                         for(vIapStr.Rx = 0,t=0;t<10000;t++)
  80.                         {       
  81.                                 FeedDog();
  82.                                 delay_ms(1);
  83.                                 if(vIapStr.Rx >5)        //开始接收数据
  84.                                 {
  85.                                         printf("\r\n开始接收程序数据");
  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))//新周期内,没有收到任何数据,认为本次数据接收完成.
  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包数据接收错误,重新请求",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包数据接收完成",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开始执行FLASH用户代码!!");
  144.                                                                         iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码

  145.                                                         }else
  146.                                                         {
  147.                                                                 printf("\r\n程序版本错误!");
  148.                                                                 printf("\r\n请重新下载应用程序!");
  149.                                                                 vIapStr.FlashProgramFlag  = 2;
  150.                                                                 vIapStr.Fram = 0;
  151.                                                         }
  152.                                                        
  153.                                                 }else
  154.                                                 {
  155.                                                          
  156.                                                         printf("\r\n非FLASH应用程序,无法执行!");
  157.                                                         printf("\r\n请重新下载应用程序!");
  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开始执行FLASH用户代码!!");
  172.                         if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
  173.                         {         
  174.                                 iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
  175.                         }else
  176.                         {
  177.                                 printf("\r\n非FLASH应用程序,无法执行!");
  178.                                 printf("\r\n请重新下载应用程序!");
  179.                                 vIapStr.FlashProgramFlag  = 2;
  180.                                 vIapStr.Fram = 0;
  181.                         }
  182.                 }                 
  183.         }  
  184. }

复制代码

所有资料51hei提供下载:
IAP Bootloader V1.0-18.rar (494.94 KB, 下载次数: 53)
回复

使用道具 举报

ID:359762 发表于 2019-8-1 15:31 | 显示全部楼层
正好学习stm32的备份区怎么使用
回复

使用道具 举报

ID:431928 发表于 2019-12-2 10:21 | 显示全部楼层
支持一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表