打印
[STM8]

请教:STM8的EEPROM的之写保护

[复制链接]
6720|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
black.lu|  楼主 | 2010-6-30 11:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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的密钥已开启,就始终处于可改写状态?还是我有其它没有注意的地方?
沙发
black.lu|  楼主 | 2010-6-30 16:50 | 只看该作者
这么冷清,自己顶一下。

使用特权

评论回复
板凳
honami520| | 2010-7-2 10:47 | 只看该作者
顶了还是很冷清

使用特权

评论回复
地板
yybj| | 2010-7-2 15:51 | 只看该作者
我一般不会轻易改头文件,都是封装好的,有问题首先从自己开始找起

使用特权

评论回复
5
yewuyi| | 2010-7-2 17:31 | 只看该作者
不太可能的吧,那也太那个了把。。。

MCU硬件在写操作成功后会不会自动清除呢?

使用特权

评论回复
6
mcuisp| | 2010-7-2 19:23 | 只看该作者
可以复位的。

使用特权

评论回复
7
black.lu|  楼主 | 2010-7-3 19:09 | 只看该作者
我后来没改头文件,我改的目的只是想看看那个读保护位能不能软件清零,后来结果是不行。我再查查原因,有结果了再来。

使用特权

评论回复
8
txcy| | 2010-7-4 09:03 | 只看该作者
复位肯定是可以

使用特权

评论回复
9
tieguanyin2008| | 2010-9-4 17:09 | 只看该作者
写保护应该这样:
FLASH->IAPSR = (u8)(~FLASH_IAPSR_DUL);

使用特权

评论回复
10
dadodo| | 2010-9-4 23:07 | 只看该作者
楼主最郁闷的在这里:

结果编译通过……以为问题到此结束,但是仿真结果证明,FLASH_IAPSR寄存器确实不可更改,且此寄存器初始值为0X4A,

你以为仿真器是万能的?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:零起点,电子承载梦想,为生活debug!

0

主题

162

帖子

1

粉丝