OpenEdv-开源电子网

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

关于STM32F030的内部flash读写问题

[复制链接]

14

主题

42

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
220
金钱
220
注册时间
2017-3-22
在线时间
46 小时
发表于 2017-8-21 09:11:01 | 显示全部楼层 |阅读模式
5金钱
要怎么在STM32F030的内部flash写入一个变量,和读取一个变量
W6WVY9FLBED]W7Q)BNMF3E5.png
BG4FR5O@RY9@OF~9ITG{LUE.png

最佳答案

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

方法可以参考原子哥的F1,原理一样
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

56

主题

1237

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2644
金钱
2644
注册时间
2014-2-13
在线时间
518 小时
发表于 2017-8-21 09:11:02 | 显示全部楼层
方法可以参考原子哥的F1,原理一样
技术交流,Sell 中颖单片机,欢迎私信骚扰
回复

使用道具 举报

14

主题

42

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
220
金钱
220
注册时间
2017-3-22
在线时间
46 小时
 楼主| 发表于 2017-8-21 09:12:17 | 显示全部楼层
我读出来的数据空了好几个空格
回复

使用道具 举报

1

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1461
金钱
1461
注册时间
2011-12-1
在线时间
110 小时
发表于 2017-8-21 09:22:23 | 显示全部楼层
如果你的串口打印信息,每次都是显示的一样的话,那可能就是你的读写函数有问题,读的函数问题可能性更大。如果不是每次一样的话,可以换个串口助手试下!
回复

使用道具 举报

14

主题

42

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
220
金钱
220
注册时间
2017-3-22
在线时间
46 小时
 楼主| 发表于 2017-8-21 10:37:39 | 显示全部楼层
xlong_06 发表于 2017-8-21 09:22
如果你的串口打印信息,每次都是显示的一样的话,那可能就是你的读写函数有问题,读的函数问题可能性更大。 ...

串口调试助手没问题的,我感觉是我的读写函数有问题,可是不知道问题出在哪里
回复

使用道具 举报

14

主题

42

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
220
金钱
220
注册时间
2017-3-22
在线时间
46 小时
 楼主| 发表于 2017-8-21 10:40:26 | 显示全部楼层
xlong_06 发表于 2017-8-21 09:22
如果你的串口打印信息,每次都是显示的一样的话,那可能就是你的读写函数有问题,读的函数问题可能性更大。 ...

[mw_shl_code=applescript,true]#include "stm32f0xx.h"
#include "delay.h"
#include "iflash.h"
#define FLASH_PAGE_SIZE 1024
u8 FLASH_BUF[FLASH_PAGE_SIZE];
u8 Read_BUF[FLASH_PAGE_SIZE];

//±ØDëè·±£ËùD′μÄμØÖ··¶Î§ÄúμÄêy¾Yè«2¿Îa0XFF,·ñÔòÔú·Ç0XFF′|D′èëμÄêy¾Y½«ê§°ü!
//¾ßóD×Ô¶ˉ»»ò31|Äü
//ÔúÖ¸¶¨μØÖ·¿aê¼D′èëÖ¸¶¨3¤¶èμÄêy¾Y,μ«êÇòaè·±£μØÖ·2»Ô½½ç!
//pBuffer:êy¾Y′æ′¢Çø
//WriteAddr:¿aê¼D′èëμÄμØÖ·(24bit)
//NumByteToWrite:òaD′èëμÄ×Ö½úêy(×î′ó65535)
u8 Flash_Write_Check(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)   
{                                           
        u16 i;
        u32 RamSource;
        RamSource =(u32)pBuffer;
        for(i=0;i<NumByteToWrite;i+=4)
        {
                FLASH_ProgramWord(WriteAddr, *(u32*)RamSource);
        if (*(u32*)WriteAddr != *(u32*)RamSource)
        {          
                         return 1;
                }
                WriteAddr += 4;
        RamSource += 4;
        }
       
        return 0;
}

//2á3yò&#187;&#184;&#246;éè&#199;&#248;
//Dst_Addr:éè&#199;&#248;μ&#216;&#214;·
//2á3yò&#187;&#184;&#246;é&#189;&#199;&#248;μ&#196;×&#238;éùê±&#188;&#228;:150ms
void Flash_Erase_Sector(u32 Dst_Addr)   
{   
        Dst_Addr*=FLASH_PAGE_SIZE;
        FLASH_ErasePage(Dst_Addr);
   
}  

void Flash_Read(u8* pBuffer,u32 ReadAddr,u16 NumByteToRead)   
{
        u16 i;                                                                                                        
        u8 *p;
        p = (u8*)ReadAddr;

    for(i=0;i<NumByteToRead;i++)
    {
        pBuffer=*p++;   //&#209;-&#187;·&#182;áêy  
    }
                 
}  
u8 Flash_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)   
{
        u32 secpos;
        u16 secoff;
        u16 secremain;          
        u16 i;  
        u8 ret;  

        secpos=WriteAddr/FLASH_PAGE_SIZE;//éè&#199;&#248;μ&#216;&#214;·
        secoff=WriteAddr%FLASH_PAGE_SIZE;//&#212;úéè&#199;&#248;&#196;úμ&#196;&#198;&#171;ò&#198;
        secremain=FLASH_PAGE_SIZE-secoff;//éè&#199;&#248;ê£óà&#191;&#213;&#188;&#228;′óD&#161;   

        if(NumByteToWrite<=secremain)secremain=NumByteToWrite;//2&#187;′óóú1024&#184;&#246;×&#214;&#189;ú

        while(1)
        {       
                Flash_Read(FLASH_BUF,secpos*FLASH_PAGE_SIZE,FLASH_PAGE_SIZE);//&#182;á3&#246;&#213;&#251;&#184;&#246;éè&#199;&#248;μ&#196;&#196;úèY
                /*
                if(secoff!=0)
                {
                    for(i=0;i<secremain;i++)//D£&#209;éêy&#190;Y
                    {
                            if(FLASH_BUF[secoff+i]!=0XFF)break;//Dèòa2á3y            
                    }
                }
                */
                //if(secoff==0 || i<secremain)//Dèòa2á3y
                {
                        FLASH_ErasePage(secpos*FLASH_PAGE_SIZE);//2á3y&#213;a&#184;&#246;éè&#199;&#248;
                        delay_ms(3);
                        for(i=0;i<secremain;i++)           //&#184;′&#214;&#198;
                        {
                                FLASH_BUF[i+secoff]=pBuffer;          
                        }
                        //ret = Flash_Write_Check(FLASH_BUF,secpos*FLASH_PAGE_SIZE,FLASH_PAGE_SIZE);//D′è&#235;&#213;&#251;&#184;&#246;éè&#199;&#248;  
                        ret = Flash_Write_Check(FLASH_BUF,secpos*FLASH_PAGE_SIZE,FLASH_PAGE_SIZE);
                        if(ret!=0) //wangxl@20170218 D&#194;&#212;&#246;
                        {
                            ret = Flash_Write_Check(FLASH_BUF,secpos*FLASH_PAGE_SIZE,FLASH_PAGE_SIZE); //wangxl@20170218 D&#194;&#212;&#246;&#212;ùD′ò&#187;′&#206;
                        }
                        if(ret!=0) break; //wangxl@20170218 D&#194;&#212;&#246;D′è&#235;3&#246;′íí&#203;3&#246;
                        
                        delay_ms(1);

                }
               /*
                else
                {
                        ret=Flash_Write_Check(pBuffer,WriteAddr,secremain);//D′ò&#209;&#190;-2á3yá&#203;μ&#196;,&#214;±&#189;óD′è&#235;éè&#199;&#248;ê£óà&#199;&#248;&#188;&#228;.        
                }
               */
                if(NumByteToWrite==secremain)break;//D′è&#235;&#189;áê&#248;á&#203;
                else//D′è&#235;&#206;′&#189;áê&#248;
                {
                        secpos++;//éè&#199;&#248;μ&#216;&#214;·&#212;&#246;1
                        secoff=0;//&#198;&#171;ò&#198;&#206;&#187;&#214;&#195;&#206;a0          

                           pBuffer+=secremain;  //&#214;&#184;&#213;&#235;&#198;&#171;ò&#198;
                        WriteAddr+=secremain;//D′μ&#216;&#214;·&#198;&#171;ò&#198;          
                           NumByteToWrite-=secremain;                                //×&#214;&#189;úêyμY&#188;&#245;
                        if(NumByteToWrite>FLASH_PAGE_SIZE)secremain=FLASH_PAGE_SIZE;        //&#207;&#194;ò&#187;&#184;&#246;éè&#199;&#248;&#187;1ê&#199;D′2&#187;íê
                        else secremain=NumByteToWrite;                        //&#207;&#194;ò&#187;&#184;&#246;éè&#199;&#248;&#191;éò&#212;D′íêá&#203;
                }         
        }
        return ret;                  
}

u8 Flash_Copy(u32 ReadAddr,u32 WriteAddr,u16 NumByteToWrite)   
{
        u32 writepos,readpos;
  
        u16 i;  
        u16 times;
        u8 ret=1;  

        //writepos=WriteAddr/FLASH_PAGE_SIZE;//éè&#199;&#248;μ&#216;&#214;·
                     
      //  readpos = ReadAddr /FLASH_PAGE_SIZE;//éè&#199;&#248;μ&#216;&#214;·
   

        times = ((NumByteToWrite-1)/ FLASH_PAGE_SIZE) + 1;   //×ü′&#206;êy
        
        readpos = ReadAddr;
        writepos = WriteAddr;
        for(i=0;i<times;i++)
        {
            Flash_Read(Read_BUF,readpos,FLASH_PAGE_SIZE);//&#182;á3&#246;&#213;&#251;&#184;&#246;éè&#199;&#248;μ&#196;&#196;úèY
            ret = Flash_Write(Read_BUF,writepos,FLASH_PAGE_SIZE);
           // FLASH_ErasePage(writepos*FLASH_PAGE_SIZE);//2á3y&#213;a&#184;&#246;éè&#199;&#248;
          //  ret = Flash_Write_Check(FLASH_BUF,writepos*FLASH_PAGE_SIZE,FLASH_PAGE_SIZE);
           // writepos++;//éè&#199;&#248;μ&#216;&#214;·&#212;&#246;1
           // readpos++;
            readpos+=FLASH_PAGE_SIZE;
            writepos+=FLASH_PAGE_SIZE;

        }
        return ret;                  
}
[/mw_shl_code]
回复

使用道具 举报

1

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1461
金钱
1461
注册时间
2011-12-1
在线时间
110 小时
发表于 2017-8-21 10:40:27 | 显示全部楼层
萧萧暮雨 发表于 2017-8-21 10:37
串口调试助手没问题的,我感觉是我的读写函数有问题,可是不知道问题出在哪里

不知道是不是你的CS1与CS2两个数组长度不一样造成的!
专业从事软硬件设计,毕业设计,C51/AVR/MSP430/STM32等单片机软硬件制作与定制。有需求的可以联系我。QQ:3436737049淘宝店铺:龙隽电子科技
回复

使用道具 举报

14

主题

42

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
220
金钱
220
注册时间
2017-3-22
在线时间
46 小时
 楼主| 发表于 2017-8-21 11:24:10 | 显示全部楼层
xlong_06 发表于 2017-8-21 10:40
不知道是不是你的CS1与CS2两个数组长度不一样造成的!

不是的,我在想是不是我写入地址和读取地址没写好
回复

使用道具 举报

6

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
198
金钱
198
注册时间
2017-7-25
在线时间
39 小时
发表于 2017-8-21 14:00:57 | 显示全部楼层
sizeof(cs1)=6
sizeof(cs2)=55
并且STM32的FLASH只能一次读或者写16位的数据,8位,32位都是不可以的
回复

使用道具 举报

14

主题

42

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
220
金钱
220
注册时间
2017-3-22
在线时间
46 小时
 楼主| 发表于 2017-8-21 14:37:29 | 显示全部楼层
黑夜之狼 发表于 2017-8-21 13:57
方法可以参考原子哥的F1,原理一样

参考原子哥的F1可以了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 22:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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