stm32 内部flash
嵌入式闪存
闪存存储器有主存储块和信息块组成
大容量产品主存储块最大为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的更多相关文章
- STM32内部flash存储小数——别样的C语言技巧
今天在进行STM32内部falsh存储的时候,发现固件库历程的函数原型是这样的: 第一个是地址,在我的STM32中是2K一页的,第二个是要写入的数据. 问题就来了,存储一个小数该怎么办呢?固件库给的是 ...
- STM32 内部flash的读写程序
/* Base address of the Flash sectors */ #define ADDR_FLASH_SECTOR_0 ((uint32_t)0x08000000) /* Base ...
- STM32学习笔记:读写内部Flash(介绍+附代码)
一.介绍 首先我们需要了解一个内存映射: stm32的flash地址起始于0x0800 0000,结束地址是0x0800 0000加上芯片实际的flash大小,不同的芯片flash大小不同. RAM起 ...
- 第50章 读写内部FLASH—零死角玩转STM32-F429系列
第50章 读写内部FLASH 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fire ...
- STM32 对内部FLASH读写接口函数
因为要用内部FLASH代替外部EEPROM,把参数放在STM32的0x08000000+320K处,其中20K是bootloader,300K是应用程序. 原理:先要把整页FLASH的内容搬到RAM中 ...
- STM32 对内部FLASH读写接口函数(转)
源:STM32 对内部FLASH读写接口函数 因为要用内部FLASH代替外部EEPROM,把参数放在STM32的0x08000000+320K处,其中20K是bootloader,300K是应用程序. ...
- 【转】STM32擦除内部FLASH时间过长导致IWDG复位分析
@20119-01-29 [小记] STM32擦除内部FLASH时间过长导致IWDG复位分析
- STM32 实现内部Flash的读写(HAL库版)
Flash 中文名字叫闪存,是一种长寿命的非易失性(断电数据不丢失)的存储器.可以对称为块的存储器单元块进行擦写和再编程,在进行写入操作之前必须先执行擦除.一个Nand Flash由多个块(Block ...
- STM32F103使用内部Flash保存参数
在我们应用开发时,经常会有一些程序运行参数需要保存,如一些修正系数.这些数据的特点是:数量少而且不需要经常修改,但又不能定义为常量,因为每台设备可能不一样而且在以后还有修改的可能.将这类数据存在指定的 ...
随机推荐
- Tekla 导出ifc并浏览
Tekla导出IFC
- flutter的 图片组件基本使用
import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends Statele ...
- 算法习题---5-7打印队列(UVa12100)
一:题目 有一个打印机,有一些任务在排着队打印,每个任务都有优先级.打印时,每次取出队列第一个任务,如果它的优先级不是当前队列中最高的,就会被放到队尾,否则就打印出来.输出初始队列的第m个任务的打印时 ...
- 论H5嵌入APP的联合登录的解决方案
什么是联合登录 因为公司产品的发展,会与第三方的一些商户进行对接,商户APP提供入口,进入我们的H5页,从而提供服务. 而商户希望用户在其APP进行账户登录后,进入H5页不再进行登录,所以我们的H5需 ...
- sed替换字符串(变量)
sed “s/查找字段/替换字段/g” echo helloworld|sed ‘s/hello/world/g’ sed 替换字符串以变量形式 1.sed命令使用双引号的情况下,可以使用$var( ...
- 保存wave音频流的方法
保存到文件: void saveToFile(String filename, ByteBuffer buffer) { byte[] bytes = buffer.array(); OutputSt ...
- 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 ...
- Eureka&Zookeeper&Consul 原理与对比
CAP 定理CAP定理:CAP定理又称CAP原则,指的是在一个分布式系统中,一致性(Consistency).可用性(Availability).分区容错性(Partition tolerance). ...
- Python机器学习基础教程-第2章-监督学习之线性模型
前言 本系列教程基本就是摘抄<Python机器学习基础教程>中的例子内容. 为了便于跟踪和学习,本系列教程在Github上提供了jupyter notebook 版本: Github仓库: ...
- 开发规范——MYSQL数据库
数据库规范 这里主要针对mysql数据库,其他数据库也可以借鉴 表 1.统一使用表命名规范 表名规范:分层+项目名缩写+实体名(小写)[+下划线+实体名+rel] 例子 表名:bc_user 分层: ...