搜索
bottom↓
回复: 3

IAP教程里的擦除函数怎么用啊

[复制链接]

出0入0汤圆

发表于 2013-1-26 01:49:34 | 显示全部楼层 |阅读模式
void EFLASH_erase(unsigned char ucAddress) //擦除是按页擦除的……不是象AVR一样擦除。郁闷ing
{ //擦除扇区
      /* Wait for completion of previous write */

      while(EECR & (1 << EEPE));

      /* Set up Address register */
      EEARH = ucAddress;
      /* Set up EFLASH erase Operation */
      EECR |= (1 << EEPM2) | (1 << EEPM0);
      EECR &= ~(1 << EEPM1);
      /* Write logic one to EEMPE*/
      EECR |= (1 << EEMPE);
      /* Start EEPROM programming by writing EEPE */
      EECR |= (1 << EEPE);
}
每次执行到置位EEPE的时候都会发生一次系统复位。我确保在调用该函数前调用了cli。但是依然没办法。不过如果注释掉EECR那一行就没有问题。
不知为什么执行EEPE的时候会发生系统复位。另外就是那个ucAddress直接是用页号吗?

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2013-1-26 01:51:22 | 显示全部楼层
本帖最后由 xwkm 于 2013-1-26 01:57 编辑

这个是gcc生成的汇编代码。貌似没啥不对劲的
00001a86 <EFLASH_erase>:
    1a86:        f9 99               sbic        0x1f, 1        ; 31
    1a88:        fe cf               rjmp        .-4              ; 0x1a86 <EFLASH_erase>
    1a8a:        82 bd               out        0x22, r24        ; 34
    1a8c:        8f b3               in        r24, 0x1f        ; 31
    1a8e:        80 69               ori        r24, 0x90        ; 144
    1a90:        8f bb               out        0x1f, r24        ; 31
    1a92:        fd 98               cbi        0x1f, 5        ; 31
    1a94:        fa 9a               sbi        0x1f, 2        ; 31
    1a96:        00 00               nop
    1a98:        08 95               ret

每次一置位EEPE立马就复位

出0入0汤圆

 楼主| 发表于 2013-1-26 21:16:43 | 显示全部楼层
问题已经解决。原因是我写的启动代码没有初始zero flag

出0入0汤圆

 楼主| 发表于 2013-1-26 21:31:29 | 显示全部楼层
void EraseAP()
{//擦除AP区域
        //这里比较危险,非常容易自宫
        //流程,从0擦到bootloader的开始值(保存INT0和RESET的中断值)。然后调用prog写回去
        unsigned int i;
        wdt_disable();
        cli();//关闭中断
        for(i=0;i<8;i++)
        {//把原来的中断向量表读入内存
                 cache[i]=pgm_read_byte(i);
        }
        PORTA=0x00;
        for(i=0;i<((BOOT_START-1)/SECTOR_SIZE);i++)
        {
                EFLASH_erase(i);//擦除扇区
        }
        /*EFLASH_write(0,0x0c,0x94);
        EFLASH_write(2,0x76,0x0b);
        EFLASH_write(4,0x0c,0xae);
        EFLASH_write(6,0x76,0x0b);*/
        for(i=0;i<8;i+=2)
        {
                EFLASH_write(i,cache[i],cache[i+1]);
        }
        //sei();//开中断
}
这段代码在我的bootloaderHID里面仅仅用于擦除APP区。bootloader仍然控制INT0和RESET向量
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-12 16:50

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表