圣龙扬特-AVR电子

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2176|回复: 1
打印 上一主题 下一主题

STM8的EEPROM操作

[复制链接]

26

主题

1

好友

3446

积分

超级版主

Rank: 8Rank: 8

UID
7
帖子
140
精华
0
注册时间
2013-2-26
在线时间
20 小时

突出贡献

跳转到指定楼层
楼主
发表于 2013-2-26 11:08:46 |只看该作者 |倒序浏览
程序如下:
#include "STM8S105C_S.h"

unsigned int eeprom_address;
unsigned char eeprom_value;

unsigned char eeprom_write_block_in_ram[100];

//#define eeadress (*(volatile unsigned intr *)ADR_8254_ARRAY[(x)])

//(*((PointerAttr u8*) Address))


void EEPROM_WRITE_BYTE(unsigned int eeaddress, unsigned char eedata)
{
       
        eeprom_address = eeaddress;
       
        /* 设置编程时间 */
        FLASH_CR1 &= (unsigned char)(~0x01);
  FLASH_CR1 |= 0x01;
       
        /* MASS密钥,解除EEPROM的保护 */
        FLASH_DUKR = 0xAE;  
  FLASH_DUKR = 0x56;                       

        *((unsigned char*) eeprom_address) = eedata;               
               
        while((FLASH_IAPSR & 0x04) != 0x00);   //EOP=1,EEPROM编程结束               
}


void EEPROM_WRITE_WORD(unsigned int eeaddress, unsigned char eedata)
{
       
        /* 设置编程时间 */
        FLASH_CR1 &= (unsigned char)(~0x01);
  FLASH_CR1 |= 0x01;
       
        /* MASS密钥,解除EEPROM的保护 */
        FLASH_DUKR = 0xAE;  
  FLASH_DUKR = 0x56;                       
       
        /* 设置字编程模式 */
    FLASH_CR2 |= 0x40;
    FLASH_NCR2 &= (unsigned char)(~0x40);

  /* 从低地址开始写入4个字节数据 */
    // *((unsigned char *)eeaddress)    = *((unsigned char*)(&eedata));
    // *(((unsigned char *)eeaddress) + 1) = *((unsigned char*)(&eedata)+1);
    // *(((unsigned char *)eeaddress) + 2) = *((unsigned char*)(&eedata)+2);
    // *(((unsigned char *)eeaddress) + 3) = *((unsigned char*)(&eedata)+3);
               
                *((unsigned char *)eeaddress)    =    (eedata);
    *(((unsigned char *)eeaddress) + 1) = (eedata+1);
    *(((unsigned char *)eeaddress) + 2) = (eedata+2);
    *(((unsigned char *)eeaddress) + 3) = (eedata+3);
               
        while((FLASH_IAPSR & 0x04) != 0x00);   //EOP=1,EEPROM编程结束               

        //BRES FLASH_IAPSR,#3                ;Data EEPROM area write protection enabled
       
}



void EEPROM_WRITE_BLOCK(void)
{
        unsigned char count;
        unsigned int eeaddress_start;
       
        eeaddress_start = 0x4000;
               
        /* 设置编程时间 */
        FLASH_CR1 &= (unsigned char)(~0x01);
  FLASH_CR1 |= 0x01;
       
        /* MASS密钥,解除EEPROM的保护 */
        FLASH_DUKR = 0xAE;  
  FLASH_DUKR = 0x56;                       
       
        /* 设置块编程模式 */
        FLASH_CR2 |= 0x01;
  FLASH_NCR2 &= (unsigned char)(~0x01);

   for (count = 0; count < 128; count++)
        {
    *((unsigned char *)(eeaddress_start + count)) = 0x99;
        }

//判断EEPROM块操作是否完成

/* STM8S103, STM8S903 属于低容量,其BLOCK的大小为64字节 */
//        while((FLASH_IAPSR & 0x04) != 0x00);   //EOP=1,EEPROM编程结束               

/* STM8S208,STM8S207,STM8S105 是中大容量,其BLCOK大小为128个字节*/
        while ((FLASH_IAPSR & 0x40) != 0x00 );  //HVOFF=1高压结束

}

void COPY_EEPROMWRITEBLOCK_INTO_RAM(void)
{               
        unsigned char eerom_count;
        eerom_count=0;
       
        while ( *((unsigned char*)EEPROM_WRITE_BLOCK + eerom_count) != 0x81 )
        {
                eeprom_write_block_in_ram[eerom_count] = *((unsigned char*)EEPROM_WRITE_BLOCK + eerom_count);
                eerom_count++;                       
        }
        eeprom_write_block_in_ram[eerom_count] = 0x81; // RET 指令                               
}

main()
{
        COPY_EEPROMWRITEBLOCK_INTO_RAM();
       
        _asm("call _eeprom_write_block_in_ram");

        _asm("nop");       
       
        while (1)
        {
               
        _asm("nop");       
        _asm("nop");
        _asm("nop");
               
        }
}
回复

使用道具 举报

0

主题

1

好友

3101

积分

超级版主

Rank: 8Rank: 8

UID
31
帖子
36
精华
0
注册时间
2013-2-27
在线时间
5 小时
沙发
发表于 2013-2-28 14:17:49 |只看该作者
表四鄙人纯属随机路过。。。顺带帮顶。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

Archiver|手机版|圣龙扬特-AVR电子 ( 鲁ICP备05022832号 )

GMT+8, 2024-12-22 00:32 , Processed in 0.194062 second(s), 19 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部