Ⅰ、写在前面

我们都知道FLASHEEPROM这两种存储器,但是大部分人了解的都是专门的FLASHEEPROM芯片,如:W25Q16ATAT24C08(外部)储存芯片。

外部存储芯片和本文说的内部FLASHEEPROM最大的区别就是在于:内部FLASHEEPROM是不需要SPII2C等进行操作,也就是说同等情况下,内部FLASHEEPROM的读写要快一点。

STM8FLASH除了储存程序代码之外,就是用于用户编程(存储数据),不像之前的51芯片不能利用内部储存代码的FLASH

为方便大家阅读,本文内容已经整理成PDF文件:

http://pan.baidu.com/s/1i5uWhJR

作者:strongerHuang

版权所有,未经允许,禁止用于其它商业用途!!!

Ⅱ、片内FLASHEEPROM基础知识

STM8内部的FLASH程序存储器数据EEPROM一组通用寄存器来控制。用户可以使用这些寄存器来编程或擦除存储器的内容、设置写保护、或者配置特定的低功耗模式。用户也可以对器件的选项字节(Option byte)进行编程。

1.关于存储的名词

(BLOCK):一个块是指可由一个简单编程操作编程或擦除的一组字节。块级的操作非常快,是标准的编程和擦除操作。请参考表4来了解块的大小。

(PAGE):一页由一组块组成。 STM8S 器件拥有启动代码,程序代码和数据EEPROM,这些区域都由特定的结构所保护。通过对特定的选项字节进行操作,这些区域的大小能够以页为单位来进行调整。

2.主要特性

STM8S分为两个存储器阵列:

─ 最多至 128K字节的FLASH程序存储器,不同的器件容量有所不同。

─ 最多至 2K字节的数据EEPROM(包括option byte-选择字节),不同的器件容量有所不同。

● 编程模式

─ 字节编程和自动快速字节编程(没有擦除操作)

─ 字编程

─ 块编程和快速块编程(没有擦除操作)

─ 在编程/擦除操作结束时和发生非法编程操作时产生中断

● 读同时写(RWW)功能。该特性并不是所有STM8S器件都拥有。请参考具体的数据手册了解更多细节。

● 在应用编程(IAP)和在线编程(ICP)能力。

● 保护特性

─ 存储器读保护(ROP)

─ 基于存储器存取安全系统(MASS 密钥)的程序存储器写保护

─ 基于存储器存取安全系统(MASS 密钥)的数据存储器写保护

─ 可编程的用户启动代码区域(UBC)写保护

● 在待机(Halt)模式和活跃待机(Active-halt)模式下,存储器可配置为运行状态和掉电状态。

3.存储器组织结构

STM8SEEPROM32位字长(每字4字节)为基础组织起来。根据不同的器件,存储器组织机构有所不同:

● 小容量STM8S器件

8K FLASH 程序存储器,每页 64 字节,共 128

640 字节数据 EEPROM,每页 64 字节,共 10 页。数据 EEPROM 包括一页的选项字节(64字节)

● 中容量STM8S器件

─ 从 16K 32K FLASH 程序存储器,每页 512 字节,最多64

1K 字节数据 EEPROM,每页 512 字节,共 2 页。数据 EEPROM 包括一页的选项字节(512 字节)

● 大容量STM8S器件

─ 从 64K 128K FLASH 程序存储器,每页 512 字节,最多256

─ 从 1K 2K 字节数据 EEPROM,每页 512 字节,共 4 页。数据 EEPROM 包括一页的选项字节(512 字节)

4.存储器编程

在尝试执行任何编程操作之前,必须对主程序存储器FLASHDATA区域解锁。

编程分类字节编程、编程、编程和选项字节编程。

字节编程

可以对主程序存储器和DATA区域逐字节地编程。要对一个字节编程,应用程序可直接向目标地址写入数据。

● 在主程序存储器中

当字节编程操作执行时,应用程序停止运行。

● 在DATA区域中

─ 有 RWW 功能的器件:在 IAP 模式下,应用程序不停止运行,字节编程进行操作。

─ 无 RWW 功能的器件:当字节编程操作执行时,应用程序停止运行。

要擦除一个字节,向对应的字节简单写入0x00即可。

应用程序可以通过读FLASH_IAPSR寄存器来校验编程或擦除操作是否已被正确执行:

● 在一次成功的编程操作后EOP位被置1

● 当软件试图对一个被保护的页进行写操作时WP_PG_DIS位被置1。在这种情况下,写操作不会被执行。

如果FLASH_CR1中的IE位已经被预先使能,则只要这些标志位(EOP/WP_PG_DIS)中有一个被置位就会产生一个中断。

字编程

字写入操作允许一次对整个4字节的字进行编程,从而将编程时间缩短。

主程序存储器和DATA EEPROM都可以进行字操作。在一些STM8S器件中,也拥有当EEPROM在进行写操作时同时具备RWW功能。

块编程

块编程比字节编程和字编程都要快。在块编程操作中,整个块的编程或擦除在一个编程周期就可以完成。

在主程序存储器FLASHDATA区域都可以执行块操作。

● 在主程序存储器中

用于块编程的代码必须全部在RAM中执行。

● 在DATA区域中

─ 有RWW功能的器件: DATA 块操作可在主程序存储器中执行,然而数据装载阶段必须在RAM中执行。

─ 无RWW功能的器件:用于块编程的代码必须全部在RAM中执行。

一共有三种可能的块操作:

● 块编程(也叫标准块编程):整个块在编程前被自动擦除。

● 快速块编程:在编程前没有预先的块擦除操作。

● 块擦除。

在块编程时,中断被硬件自动屏蔽。

标准块编程

块编程操作允许一次对整个块进行编程,整个块在编程前被自动擦除。

快速块编程

快速块编程允许不擦除存储器内容就对块进行编程,因此快速块编程的编程速度是标准块编程的两倍。

警告 在执行快速块编程之前如果这个块不是空的话,不能保证写入的数据无误。

选项字节(Option byte)编程

对选项字节编程和对DATA EEPROM区域编程非常相似。

应用程序可直接向目标地址进行写操作。利用STM8RWW功能,在对选项字节写操作的同时程序不必停下来。

Ⅲ、软件工程源代码

1、关于工程

本文提供的工程代码是基于前面软件工程STM8S-A04_UART基本收发数据”增加FLASH修改而来。初学的朋友可以参看我前面对应的基础文章,那些文章讲的比较详细。

工程源代码主要实现功能写入FLASHEEPROM并读取写入的数据,通过UART打印来观察读取的数据是否和写入的一直。

提供两个工程:STM8S-A07_内部FLASH编程STM8S-A07_内部EEPROM编程

这两个工程需要注意读写操作的地址不同,见下图:

本文重点的函数接口:

FLASH_WriteNByte:FLASHN字节

FLASH_ReadNByte FLASHN字节

EEPROM_WriteNByteEEPROMN字节

EEPROM_ReadNByteEEPROMN字节

2.代码分析说明

A.FLASH_WriteNByteFLASHN字节

void FLASH_WriteNByte(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t nByte)

{

FLASH_Unlock(FLASH_MEMTYPE_PROG);              //解锁

while(FLASH_GetFlagStatus(FLASH_FLAG_PUL) == RESET);

while(nByte--)

{

FLASH_ProgramByte(WriteAddr, *pBuffer);

WriteAddr++;

pBuffer++;

FLASH_WaitForLastOperation(FLASH_MEMTYPE_PROG);

}

FLASH_Lock(FLASH_MEMTYPE_PROG);                //上锁

}

这里需要注意:1.写之前解锁,写完需要上锁;2.我们提供的代码是字节操作,因此,每次操作需要“等待上次写操作完成”。

B.FLASH_ReadNByteFLASHN字节

void FLASH_ReadNByte(uint8_t* pBuffer, uint32_t ReadAddr, uint16_t nByte)

{

while(nByte--)

{

*pBuffer = FLASH_ReadByte(ReadAddr);

ReadAddr++;

pBuffer++;

}

}

读操作一般都很简单,不管是读FLASH还是EEPROM,基本上操作都类似。为什么我们买的U盘读取速度远大于写的速度,原因就在这里。

C.EEPROM_WriteNByteEEPROMN字节

void EEPROM_WriteNByte(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t nByte)

{

FLASH_Unlock(FLASH_MEMTYPE_DATA);

while(FLASH_GetFlagStatus(FLASH_FLAG_DUL) == RESET);

while(nByte--)

{

FLASH_ProgramByte(WriteAddr, *pBuffer);

WriteAddr++;

pBuffer++;

FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);

}

FLASH_Lock(FLASH_MEMTYPE_DATA);

}

FLASH的写对比,可以看得出来,他们之间的差别在于参数:FLASH_MEMTYPE_DATA.

D.EEPROM_ReadNByteEEPROMN字节

void EEPROM_ReadNByte(uint8_t* pBuffer, uint32_t ReadAddr, uint16_t nByte)

{

while(nByte--)

{

*pBuffer = FLASH_ReadByte(ReadAddr);

ReadAddr++;

pBuffer++;

}

}

E.main函数读写验证

FLASH_WriteNByte(WriteBuf, FLASH_ADDR, BUF_SIZE);

TIMDelay_Nms(500);

FLASH_ReadNByte(ReadBuf, FLASH_ADDR, BUF_SIZE);

UART1_SendNByte(ReadBuf, BUF_SIZE);

通过UART打印“读BUF”的数据,可以看得出来,我们从FLASH中写入的数据是否正确。

两个工程代码实现功能都一样,注意地址

打印数据如下:

00 00 00 00 00 00 00 00 00 00(打印未读写操作之前的“读BUF”数据)

41 31 42 32 43 33 44 34 45 35(十六进制显示)

A1B2C3D4E5(字符形式显示)

Ⅳ、下载

STM8S资料:

http://pan.baidu.com/s/1o7Tb9Yq

软件源代码工程(STM8S-A07_内部xxx编程):

http://pan.baidu.com/s/1c2EcRo0

提示:如果网盘链接失效,可以微信公众号“底部菜单”查看更新链接

Ⅴ、最后

微信搜索EmbeddDeveloper” 或者扫描下面二维码、关注,查看更多精彩内容。

STM8S_007_片内FLASH和EEPROM编程相关推荐

  1. FLASH模拟EEPROM编程

    单片机内存FLASH模拟EEPROM编程 一,简述 很多单片机本身是没有自带EEPROM,但是一般具有在应用编程(IAP:In Application Programming)功能,可以把它的内存FL ...

  2. STM32G0系列将内部FLASH作为EEPROM使用,巧妙编程,可延长Flash擦写寿命上百倍,已用于量产产品。

    STM32内部flash可以用作EEPROM,用于保存用户数据. 1.一般来说,stm32的flash擦写寿命只有10万次,如果在同一位置擦写过于频繁,在产品质保期内FLASH就会达到寿命极限,保存数 ...

  3. STM32F1_片内FLASH编程

    前言 今天总结"STM32F103  片内FLASH编程",对于学习编程的人来说"FLASH"这个词肯定很熟悉,因为FLASH主要用于存储数据.对于STM32来 ...

  4. flash 和 eeprom 区别和关系、nor flash和nand flash区别

    1.FLASH存储器和EEPROM存储器的区别 2.EEPROM介绍及与Flash区别_VirtuousLiu的博客-CSDN博客_eeprom 3.基础--ROM, RAM, FLASH, SSD, ...

  5. 非易失性存储器Flash和EEPROM之间的差异与优缺点

    在嵌入式系统中,Flash和EEPROM能够存储可用于通信或执行某些功能的数据.它们可以通过多种不同的串行协议(包括SPI或串行外围设备接口)来连接存储设备.在单片机中也集成了多种不同类型的SPI存储 ...

  6. 【正点原子STM32连载】 第四十五章 FLASH模拟EEPROM实验 摘自【正点原子】STM32F103 战舰开发指南V1.2

    第四十五章 FLASH模拟EEPROM实验 STM32本身没有自带EEPROM,但是STM32具有IAP(在应用编程)功能,所以我们可以把它的FLASH当成EEPROM来使用.本章,我们将利用STM3 ...

  7. FLASH 模拟 EEPROM

    FLASH 模拟 EEPROM 一.STM32 FLASH 简介   STM32F4 的闪存模块由主存储器.系统存储器.OPT 区域和选项字节等 4 部分组成.   主存储器,该部分用来存放代码和数据 ...

  8. MPC5744 Data Flash 仿真 EEPROM

    一 .目的 本文主要是使用 MPC5744 中的 Data Flash 仿真 EEPROM .之前在 < MPC5744 烧录一直停留在 98% 的解决方法 > 中也简单介绍了 Flash ...

  9. flash读取程序 msp430_MSP430单片机对片内FLASH的读写操作程序范例

    原标题:MSP430单片机对片内FLASH的读写操作程序范例 // 参数: wAddr 为地址 , 范围 0x1000~0xFFFF void ReadFlash(U16 wAddr,U8 *bBuf ...

  10. 痞子衡嵌入式:串行NOR Flash的页编程模式对于量产效率的影响

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是串行NOR Flash的页编程模式对于量产效率的影响. 任何嵌入式产品最终都绕不开量产效率话题,尤其是对于主控是非内置 Flash 型 ...

最新文章

  1. boost库之tcp server(异步)
  2. 程序员常用的六大技术博客类
  3. html自定义radio样式,用纯CSS 自定义radio checkbox 样式
  4. 理解Object.defineProperty的作用
  5. Redis集群~StackExchange.redis连接Sentinel服务器并订阅相关事件
  6. 文件在线预览 图片 PDF Excel Word
  7. mmdetection 使用笔记 01: 安装与简单的推理demo
  8. Matplotlib 中文用户指南 3.8 路径教程
  9. [前端]如何让图片等比例缩放,同时撑满父级容器的长或宽
  10. JavaWeb框架之Struts2 ---- 系列学习
  11. linux模拟lcd显示文字,求助 armlinux中实现lcd显示
  12. Android 蓝牙手柄开发
  13. Unity制作简单动画效果
  14. 【Python】发送UDP数据(保姆级图文+附测试工具文件+api例程)
  15. 轻松搞定 Spring Cloud 2.x 微服务全家桶
  16. Carla在Windows上的安装与运行
  17. python自动化交易 期货_一只股票一天可以撤单单几次
  18. 【日常】如何处理“火星文”乱码
  19. mysql多表联合查询 去重_mysql中的多表联合并且去重排序
  20. Android内核模式下对当前进程的cred结构的获取方式

热门文章

  1. c语言头文件的使用和写法,C语言头文件的使用与写法
  2. 网络安全学习相关网站
  3. 无码间串扰的基带传输特性
  4. 使用librdkafka
  5. luac 格式分析与反编译
  6. c# lu分解的代码_线性方程组的分解法——LU分解法
  7. 拉普拉斯平滑处理介绍
  8. 数字图像直方图匹配或规定化Histogram Matching (Specification)处理
  9. 智能优化算法:人工水母搜索算法 -附代码
  10. MagicDraw-活动图