OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3865|回复: 5

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

[复制链接]

95

主题

554

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3324
金钱
3324
注册时间
2016-1-7
在线时间
545 小时
发表于 2018-3-21 15:07:38 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 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写操作的问题,还是哪里问题?

最佳答案

查看完整内容[请看2#楼]

根据官方库的写Flash时序,已经OK了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

95

主题

554

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3324
金钱
3324
注册时间
2016-1-7
在线时间
545 小时
 楼主| 发表于 2018-3-21 15:07:39 | 显示全部楼层
根据官方库的写Flash时序,已经OK了。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-3-22 02:04:26 | 显示全部楼层
帮顶
回复

使用道具 举报

95

主题

554

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3324
金钱
3324
注册时间
2016-1-7
在线时间
545 小时
 楼主| 发表于 2018-3-22 10:54:21 | 显示全部楼层
请从事过类似工作或有经验的大神指点一下,哪里出了问题,昨天调试时不小心,还把原子哥的F103开发板SWD口给弄坏了,现在待换103芯片。目前找了一个公司F030的产品板充当目标板连在上面,也是类似问题,能擦除数据,就是不能往目标板Flash中写数据。
回复

使用道具 举报

95

主题

554

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3324
金钱
3324
注册时间
2016-1-7
在线时间
545 小时
 楼主| 发表于 2018-3-23 21:06:32 | 显示全部楼层
大神们呢?
回复

使用道具 举报

0

主题

2

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2016-12-21
在线时间
26 小时
发表于 2018-4-8 15:13:13 | 显示全部楼层
楼主的问题解决没?目前我也是卡在了这里?很想知道最后楼主怎么解决的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-20 22:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表