OpenEdv-开源电子网

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

会用FLASH的大神请指教,我往FLASH里写数据,读出来却是FF FF,这是为什么?

[复制链接]

44

主题

298

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
209
金钱
209
注册时间
2016-9-9
在线时间
84 小时
发表于 2016-11-2 11:37:48 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 dreamARM 于 2016-11-2 15:51 编辑

int main(void)
{
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢
        while(1)
        {
                  step++;
                        MotorRun(3,step);
                if(step>=65535)
                        step=0;
                if(KEY2==0)        //KEY0按下,读取字符串并显示
                        {
                                delay_ms(20);
                                if(KEY2==0)        //KEY0按下,读取字符串并显示        
                    {
                            STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)flash,SIZE);
                                  txbuf[0]=flash/256;
                                    txbuf[1]=flash%256;
                                   send_char(txbuf[0]);
                                        delay_ms(1);
                                   send_char(txbuf[1]);        
                    }
            }         
  }
void USART1_IRQHandler(void)
{
        //unsigned char recdata;
        unsigned char res;
        if(USART_GetITStatus(USART1,USART_IT_RXNE)==SET)
        {
                 res = USART_ReceiveData(USART1);
          if (res==0x01)
                  {
                                        STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)step,SIZE);
                           rxbuf[0]=step/256;
                               rxbuf[1]=step%256;
                             send_char(rxbuf[0]);
                            send_char(rxbuf[1]);
                        }
                }                          
}                        
这个程序的用法是  step 在主程序里自增, 当我发出01命令时候,可以显示并储存当前step值,以后上电开机,或是按KEY2都可以直接读出来,但是现在读出来全是00.
麻烦大家了!

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2016-11-2 12:53:19 | 显示全部楼层
STMFLASH_Write()这个函数代码贴出来
回复

使用道具 举报

7

主题

247

帖子

0

精华

高级会员

Rank: 4

积分
745
金钱
745
注册时间
2016-1-20
在线时间
78 小时
发表于 2016-11-2 12:57:35 | 显示全部楼层
FF是没有数据,也就是说没有写进去。rxbuf[num] 里面的num是在那里设的变量?num自增和清零在那里实现的?程序贴的不全不好分析吧!
回复

使用道具 举报

44

主题

298

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
209
金钱
209
注册时间
2016-9-9
在线时间
84 小时
 楼主| 发表于 2016-11-2 15:39:01 | 显示全部楼层
八度空间 发表于 2016-11-2 12:53
STMFLASH_Write()这个函数代码贴出来


STMFLASH_Write()和 STMFLASH_Read()全是用的正点原子官方的:

void STMFLASH_Write(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite)       
{
        u32 secpos;           //扇区地址
        u16 secoff;           //扇区内偏移地址(16位字计算)
        u16 secremain; //扇区内剩余地址(16位字计算)          
        u16 i;   
        u32 offaddr;   //去掉0X08000000后的地址
        if(WriteAddr<STM32_FLASH_BASE||(WriteAddr>=(STM32_FLASH_BASE+1024*STM32_FLASH_SIZE)))return;//非法地址
        FLASH_Unlock();                                                //解锁
        offaddr=WriteAddr-STM32_FLASH_BASE;                //实际偏移地址.
        secpos=offaddr/STM_SECTOR_SIZE;                        //扇区地址  0~127 for STM32F103RBT6
        secoff=(offaddr%STM_SECTOR_SIZE)/2;                //在扇区内的偏移(2个字节为基本单位.)
        secremain=STM_SECTOR_SIZE/2-secoff;                //扇区剩余空间大小   
        if(NumToWrite<=secremain)secremain=NumToWrite;//不大于该扇区范围
        while(1)
        {       
                STMFLASH_Read(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE,STMFLASH_BUF,STM_SECTOR_SIZE/2);//读出整个扇区的内容
                for(i=0;i<secremain;i++)//校验数据
                {
                        if(STMFLASH_BUF[secoff+i]!=0XFFFF)break;//需要擦除            
                }
                if(i<secremain)//需要擦除
                {
                        FLASH_ErasePage(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE);//擦除这个扇区
                        for(i=0;i<secremain;i++)//复制
                        {
                                STMFLASH_BUF[i+secoff]=pBuffer;          
                        }
                        STMFLASH_Write_NoCheck(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE,STMFLASH_BUF,STM_SECTOR_SIZE/2);//写入整个扇区  
                }else STMFLASH_Write_NoCheck(WriteAddr,pBuffer,secremain);//写已经擦除了的,直接写入扇区剩余区间.                                   
                if(NumToWrite==secremain)break;//写入结束了
                else//写入未结束
                {
                        secpos++;                                //扇区地址增1
                        secoff=0;                                //偏移位置为0          
                  pBuffer+=secremain;          //指针偏移
                        WriteAddr+=secremain;        //写地址偏移          
                  NumToWrite-=secremain;        //字节(16位)数递减
                        if(NumToWrite>(STM_SECTOR_SIZE/2))secremain=STM_SECTOR_SIZE/2;//下一个扇区还是写不完
                        else secremain=NumToWrite;//下一个扇区可以写完了
                }         
        };       
        FLASH_Lock();//上锁
}
void STMFLASH_Read(u32 ReadAddr,u16 *pBuffer,u16 NumToRead)          
{
        u16 i;
        for(i=0;i<NumToRead;i++)
        {
                pBuffer=STMFLASH_ReadHalfWord(ReadAddr);//读取2个字节.
                ReadAddr+=2;//偏移2个字节.       
        }
}

麻烦版主了!
回复

使用道具 举报

44

主题

298

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
209
金钱
209
注册时间
2016-9-9
在线时间
84 小时
 楼主| 发表于 2016-11-2 15:50:37 | 显示全部楼层
footprint 发表于 2016-11-2 12:57
FF是没有数据,也就是说没有写进去。rxbuf[num] 里面的num是在那里设的变量?num自增和清零在那里实现的? ...

你好,我更新了一下题目,你帮我看看呗?
回复

使用道具 举报

21

主题

387

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1043
金钱
1043
注册时间
2016-9-8
在线时间
213 小时
发表于 2016-11-2 16:24:36 | 显示全部楼层
简单点写就行呗,,搞那么麻烦
烦烦烦.png
shop60994719.taobao.com
回复

使用道具 举报

44

主题

298

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
209
金钱
209
注册时间
2016-9-9
在线时间
84 小时
 楼主| 发表于 2016-11-2 16:34:25 | 显示全部楼层
密耳 发表于 2016-11-2 16:24
简单点写就行呗,,搞那么麻烦

LENTH,为什么要除以2? 你这个程序是做什么的呢, 我的 STEP,是16位数据,最大65535
回复

使用道具 举报

21

主题

387

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1043
金钱
1043
注册时间
2016-9-8
在线时间
213 小时
发表于 2016-11-2 16:39:19 | 显示全部楼层
dreamARM 发表于 2016-11-2 16:34
LENTH,为什么要除以2? 你这个程序是做什么的呢, 我的 STEP,是16位数据,最大65535

lenth是存FALSH的字节数,FLASH写一般需要半字或者字,所以变成半字的实际数据长度就除以2了。
shop60994719.taobao.com
回复

使用道具 举报

7

主题

247

帖子

0

精华

高级会员

Rank: 4

积分
745
金钱
745
注册时间
2016-1-20
在线时间
78 小时
发表于 2016-11-3 13:34:52 | 显示全部楼层
dreamARM 发表于 2016-11-2 15:39
STMFLASH_Write()和 STMFLASH_Read()全是用的正点原子官方的:

void STMFLASH_Write(u32 WriteAddr ...

兄弟,你要用正点原子官方的就一点都别改呀!你觉得while(1)是不是死循环?

while(1)?

while(1)?
回复

使用道具 举报

7

主题

247

帖子

0

精华

高级会员

Rank: 4

积分
745
金钱
745
注册时间
2016-1-20
在线时间
78 小时
发表于 2016-11-3 13:36:38 | 显示全部楼层
footprint 发表于 2016-11-3 13:34
兄弟,你要用正点原子官方的就一点都别改呀!你觉得while(1)是不是死循环?

我看错了!
回复

使用道具 举报

44

主题

298

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
209
金钱
209
注册时间
2016-9-9
在线时间
84 小时
 楼主| 发表于 2016-11-4 11:07:54 | 显示全部楼层
密耳 发表于 2016-11-2 16:24
简单点写就行呗,,搞那么麻烦

我咋没听懂呢。 存16位的数要除以二, 存32位的数就不用吗?
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2016-12-15
在线时间
1 小时
发表于 2016-12-16 08:34:45 来自手机 | 显示全部楼层
请问楼主最后解决了吗,我也遇到了相同的问题,求指导
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-26 08:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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