我的目标班上的CPU是AT91M40800,它带有8KB的内RAM;FLASH为SST39VF800,基址为0x1000000;外RAM为IS62LV12816,基址为0x400000
我在JTAG接口调试时,无论把程序下载到内部RAM还是外部RAM都能正常的实现对FLASH的擦写,但是,当把程序写入FLASH,然后把自身拷贝到内部RAM中或外部RAM中运行时,总是无法实现对FLASH的擦写。
我程序的RO_Base为0x0,RW_Base未设置
在存储器重映射前进行了自拷贝。
擦写FLASH代码如下:
/**************************************************************************
检测flash的DQ6位,确认擦除的完成
**************************************************************************/
static void readtogglebit(void)
{
INT16U read1, read2, i;
for(i=0;;i++) {
read1 = *(volatile INT16U *)SST_BASE_ADDR & 0x4040;
read2 = *(volatile INT16U *)SST_BASE_ADDR & 0x4040;
if (read1 == read2) {
PrintFromUART(UART_FLASH, "\ni=");
SendFromUART_HEX(UART_FLASH, i);
break;
}
}
}
void SectorErase_Flash(INT8U nSector)
{
if (nSector >= SST_SECTOE_NUM) return; //ErrExit(ERR_FLASH_WRITEADDR);
if (nSector < SST_SECTOR_LIMIT) return; //ErrExit(ERR_FLASH_WRITEADDR);
*((volatile INT16U *)SST_BASE_ADDR + SST_ADDR_UNLOCK1) = SST_DATA_UNLOCK1; //连续解锁.
*((volatile INT16U *)SST_BASE_ADDR + SST_ADDR_UNLOCK2) = SST_DATA_UNLOCK2;
*((volatile INT16U *)SST_BASE_ADDR + SST_ADDR_UNLOCK1) = SST_SETUP_ERASE;
*((volatile INT16U *)SST_BASE_ADDR + SST_ADDR_UNLOCK1) = SST_DATA_UNLOCK1;
*((volatile INT16U *)SST_BASE_ADDR + SST_ADDR_UNLOCK2) = SST_DATA_UNLOCK2;
*((volatile INT16U *)FlashAbsAddr(nSector, 0)) = SST_SECTOR_ERASE; //写入擦除命令.
readtogglebit();
}
调试信息如下:
Begin Erase the Last Sector!
i=00
Erase flash OK!,Start flash write test...
05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe ff 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe ff 00 01 02 03 04
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00
i=00 Flash write successed:
j=00
checkPtr=01 07 f0 00
*checkPtr=ff ff
testPtr=00 00 0f b0
*testPtr=06 05
test=05 07
check error!
好像解锁根本没有效果,但是通过JTAG调试的时候怎么可以了呢。
希望各位大虾给指点一下!