最近做MC9S12XEP100的bootloader,在做Flash的驱动的时候遇到一个问题,我用的芯片Flash的大小应该是1024K的,对应的flash地址为0x70_0000—0x7F_FFFF,对应的block如下:
Global Address | Size(Bytes) | Description
0x7C_0000 – 0x7F_FFFF 256 K P-Flash Block 0 Contains Flash Configuration Field
0x7A_0000 – 0x7B_FFFF 128 K P-Flash Block 1N
0x78_0000 – 0x79_FFFF 128 K P-Flash Block 1S
0x74_0000 – 0x77_FFFF 256 K P-Flash Block 2
0x70_0000 – 0x73_FFFF 256 K P-Flash Block 3
驱动代码完全按照芯片的DS的流程写的,现在的问题是在写0x70_0000—0x7B_FFFF时都没有问题,在写Block0 时,在进入写Flash函数一步步的单步调试,没有问题。但是一按全速运行芯片好像就跑飞了。我怀疑过是看门狗和中断的问题,但是我把看门狗和中断都关了,问题还在。也不大像是flash保护,因为我在调试窗口看到芯片开始写的地址开头8个字节(函数执行一次写进8个字节)是有数据的。只是写完这8个字节,就跳到别的地方了。
我的驱动代码如下:
void PFlash_Set( uint Block,uint Addr,uint Data[],uint j)
{
while( FCLKDIV_FDIVLD != 1 )
FCLKDIV = 0x03;
while( FSTAT_CCIF != 1 );
if( ( FSTAT_ACCERR == 1 ) || ( FSTAT_FPVIOL == 1 ) )
FSTAT |= 0x30;
FPROT_FPOPEN = 1; //不保护,2016/1/5
FPROT_FPHDIS = 1;
FPROT_FPLDIS = 1;
FCCOBIX_CCOBIX = 0x00;
FCCOBHI = 0x06;
FCCOBLO = Block;
FCCOBIX_CCOBIX = 0x01;
FCCOB = Addr;
FCCOBIX_CCOBIX = 0x02;
FCCOB = Data[j];
FCCOBIX_CCOBIX = 0x03;
FCCOB = Data[j+1];
FCCOBIX_CCOBIX = 0x04;
FCCOB = Data[j+2];
FCCOBIX_CCOBIX = 0x05;
FCCOB = Data[j+3];
FSTAT_CCIF = 1;
//delay(10);
while( FSTAT_CCIF != 1 );
}
研究的东西可能比较偏,做过的人可能不多,但是实在没有办法了。