标题: STM32在线升级IAP功能-全部软件(带IAP下载器) [打印本页]

作者: sadfasd234234    时间: 2017-6-21 16:19
标题: STM32在线升级IAP功能-全部软件(带IAP下载器)
win7下面的IAP下载器上位机程序:



STM32单片机iap源程序如下:
  1. #include "iap.h"

  2. #define FLASH_APP1_ADDR                0x08002000          //第一个应用程序起始地址(存放在FLASH)
  3.                                                                                         //保留的空间为IAP使用

  4. u16 iapbuf[1024] = {0}; //用于缓存数据的数组
  5. u16 receiveDataCur = 0;        //当前iapbuffer中已经填充的数据长度,一次填充满了之后写入flash并清零
  6. u32 addrCur = FLASH_APP1_ADDR;                        //当前系统写入地址,每次写入之后地址增加2048

  7. //开始下载
  8. void iap_down_s(void)
  9. {
  10.         u16 i = 0;
  11.         u16 temp = 0;
  12.         u16 receiveCount;
  13.         printf("begin,wait data download\r\n");
  14.         receiveMode = 1;//串口进入下载接收数据模式
  15.         while(1)
  16.         {
  17.                 //循环接收数据,每次必须要发128个数据下来,如果没有128,说明这是最后一包数据
  18.                 //接收到一包数据之后,返回一个小数点,发送完成,系统编程完成之后返回一个iap_over
  19.                 if(serial_Buffer_Length & 0x8000)
  20.                 {
  21.                         receiveCount = (u8)(serial_Buffer_Length&0x00ff);
  22.                         if(receiveCount == 128)//满足一包,填充并查看是否有了1024字节,有了写入闪存
  23.                         {
  24.                                 for(i = 0; i < receiveCount; i+=2)
  25.                                 {
  26.                                         //数据八位融合为16位
  27.                                         temp = (((u16)serial_Buffer[i+1])<<8) + ((u16)serial_Buffer[i]);
  28.                                         iapbuf[receiveDataCur] = temp;
  29.                                         receiveDataCur++;//完成之后receiveDataCur++;
  30.                                 }
  31.                                 receiveExpectCount = 0;//清除期望接收模式
  32.                                 serial_Buffer_Length = 0;//清除串口满标志
  33.                                 printf(".");//每次接受一次数据打一个点
  34.                                 //此时需要检测receiveDataCur的值,要是放满了,就需要写入
  35.                                 if(receiveDataCur == 1024)
  36.                                 {
  37.                                         //写入flash中
  38.                                         STMFLASH_Write(addrCur,iapbuf,1024);
  39.                                         //printf("\r\nwrite addr %x,length 1024\r\n",addrCur);
  40.                                         addrCur += 2048;//地址+2048
  41.                                         //写完之后receiveDataCur要清零等待下一次传输
  42.                                         receiveDataCur = 0;
  43.                                 }
  44.                                 else //有可能最后一包有128个数据但是最终没有2048个数据,此时扩展一个指令用于完成最后一个的写入
  45.                                 {
  46.                                        
  47.                                 }
  48.                                 //还没放满,等待下一次数据过来
  49.                         }
  50.                         else        //不满足一包,说明数据传送这是最后一包,写入闪存
  51.                         {
  52.                                 //没有一包也要传送到缓存中
  53.                                 for(i = 0; i < receiveCount; i+=2)
  54.                                 {
  55.                                         //数据八位融合为16位
  56.                                         temp = (((u16)serial_Buffer[i+1])<<8) + ((u16)serial_Buffer[i]);
  57.                                         iapbuf[receiveDataCur] = temp;
  58.                                         receiveDataCur++;//完成之后receiveDataCur++;
  59.                                 }
  60.                                 receiveExpectCount = 0;//清除期望接收模式
  61.                                 serial_Buffer_Length = 0;//清除串口满标志
  62.                                 printf(".");//每次接受一次数据打一个点
  63.                                 //之后就要将这数据写入到闪存中
  64.                                 STMFLASH_Write(addrCur,iapbuf,receiveDataCur);//将最后的一些内容字节写进去.
  65.                                 //printf("\r\nwrite addr %x,length %d\r\n",addrCur,receiveDataCur);
  66.                                 //写完之后要把地址恢复到原来的位置
  67.                                 addrCur = FLASH_APP1_ADDR;
  68.                                 receiveDataCur = 0;
  69.                                 //写完之后要退出下载循环并告诉上位机,已经下载完了
  70.                                 printf("download over\r\n");
  71.                                 //同时,也要退出下载循环模式
  72.                                 receiveMode = 0;
  73.                                 return;
  74.                         }
  75.                 }
  76.         }
  77. }
  78. //最后一包有128个数据但是最终没有2048个数据
  79. //收到这个指令检测receiveDataCur和addrCur的值,
  80. //完成最后的写入
  81. void iap_over_s(void)
  82. {
  83.         //这个时候,依然在串口下载模式
  84.         if(receiveDataCur != 0)
  85.         {
  86.                 STMFLASH_Write(addrCur,iapbuf,receiveDataCur);//将最后的一些内容字节写进去.
  87.                 //printf("write addr %x,length %d",addrCur,receiveDataCur);
  88.                 addrCur = FLASH_APP1_ADDR;
  89.                 receiveDataCur = 0;
  90.                 //同时,也要退出下载模式
  91.                 receiveMode = 0;
  92.         }
  93.         printf("ok\r\n");
  94. }


  95. typedef  void (*iapfun)(void);                                //定义一个函数类型的参数.
  96. iapfun jump2app;

  97. //设置栈顶地址
  98. //addr:栈顶地址
  99. __asm void MSR_MSP(u32 addr)
  100. {
  101.     MSR MSP, r0                         //set Main Stack value
  102.     BX r14
  103. }

  104. //跳转到应用程序段
  105. //appxaddr:用户代码起始地址.
  106. void iap_load_app(u32 appxaddr)
  107. {
  108.         if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000)        //检查栈顶地址是否合法.0x20000000是sram的起始地址,也是程序的栈顶地址
  109.         {
  110.                 printf("ok\r\n");
  111.                 Delay_Ms(10);
  112.                 jump2app=(iapfun)*(vu32*)(appxaddr+4);                //用户代码区第二个字为程序开始地址(复位地址)               
  113.                 MSR_MSP(*(vu32*)appxaddr);                                        //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
  114.                 jump2app();                                                                        //跳转到APP.
  115.         }
  116.         else
  117.         {
  118.                 printf("program in flash is error\r\n");
  119.         }
  120. }

  121. //跳转到app区域运行
  122. void iap_jump_app_s(void)
  123. {
  124.         iap_load_app(FLASH_APP1_ADDR);//跳转到app的复位向量地址
  125. }



  126. //设置app固化配置
  127. void iap_set_flag_s(void)
  128. {
  129.         Test_Write(APP_CONFIG_ADDR,APP_CONFIG_SET_VALUE);
  130.         printf("ok\r\n");
  131. }

  132. //清除app固化配置
  133. void iap_clear_flag(void)
  134. {
  135. ……………………

  136. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
STM32在线升级IAP功能-全部软件.rar (1016.3 KB, 下载次数: 759)



作者: song823    时间: 2017-8-16 08:45
下来看看 多谢楼主
作者: z_z_j    时间: 2017-8-16 13:11
感谢分享啊,正是我想要的
作者: tj00498    时间: 2017-9-11 15:08
黑币不够,能否私发一份
作者: billy226    时间: 2017-10-17 16:50
顶楼主,正在找这方面的资料
作者: mhqyz    时间: 2017-12-13 10:39
下载看看先啊@@@@
作者: ditozy    时间: 2017-12-14 10:00
上位机器是用什么语言写的呀
作者: flyingwen    时间: 2017-12-23 14:59
谢谢分享

作者: jimmy.pan    时间: 2017-12-24 12:23
正在找这
作者: carlyvin    时间: 2017-12-24 18:10
能直接用么?
作者: heirun    时间: 2017-12-29 18:13
flyingwen 发表于 2017-12-23 14:59
谢谢分享

你好,能发一份给我吗?邮箱:785805660@qq.com, 感谢!
作者: heirun    时间: 2017-12-29 18:13
song823 发表于 2017-8-16 08:45
**** 作者被禁止或删除 内容自动屏蔽 ****

你好,能发一份给我吗?邮箱:785805660@qq.com, 感谢!
作者: heirun    时间: 2017-12-29 18:14
z_z_j 发表于 2017-8-16 13:11
感谢分享啊,正是我想要的

你好,能发一份给我吗?邮箱:785805660@qq.com, 感谢!
作者: yjsjsy    时间: 2018-1-4 10:27
正需要这样的东西!!!!
作者: yangjf    时间: 2018-1-4 14:56
下来看看 多谢楼主
作者: ajaxchan    时间: 2018-1-24 10:20
感谢分享!
作者: albert98    时间: 2018-3-12 20:08

感谢分享!
作者: roothan    时间: 2018-3-28 14:03
app 软件点击哪个下载啊?
作者: roothan    时间: 2018-3-28 23:38
iap跳app程序的时候,直接跳这里了,不知道什么原因啊?有没有人遇到这个问题。

void HardFault_Handler(void)
{
  /* Go to infinite loop when Hard Fault exception occurs */
  while (1)
  {
  }
}

作者: lgr0718    时间: 2018-3-29 10:00
好东西,感谢分享
作者: yxjstar    时间: 2018-4-19 11:06
       学习学习,多谢分享!
作者: 随风飘远    时间: 2018-5-4 16:07
IAP 控制组,写入APP固化配置怎么用?  
作者: wuzetian286    时间: 2018-5-4 22:19
谢谢楼主的无私分享
作者: 随风飘远    时间: 2018-5-9 17:03
存储器128K  的好像不兼容??
作者: numenjian    时间: 2018-5-10 15:39
想用在其他单片机上,先下来参考一下
作者: numenjian    时间: 2018-5-11 09:02
下不了。。。
作者: 小帖    时间: 2018-8-30 16:26
这个上位机有BUG,不能修改波特率,只能使用115200,改成别的波特率没用。
找过这个上位机的资料,想自己修改来着,没找到。。。
作者: ggliuy    时间: 2018-9-9 19:24
,正在网上找这个资料哦,下来先试试看!
作者: yangbo_1000    时间: 2018-10-15 11:39
这个厉害了,学习一下
作者: 烟花绽放    时间: 2018-10-26 09:13
很棒的东西,谢谢楼主分享

作者: w0can    时间: 2018-11-5 09:32
好东西
作者: hellowC8051    时间: 2018-11-5 13:02
谢谢分享,学习中
作者: aslkdfjhg    时间: 2018-11-6 22:34
感谢分享!!!
作者: 天风情    时间: 2018-11-23 16:28
论坛好多资料都很好,但是黑币总是不够用啊
作者: phang    时间: 2018-12-7 09:15
灰常感谢。。。
作者: 周超然    时间: 2019-1-29 14:21
可以用的,只是上位机的源码,能提供下么
作者: zhiyong_05    时间: 2019-1-31 11:31
正需要,谢谢
作者: jach09    时间: 2019-3-14 15:48
好东西啊,找了好久终于找到了!
作者: stephen_xzhou    时间: 2019-3-25 10:21
多谢楼主,很有用
作者: tianli37    时间: 2019-4-21 14:20
感谢分享啊,正想要
作者: huangchao366    时间: 2019-4-21 15:48
这种升级方式确实很好
作者: HHY51    时间: 2019-4-27 16:25
感谢分享,谢谢楼主,继续加油
作者: honey_teck    时间: 2019-5-13 16:45
我正在学习在线下载的功能,学习一下
作者: ontheroad    时间: 2019-6-11 10:10
正在学习STM32 IAP 在线升级!借鉴一下!
作者: 梦园心田    时间: 2019-6-16 21:40
这个跟hex区别
作者: chinaxu10    时间: 2019-6-22 15:23
感谢,正在找上位机软件
作者: tao2008    时间: 2019-7-5 15:02
楼主不厚道。
作者: 376262974    时间: 2019-9-5 09:45
希望是个好东西呢
作者: flyingwen    时间: 2019-12-4 22:42
总结的不错,感谢
作者: lkjdf    时间: 2020-1-3 15:51
感謝大佬分享
作者: qingtian2090    时间: 2020-2-27 11:36
感谢楼主分享
作者: Mancow    时间: 2020-6-9 11:07
灰常感谢分享!
作者: Mancow    时间: 2020-6-9 11:08
很好,感谢分享
作者: 88290398    时间: 2020-6-26 13:27
正是想要的
作者: 知不足而后学    时间: 2020-9-24 11:30
请问写入APP固化配置是什么意思?
作者: irisice008    时间: 2020-9-30 11:40
非常好,下来看看 多谢楼主
作者: irisice008    时间: 2021-1-14 14:58
这个怎么使用呀,楼主要详细解说一下才好,谢谢!
作者: 西点钟灵毓秀    时间: 2022-7-6 16:14
感谢分享啊,正是我想要的,最近在研究这个
作者: yanrz    时间: 2022-8-10 16:08
看着很不错,如果上位机都开放就太好了




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1