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保存参数
在我们应用开发时,经常会有一些程序运行参数需要保存,如一些修正系数.这些数据的特点是:数量少而且不需要经常修改,但又不能定义为常量,因为每台设备可能不一样而且在以后还有修改的可能.将这类数据存在指定的 ...
随机推荐
- 【swoole】PHP+Swoole+Linux实现进程监控
脚本代码 class Server { const PORT = 8888; public function port() { //netstat -anp 2>/dev/null| grep ...
- 转 ORA-16191 "Primary log shipping client not logged on standby
###sample 0 原因未知: 解决办法,重建密码文件 primary db :alter system set log_archive_dest_state_2=defer sid='*' sc ...
- window下安装docker
下载docker toolbox https://mirrors.aliyun.com/docker-toolbox/windows/docker-toolbox/ 1,.双击安装DockerTool ...
- MVC4笔记 RedirectResult,RedirectToRoute
RedirectResult:运行重新导向到其他网址,在RedirectResult的内部,基本上还是以Response.Redirect方法响应HTTP 302暂时导向. eg: public Ac ...
- CRC校验的问题(c语言实现CRC校验和)
1. 前面的数 7A 01 00,计算的结果是0X4920 2. 那么把数据CRC加上 3. 测试代码,计算出来的结果对不上,什么情况?可是我把参考模型的全部都选了一遍,也对不上其中一个!!! 4. ...
- Data - 【转】数据分析的道与术
简要说明 本文来自网络流传的"百度内部培训PPT - 数据分析的道与术",版权属于"百度",如有冒犯,即刻删除. PDF下载 - 数据分析的道与术 什么是数据分 ...
- intel 蓝牙驱动安装时报错
BT_20.120.2_64_Win7.exe 安装时报错. 把系统补丁打全,就可以安装 了.
- jstat介绍
命令可用选项 ➜ ~ jstat -options -class -compiler -gc -gccapacity -gccause -gcmetacapacity -gcnew -gcnewcap ...
- 微信小程序之 语言特点
主页面的CSS样式默认为index.wxss,无需引入
- Django 之memcached的应用
memcached介绍: memcached之前是danga的一个项目,最早是为LiveJournal服务的,当初设计师为了加速LiveJournal访问速度而开发的,后来被很多大型项目采用.官网是w ...