F4脱机烧录器,将目标板的Flash擦除后,目标板写不进去数据。

2019-07-20 08:48发布

本帖最后由 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;                                                //μ&#216;&#214;·3&#172;&#207;T
        if(add+len>=FLASH_BASE+TO_FLASH_SIZE) return 0;//3¤&#182;è3&#172;&#207;T

        Write_APDP(REG_AP_WCTRL,AP_STAT_32);
        SW_FLASH_UNLOCK();                                                                                        //&#189;a&#203;&#248;
        WAIT_FLASH_BUSY();                                                                                        //BUSY
        
        sec = CHK_ERASE_SEC(add-FLASH_BASE);                //éè&#199;&#248;ê×μ&#216;&#214;·Dèòa&#207;è2á3y£&#172;2¢&#197;&#228;&#214;&#195;&#207;à1&#216;±à3ì&#196;£ê&#189;
        if( sec ) SW_FLASH_ERASE(sec-1,len);                //éè&#199;&#248;2á3y
        else                                                                                                                                                //·&#199;éè&#199;&#248;ê×μ&#216;&#214;·Dèòa&#197;&#228;&#214;&#195;&#207;à1&#216;±à3ì&#196;£ê&#189;
        {
                sec = GET_FLASH_SEC(add-FLASH_BASE);        //μ±&#199;°μ&#216;&#214;·&#203;ù&#212;úéè&#199;&#248;o&#197;
                c = (PSIZE_32<<PSIZE)|(sec<<SNB)|(1<<PG)|(1<<STRT);
                SET_FLASH_CR(c);                                                                                        //±à3ì&#196;£ê&#189;
        }
/*******************&#191;éò&#212;D′è&#206;òa3¤&#182;è×&#214;&#189;ú£&#172;&#196;&#191;±êμ&#216;&#214;·2&#187;&#207;T&#214;&#198;*******************/
//&#207;èD′μúò&#187;&#184;&#246;·&#199;32bitè&#171;×&#214;μ&#216;&#214;·μ&#196;×&#214;
        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);
        }

/*******************&#191;éò&#212;D′è&#206;òa3¤&#182;è×&#214;&#189;ú£&#172;&#196;&#191;±êμ&#216;&#214;·2&#187;&#207;T&#214;&#198;*******************/
//&#212;ùD′oóD&#248;32bitè&#171;×&#214;£¨2&#187;×&#227;32bit21FF£&#169;
        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′′í&#206;ó
                add += 4;
        }
/************************************************************************/
        
//        WAIT_FLASH_BUSY();                                                                                        //BUSY
//        SET_FLASH_CR(0);                                                                                                //&#189;a3y±à3ì&#196;£ê&#189;
//        SW_FLASH_LOCK();                                                                                                //é&#207;&#203;&#248;

        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写操作的问题,还是哪里问题?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。