首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

[求助]9s08gt32烧写FLASH数据问题

[求助]9s08gt32烧写FLASH数据问题

目前本人正在使用9s08gt32,使用到片上用程序来修改存放在FLASH中的数据
我已按照PDF资料上的流程编写了FLASH的页擦除及烧写程序,
但用调试器进行调试时发现,只有单步运行时FLASH的擦除及烧写正常,而自动运行时则失败,且片子会跑飞导致看门狗复位.
请问为什么会发生这种情况,如何才能正确的修改FLASH
希望有高手可以指点迷津,在下感激不尽

附程序:
void FlashDO (byte aaa)
{
FCMD = aaa;//指令输入,0x40为页擦除,0x20为字节烧写
FSTAT = 0x80;//开始执行指令
asm{
nop
nop
nop
nop
}
if(FSTAT_FPVIOL||FSTAT_FACCERR==1){
Sys_Error|=0x01;//烧写故障,记标记
} else{
while(FSTAT_FCCF==0){}//等待完成
}
}
void write_data (void)
{
byte *Flash_ptr; // Flash pointer
word i;
byte databuffer[20];

Flash_ptr = (byte *) 0xd000; //指针指向数据在FLASH中的地址
for(i = 0; i < 20; i++)
{
databuffer = 0; //数据缓存初始化,测试时全为0
}
//__RESET_WATCHDOG(); /* feeds the dog */
Sys_Error&=~0x01; //清故障标记
if(FSTAT_FACCERR==1) {
FSTAT_FACCERR=1; //若有错误,先清除
}
//FCDIV=0x89; //设置频率
*(Flash_ptr)=0; //写FLASH
FlashDO(0x40); //擦除该FLASH页指令
for (i = 0; i < 20; i++){
//__RESET_WATCHDOG(); /* feeds the dog */
if(FSTAT_FACCERR==1) {
FSTAT_FACCERR=1; //若有错误,先清除
}
//FCDIV=0x89; //设置频率
*(Flash_ptr + i) = *(databuffer + i); //写FLASH
FlashDO(0x20); //字节烧写FLASH指令
}
}

你可以先将COP和中断关闭试试。
海纳百川  有容乃大
感谢版主的回复!
我关闭了COP,并且在进入程序前关闭了中断,发现问题依旧存在
至于跑飞的原因我已查到:
自动运行时,当擦除指令正确执行后,发现返回到程序write_data时SP堆栈出错,也可以认为是RTS指令没有被正确执行(曾在RTS指令上设置过断点,自动运行时该指令居然会被跳过!!),但单步运行的话一切正常.
我也试了不用子程序的方法,直接放在write_data里输入指令,的确没有了RTS的问题了,
不过,i=0语句却被跳过.....
这可能都是优化的问题。你可以关闭优化试试。
海纳百川  有容乃大
问题终于得到了解决,
关闭了看门狗和中断后,用了老帖子里提到的将子程序复制到RAM区去运行的方法....
虽然不知道为什么要这么做,不过,程序放RAM区运行时,没有发生跑飞的异常情况,程序之间的跳转完全正常
请问一下版主~
程序放在RAM区执行与放在FLASH中执行为何有如此差别,
难道是因为烧写FALSH时会导致整个FLASH区域在短时间内读写异常?
总觉得要把程序放在RAM中执行的安全性低了点
返回列表