73

帖子

0

TA的资源

一粒金砂(初级)

21
 

我现在对STM32的FLASH存储器结构还不是很清楚……

所以对楼主这个问题也不是很肯定,只能说我自己的理解。

用户FLASH中的头8K是IAP?这个是谁规定的?既然是用户自定义的IAP程序,那么就可以放在任意位置,大小也是不固定的。
此帖出自stm32/stm8论坛
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

22
 

我也不知道楼主是从哪里看来的“用户FLASH中的头8K是IAP”?

圈圈的理解正确,STM32的Flash就是一个连续的存储区,用户可以根据自己的需要任意的划分它的用途;依据型号的不同,这个连续的存储区的大小也不同,目前有下列选项:32KB、64KB、128KB、256KB、384KB和512KB。

System Memory与用户Flash不处于同一个区域,而且用户不能对它进行擦写,所以可以理解为一段ROM区。
此帖出自stm32/stm8论坛
 
 

回复

89

帖子

0

TA的资源

一粒金砂(初级)

23
 

通常,会把bootloader放在flash的最末尾

因为在用户flash的开始部分都是中断向量表,用户程序的中断向量表必须安置在这里,用户程序的中断才能正常响应(当然把中断向量表复制到RAM中去运行时例外)。

当用户执行bootloader下载程序时,先将地址0中的指令保存起来,然后修改地址0的指令,让它跳转到bootloader去运行。在bootloader中去检查条件,
如果需要运行用户程序时,再调用原来保存起来的指令去运行用户程序。当然这对用户的0地址指令有些限制。
此帖出自stm32/stm8论坛
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

24
 

偶这里还有一个例程

使用USB接口实现CDC,上位机仍旧使用原来的ST Flash Loader兼容的程序就可以了(只是需要设置偏移为0x2000)。
STM32USBBoot
此帖出自stm32/stm8论坛
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

25
 

什么是IAP?

看了楼主20楼的发言,感觉楼主还是没有明白什么是IAP,我再次重复我前面的定义:“IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写”。

通常在用户需要实现IAP功能时,即用户程序运行中作自身的更新操作,需要在设计固件程序时编写两个项目代码,第一个项目是楼主一直在说的8K程序,这段程序不执行正常的功能操作,而只是通过某种通信管道(如USB)接收程序或数据,执行对第二部分代码的更新;第二个项目代码才是真正的功能代码。这两部分项目代码都同时烧录在User Flash中,当芯片上电后,首先是第一个项目代码开始运行,它作如下操作:
1)检查是否需要对第二部分代码进行更新
2)如果不需要更新则转到4)
3)执行更新操作
4)跳转到第二部分代码执行

第一部分代码必须通过其它手段,如JTAG或ISP烧入;第二部分代码可以使用第一部分代码IAP功能烧入,也可以和第一部分代码一道烧入,以后需要程序更新是再通过第一部分IAP代码更新。

不知道这样解释是否可以明白些。
此帖出自stm32/stm8论坛
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

26
 

是明白些了

但还是有几个问题:
1-在AN2557第9页这样写:On STM32F10xxx microcontrollers,the user must program the IAP application from the Flash memory base address(0x0800 0000),and the user application from address 0x8002000.这句话怎么解释呢?
2-"4)跳转到第二部分代码执行"是怎么实现跳转的呢?
3-"当芯片上电后,首先是第一个项目代码开始运行",是运行在FLASH里面么?
"1)检查是否需要对第二部分代码进行更新"
"3)执行更新操作"
如果IAP代码是运行在FLASH的前8K空间里,那么当它发现用户程序需要更新时,它能对FLASH的前8K空间之外的代码进行擦、写操作么?就是自己写自己?

先问这些,谢谢!
此帖出自stm32/stm8论坛
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

27
 

这些都是十分基础的东西

1)第一部分代码放在0x0800 0000开始的地方,因为中断向量表必须在Flash的开始,如果不放在这里,第一部分代码就无法执行中断功能。第二部分代码放在0x0800 2000开始的地方,这是因为第一部分代码占用了8K空间。

2)使用跳转指令。

3)运行在Flash中。

4)Flash不能自己写自己,需要把写Flash的程序拷贝到RAM中执行。


如果你已经搞清楚IAP的工作原理,请参考ST的例程自行寻找如何实现的答案,谢谢!
此帖出自stm32/stm8论坛
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

28
 

OK,谢谢香主

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

29
 

可不可以从用户程序跳转到System memory Boot Loader去执行?

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

30
 

回29楼:可以

                                 但System memory的Boot Loader是不公开的,你不知道要跳转到哪里。
此帖出自stm32/stm8论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

31
 

入口地址应该是固定的。

在Boot0 Boot1选择进入Boot loader后,stm32f如何保证boot loader获得控制权?
这个应该是独立于cortex-m3内核的,而且是硬件实现的。
应该是将Boot loader区的flash映射到0x8000000。
即此时寻址0x8000000~0x8000FFF就是寻址0x1FFFF000~0x1FFFFFF。然后Bootloader通过一些“秘密”操作,切回映射。
此帖出自stm32/stm8论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

32
 

STM32的Boot0和Boot1始终是把启动存储区映射到0x0000 0000

从System Memory启动时,就是把0x1FFF F000~0x1FFF F800映射到0x0000 0000~0x0000 0800。

从内部User Flash启动时,就是把0x0800 0000~0x0803 FFFF映射到0x0000 0000~0x0003 FFFF。

哈哈,没有什么“秘密”操作。
此帖出自stm32/stm8论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

33
 

从用户的角度去理解最好解释

ISP-----俗称下载线
IAP-----俗称在线升级

从用户的角度说,

ISP下载线说白了是你生产时候用的,如果你生产用JTAG,也可以叫做ISP

IAP不使用专门的通讯线,而是你的成品有什么它用什么,比如串口/USB/CAN/ZigBee/SPI/I2C网口/红外/蓝牙,一般此类产品是有PC软件或者其他方式的主机存放升级Firmware或直接联网到存放FW的服务器。
此帖出自stm32/stm8论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

34
 

各位理解的都不错

                                 有没有研究过ST实现IAP功能的那里例程的,好半天了我就是没看出来他的IAP实现代码是怎么被复制到RAM中执行的
此帖出自stm32/stm8论坛
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

35
 

确实没什么秘密。。。。资料上有写。

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

36
 

刚打电话问了北京ST

碰到高手啦
IAP的代码大小是有限制的,不大于8K而且必须放在FLASH的前8K空间,并且不用放到RAM中运行,在FLASH中运行就可以,用它就可以直接对剩余FLASH空间(比如120K)进行直接读写操作,如果程序不需要更新的话就直接跳转到用户程序去运行。各路高手各抒己见但说法儿五花八门。。。
此帖出自stm32/stm8论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

37
 

哈哈,原来楼主要考我,在这里问了问题再打电话去证实

我问过了北京的工程师,这个答案是经实际验证过的。而我之前的解释是根据手册,在理论上成立,但没有经过验证。所以请楼主按照我们北京的工程师说的去做肯定没错。

关于擦写Flash的程序可以在Flash中执行的问题,我有查看了手册,确认可以不用在RAM中执行,我之前的概念有误。
此帖出自stm32/stm8论坛
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

38
 

哈哈~~~应该倒过来说:

                                 为了能够不把代码复制到RAM中也能擦写FLASH,IAP代码必须放在用户FLASH的前8K中。否则,就需要复制到RAM中运行。很多系统在擦除FLASH时是不能再访问FLASH的,因而需要把代码复制到RAM中运行。
此帖出自stm32/stm8论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

39
 

我也是刚刚得到确定答复的

                                 看到这么多五花八门的说法儿也不错,长见识,每一个人都有他擅长的领域和不擅长的领域。因为我们的产品中用STM32F升级原来的16位机,并且要求一定要上IAP,这也是升级的关键意义所在,所以在这个问题上我会一直研究下去,直到把IAP成功集成到我们的产品中,到时候我也会把心得跟大家分享。另外00说的把IAP代码复制到RAM中去运行已经是过时的方法了,现在的IAP技术已经是一个新的平台了,这个说法儿基本上是北京ST工程师的原义:)
此帖出自stm32/stm8论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

40
 

原理上讲IAP程序没有8K的限制,但需要实际应用上的证实

所以我在37楼说:请楼主按照我们北京的工程师说的去做肯定没错。

其实讨论是否有8K的限制意义不大,从另一个角度讲,只要你把擦写Flash的代码安排在Flash的前8K,你的IAP程序多大都无所谓,因为8K之外的部分不执行Flash的擦写操作。
此帖出自stm32/stm8论坛
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表