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

一个星期了全网没打到答案,一个关于在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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版