嵌入式闪存

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

大容量产品主存储块最大为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. 如何:创建返回 UI 的外接程序

    https://msdn.microsoft.com/zh-cn/library/bb909849(v=vs.100).aspx

  2. DataGrip 2019.1 连接mysql 8.0.16

    # 下载mysql Connector/J驱动包 https://dev.mysql.com/downloads/connector/j/ 然后解压到一个目录 # 新建mysql 8.0连接驱动 打开 ...

  3. pyenv、virtualenv、virtualenvwrapper三种python多版本介绍

    今天有把此前接触过的三种python实现多版本环境用到的软件pyenv.virtualenv.virtualenvwrapper,了解了一番,现做如下总结: 一.pyenv: 是针对python多版本 ...

  4. 零基础学Python-第二章 :Python基础语法-05.基础数据类型

    打开终端,输入python3,这就进入了python的命令提示符. 输入type(8),返回的是int类型.用来type来判断当前的是什么类型. 字符串8转int类型. 数字123转字符串 布尔类型的 ...

  5. tensor&ndarray&int、float

    (1)如果tensor只有一个元素,然后转换成int或者float类型的时候直接用int()或者float()就可以了: (2)如果tensor含有多个元素,转换成ndarray时就要用x.detac ...

  6. 数据标记系列——图像分割 & Curve-GCN

    在之前的文章中(参考:),我们提到了Polygon-RNN++在数据标注中的应用.今天不得不提到多伦多大学与英伟达联合公布的一项最新研究:Curve-GCN的应用结果显示图像标注速度提升10倍. Cu ...

  7. [ jenkins ] 基础安装及权限管理

    1. 安装 jenkins 在安装 jenkins 之前需要 java 的支持 (1)安装 jdk1.8 [root@192.168.118.17 ~]#tar xf jdk-8u77-linux-x ...

  8. Swift4.0复习泛型

    1.泛型的基本使用: /// 定义了一个泛型结构体MyStruct, /// 其泛型形参为T struct MyStruct<T> {   /// 用泛型T定义存储式成员属性t var t ...

  9. 常见问题:计算机网络/完整HTTP访问

    域名解析 以浏览器进行HTTP访问为例,首先搜索自身DNS缓存(一般缓存1000条左右,仅缓存1分钟),若有且未过期,结束. 若未找到,则搜索操作系统的DNS缓存. 若未找到,尝试读取hosts文件. ...

  10. Android StickyListHeadersListView头部悬停 分组列表实现

    最近在做分组列表,头部悬停的效果,在github上就搜到了StickyListHeaders(https://github.com/emilsjolander/StickyListHeaders)这个 ...