本文介绍STM8L051F3的FLASH编程的相关知识。内容分为以下几部分:
1、FLASH编程简介STM8L051F3的存储器架构可分为两部分:FLASH程序存储器和数据EEPROM,它们可以由普通的寄存器进行控制,通过这些寄存器,应用程序可以对存储器的内容进行编程/擦除或设为写保护,同时也能对选项字节进行编程。
对于不同芯片的型号对应的FLASH与EEPROM大小是不一样的,STM8L051F3属于STM8L的低密度型号,它的存储器结构如下:
- 8Kbyte的FLASH
- 256Byte的EEPROM
- 64 option bytes
对存储器进行编程有Byte programming (字节编程)、Word programming(字编程)和Block programming(块编程),对于相关编程方法的详细介绍可以参考官方手册RM0031的第三章内容。
2、EEPROM读写2.1 EEPROM读写配置本小节介绍如何对STM8L051F3内部的EEPROM区域进行编程,内容较为简单,就是往某个地址写入一字节数据,然后读出来验证数据是否正确。读出来的数据与写入的数据相同LED1亮,否则LED2亮。使用的例程:STM8L051F3_10_FLASH。例程的操作步骤:
- 定义FLASH编程时间
- 解锁EEPROM区域
- 往EEPROM区域的某个地址写入一字节数据
- 读出写入EEPROM的数据
2.2 例程介绍本文采用的例程中主要的函数都在main.c文件中实现,主函数如下:
void main(void)
{
uint8_t temp; LED_Init(); //初始化LED /* 定义FLASH编程时间 */ FLASH_SetProgrammingTime(FLASH_ProgramTime_Standard); /* 解锁EEPROM */ FLASH_Unlock(FLASH_MemType_Data); /* 等待解锁完成 */ while(FLASH_GetFlagStatus(FLASH_FLAG_DUL)== RESET); /* 往EEPROM地址0x1000 + 0 处写入数据0x11 */ EEPROM_Write_Byte(0, 0x11); /* 读出EEPROM地址0x1000 + 0 处的数据 */ temp = EEPROM_Read_Byte(0); if(temp == 0x11) //判断数据是否正确 GPIO_ResetBits(LED1_GPIO_PORT, LED1_GPIO_PINS); else GPIO_ResetBits(LED2_GPIO_PORT, LED2_GPIO_PINS); while(1) { ; } }
EEPROM_Write_Byte函数如下:
void EEPROM_Write_Byte(uint8_t addr, uint8_t data)
{
/* 往EEPROM地址0x1000 + addr 处写入数据 */ FLASH_ProgramByte(FLASH_DATA_EEPROM_START_PHYSICAL_ADDRESS + addr, data); /* 等待写入完成 */ while(FLASH_GetFlagStatus(FLASH_FLAG_EOP)== RESET); }
EEPROM_Read_Byte函数如下:
uint8_t EEPROM_Read_Byte(uint8_t addr)
{
uint8_t data; /* 读出EEPROM地址0x1000 + addr 处的数据 */ data = FLASH_ReadByte(FLASH_DATA_EEPROM_START_PHYSICAL_ADDRESS + addr); return data; //返回读取到的数据 }
使用ST-LINK把程序下载到开发板,LED1亮。第一次下载后,把EEPROM_Write_Byte(0, 0x11);注释掉在编译下载,效果仍然是LED1亮,因为EEPROM是掉电保存的。把EEPROM_Write_Byte(0, 0x11)改为EEPROM_Write_Byte(0, 0x12)后编译下载,LED2亮(因为写入与读出的数据不匹配)。
|