本帖最后由 challenger 于 2018-3-22 10:55 编辑
我烧录板F4的SWD连接目标板F1,读取到了目标板的ID号:0x1BA01477,识别到F103的目标板,并根据我要擦除的Flash地址,读取到目标板的所对应的扇区号,并擦除了扇区。然后写数据的时候,没写不进去。用jlink读出来目标板的数据,始终是0xff。我写目标板FLASH数据的程序是:
uint32_t SW_FLASH_WRITE( uint32_t add, uint8_t *data, uint32_t len )
{
uint8_t i,sec;
uint32_t c,c1,d,add1=0;
if(add<FLASH_BASE) return 0; //μØÖ·3¬ÏT
if(add+len>=FLASH_BASE+TO_FLASH_SIZE) return 0;//3¤¶è3¬ÏT
Write_APDP(REG_AP_WCTRL,AP_STAT_32);
SW_FLASH_UNLOCK(); //½aËø
WAIT_FLASH_BUSY(); //BUSY
sec = CHK_ERASE_SEC(add-FLASH_BASE); //éèÇøê×μØÖ·DèòaÏè2á3y£¬2¢ÅäÖÃÏà1رà3ìÄ£ê½
if( sec ) SW_FLASH_ERASE(sec-1,len); //éèÇø2á3y
else //·ÇéèÇøê×μØÖ·DèòaÅäÖÃÏà1رà3ìÄ£ê½
{
sec = GET_FLASH_SEC(add-FLASH_BASE); //μ±Ç°μØÖ·ËùÔúéèÇøoÅ
c = (PSIZE_32<<PSIZE)|(sec<<SNB)|(1<<PG)|(1<<STRT);
SET_FLASH_CR(c); //±à3ìÄ£ê½
}
/*******************¿éòÔD′èÎòa3¤¶è×Ö½ú£¬Ä¿±êμØÖ·2»ÏTÖÆ*******************/
//ÏèD′μúò»¸ö·Ç32bitè«×ÖμØÖ·μÄ×Ö
c = add%4;
if( c )
{
c1 = 0xFFFFFFFF;
for(i=c;(i<4)&&len;i++,len--)
{
d = ~(0xFF<<(i*8));
c1 &= (d|((*data++)<<(i*8)));
}
add1 = add/4*4;
add = add1+4;
WRITE_WORD32(add1,c1);
}
/*******************¿éòÔD′èÎòa3¤¶è×Ö½ú£¬Ä¿±êμØÖ·2»ÏTÖÆ*******************/
//ÔùD′oóDø32bitè«×Ö£¨2»×ã32bit21FF£©
while(len)
{
c = 0xFFFFFFFF;
for(i=0;(i<4)&&len;i++,len--)
{
d = ~(0xFF<<(i*8));
c &= (d|((*data++)<<(i*8)));
}
if( !WRITE_WORD32(add,c) ) break; //D′′íÎó
add += 4;
}
/************************************************************************/
// WAIT_FLASH_BUSY(); //BUSY
// SET_FLASH_CR(0); //½a3y±à3ìÄ£ê½
// SW_FLASH_LOCK(); //éÏËø
if( len ) return 0;
return 1;
}
//////////////////////////////////////////////////////////////
const u32 PASS1=0xA5A5A5A5;
r=SW_FLASH_IN( id );
if(r)
{
//SW_FLASH_ERASE(0,2000 );
//SW_FLASH_WRITE( 0x8000000, (u8*)TEXT_Buffer, 1936 );
r=SW_FLASH_WRITE( 0x8000000, (uint8_t*)&PASS1, sizeof(PASS1) );
SW_FLASH_OU(id);
}
想往目标板写0xA5A5A5A5,怎么就是写不进去,始终是0xff?是我Flash写操作的问题,还是哪里问题?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>