本帖最后由 black.lu 于 2010-6-30 11:37 编辑
这两天用到了EEPROM资源,写操作等都顺利,但是在写保护的问题上,一直找不到合适的做法,我个人比较转牛角尖,晒出问题和大家讨论。
部分程序代码如下:
/*******************************************************************************
Copyright (C), 2003-2009, winpark Electronics Co., Ltd.
Flie name: for STM8Sxxx--eeprom
Author: black.lu
Version: V1.00
Date: 2010-6-29
Description:对STM8系列单片机的内部EEPROM进行操作
*******************************************************************************/
#include "File_Include.h"
//----------------------------------------------------------
#define MASS_KEY1 0XAE //写操作密钥,注意FLASH与EEPROM的密钥相反
#define MASS_KEY2 0X56
#define EEP_BASE 0x4000 //EEPROM的起始地址
//----------------------------------------------------------
/***********************************************************
* 函数:void STM8_EEPROM_Init(void)
* 说明:EEPROM的寄存器初始化
* 参数:无
* 输出:无
* 返回:无
***********************************************************/
void STM8_EEPROM_Init(void)
{
//都初始化为默认值
FLASH_CR1=0X00;
FLASH_CR2=0X00;
FLASH_NCR2=0XFF;
}
/***********************************************************
* 函数:void STM8_EEPROM_MASS(void)
* 说明:对STM8的EEPROM写使能和写保护
* 参数:bool mass_en
0--写保护
1--写使能
* 输出:无
* 返回:无
***********************************************************/
void STM8_EEPROM_MASS(bool mass_en)
{
if(mass_en) //写使能
{
FLASH_DUKR=MASS_KEY1;
FLASH_DUKR=MASS_KEY2;
while(!FLASH_IAPSR_DUL)asm("nop"); //等待硬件置位
}
/*else //写保护
{
FLASH_IAPSR_DUL=0;
}*/
}
/***********************************************************
* 函数:void STM8_EEPROM_Write_Byte(void)
* 说明:EEPROM写一字节函数
* 参数:uint16 address----写入数据的偏移地址
uint8 dat----写入的一字节数据
* 输出:无
* 返回:无
***********************************************************/
void STM8_EEPROM_Write_Byte(uint8 address, uint8 dat)
{
STM8_EEPROM_MASS(1); //密钥使能
*((uint8 *)(address+EEP_BASE))=dat; //写入地址
STM8_EEPROM_MASS(0); //禁止写入
}
首先很肯定的是,STM8的单字节可擦写的功能非常好用。我之前做法都是密钥开启写入权限,然后对地址写入,最后写保护。
前面两步骤都没有问题,最后写保护的操作
/*else //写保护
{
FLASH_IAPSR_DUL=0;
}*/
编译器报错,提示此变量为不可修改变量。
在抱着对中文手册怀疑态度,查阅了英文手册,如下:
“Bit 3 DUL: Data EEPROM area unlocked flag
This bit is set by hardware and cleared by software by programming it to 0.
0: Data EEPROM area write protection enabled
1: Data EEPROM area write protection has been disabled by writing the correct MASS
keys
”
即软件可清零,郁闷……于是我斗胆更改了“iostm8.h”的头文件,将头文件库中的“__IO_REG8_BIT(FLASH_IAPSR, 0x505F, __READ, __BITS_FLASH_IAPSR);”
改为“__IO_REG8_BIT(FLASH_IAPSR, 0x505F, __READ_WRITE, __BITS_FLASH_IAPSR);”
结果编译通过……以为问题到此结束,但是仿真结果证明,FLASH_IAPSR寄存器确实不可更改,且此寄存器初始值为0X4A,那这样是不是说明只要我EEPROM的密钥已开启,就始终处于可改写状态?还是我有其它没有注意的地方? |