发新帖我要提问
12
返回列表
打印
[STM8]

求助,香主请进:STM8S的IAP升级之Flash写入的问题

[复制链接]
楼主: sed2003
手机看帖
扫描二维码
随时随地手机跟帖
21
1# sed2003 STM8S的IAP升级之Flash写入能不能支持块写??

使用特权

评论回复
22
明月小厨| | 2012-11-30 14:32 | 只看该作者
本来就是一个块一个块写的,块好象大小不一的,有的大些,有的小些(和芯片有关);完成一个块,再重新操作另一个块,包括解锁;

你先别搞那么复杂;就写块操作先调好,把一个块的数据换个地方重写;这样你就不用怀疑是不是接收的数据有错;
数据收发也要注意,别使劲发,这边写完一个块,你再接着发不迟;不然那么多数据放在哪?:victory:

使用特权

评论回复
23
sed2003|  楼主 | 2012-11-30 14:33 | 只看该作者
支持,不过我一直没成功。问技术支持,他们也不会,我彻底服了。
我所做的,不是上电就立刻进行IAP升级,而是所有程序都已经运行起来了,通过一个命令激活升级,这也是常见的做法,但是就是没有现成的例子可以参考。极其郁闷。

使用特权

评论回复
24
明月小厨| | 2012-11-30 15:27 | 只看该作者
本帖最后由 明月小厨 于 2012-11-30 15:48 编辑

自我删除垃圾;说的不对

使用特权

评论回复
25
明月小厨| | 2012-11-30 15:44 | 只看该作者
你定义二个大一些的数组块;一个用于存放你的RAM里要跑的小程序;另一个用来接收数据(新程序块);
1.升级程序被激活了(把看门狗等全关掉).去RAM里运行起来了;请求上位机发送命令和数据;
2.接收串口数据,128字节一组;发送完毕自动暂停发送,并等待RAM里小程序的下一次请求;
3.RAM里的程序开始写FLASH块;写完后请求上位机发送新的命令和数据;
4.如果上位机发过来的命令是完成,则RAM里的程序任务就结束了;
5.全部完工后开启看门狗,但不喂狗,让它超时复位.

使用特权

评论回复
26
明月小厨| | 2012-12-1 22:22 | 只看该作者
仅仅是在擦和写数据的时候需要在RAM里运行.如果是块擦或写,好象系统自动禁止了所有的中断;
块擦写的速度是6mS;32K区域擦写时间约为1.6秒;这个过程注意看门狗.
块擦写完成后回到FLASH程序区,再收数据;收完数据再回RAM里写;直到完成.
所有的升级完成后,有一个软件复位指令,可让系统立即复位;
一边擦写一边收数据也行,只要RAM区域够大就可以.

另一个方案,仅仅是块擦除在RAM里完成,以字的形式在正常FLASH区域完成写操作;理由是字节或字编程时可以在FLASH程序段完成,不用进入RAM区域;
每次写的时候,系统停止运行(所有程序停止暂停执行,进入休眠状态,肯定是占用了总线的原因);每个字写的时间是约200uS不到;这样写完后程序继续恢复运行;这样的流程更简洁.但用时多一些.写数据的时候什么事都做不了.
注:块擦除操作要单独进行,用时约3mS;

使用特权

评论回复
27
明月小厨| | 2012-12-1 22:27 | 只看该作者
sed2003 发表于 2012-11-12 16:57
我怀疑是写入的位置不对,或者跳转的位置不对。
我写入的起始位置是8000H,按128个字节的块来写的,最后一 ...

8000前面也是程序段,但这个程序段是系统自己要用的启动引导区,不对外开放;

使用特权

评论回复
28
明月小厨| | 2012-12-1 22:30 | 只看该作者
oayzw 发表于 2012-11-13 17:20
可能是Count定义成char了,定义成int就应该可以了

这个定义是不可以随便改的吧,最大的块好象也就没多大的;连续写应该不行;
我怀疑是写完后系统自动上锁,再写必须重新开锁;

使用特权

评论回复
29
明月小厨| | 2012-12-1 22:40 | 只看该作者
19楼的兄弟讲的是对的,思路很清楚,不应该从8000处重写;但8000后面的中断向量表你需要做二次跳转了;

使用特权

评论回复
30
noley| | 2012-12-4 09:04 | 只看该作者
本帖最后由 noley 于 2012-12-4 09:17 编辑

楼主,你的程序上是不是有问题?
for(i=0;i<128;i++)
{
FlashBuf = DataBuffer[6+i];
}
此处FlashBuf???
-----------
刚调试IAP成功,附上一段块写的程序,供参考(STM8S105调试成功,编译器IAR V1.30) IAP_BLOCK.rar (868 Bytes)

使用特权

评论回复
31
noley| | 2012-12-4 09:20 | 只看该作者
本帖最后由 noley 于 2012-12-4 09:28 编辑

使用IAP时有几点要注意:
1. IAP-BOOT程序:
   A. 修改LNK文件(lnkstm8s105s4.ICF),定义块编程放在ROM区
    initialize by copy { rw, ro section .tiny.rodata, section FLASH_CODE};
   
    代码中定位块写程序的位置
    #pragma location = "FLASH_CODE"
    unsigned char IAP_bWrBlock(void){...}
   B. 修改向量表文件(stm8s_interrupt.S),使中断指向用户程序的向量地址(0X8800开始);
   C. 编译选项Linker重定向到已修改的文件lnkstm8s105s4.ICF;
   D. 项目文件中添加stm8s_interrupt.S文件;
   E. 编译生成的文件即为用户代码引导区;   F. 设置OPTION选项,ROP=0xAA, UBC=0x02(BOOT区大小,0x8000--0x87FF, IAP不能修改该段代码)
2. IAP-USER程序
   A. 修改LNK文件(lnkstm8s105s4.ICF),定义用户代码区间,避开BOOT区(起始:0x8800)
   B. 编译生成的文件即为用户程序区;
3. 烧录步骤:
    A. BOOT程序和OPTION先烧录进芯片
    B. BOOT引导过程中主机发同步码,进入IAP升级。

使用特权

评论回复
32
sed2003|  楼主 | 2012-12-13 17:12 | 只看该作者
本帖最后由 sed2003 于 2012-12-13 17:19 编辑

你好,noley。我的代码里FlashBuf是我自己改过的,库函数也改成了FlashBuf[128]了。
我想强调的是,我是在程序跑起来以后,通过上位机的命令来触发STM8S208MB升级的。
请可否给出一份完整的project来?根据我所了解,LNK文件,还有COSMIC都有设置的,代码只是其中的一部分,而且作用不大。
关键就是LNK文件和COSMIC的设置。

使用特权

评论回复
33
明月小厨| | 2012-12-13 20:36 | 只看该作者
sed2003 发表于 2012-11-16 16:34
我用STM8S208MB来做升级,在RAM里运行对flash的擦写工作,晶振仍用外部的,结果,前面写都是正确的,到了一 ...

跳转到main并非等同于重新启动;
我怀疑有可能你的问题是堆栈溢出了;
你可以在main后面,设置SP的指针归零(顶);

使用特权

评论回复
34
sed2003|  楼主 | 2012-12-14 09:52 | 只看该作者
明月小厨,你好。
应该不是溢出导致的。我从论坛里找到很多IAP升级资料,按照他们的代码写出来以后,不行。尤其是有个号称是IAP升级的,结果他写的只是EEPROM,换成了FLASH根本就不能用。我用他的代码反复试验,也就是我开帖子写的这些,最后判定,它根本就没有在RAM里运行,而是在FLASH上跑的。比如,写FLASH的函数放在0X000D400位置,这个写Flash动作就只能到0X000D400就停止了。
只有noely讲得方式是对的,以前听同事说过,就是要改ICF文件。可惜没有资料可以借鉴。到时候再换个技术支持来解决吧。
利用上位机来触发MCU升级,是一种非常常见的做法,ST公司居然没有案例,太不可思议了。

使用特权

评论回复
35
sed2003|  楼主 | 2012-12-27 14:56 | 只看该作者
通过技术支持的协助,已经搞定了!是我思路有点问题,但是绝对可以不用像ST公司提供的资料那样外接一个IO来做。

使用特权

评论回复
36
美丽妹妹| | 2012-12-28 13:32 | 只看该作者
好吧,我是路人,进来看看的

使用特权

评论回复
37
aundry| | 2014-9-2 14:52 | 只看该作者
:'(0x10000之后的有问题,不知道怎么搞

使用特权

评论回复
38
Nino0713| | 2015-3-19 12:05 | 只看该作者
楼主你好, 请问你问题解决了吗? 我现在也遇到跟你一样的问题,写到一个位置之后就会挂掉,拜托给我答案!!

使用特权

评论回复
39
sed2003|  楼主 | 2015-4-20 23:24 | 只看该作者
本贴居然还有人发邮件问我。
我告诉不会的,首先将FLASH分区,分成两个不同的程序区,每个程序区都建立一个工程,独立工作。比如起始FLASH800000H到8002000H(注意这里的0我是估的,你们看资料)叫BOOT区,8002000H到末尾叫APP区。
然后,用COSMIC或IAP编译器设置分区;
然后在BOOT区编写写FLASH的代码;APP区编写应用段程序。
BOOT区不能用中断,并且设置中断跳转向量数组,将中断跳转到APP区。
BOOT区利用查询方式获取升级APP区代码的分割数据块(大小任意,可以64字节,也可而已128字节)。
FLASH首先接触保护,然后写。写完再保护。
OK

使用特权

评论回复
40
LPC————| | 2016-9-29 09:55 | 只看该作者
你好!
能否给我一份关于STM8S块操作Flash的代码.
我按照你的步骤去做了,不能块操作啊.而且你没有说明白工程配置怎么设置.我用的STVD.如果没有代码,就给说说怎么设置库文件,怎么设置STVD软件,写代码用到什么函数及其步骤吧!

我邮箱  3228504429@qq.com

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则