OpenEdv-开源电子网

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

片上FLASH不能连续写入?我这个程序只能成功写入第一个数据

[复制链接]

8

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2016-5-24
在线时间
11 小时
发表于 2016-6-17 00:27:53 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 16165008 于 2016-6-17 11:43 编辑

#include "OnChip_FLASH.h"
#include "MALLOC.h"
#define OnChip_FLASH_ADDRESS 0x08078000
//拷贝数据void OnChip_FLASH_CopyData(void *des,void *src,u32 n)
{
        u8 *desdata=des;
        u8 *srcdata=src;
        u32 i;
        for(i=0;i<n;i++)
        {
                *desdata=*srcdata;
                desdata++;
                srcdata++;
        }
}


//向FLASH写入n个字节
//offset:相对定义的FLASH起始地址的偏移地址  0~32766 for 32KB
//data:
//n
void OnChip_FLASH_WriteNByte(u32 offset,u8 *data,u32 n)
{
        u8 *DataBuff=(u8*)mymalloc(2048);//分配一块内存区域存放一页的数据
        u16 pageindex;
        u16 pageoffset;
        u16 pageremain;
        u32 pageaddr;//页在FLASH中的绝对地址
        u16 i;
        u16 HalfWord;
        
        if(n==0) return;
        if(data==NULL) return;
        if(DataBuff==NULL) return;
        
        n=n/2;//一次写入2个字节
        pageindex=offset/2048;//页码(相对地址)
        pageoffset=offset%2048;//页内偏移
        pageremain=(2048-pageoffset)/2;//页内剩余区间(16位)
        if(n<=pageremain) pageremain=n;
        
        FLASH_Unlock();
        while(1)
        {
                pageaddr=OnChip_FLASH_ADDRESS+(pageindex*2048);
                OnChip_FLASH_CopyData(DataBuff,(u8*)pageaddr,2048);//读出一整页数据
               
                FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);
                FLASH_ErasePage(pageaddr);
               
                for(i=0;i<(pageremain*2);i++)
                {
                        *(u8*)(DataBuff+pageoffset+i)=*(u8*)(data+i);//在指定位置写入要改变的数据,其他位置数据不变
                }
                for(i=0;i<1024;i++)//写入一整页数据
                {
                        HalfWord=*(u8*)(DataBuff+i*2);//低地址低字节
                        HalfWord|=(*(u8*)(DataBuff+i*2+1))<<8;//高地址高字节
                        FLASH_ProgramHalfWord((pageaddr+i*2),HalfWord);//写入半字
                }
               
                if(pageremain==n)//写完了
                {
                        FLASH_Lock();
                        break;
                }
                else//还没有写完
                {
                        pageindex++;//页码+1
                        pageoffset=0;
                        data+=pageremain*2;//写入数据指针偏移
                        n-=pageremain;//减去已经写入的数量
                        if(n>1024) pageremain=1024;//下一页还是写不完
                        else pageremain=n;
                }
        }
        myfree(DataBuff);//释放动态分配的内存区域
}

//读出n个字节
//offset:相对偏移地址
//data:存放数据的指针
//n数据数量(byte)
void OnChip_FLASH_ReadNByte(u32 offset,u8 *data,u32 n)
{
        u32 absAddr=OnChip_FLASH_ADDRESS+offset;
        while(n--)
        {
                *(data++)=*((u8*)(absAddr++));
        }
}



最佳答案

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

试好了,去掉FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);这一行就好了,实在是诡异
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2016-5-24
在线时间
11 小时
 楼主| 发表于 2016-6-17 00:27:54 | 显示全部楼层
憨厚诚实大叔 发表于 2016-6-17 21:20
好吧,你加上返回值判断,看看是哪里写不进去,为什么写不进去,再找程序的问题

试好了,去掉FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);这一行就好了,实在是诡异
回复

使用道具 举报

20

主题

138

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
346
金钱
346
注册时间
2012-10-11
在线时间
136 小时
发表于 2016-6-17 09:12:05 | 显示全部楼层
绑定,,,,,
回复

使用道具 举报

8

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2016-5-24
在线时间
11 小时
 楼主| 发表于 2016-6-17 11:52:12 | 显示全部楼层
大神们,快来帮帮忙啊?别沉了
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-6-17 20:57:59 | 显示全部楼层
for(i=0;i<1024;i++)//写入一整页数据
                {
                         HalfWord=*(u8*)(DataBuff+i*2);//低地址低字节
                        HalfWord|=(*(u8*)(DataBuff+i*2+1))<<8;//高地址高字节
                        FLASH_ProgramHalfWord((pageaddr+i*2),HalfWord);//写入半字
                }

这里是写了2页的数据了吧
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-6-17 21:01:22 | 显示全部楼层
        pageindex=offset/2048;//页码(相对地址)
        pageoffset=offset%2048;//页内偏移

一页是1024个字节
回复

使用道具 举报

8

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2016-5-24
在线时间
11 小时
 楼主| 发表于 2016-6-17 21:14:34 | 显示全部楼层
憨厚诚实大叔 发表于 2016-6-17 21:01
pageindex=offset/2048;//页码(相对地址)
        pageoffset=offset%2048;//页内偏移

我用的F103ZE,每页是2K
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-6-17 21:18:53 | 显示全部楼层
虽然说你擦除1页,写2页的数据,不过也不应该出现只写入一个数据的情况
FLASH_ErasePage
FLASH_ProgramHalfWord
这2个函数有返回值的,加上判断他的返回值语句,在他返回值不对的情况下打印出来,看看是写第几个数据的时候出现的错误,是什么错误
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-6-17 21:20:09 | 显示全部楼层
16165008 发表于 2016-6-17 21:14
我用的F103ZE,每页是2K

好吧,你加上返回值判断,看看是哪里写不进去,为什么写不进去,再找程序的问题
回复

使用道具 举报

8

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2016-5-24
在线时间
11 小时
 楼主| 发表于 2016-6-17 21:54:42 | 显示全部楼层
憨厚诚实大叔 发表于 2016-6-17 21:20
好吧,你加上返回值判断,看看是哪里写不进去,为什么写不进去,再找程序的问题

一开始我就加上了status判断,返回值都是COMPLETE,printF没有出现任何报错,最后才删了的。

我看资料上写的如果sysclock>24MHz时,要操作FLASH必须把预取指等待设为2周期,而且HSI必须开启,试了还是不行,真不知道哪儿出了问题
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-12 05:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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