这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » [求助]程序把自身拷贝到RAM中运行无法擦写FLASH

共4条 1/1 1 跳转至

[求助]程序把自身拷贝到RAM中运行无法擦写FLASH

菜鸟
2006-03-09 23:20:00     打赏

我的目标班上的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调试的时候怎么可以了呢。

希望各位大虾给指点一下!




关键词: 求助     程序     自身     拷贝     运行     无法     擦写     FLAS    

菜鸟
2006-03-09 23:36:00     打赏
2楼
请确保程序拷贝是正确的,另外,你的程序从FLASH拷贝到SDRAM后,因为地址变了,你的程序是否还能够正确运行?

菜鸟
2006-03-10 16:17:00     打赏
3楼

谢谢twentyone!

搞定了!

原来是我之前没有加上volatile关键词,而JTAG调试和写入FLASH的程序使用两个不同的生成目标编译的,它们的优化级别不同,所以才会调试的时候没问题,而烧写进去后就会有问题。加上volatile就一切ok了,至于编译器是怎么优化的,俺还要在研究一下。


菜鸟
2006-03-10 19:38:00     打赏
4楼
[em17][em17][em17]

共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]