0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM8S_ 007_片内FLASH和EEPROM编程

黄工的嵌入式技术圈 来源:黄工的嵌入式技术圈 2020-03-20 10:00 次阅读

写在前面 Ⅰ

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

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

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

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

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

片内FLASH和EEPROM基础知识 Ⅱ

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.存储器组织结构

STM8S的EEPROM以32位字长(每字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.存储器编程

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

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

字节编程

可以对主程序存储器和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功能。

块编程

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

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

● 在主程序存储器中

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

● 在DATA区域中

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

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

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

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

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

● 块擦除。

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

标准块编程

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

快速块编程

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

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

选项字节(Option byte)编程

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

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

软件工程源代码 Ⅲ

1、关于工程

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

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

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

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

本文重点的函数接口:

FLASH_WriteNByte:FLASH写N字节

FLASH_ReadNByte: FLASH读N字节

EEPROM_WriteNByte:EEPROM写N字节

EEPROM_ReadNByte:EEPROM读N字节

2.代码分析说明

A.FLASH_WriteNByte:FLASH写N字节

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_ReadNByte:FLASH读N字节

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_WriteNByte:EEPROM写N字节

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_ReadNByte:EEPROM读N字节

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

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FlaSh
    +关注

    关注

    10

    文章

    1647

    浏览量

    149291
  • EEPROM
    +关注

    关注

    9

    文章

    1045

    浏览量

    82270
  • STM8S
    +关注

    关注

    16

    文章

    149

    浏览量

    31581
收藏 人收藏

    相关推荐

    EEPROMFlash存储器的区别

    编程只读存储器)和Flash存储器是两种常见的非易失性存储器,它们具有各自的特点和应用场景。本文将深入分析和比较EEPROMFlash存储器的原理、结构、性能以及应用,以期为读者提
    的头像 发表于 05-23 16:35 7139次阅读

    AN89056 PSoC4100S+256K上的FLASH测试失败的原因?

    我修改了 AN89056 示例代码中的 AN89056_FLASH,并尝试在 PSoC4100S+256K (CY8C4148AZQ-S455) 上运行。 但我收到了如下错误信息: 测试计数器
    发表于 05-21 08:16

    STM8S003F3P6操作EEPROM会影响FLASH吗?

    各位前辈好,想请教一下,STM8S003F3P6操作EEPROM会影响FLASH吗(具体的读写程序已经写完,只是担心会影响FLASH,因为FLASH
    发表于 05-21 06:36

    STM8S007老是参数检查错误进入assert_failed()的原因?

    请哪位大侠解答一下,在使用STM8S007和STM8S105K4的时候,经过跟踪发现,调用一些固件库函数时老是会出现参数检查错误而进入到assert_failed()函数,关键是参数都是库中预定义的
    发表于 05-17 06:18

    求助,关于STM8SEEPROM寿命问题求解

    大家好:最近在用STM8S做开发,STM8S写一个字节到EEPROM中不需要擦除整个扇区,它自动擦除本字节然后写入,这非常方便。如果对某一个地址的一个字节EEPROM不停的写入,到达寿
    发表于 05-15 07:18

    STM8s 003 EEPROM断电后不保存,eeprom数据被清零的原因?

    STM8s003EEPROM 断电后不保存怎么回事,eeprom数据被清零 void EEPROM(void) { p = (unsigned char *)0x4000; //指针p指向芯片
    发表于 05-13 06:01

    STM8S103k3的EEPROM一用块编程,程序就死在块编程的函数上面,怎么解决?

    我最近在用STM8S103k3做东西,用到了里面的EEPROM。我想字节编程,字编程,我都用着好好的,但是最近我需要用到块编程。发现一用块
    发表于 05-11 07:27

    STM8S903K3定义@eeprom不能编译通过的原因?

    STM8S903K3定义了@eeprom unsigned char memorySecurity[] = { 0b00000111, 0xff, 0xff, 0xff }; 然后编译通不过
    发表于 05-07 06:30

    求助,关于STM8EEPROM问题求解

    小白问题,看了一些资料,关于STM8S003或者005的EEPROM的操作必须要用FLASH_ProgramBlock和FLASH_EraseBlock,就是必须在RAM中执行,但是如
    发表于 05-06 08:32

    STM8L052写EEPROM偶尔会死机的原因?怎么解决?

    用STM8L052做个项目,这几天发现写EEPROM偶尔会死机,产品频繁测试的时候,按键按下后会写一次EEPROM,按键一直按测试,发现不定时会出现一次死机,找不到什么问题,大家帮忙看看。 写
    发表于 04-30 07:49

    STM32H750flash对同一flash地址做二次修改出错是哪里的问题?

    各位大佬好,又是我,是的,我在H750的flash里游不出去了…… 下面详细介绍我的使用方法和出现的问题: 我在程序里面拟定在flash地址0x08001000~0x080010
    发表于 04-23 06:16

    【GD32H757Z海棠派开发板使用手册】第四讲 FMC-Flash擦写读实验

    FMC即Flash控制器,其提供了Flash操作所需要的所有功能,在GD32H7XX系列MCU中,具有高达3840KB字节的上闪存可用于存储指令或数据。FMC也提供了扇区擦除和整
    的头像 发表于 04-19 10:09 1489次阅读
    【GD32H757Z海棠派开发板使用手册】第四讲 FMC-<b class='flag-5'>片</b><b class='flag-5'>内</b><b class='flag-5'>Flash</b>擦写读实验

    STM8S007C8的TIM2如何配置才能输出单脉冲?

    各位大神,请问你STM8S007C8的TIM2如何配置才能输出单脉冲?因为TIM2没有SMCR寄存器,怎样才能和TIM1一样设置MSM、TS和SMS呢?正在郁闷中,请各位赐教。谢谢!
    发表于 04-19 07:35

    IAR for STM8 FLASH_EraseBlock在release模式卡死怎么解决?

    BlockNum, FLASH_MemType_TypeDef FLASH_MemType)) { uint32_t startaddress = 0; #if defined(STM8S
    发表于 04-16 06:44

    通用bootloader选“支持spi flash”,无论设定download为还是flash启动都找不到at45db161,为什么?

    通用bootloader不选“支持spi flash”,download放于flash,正常启动,ota正常,app驱动at45db161读写正常。通用bootloader选“支持
    发表于 03-22 07:45