OpenEdv-开源电子网

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

stm32f103ret6读写flash数据丢失

[复制链接]

65

主题

244

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1147
金钱
1147
注册时间
2015-11-29
在线时间
148 小时
发表于 前天 14:16 | 显示全部楼层 |阅读模式
10金钱
#include "stm32f10x_it.h"
#include "stm32f10x.h"
#include "globle.h"
#include "stm32f10x_conf.h"
//#include "usart.h"
#include "adc.h"
#include "Driver.h"
#include "Ex_Control.h"
#include "Flashdata.h"

uint16_t writedata[200]={0};
uint16_t readdata[200]={0};
//Threshold Laser_Threshold;
Adapatpara Laser_Adapatpara;
Adapatpara1 Laser_Adapatpara1;
biaoding_value biaoding_current;
void writeflash(uint32_t data1,uint32_t data2)
{
//        uint32_t EraseCounter = 0x00;         //记录要擦除多少页
        uint32_t Address = 0x00;                                //记录写入的地址
        uint16_t Data = 0;                        //记录写入的数据
//        uint32_t NbrOfPage = 0x00;                        //记录写入多少页
        uint8_t i=0;
       
        if((data1==WRITE_START_ADDR)&&(data2==WRITE_END_ADDR))
        {
                        FLASH_Status FLASHStatus = FLASH_COMPLETE; //记录每次擦除的结果       
                         /* 解锁 */
                        FLASH_Unlock();

                        /* 清空所有标志位 */
                        FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);       

                        /* 按页擦除*/
                        FLASHStatus=FLASH_ErasePage(WRITE_START_ADDR);  //擦除1页
//                 for(EraseCounter = 0; (EraseCounter < NbrOfPage) && (FLASHStatus == FLASH_COMPLETE); EraseCounter++)
//                        {
//                                FLASHStatus = FLASH_ErasePage(WRITE_START_ADDR + (FLASH_PAGE_SIZE * EraseCounter));
//                       
//                        }
                       
                        /* 向内部FLASH写入数据 */
                        if(FLASHStatus == FLASH_COMPLETE)  //擦除成功
                        {
                                Address = WRITE_START_ADDR;
                               
                                while((Address < WRITE_END_ADDR) && (FLASHStatus == FLASH_COMPLETE))
                                {
                                        Data=writedata[i];
                                        FLASHStatus = FLASH_ProgramHalfWord(Address, Data);
                                        Address = Address + 2;
                                        i++;
                                }
                        }
                FLASH_Lock();
}
}

void readflash(void)
{
        uint32_t Address = 0;                                //读取的地址
        uint8_t i=0x00;
        Address = WRITE_START_ADDR;
        for(i=0;i<200;i++)
        {
                readdata[i]=*(__IO uint16_t*)Address;
                Address=Address+2;
        }
}
void Adapat_Para_Updata(void)
{
        uint8_t i=0;
        writedata[0]=0xA5A5;
   for(i=0;i<200;i++)
{
writedata[i]=i;
}

        writeflash(WRITE_START_ADDR,WRITE_END_ADDR);       
       
}
偶尔出现数据从readdata[85]到readdata[120]丢失。


回复

使用道具 举报

65

主题

244

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1147
金钱
1147
注册时间
2015-11-29
在线时间
148 小时
 楼主| 发表于 前天 14:18 | 显示全部楼层
#define WRITE_START_ADDR  ((uint32_t)0x800C000)   #define WRITE_END_ADDR    ((uint32_t)0x800C0fa)    //200 个双字
回复

使用道具 举报

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

本版积分规则


关闭

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

正点原子公众号

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

GMT+8, 2026-1-2 11:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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