发 帖  
原厂入驻New
[资料]

PIC读写程序存储器

2014-6-12 10:32:45  3653 存储器
分享
贴上代码,为什么调试的时候执行到READ之后就直接跳到主函数第一行,而不是继续往下执行READ后面的代码,一直这样循环,到底怎么回事啊。
#include "p24fj64ga006.h"
//#define UINT32 unsigned long
#define UINT16 unsigned int
#define UINT8  unsigned char
#define FLASH_ERASEPAGE 0x4042
#define FLASH_PROGLINE  0x4001
void FlashReadData(UINT16 FlashAddr,UINT8 *Dest,UINT8 DataNum)
{
TBLPAG = 0x00;
for(;DataNum>0;DataNum--)
{ asm("tblrdl.b [%1],%0":"=r"(*Dest):"r"(FlashAddr));
   Dest++;
   asm("tblrdh.b [%1],%0":"=r"(*Dest):"r"(FlashAddr));
   Dest++;
   FlashAddr += 2;
}
// return 0;
}
void FlashErasePage(UINT16 FlashAddr)
{
   UINT16 temp16;
   NVMCON = FLASH_ERASEPAGE;
   TBLPAG = 0x00;
   temp16 = FlashAddr;
   asm("tblwtl w0,[w0]");
   NVMKEY = 0x55;
   NVMKEY = 0xaa;
   _WR = 1;
   Nop();
   Nop();
}
void FlashWriteData(UINT16 FlashAddr,UINT8 *Dest,UINT8 DataNum)
{
  UINT16 temp16;
  NVMCON = FLASH_ERASEPAGE;
  TBLPAG = 0x00;
  temp16 = FlashAddr;
  asm("tblwtl w0,[w0]");
  NVMKEY = 0x55;
  NVMKEY = 0xaa;
  _WR = 1;
  Nop();
  Nop();
  NVMCON = FLASH_PROGLINE;
  TBLPAG = 0x00;
  for(;DataNum>0;DataNum--)
{
  asm("tblwtl.b %0,[%1]"::"r"(*Dest),"d"(FlashAddr));
  Dest++;
  asm("tblwth.b %0,[%1]"::"r"(*Dest),"d"(FlashAddr));
  Dest++;
  FlashAddr += 2;
}
NVMKEY = 0x55;
NVMKEY = 0xaa;
_WR = 1;
Nop();
Nop();
}
void main()
{
AD1PCFG=0XFFFF;
int a[1]={0xffff,0x55aa};
int b[1];

TRISB=0;
LATB=0XFFFF;
FlashReadData(0xAC00,b,4);
Nop();
    Nop();
FlashErasePage(0XAC00);
Nop();
    Nop();
FlashWriteData(0xAC00,a,4);
Nop();
    Nop();
FlashReadData(0xAC00,b,4);
while(1);
}

0
分享淘帖 显示全部楼层
· 2014-6-13 21:15:16
你的while(1)是在末尾,。。只会执行一次然后死循环。。。
· 2014-6-16 10:59:53
不是,进入主函数就已经执行一次READ了,不是WHILE上面那条。READ执行完就直接回到主函数首部,没往下执行,一直这样循环。
· 2014-6-25 10:10:07

谢谢楼主分享!
· 2014-6-26 09:46:56
问题解决咯。是给W寄存器附的地址值被覆盖了。        可改成asm("tblwtl %0, [w0]" : /* no outputs */ : "r"(FlashAddr));,调试全部正常了
· 2014-6-26 09:50:58
楼主辛苦了。。。。。。
· 2014-7-1 11:04:55
                          

只有小组成员才能发言,加入小组>>

467个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /7 下一条

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