/**********************************************************************
/* MAIN.C file
*
* Copyright (c) 2002-2005 STMicroelectronics
*/
//EEPROM的读写
//先对)0x40000写入0x12
//在读出来写的数据
//如果是0x12,就使得PD的前4位输出颠倒
#include "stm8s103f.h"
unsigned char ch;
main()
{
unsigned char *p;
PD_DDR=0x0f;
PD_CR1=0x0f;
PD_CR2=0x00;
PD_ODR=0x00;
p=(unsigned char *)0x4000;//指针P指向EEPROM的第一个单元
do
{
FLASH_DUKR=0xae;//写入第一个密钥
FLASH_DUKR=0x56;//写入第一个密钥
}while((FLASH_IAPSR&0x08)==0);//若解锁未成功,则继续写
*p=0x12;//写入第一个字节
while((FLASH_IAPSR&0x04)==0) ;//等待写操作成功
ch=*p;
while (1)
{
if(ch==0x12)
{
PD_ODR^=0x0f;
}
}
}
/**********************************************************************
在用STVP烧写程序的时候会出现如图所示的警告
引用http://www.51hei.com/bbs/dpj-25357-1.html的解决办法
个人总结:延迟21毫秒后再操作EEPROM,延迟20毫秒烧录都会报错。(STM8S003F3)
我上个月也出现了这样的问题,对出现问题的的工程进行分析。
发现,在main函数中直接解除EEPROM的锁定,然后对特定的EEPROM地址进行赋值,只要赋的值不是0,就会报错,
直接插入CLR或者LD指令操作EEPROM地址,发现CLR指令不会报错,LD的会报错。也就是说,清零没问题,赋值会有问题。
今天,使用STVP下载的时候再次出现这样的问题,对多处修改进行分析。发现原来是我用的配置初始化函数中ConfigInit(),
有类似这样的语句*EEP_Config =ROM_Config(两个都是结构体,其中前面一个指向EEP,后一个在定义的时候带有const)。
今天早上之前都没有这个错误的,经查出现错误的原因是:以前我是在菜单状态机的第一个状态,在启动后一秒钟调用ConfigInit(),
而今天早上我是将ConfigInit()函数放到了第一个状态的入口动作上,也就是说在菜单状态机被初始化的时候,ConfigInit()函数就会被调用。
同时我是将初始化菜单状态机的函数,直接放在main函数中的,即上电后马上调用ConfigInit()!
将ConfigInit()函数延后执行后,程序下载恢复正常。
我才猜测是这样的:启动后的一段时间内不能对EEPROM进行赋值,要不然就会被报错。
结合在STVP下载的时候,能看到LCD狂闪,推论如下:
STVP在下载的时候,程序是可以断断续续的运行的,而在期间如果执行了赋值EEPROM的动作,那么STVP在随后对EEPROM的
检测的时候,发现并非全是0,就会将不是0的那个地址用下面的语句报错:
Verify failed at address0xXXXX
希望能帮到以后遇到这个问题的人~~
/************************************************************************************************************************************
关键字:stm8s103f3p EEPROM 读写
引用地址:
stm8s103f3p EEPROM的读写
推荐阅读最新更新时间:2024-03-16 16:13
avr的SD卡基本读写程序(二)
SD卡读写子程序 硬件平台:atmega8L最小系统 硬spi(sd卡的初始化采用了io口模拟时序,因为在实验中发现要使用较低的速率才能稳定的初始化) 软件开发平台:ICC-AVR version 6.31a 硬件配置:atmega8L 内部8m时钟 sandisk 128m sd卡 几个基本的子程序及其介绍: 1.io口模拟spi,实现数据发送,在初始化时使用 void iodatatransfer(unsigned char iodata) { unsigned char num,b; num=0x80; for (b=0;b 0x08;b++) { W
[单片机]
PIC16F1829 DATA EEPROM 读写操作示例
简介:本文给出一个PIC16F1829 DATA EEPROM 读写操作示例,感兴趣的朋友可以看看。 #define ReadRomString_CALL #define WriteRomString_CALL //************************************* // 函数名称:ReadRomByte // 函数功能:从ROM的某一地址读数据 // 入口参数:所读数据的地址 // 出口参数:所读地址的数据 //*************************************** uint8 ReadRomByte(uint8 addr) { uint8 num; while(R
[单片机]
STC89C52单片机的扩展RAM读写时序
书上看到的毕竟是理论的东西,实际应用中总会碰上意外的或者说是不可预测的情况,与其在那瞎推理,还不如动手做点实际的工作。 特权同学用的是11.0592MHz的STC89C52做测试,C代码也很简单: #include #define uchar unsigned char #define uint unsigned int uchar xdata LD _at_ 0x7fff; void delay(uint cnt) { uint i; for(i=0;i } void main(void) { uchar i; delay(1000);
[单片机]
2440 I2C存储卡读写实验 AT24c08a
本实验为IIC总线通信协议,以友善之臂mini2440为实验平台,对其开发板上的AT24c08a指定位置写入字符串“hello”,并指定位置读出该位置的内容。 初始工作,首先需要配置GPE14、15管脚分别为IICSLC、IICSDA,并禁止上拉功能。然后设置IIC时钟频率,使能应答信号,并使IIC中断使能,禁止IIC中断屏蔽寄存器。 应答中断处理函数为清除中断标志位,清除中断标记flag。 指定内存写函数的实现为:首先设置主设备发送模式,写入从设备地址,清除中断标记,然后等待应答,写入设备内存地址,等待到应答后开始连续发送数据,存入指定空间。发送结束发出停止命令,结束本次通讯,让IIC状态改为开始状态,准备下
[单片机]
CS5550读写程序
最近一直在写采集板的程序。 采用STM32F101与外部AD CS5550。 刚刚接触这个CS5550,感觉时序有点怪异。尤其是读的时候,在后3个指节,还要写SYNCO. 刚开始对这个非常不理解。后来参考了网上的一个程序。貌似网上就只有一个程序。于是有一点理解。就是说,单片机在读CS5550的数据时(也就是读MISO)还要往CS5550(MOSI)写数据。 CS5550读写大致是这样的。 读写都要32个周期。 前8个周期读写都是相同的,就是都要先写地址,然后读/写 地址的内容。 但是读的时候在后24个周期的时候要写3次SYNCO(11111110).这个是难点,容易被忽略。 刚开始我也琢磨了很久。 后来终于柳岸花明
[单片机]
STM32 FLASH做EEPROM用
STM32 本身没有自带 EEPROM,但是 STM32 具有 IAP(在应用编程)功能,所以我们可以把它的 FLASH 当成 EEPROM 来使用 STM32 FLASH 简介 不同型号的 STM32,其 FLASH 容量也有所不同,最小的只有 16K 字节,最大的则达到了1024K 字节。战舰 STM32 开发板选择的 STM32F103ZET6 的 FLASH 容量为 512K 字节,属于大容量产品(另外还有中容量和小容量产品), STM32 的闪存模块由:主存储器、信息块和闪存存储器接口寄存器等 3 部分组成。 主存储器,该部分用来存放代码和数据常数(如 const 类型的数据)。对于大容量产品,其被划分为 256 页,每
[单片机]
STC单片机片内EEPROM的读写
宏晶STC很多系列的单片机片内都集成了EEPROM存储器(其实是Data Flash),方便用户使用,想得真周到!今天写了个小程序,测试了一下,工作正常。下面就上我自己写的源程序。本人在STC89C52RC单片机上试验成功。 首先是stcEEPROM.h头文件内容: /* When Who Remarks ---------------------------------- 2011-Oct-06 黄长浩 初始版本 */ #ifndef __STCEEPROM_H__ #define __STCEEPROM_H__ #define STC_EEPROM_START_ADDR 0x2000 //STC89C
[单片机]
STM8 中I2C读写函数
void I2C_write(u8 Addr, u8 *WriteData, u8 length) { /* Send STRAT condition */ I2C_GenerateSTART(ENABLE); /* Test on EV5 and clear it */ while(!I2C_CheckEvent(I2C_EVENT_MASTER_START_SENT)); /* Send EEPROM address for write */ I2C_Send7bitAddress(Addr, I2C_DIRECTION_TX); /* Test on EV6 and clear it */ while(!
[单片机]