OpenEdv-开源电子网

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

stm32f103ret6读写flash数据丢失

[复制链接]

65

主题

244

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1153
金钱
1153
注册时间
2015-11-29
在线时间
149 小时
发表于 2025-12-31 14:16:13 | 显示全部楼层 |阅读模式
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]丢失。


最佳答案

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

https://download.csdn.net/blog/column/12561144/135722340
回复

使用道具 举报

8

主题

584

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2967
金钱
2967
注册时间
2016-5-13
在线时间
187 小时
发表于 2025-12-31 14:16:14 | 显示全部楼层
虽然不明白你们在说什么,但感觉很厉害的样子。
回复

使用道具 举报

65

主题

244

帖子

0

精华

金牌会员

Rank: 6Rank: 6

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

使用道具 举报

8

主题

584

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2967
金钱
2967
注册时间
2016-5-13
在线时间
187 小时
发表于 2026-1-4 15:57:00 | 显示全部楼层

我怀疑是你操作的时候有中断进来。就是读到85的时候有中断打断你的读取函数了。可以考虑读取开始前关闭总中断,读取完毕再打开。

__disable_irq();

开始读取....
读取结束.

__enable_irq();
虽然不明白你们在说什么,但感觉很厉害的样子。
回复

使用道具 举报

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

本版积分规则


关闭

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

正点原子公众号

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

GMT+8, 2026-1-29 07:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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