你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

一个星期了全网没打到答案,一个关于在RAM中运行的问题

[复制链接]
曲阿子期 提问时间:2018-8-13 18:13 /
我要做一个IAP的程序,因为这段程序还要做解密的功能,所以官方的BOOT不能用。我用的分环境是STM8 + STVD + COSMIC。

其实功能我已经实现了,但有个问题,我的BOOT放在FLASH最后面,做过IAP的都知道编程FLASH的动作要在RAM中执行。
假如我写FLASH的函数是:FlashProgram(); 写完要调用 FunctionA();
那么必然有:
#pragma section(FLASH_CODE)
FlashProgram() {
...
}
#pragma section()
FunctionA() {
...
}
...
main() {
...
_fctcpy('F');
...
}
现在问题来了,如果 FlashProgram()的地址超过 0x10000, 那调用FlashProgram()是能正常进入的,但返回时就不对了;
如果FlashProgram()的地址在0xFFFF以内,程序就一切正常;
如果不去调RAM中的FlashProgram(),而是调FLASH中的任意函数,不管地址多大也都是正常的。只要一调RAM中的函数再返回就不对了。

是我在STVD中哪个设置项不对引起的吗?
有没有高手可以指点一下,是不是RAM中最多只能以2BYTE编址引起的,RAM中函数返回后是要跳到3BYTE地址去运行的,所以就出错了?
收藏 评论5 发布时间:2018-8-13 18:13

举报

5个回答
cloudcn 回答时间:2018-8-14 15:15:28
上电以后RAM是空的,你不干涉根本没法执行 怎么你也得在FLASH 开始处 0x800 0000处写些代码, 其实你在FLASH前面留出一个固定大小BOOT区就行了,BOOT区的代码不烧录BOOT区地址就行 ,没必要在费事把FLASH代码搬到RAM里执行

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

feixiang20 回答时间:2018-8-13 23:35:17
之前没遇到同类问题,只能猜测,说到IAP,RAM是以每2Byte来编址的。地址空间的大小一般取决于地址总线,32位机的地址总线一般是32bit的,2^32=4294967296。看看编程前先擦写有没有用。同时查看擦除函数,看着函数说明,正确的传参数。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

zhao.zhao 回答时间:2018-8-14 11:09:16
中断向量表要映射到RAM区的吧。可能问题还不止这一个。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

曲阿子期 回答时间:2018-8-16 16:24:55
cloudcn 发表于 2018-8-14 15:15
上电以后RAM是空的,你不干涉根本没法执行 怎么你也得在FLASH 开始处 0x800 0000处写些代码, 其实你在FLASH ...

0x8000处不一定要有代码的,只要在LINK INPUT中设置断向量表起始地址就可以了。我之后以把BOOT放到最后,是为了APP程序可以用默认设置。还有DATA SHEET中好像有说要对FLASH擦写操作必须在RAM中进行。实际我也试过,不把擦写动用放到RAM,直接去做,但是操作的块和BOOT不重叠,实际并不成功
曲阿子期 回答时间:2018-8-16 16:28:30
zhao.zhao 发表于 2018-8-14 11:09
中断向量表要映射到RAM区的吧。可能问题还不止这一个。

不需要映射到RAM的,当我整个程序不超过32K (也就是地址不超过 0XFFFF)一切都是正常的。只有当程序超过32K,并且擦写FLASH的函数地址在 0xFFFF 以外时才会有问题

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版