我要做一个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地址去运行的,所以就出错了? |
评分
查看全部评分
评分
查看全部评分
评分
查看全部评分
0x8000处不一定要有代码的,只要在LINK INPUT中设置断向量表起始地址就可以了。我之后以把BOOT放到最后,是为了APP程序可以用默认设置。还有DATA SHEET中好像有说要对FLASH擦写操作必须在RAM中进行。实际我也试过,不把擦写动用放到RAM,直接去做,但是操作的块和BOOT不重叠,实际并不成功
不需要映射到RAM的,当我整个程序不超过32K (也就是地址不超过 0XFFFF)一切都是正常的。只有当程序超过32K,并且擦写FLASH的函数地址在 0xFFFF 以外时才会有问题