本帖最后由 Ryanhsiung 于 2011-12-2 15:35 编辑
香主可以先看一下这个帖子,这是很早以前的发的帖子求救STM8 频率突变? 一直没有找到原因和解决方法,到今年离职后也没有再理会这个问题了!
前两天与同事聊天,发现他们经过多次验证,以经解决这个问题了。
但是还是不知道原因??
虽然我现在没有用STM8,但是这个问题一直挂在我的心头,特向香主求助
以下是解决方法:
一、
拷了一个lnkstm8s208rb.icf在工程里面,修改里面的内容:
/*这是自己添加的一个区*/
define region MYFuncCode = [from 0x20000 to0x27FFF];
… …
/*把自定义段放在指定区的起始位置,而且只有delay函数放在这个段,这样delay函数地址就定死了*/
place at start of MYFuncCode
{ ro section .mysection };
二、在iar中指定这个icf的位置,
#pragma section =".mysection"
void
delay(u16
temp) @
".mysection"
{
unsigned char
i ;
while(temp-->0)
{
for(i=0;i<=80;i++);
}
}
四、编译后查看.map文件,查看delay函数的具体位置
delay
0x020000
0x15
Code
Gb
public.o [1]
exit
0x008101
0x4
Code
Gb
exit.o [5]
main
0x00823c
0x2f
Code
Gb
main.o [1]
可以看到delay被一直限制在地址0x020000,就是我们自己分配的空间。
五、这样修改后,只要delay函数本身不被修改,那么固定的参数,照成的执行时间也是固定的,当然,这里假设中断已被屏蔽或者执行期间无中断发生。 |