嵌入式闪存

闪存存储器有主存储块和信息块组成

大容量产品主存储块最大为64K×64位,每个存储块划分为256个2K字节的页

编程和擦除闪存

闪存编程一次可以写入16位(半字)

闪存擦除操作可以按页面擦除或完全擦除(全擦除)。全擦除不影响信息块

编程过程

页擦除过程

操作步骤

1.解锁

2.读操作

3.擦除操作

4.写操作

5.获取FLASH状态

6.锁定

举例

#define STM32_FLASH_BASE    0x08000000
#define STM32_PAGE_NUM 256
#define STM32_PAGE_SIZE (2 * 1024) void FLASH_read(u16 *buf, u32 addr, u16 num)
{
u16 i; for(i = 0; i < num / 2; i++)
{
buf[i] = *((u16*)addr + i);
}
} void FLASH_page_write(u16 *buf, u32 addr)
{
u16 i;
FLASH_Status s; for(i = 0; i < STM32_PAGE_SIZE / 2; i++)
{
s = FLASH_ProgramHalfWord(addr + i * 2, buf[i]); //地址+2
if(s != FLASH_COMPLETE)
{
LCD_ShowString(10, 100, tftlcd_data.width, tftlcd_data.height, 16, "FLASH_page_write failed.");
}
}
} u16 FLASH_BUF[STM32_PAGE_SIZE / 2];
void FLASH_write(u16 *buf, u32 addr, u16 num)
{
u16 i;
u16 *b = buf;
u32 a = addr;
u16 n = num;
u32 pos;
u16 offset;
FLASH_Status s; FLASH_Unlock(); a -= STM32_FLASH_BASE; //FLASH实际地址
pos = a / STM32_PAGE_SIZE; //页地址
offset = a % STM32_PAGE_SIZE; //页偏移
n = STM32_PAGE_SIZE - offset; //页剩余 if(num < n)
{
n = num;
} while(1)
{
FLASH_read(FLASH_BUF, pos * STM32_PAGE_SIZE + STM32_FLASH_BASE, STM32_PAGE_SIZE); //读页 for(i = 0; i < n / 2; i++)
{
FLASH_BUF[i + offset / 2] = b[i];
} s = FLASH_ErasePage(pos * STM32_PAGE_SIZE + STM32_FLASH_BASE); //擦除页
if(s != FLASH_COMPLETE)
{
LCD_ShowString(10, 80, tftlcd_data.width, tftlcd_data.height, 16, "FLASH_ErasePage failed.");
break;
} FLASH_page_write(FLASH_BUF, pos * STM32_PAGE_SIZE + STM32_FLASH_BASE); //写页 if(n == num) //结束标志
{
break;
} num -= n;
b += n;
pos++;
offset = 0;
if(num > STM32_PAGE_SIZE)
{
n = STM32_PAGE_SIZE;
}
else
{
n = num;
}
} FLASH_Lock();
}

stm32 内部flash的更多相关文章

  1. STM32内部flash存储小数——别样的C语言技巧

    今天在进行STM32内部falsh存储的时候,发现固件库历程的函数原型是这样的: 第一个是地址,在我的STM32中是2K一页的,第二个是要写入的数据. 问题就来了,存储一个小数该怎么办呢?固件库给的是 ...

  2. STM32 内部flash的读写程序

    ​ /* Base address of the Flash sectors */ #define ADDR_FLASH_SECTOR_0 ((uint32_t)0x08000000) /* Base ...

  3. STM32学习笔记:读写内部Flash(介绍+附代码)

    一.介绍 首先我们需要了解一个内存映射: stm32的flash地址起始于0x0800 0000,结束地址是0x0800 0000加上芯片实际的flash大小,不同的芯片flash大小不同. RAM起 ...

  4. 第50章 读写内部FLASH—零死角玩转STM32-F429系列

    第50章     读写内部FLASH 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fire ...

  5. STM32 对内部FLASH读写接口函数

    因为要用内部FLASH代替外部EEPROM,把参数放在STM32的0x08000000+320K处,其中20K是bootloader,300K是应用程序. 原理:先要把整页FLASH的内容搬到RAM中 ...

  6. STM32 对内部FLASH读写接口函数(转)

    源:STM32 对内部FLASH读写接口函数 因为要用内部FLASH代替外部EEPROM,把参数放在STM32的0x08000000+320K处,其中20K是bootloader,300K是应用程序. ...

  7. 【转】STM32擦除内部FLASH时间过长导致IWDG复位分析

    @20119-01-29 [小记] STM32擦除内部FLASH时间过长导致IWDG复位分析

  8. STM32 实现内部Flash的读写(HAL库版)

    Flash 中文名字叫闪存,是一种长寿命的非易失性(断电数据不丢失)的存储器.可以对称为块的存储器单元块进行擦写和再编程,在进行写入操作之前必须先执行擦除.一个Nand Flash由多个块(Block ...

  9. STM32F103使用内部Flash保存参数

    在我们应用开发时,经常会有一些程序运行参数需要保存,如一些修正系数.这些数据的特点是:数量少而且不需要经常修改,但又不能定义为常量,因为每台设备可能不一样而且在以后还有修改的可能.将这类数据存在指定的 ...

随机推荐

  1. Tekla 导出ifc并浏览

    Tekla导出IFC

  2. flutter的 图片组件基本使用

    import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends Statele ...

  3. 算法习题---5-7打印队列(UVa12100)

    一:题目 有一个打印机,有一些任务在排着队打印,每个任务都有优先级.打印时,每次取出队列第一个任务,如果它的优先级不是当前队列中最高的,就会被放到队尾,否则就打印出来.输出初始队列的第m个任务的打印时 ...

  4. 论H5嵌入APP的联合登录的解决方案

    什么是联合登录 因为公司产品的发展,会与第三方的一些商户进行对接,商户APP提供入口,进入我们的H5页,从而提供服务. 而商户希望用户在其APP进行账户登录后,进入H5页不再进行登录,所以我们的H5需 ...

  5. sed替换字符串(变量)

    sed “s/查找字段/替换字段/g” echo helloworld|sed  ‘s/hello/world/g’ sed 替换字符串以变量形式 1.sed命令使用双引号的情况下,可以使用$var( ...

  6. 保存wave音频流的方法

    保存到文件: void saveToFile(String filename, ByteBuffer buffer) { byte[] bytes = buffer.array(); OutputSt ...

  7. Warning: Hash history cannot PUSH the same path; a new entry will not be added to the history stack

    现象 在用`mobx-react-router`的`this.props.history.push("/")`的时候,浏览器会提示 Warning: Hash history ca ...

  8. Eureka&Zookeeper&Consul 原理与对比

    CAP 定理CAP定理:CAP定理又称CAP原则,指的是在一个分布式系统中,一致性(Consistency).可用性(Availability).分区容错性(Partition tolerance). ...

  9. Python机器学习基础教程-第2章-监督学习之线性模型

    前言 本系列教程基本就是摘抄<Python机器学习基础教程>中的例子内容. 为了便于跟踪和学习,本系列教程在Github上提供了jupyter notebook 版本: Github仓库: ...

  10. 开发规范——MYSQL数据库

    数据库规范 这里主要针对mysql数据库,其他数据库也可以借鉴 表 1.统一使用表命名规范 表名规范:分层+项目名缩写+实体名(小写)[+下划线+实体名+rel] 例子 表名:bc_user 分层: ...