硬汉嵌入式论坛

 找回密码
 立即注册
查看: 16657|回复: 39
收起左侧

[例程下载] STM32-V5开发板串口IAP操作说明(例子:V5_136_串口IAP)

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2015-3-6 09:07:03 | 显示全部楼层 |阅读模式
例子下载: V5_136_串口IAP.rar (4.4 MB, 下载次数: 2146)
说明:STM32-V5开发板使用的这个例子是参考了官方的串口IAP例子,下面先简单的介绍下串口IAP:
          对于大多数基于 Flash 的系统而言,在最终产品中安装之后,能够对固件进行更新,这一点非常重要。
这一功能被称为在应用中编程 (IAP   in-applicationprogramming)。 通过微处理器内置 Flash 的 IAP
(可以认为是boot代码),STM32F4xx 微控制器能够运行用户指定固件。借助这一特性,在重新编程
过程中可以使用任意类型的通信协议。下面的例子是利用串口下载一个可以执行的bin文件程序到开发板,
由于开发板已经内置好IAP程序,下载完bin文件后,用户就可以选择跳转到相应flash地址去执行这个程序。
********************************************************************************************************
本工程使用的bin文件是例子: V5-101_按键检测和LED控制例程.rar (4.57 MB, 下载次数: 1219)
这个是生成好的bin文件,可直接下载 output.rar (6 KB, 下载次数: 435)
********************************************************************************************************
生成方法看下面说明:
IAR或者MDK生产bin文件看这个帖子:http://www.armbbs.cn/forum.php?mod=viewthread&tid=7097
STM32F407有如下12个扇区,这里我们把扇区0,扇区1,扇区2,扇区3用来存储IAP代码,其余扇区
用于用户flash区。

/* 各个扇区首地址 */
#define ADDR_FLASH_SECTOR_0     ((uint32_t)0x08000000) /* Base @ of Sector 0, 16 Kbyte */
#define ADDR_FLASH_SECTOR_1     ((uint32_t)0x08004000) /* Base @ of Sector 1, 16 Kbyte */
#define ADDR_FLASH_SECTOR_2     ((uint32_t)0x08008000) /* Base @ of Sector 2, 16 Kbyte */
#define ADDR_FLASH_SECTOR_3     ((uint32_t)0x0800C000) /* Base @ of Sector 3, 16 Kbyte */
#define ADDR_FLASH_SECTOR_4     ((uint32_t)0x08010000) /* Base @ of Sector 4, 64 Kbyte */
#define ADDR_FLASH_SECTOR_5     ((uint32_t)0x08020000) /* Base @ of Sector 5, 128 Kbyte */
#define ADDR_FLASH_SECTOR_6     ((uint32_t)0x08040000) /* Base @ of Sector 6, 128 Kbyte */
#define ADDR_FLASH_SECTOR_7     ((uint32_t)0x08060000) /* Base @ of Sector 7, 128 Kbyte */
#define ADDR_FLASH_SECTOR_8     ((uint32_t)0x08080000) /* Base @ of Sector 8, 128 Kbyte */
#define ADDR_FLASH_SECTOR_9     ((uint32_t)0x080A0000) /* Base @ of Sector 9, 128 Kbyte */
#define ADDR_FLASH_SECTOR_10    ((uint32_t)0x080C0000) /* Base @ of Sector 10, 128 Kbyte */
#define ADDR_FLASH_SECTOR_11    ((uint32_t)0x080E0000) /* Base @ of Sector 11, 128 Kbyte */


/*其中 扇区0 - 3用于IAP BOOT,  下面是用户区首地址  */
#define APPLICATION_ADDRESS   (uint32_t)0x08010000
下面我们要做的就是把可执行程序bin文件的首地址设置为0x08010000 ,需要设置如下两个地方再编译:
12.png

13.png

********************************************************************************************************
第1步:打开超级终端,XP系统自带超级终端,WIN7系统没有自带,可以下载这里的超级终端:
           http://www.armbbs.cn/forum.php?mod=viewthread&tid=7090。由于这个例子用到了Ymodem文件传输协议,所以要
           使用超级终端,如果使用secureCRT的话,文件下载会失败,主要是secureCRT使用的Ymodem协议与
           超级终端使用的稍有区别。
            1.png
           点击确定后选择波特率,停止位等(注意自己电脑可以用的串口号是com几,就选择com几,当前我这里是com4)
            2.png
           点击确定后选择波特率,停止位等选项,然后点击应用,确定:
            3.png
           至此超级终端就设置完了。   
第2步:下载例子 V5_136_串口IAP  到开发板 到开发板,会在超级终端显示如下信息:
          4.png
          在键盘上面点击数字1,弹出如下信息:
          5.png
          点击菜单选项-->传送-->发送文件-->
          6.png
          点击发送,弹出如下窗口:
          7.png
         发送完成后,上面的窗口会自动消息,并在超级终端显示如下消息:
          11.png
第3步:在电脑键盘上面点击数字2,开发板就会执行前面下载的output.bin程序。
14.png


回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
发表于 2015-3-6 10:23:49 | 显示全部楼层
IAP自身的程序在哪里? 怎么下载到板子上的?[s:120]
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2015-3-6 10:25:28 | 显示全部楼层

回 caicaptain2 的帖子

caicaptain2:IAP自身的程序在哪里? 怎么下载到板子上的?[s:120]  (2015-03-06 10:23) 
还没有整理完,我发的有些早
http://www.armbbs.cn/forum.php?mod=viewthread&tid=7044
回复

使用道具 举报

7

主题

53

回帖

74

积分

初级会员

积分
74
发表于 2015-3-25 12:07:38 | 显示全部楼层
以上例子已经应用到工程项目中,感谢硬汉同学[s:142] [s:142] [s:142]
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2015-3-25 12:23:01 | 显示全部楼层

回 ajaxchan 的帖子

ajaxchan:以上例子已经应用到工程项目中,感谢硬汉同学[s:142] [s:142] [s:142]  (2015-03-25 12:07) 
[s:142][s:142]
回复

使用道具 举报

11

主题

103

回帖

31

积分

初级会员

积分
31
发表于 2015-12-31 09:29:34 | 显示全部楼层
与此类似,如果放到SD卡升级呢?  andriod机都是这样升级多~
回复

使用道具 举报

11

主题

103

回帖

31

积分

初级会员

积分
31
发表于 2016-1-4 09:41:08 | 显示全部楼层
http://www.armbbs.cn/forum.php?mod=viewthread&tid=16906&ds=1&page=1&toread=1#tpc  我后面在v5开发板实现了 sdio+iap
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2016-1-5 10:56:03 | 显示全部楼层

回 qq27488 的帖子

qq27488:我下载一个自己的.bin文件(里面配置都修改好了),有390K大小。下载完成后,无论是电脑键盘按1/2都没反应,复位就串口会出现提示你按1/2等信息~  是什么情况? (2016-01-04 09:41) 
回头我测试下看看。
回复

使用道具 举报

0

主题

1

回帖

4

积分

新手上路

积分
4
发表于 2017-8-24 09:28:07 | 显示全部楼层
#define APPLICATION_ADDRESS   (uint32_t)0x08010000
可执行程序bin文件的首地址为什么是0x08010000 ?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2017-8-24 09:33:24 | 显示全部楼层

回 gld的账号 的帖子

gld的账号:
#define APPLICATION_ADDRESS   (uint32_t)0x08010000
可执行程序bin文件的首地址为什么是0x08010000 ?
不限制。

QQ截图20170824092950.png
回复

使用道具 举报

0

主题

12

回帖

12

积分

新手上路

积分
12
发表于 2017-11-6 16:01:31 | 显示全部楼层
您好,我把U盘FatFS的例程加到这个工程里面,想做成从U盘读取升级文件的,不知为什么检测不到U盘插入,执行到读取文件就卡住了,拔掉U盘才检测到.。往别的工程里面加U盘的功能不这样啊
回复

使用道具 举报

0

主题

12

回帖

12

积分

新手上路

积分
12
发表于 2017-11-6 16:02:27 | 显示全部楼层
您好,我把U盘FatFS的例程加到这个工程里面,想做成从U盘读取升级文件的,不知为什么检测不到U盘插入,执行到读取文件就卡住了,拔掉U盘才检测到.。往别的工程里面加U盘的功能不这样啊
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2017-11-7 01:45:52 | 显示全部楼层

回 _uuuu 的帖子

_uuuu:您好,我把U盘FatFS的例程加到这个工程里面,想做成从U盘读取升级文件的,不知为什么检测不到U盘插入,执行到读取文件就卡住了,拔掉U盘才检测到.。往别的工程里面加U盘的功能不这样啊 (2017-11-06 16:02) 
那就反着来,将这个工程网U盘里面加试试看。
回复

使用道具 举报

0

主题

12

回帖

12

积分

新手上路

积分
12
发表于 2017-11-9 15:12:16 | 显示全部楼层

回 eric2013 的帖子

eric2013:那就反着来,将这个工程网U盘里面加试试看。 (2017-11-07 01:45) 
嗯,现在可以跳到简单的APP了[s:142]
回复

使用道具 举报

0

主题

12

回帖

12

积分

新手上路

积分
12
发表于 2017-11-9 17:27:37 | 显示全部楼层
求助,用V5开发板的U盘FatFS例程做的bin文件,用这个串口IAP例程更新,结果跳过去打印几个字符后程序就卡死了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2017-11-10 01:20:18 | 显示全部楼层

回 _uuuu 的帖子

_uuuu:求助,用V5开发板的U盘FatFS例程做的bin文件,用这个串口IAP例程更新,结果跳过去打印几个字符后程序就卡死了 (2017-11-09 17:27) 
你的boot程序是不是裸机的,跳转前关闭全局中断。
回复

使用道具 举报

0

主题

12

回帖

12

积分

新手上路

积分
12
发表于 2017-11-13 14:19:46 | 显示全部楼层

回 eric2013 的帖子

eric2013:你的boot程序是不是裸机的,跳转前关闭全局中断。 (2017-11-10 01:20) 
static void USB_OTG_BSP_TimeInit ( void )
{
#ifdef USE_ACCURATE_TIME   
  NVIC_InitTypeDef NVIC_InitStructure;
  
  /* Set the Vector Table base address at 0x08000000 */
   
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x00);
  
  找到原因了,usb_bsp.c的这一句,
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2017-11-14 10:18:30 | 显示全部楼层

回 _uuuu 的帖子

_uuuu:static void USB_OTG_BSP_TimeInit ( void )
{
#ifdef USE_ACCURATE_TIME  
  NVIC_InitTypeDef NVIC_InitStructure;
....... (2017-11-13 14:19) 
谢谢告知问题的原因[s:142]
回复

使用道具 举报

0

主题

12

回帖

12

积分

新手上路

积分
12
发表于 2017-11-14 19:26:47 | 显示全部楼层
求助求助。还是IAP的事,我在应用程序里面加了RL-FlashFS的部分,是从《基于RL-FlashFS的F429驱动NAND Flash》这个里面剥出来的,单独运行没问题,但是把这段程序烧到0x8010000,再从IAP往这跳转就死掉了。拿其他程序试了也是这样,只要加上RL-FlashFS的部分,就会出现跳转不了。没找到原因到底出在哪儿。。。。。。。。。。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2017-11-15 10:22:57 | 显示全部楼层

回 _uuuu 的帖子

_uuuu: 求助求助。还是IAP的事,我在应用程序里面加了RL-FlashFS的部分,是从《基于RL-FlashFS的F429驱动NAND Flash》这个里面剥出来的,单独运行没问题,但是把这段程序烧到0x8010000,再从IAP往这跳转就死掉了。拿其他程序试了也是这样,只要加上RL-FlashFS的部分,就会出现跳转 .. (2017-11-14 19:26) 
必要的设置都做了吧,中断向量表位置和Flash位置修改。另外调整前关闭全局中断。在你的APP函数开头先弄个串口打印,看看在哪里死机了。
回复

使用道具 举报

0

主题

12

回帖

12

积分

新手上路

积分
12
发表于 2017-11-15 18:09:49 | 显示全部楼层
捕获.PNG
重定向输出的函数
回复

使用道具 举报

0

主题

12

回帖

12

积分

新手上路

积分
12
发表于 2017-11-15 18:13:24 | 显示全部楼层
上面图中划线的两句前后顺序换一下,就可以正常跳转了。
好奇怪,这样写的时候竟然也能正常执行串口打印打印数据。不应该卡到while循环那儿吗
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2017-11-16 00:42:40 | 显示全部楼层

回 _uuuu 的帖子

_uuuu:上面图中划线的两句前后顺序换一下,就可以正常跳转了。
好奇怪,这样写的时候竟然也能正常执行串口打印打印数据。不应该卡到while循环那儿吗 (2017-11-15 18:13) 
的确有个这个问题,后面了深入查下。
回复

使用道具 举报

0

主题

2

回帖

26

积分

新手上路

积分
26
发表于 2018-1-11 11:54:12 | 显示全部楼层
本帖最后由 李光 于 2018-1-11 11:56 编辑

您好,我把IAP放到了APP区域的后方,到发送文件时候就会收不到远程主机的响应,进度条也不走;这个我该怎么解决呢?把IAP放到APP前面,倒是没什么问题;我是这样分配存储空间的:
APP:0X08000000~0X0803FFFF
IAP:0X08040000~0X0805FFFF
PARA:0X0807F800~0X0807FFFF
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2018-1-11 12:20:56 | 显示全部楼层
李光 发表于 2018-1-11 11:54
您好,我把IAP放到了APP区域的后方,到发送文件时候就会收不到远程主机的响应,进度条也不走;这个我该怎么 ...

这个涉及到一个重映射的问题。对于Cortex-M内核,上电后务必从0x0000 0000开始读取SP PC和中断向量表
而STM32是将Flash的首地址0x0800 0000映射到0x0000 0000的。所以0x0800 0000一定要是IAP。上电后随意搞。
回复

使用道具 举报

0

主题

2

回帖

26

积分

新手上路

积分
26
发表于 2018-1-11 14:24:51 | 显示全部楼层
eric2013 发表于 2018-1-11 12:20
这个涉及到一个重映射的问题。对于Cortex-M内核,上电后务必从0x0000 0000开始读取SP PC和中断向量表
而 ...

好吧,谢谢了
我准备在APP里通过命令写入flash一个升级标识,上电后IAP读取到这个标识并判断,如果不需要升级则直接跳转到APP
回复

使用道具 举报

0

主题

12

回帖

12

积分

新手上路

积分
12
发表于 2018-3-12 14:07:42 | 显示全部楼层
求助,串口通信要求数据位7位,无校验,STM32这边该怎么配置呢
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2018-3-12 15:27:27 | 显示全部楼层
_uuuu 发表于 2018-3-12 14:07
求助,串口通信要求数据位7位,无校验,STM32这边该怎么配置呢

7位数据的话,有一位得是奇偶校验位才行
QQ截图20180312152543.png
回复

使用道具 举报

7

主题

22

回帖

43

积分

新手上路

积分
43
发表于 2018-5-2 22:47:51 | 显示全部楼层
DISABLE_INT(); /* 关中断 */
Jump_To_Application();


坛主,请问是在这里加吗?
回复

使用道具 举报

7

主题

22

回帖

43

积分

新手上路

积分
43
发表于 2018-5-2 23:06:00 | 显示全部楼层
还有一个问题,我现在APP程序里面一个中断都没有
int main()
{
        BSP_Init();
        BSP_LedOff(1);       
        BSP_LedOff(2);
//        PrintfLogo();
//        BSP_StartAutoTimer(0, 500);        /* 启动1个500ms的自动重装的定时器 */
        while(1)
        {
                BSP_LedOn(1);       
                Delay(0x1FFFFF);
                BSP_LedOff(1);       
                Delay(0x1FFFFF);
//               
//                if (BSP_CheckTimer(0))
//                {
//                        BSP_LedToggle(1);
//                }
        }
}
我这样才可以正常运行
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2018-5-3 02:38:44 | 显示全部楼层
Sincere_sZ08C 发表于 2018-5-2 22:47
DISABLE_INT(); /* 关中断 */
Jump_To_Application();

加上是有必要的。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2018-5-3 02:40:48 | 显示全部楼层
Sincere_sZ08C 发表于 2018-5-2 23:06
还有一个问题,我现在APP程序里面一个中断都没有
int main()
{

中断向量表出问题了,发生中断后,程序不能正确调整到指定的地址。
回复

使用道具 举报

27

主题

91

回帖

172

积分

初级会员

积分
172
发表于 2018-5-14 13:46:03 | 显示全部楼层
....硬汉兄,带UCOS这类OS的做IAP时,应该注意什么,可以直接用裸机的么
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2018-5-15 05:12:58 | 显示全部楼层
borrow1988 发表于 2018-5-14 13:46
....硬汉兄,带UCOS这类OS的做IAP时,应该注意什么,可以直接用裸机的么

没问题的
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2019-2-20 16:10:19 | 显示全部楼层
SecureCRT8.1和8.5版本已经能直接用ymodem下载了,Win10和Win7下能代替超级终端了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2019-2-20 16:41:21 | 显示全部楼层
0xcf_nc2Mv 发表于 2019-2-20 16:10
SecureCRT8.1和8.5版本已经能直接用ymodem下载了,Win10和Win7下能代替超级终端了

谢谢告知。
老版的也支持,就是跟我们常用的,在实现上略有区别,自己做的代码要改下。
回复

使用道具 举报

29

主题

514

回帖

606

积分

金牌会员

积分
606
QQ
发表于 2019-2-22 09:33:53 | 显示全部楼层
eric2013 发表于 2019-2-20 16:41
谢谢告知。
老版的也支持,就是跟我们常用的,在实现上略有区别,自己做的代码要改下。

Eric,有没有USB OTG 能识别2GB以上U盘的驱动? 我的是STM32F105
回复

使用道具 举报

21

主题

61

回帖

124

积分

初级会员

积分
124
发表于 2020-7-3 16:31:27 | 显示全部楼层
Y-Modem是不是最多只能传256K的文件?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2020-7-3 16:59:35 | 显示全部楼层
廷润 发表于 2019-2-22 09:33
Eric,有没有USB OTG 能识别2GB以上U盘的驱动? 我的是STM32F105

没问题的。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2020-7-3 17:02:29 | 显示全部楼层
zhumx 发表于 2020-7-3 16:31
Y-Modem是不是最多只能传256K的文件?

这个倒是没有注意过。

不过现在已经不再使用这个方法了,改用系统bootloader了:

http://www.armbbs.cn/forum.php?mod=viewthread&tid=93255&extra=page%3D1


4.jpg
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-29 13:38 , Processed in 0.340967 second(s), 34 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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