找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 19235|回复: 58
打印 上一主题 下一主题
收起左侧

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, 下载次数: 755)


评分

参与人数 2黑币 +10 收起 理由
fanmeng11 + 5 赞一个!
hk18774830405 + 5 厉害

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏18 分享淘帖 顶3 踩
回复

使用道具 举报

沙发
ID:227842 发表于 2017-8-16 08:45 | 只看该作者
下来看看 多谢楼主
回复

使用道具 举报

板凳
ID:143047 发表于 2017-8-16 13:11 | 只看该作者
感谢分享啊,正是我想要的
回复

使用道具 举报

地板
ID:232350 发表于 2017-9-11 15:08 | 只看该作者
黑币不够,能否私发一份
回复

使用道具 举报

5#
ID:79631 发表于 2017-10-17 16:50 | 只看该作者
顶楼主,正在找这方面的资料
回复

使用道具 举报

6#
ID:40927 发表于 2017-12-13 10:39 | 只看该作者
下载看看先啊@@@@
回复

使用道具 举报

7#
ID:261411 发表于 2017-12-14 10:00 | 只看该作者
上位机器是用什么语言写的呀
回复

使用道具 举报

8#
ID:236912 发表于 2017-12-23 14:59 | 只看该作者
谢谢分享
回复

使用道具 举报

9#
ID:266000 发表于 2017-12-24 12:23 | 只看该作者
正在找这
回复

使用道具 举报

10#
ID:265966 发表于 2017-12-24 18:10 | 只看该作者
能直接用么?
回复

使用道具 举报

11#
ID:268969 发表于 2017-12-29 18:13 | 只看该作者

你好,能发一份给我吗?邮箱:785805660@qq.com, 感谢!
回复

使用道具 举报

12#
ID:268969 发表于 2017-12-29 18:13 | 只看该作者
song823 发表于 2017-8-16 08:45
**** 作者被禁止或删除 内容自动屏蔽 ****

你好,能发一份给我吗?邮箱:785805660@qq.com, 感谢!
回复

使用道具 举报

13#
ID:268969 发表于 2017-12-29 18:14 | 只看该作者
z_z_j 发表于 2017-8-16 13:11
感谢分享啊,正是我想要的

你好,能发一份给我吗?邮箱:785805660@qq.com, 感谢!
回复

使用道具 举报

14#
ID:271230 发表于 2018-1-4 10:27 | 只看该作者
正需要这样的东西!!!!
回复

使用道具 举报

15#
ID:260390 发表于 2018-1-4 14:56 | 只看该作者
下来看看 多谢楼主
回复

使用道具 举报

16#
ID:279164 发表于 2018-1-24 10:20 | 只看该作者
感谢分享!
回复

使用道具 举报

17#
ID:290949 发表于 2018-3-12 20:08 | 只看该作者

感谢分享!
回复

使用道具 举报

18#
ID:230678 发表于 2018-3-28 14:03 | 只看该作者
app 软件点击哪个下载啊?
回复

使用道具 举报

19#
ID:230678 发表于 2018-3-28 23:38 | 只看该作者
iap跳app程序的时候,直接跳这里了,不知道什么原因啊?有没有人遇到这个问题。

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

使用道具 举报

20#
ID:264334 发表于 2018-3-29 10:00 | 只看该作者
好东西,感谢分享
回复

使用道具 举报

21#
ID:223959 发表于 2018-4-19 11:06 | 只看该作者
       学习学习,多谢分享!
回复

使用道具 举报

22#
ID:319023 发表于 2018-5-4 16:07 | 只看该作者
IAP 控制组,写入APP固化配置怎么用?  
回复

使用道具 举报

23#
ID:322438 发表于 2018-5-4 22:19 | 只看该作者
谢谢楼主的无私分享
回复

使用道具 举报

24#
ID:319023 发表于 2018-5-9 17:03 | 只看该作者
存储器128K  的好像不兼容??
回复

使用道具 举报

25#
ID:326896 发表于 2018-5-10 15:39 | 只看该作者
想用在其他单片机上,先下来参考一下
回复

使用道具 举报

26#
ID:326896 发表于 2018-5-11 09:02 | 只看该作者
下不了。。。
回复

使用道具 举报

27#
ID:391656 发表于 2018-8-30 16:26 | 只看该作者
这个上位机有BUG,不能修改波特率,只能使用115200,改成别的波特率没用。
找过这个上位机的资料,想自己修改来着,没找到。。。
回复

使用道具 举报

28#
ID:395711 发表于 2018-9-9 19:24 | 只看该作者
,正在网上找这个资料哦,下来先试试看!
回复

使用道具 举报

29#
ID:124003 发表于 2018-10-15 11:39 | 只看该作者
这个厉害了,学习一下
回复

使用道具 举报

30#
ID:87577 发表于 2018-10-26 09:13 | 只看该作者
很棒的东西,谢谢楼主分享
回复

使用道具 举报

31#
ID:81544 发表于 2018-11-5 09:32 | 只看该作者
好东西
回复

使用道具 举报

32#
ID:328121 发表于 2018-11-5 13:02 | 只看该作者
谢谢分享,学习中
回复

使用道具 举报

33#
ID:368791 发表于 2018-11-6 22:34 来自手机 | 只看该作者
感谢分享!!!
回复

使用道具 举报

34#
ID:426861 发表于 2018-11-23 16:28 | 只看该作者
论坛好多资料都很好,但是黑币总是不够用啊
回复

使用道具 举报

35#
ID:396960 发表于 2018-12-7 09:15 | 只看该作者
灰常感谢。。。
回复

使用道具 举报

36#
ID:449525 发表于 2019-1-29 14:21 | 只看该作者
可以用的,只是上位机的源码,能提供下么
回复

使用道具 举报

37#
ID:474311 发表于 2019-1-31 11:31 | 只看该作者
正需要,谢谢
回复

使用道具 举报

38#
ID:219315 发表于 2019-3-14 15:48 | 只看该作者
好东西啊,找了好久终于找到了!
回复

使用道具 举报

39#
ID:414697 发表于 2019-3-25 10:21 | 只看该作者
多谢楼主,很有用
回复

使用道具 举报

40#
ID:82586 发表于 2019-4-21 14:20 | 只看该作者
感谢分享啊,正想要
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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