STM8S_007_片内FLASH和EEPROM编程

发布者:keiss2018最新更新时间:2017-09-16 来源: ofweek关键字:STM8S  片内FLASH  EEPROM编程 手机看文章 扫描二维码
随时随地手机看文章

Ⅰ、写在前面

我们都知道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


作者:strongerHuang

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

 

Ⅱ、片内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


关键字:STM8S  片内FLASH  EEPROM编程 引用地址:STM8S_007_片内FLASH和EEPROM编程

上一篇:STM8S_008_WDG独立看门狗和窗口看门狗
下一篇:STM8S_006_AWU自动唤醒

推荐阅读最新更新时间:2024-03-16 15:37

STM8S(105K4)使用笔记——活跃停机模式的配置与AWU唤醒
STM8S提供的可编程的电源管理 等待(Wait)模式: 通过WFI指令进入。该模式下CPU将停止运行,但外设与中断控制器仍保持运行。 该模式下可以通过外设时钟门控、降低CPU时钟频率、选择低功耗时钟源(LSI,HSI)进一步降低功耗。 在等待模式下,所有寄存器与RAM的内容不变,进入等待模式前所定义的时钟配置也不会在进入等待模式后改变。 当一个内部或外部中断产生时,CPU从等待模式唤醒并恢复工作。 停机(Halt)模式: 通过HALT指令进入。该模式下主时钟停止,即由fMASTER提供时钟的CPU及所有外设均被关闭。 该模式下可以通过关闭主电压调节器、进一步降低功耗。需注意,主电压调节器关闭后,仅LSI时
[单片机]
<font color='red'>STM8S</font>(105K4)使用笔记——活跃停机模式的配置与AWU唤醒
STM8S定时器操作
综述 STM8S提供三种类型的 TIM 定时器:高级控制型(TIM1)、通用型(TIM2/TIM3/TIM5)和基本型定时器(TIM4/TIM6)。它们虽有不同功能但都基于共同的 架构 。此共同的架构使得采用各个定时器设计应用变得非常容易与方便(相同的寄存器映射,相同的基本功能)。 本文只针对STM8S103该芯片进行介绍,该芯片的定时器个数为3个,每个类型的定时器都一个,分别为高级控制型(TIM1)、通用型(TIM2)、基本型定时器(TIM4)。 关于STM8S103手册的TIM简介 每个定时器的功能都有详细介绍,大家可以认真看下。 TIMx详细讲解 3.1 TIM1解析 TIM1_Prescaler    :即预分
[单片机]
串行EEPROM X24128与AT89C51的接口及编程
X24128是美国XICor公司生产的CMOS串行通信EEPROM。内部结构为16k字节8位阵列。X24182在2线总线上可同时并联8片,并具有软件和硬件写保护功能。片内最高地址单元(FFFFH)为一写保护寄存器。通过写入不同数据,可进行软件写保护、块锁定选择保护和编程硬件写保护三种不同形式的写保护。在2线总线上串行通信的最高时钟频率为400kHz。另外还具有输入、输出消噪声和抑制功能。而且功耗低,它的读状态工作电流小于1mA, 写状态工作电流小于3mA,静态电流小于1uA。工作电压有1.8V-3.6V、2.5V-5.5V和4.5V-5.5V三种类型供选择。写方式有按字节写和按页写两种形式,每页为32字节。 1.管脚说明 X2
[单片机]
串行<font color='red'>EEPROM</font> X24128与AT89C51的接口及<font color='red'>编程</font>
STM8S_004_UART基本收发数据
Ⅰ、写在前面 做软件开发的人都知道打印信息的重要,说到打印信息,我们就不得不说UART串口打印。做单片机开发的人,打印信息主要的来源就是UART串口打印。因此,关于UART相关的知识就比较重要。 printf、scanf这种标准的函数不只是可以在电脑上可以使用,在我们单片机上也同样可以使用,本文只讲述关于UART的基础知识,关于printf、scanf这一块后面将再次给大家整理一篇文章。 本文将结合“STM8S参考手册”和软件源代码给大家讲述关于UART的基础知识和用法。 为方便大家阅读,本文内容已经整理成PDF文件: http://pan.baidu.com/s/1i5uWhJR 作者:strongerHuan
[单片机]
STM8S_004_UART基本收发数据
单片机 I2C 和 EEPROM 的综合编程
电视频道记忆功能,交通灯倒计时时间的设定,户外 LED 广告的记忆功能,都有可能用到 EEPROM 这类存储器件。这类器件的优势是存储的数据不仅可以改变,而且掉电后数据保存不丢失,因此大量应用在各种电子产品上。 我们这节课的例程,有点类似广告屏。上电后,1602 的第一行显示 EEPROM 从 0x20 地址开始的16个字符,第二行显示 EERPOM 从 0x40 开始的16个字符。我们可以通过 UART 串口通信来改变 EEPROM 内部的这个数据,并且同时也改变了 1602 显示的内容,下次上电的时候,直接会显示我们更新过的内容。 这个程序所有的相关内容,前面都已经讲过了。但是这个程序体现在了一个综合应用能力上。这个程序用到了
[单片机]
STM8s(1) 系统时钟控制
// HSI为16MHz的时钟,默认8分频 // 其中 CLK_CKDIVR 控制了HSI自己的分频值和CPU的分频值 void Clock_Init(void) { while(!CLK_ICKR_HSIRDY) // HSI时钟使能 CLK_ICKR_HSIEN; while(CLK_CMSR != 0xE1) // 将HSI设置为主时钟 { CLK_SWR = 0xE1; // 目标时钟源 CLK_SWCR_SWEN; // 开始切换 while(CLK_SWCR_SWBSY); // 等待切换完成 } CLK_CKDIVR = 0x00; // HSI的分
[单片机]
STM8S 定时器第一次使用时间不准确的问题
以前用定时器只是提供系统的5ms时基,并没有发现问题,最近做红外遥控器的解码,发现启动定时器TIM2后,第一次总是时间没到就触发中断了,之后也都正常了,也就是说问题出在刚配置好第一次使用的时候 由手册得知,定时器的预分频器PSCR并不是立即生效的,只有触发一次中断事件后,才会写入设定的分频值,系统也提供了EGR寄存器的UG位来主动软件触发中断事件,可以用来解决这个问题
[单片机]
<font color='red'>STM8S</font> 定时器第一次使用时间不准确的问题
STM8S 三种时钟源的配置HSE\HSI\LSI的配置
1. 关于HSE的时钟配置为主时钟 static void CLK_Config(void) { CLK_DeInit(); // 初始化 CLK_HSECmd(ENABLE); //使能HSE CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSE, DISABLE, CLK_CURRENTCLOCKSTATE_DISABLE); //切换HSE 并关闭其他时钟 为自动模式 /*Enable CSS interrupt */ CLK_ITConfig(CLK_IT_CSSD, ENABLE); /* Enab
[单片机]
<font color='red'>STM8S</font> 三种时钟源的配置HSE\HSI\LSI的配置
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved