打印

有没有IAR环境下STM8操作eeprom的例子呢?

[复制链接]
2613|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xiaolong12|  楼主 | 2016-7-19 15:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
喵喵小星人| | 2016-7-19 19:45 | 只看该作者
我记得官方的库文件包下面就有例程的,你可以参考看看。

使用特权

评论回复
板凳
maninman1981| | 2016-7-20 22:13 | 只看该作者
E:\桌面\STM32\STM8\STM8S_StdPeriph\STM8S_StdPeriph_Lib\Project\STM8S_StdPeriph_Examples\FLASH
操作flash就是操作eeprom。

使用特权

评论回复
地板
rmbass| | 2016-7-21 09:22 | 只看该作者
可以看看风驰的例程,STM8开发板做的最好的了

使用特权

评论回复
5
yysforever| | 2016-7-22 11:00 | 只看该作者
我见有人的例程用的__eeprom这样的宏定义,这么做有什么好处呢?

使用特权

评论回复
6
冰是睡着的冰| | 2016-7-22 21:48 | 只看该作者
yysforever 发表于 2016-7-22 11:00
我见有人的例程用的__eeprom这样的宏定义,这么做有什么好处呢?


__eeprom 用于EEPROM 存储空间, 控制数据存放,控制指针类型和存放
   __tinyflash, __flash, __farflash, __hugeflash 用于flash 存储空间控制数据存放
   __ext_io, __io 用于I/O存储空间, 控制数据存放,控制指针类型和存放
   __regvar 放置一个变量在工作寄存器中

使用特权

评论回复
7
yesherecn| | 2016-7-23 11:52 | 只看该作者
写eeprom的过程中,是不能开中断的,不然就会出现错误,你可以在写eeprom的时候,中断都关掉。

使用特权

评论回复
8
playergatsby| | 2016-7-23 22:58 | 只看该作者
给你个例程看看
#include <iostm8s103f3.h>

#define        uint         unsigned    int
#define        uchar        unsigned    char
#define        ulong        unsigned    long

#define        MASS_KEY1        0xAE
#define        MASS_KEY2        0x56
#define        EEP_BASE         0x4000

void  delay_ms(uchar  ms)
{
    uchar  i,j;
    while(ms--)
    {
        for(i=4;i!=0;i--)
          for(j=100;j!=0;j--);
    }
}

void  EEP_Init(void)
{
    FLASH_CR1 = 0x00;
    FLASH_CR2 = 0x00;
    FLASH_NCR2 = 0xff;
    FLASH_DUKR = MASS_KEY1;
    FLASH_DUKR = MASS_KEY2;
    while(!FLASH_IAPSR_DUL);
}

void  eep_write(uint addr,uchar dat)
{
    *((uchar*)(addr + EEP_BASE)) = dat;
    while(!FLASH_IAPSR_EOP);
}

uchar  eep_read(uint addr)
{
    return  *((uchar*)(EEP_BASE + addr));
}

void  main(void)
{
    asm("sim");
    EEP_Init();
    while(1)
    {
        asm("nop");
    }
}

使用特权

评论回复
9
jouney316| | 2016-7-24 10:41 | 只看该作者
这里好像用的都是寄存器,没有库函数版本的吗?

使用特权

评论回复
10
Dennis-Zhou| | 2016-7-25 19:17 | 只看该作者
要想用:__eeprom关键字,必须实现三个函数。
//以下三个函数,以支持IAR独有的__eeprom关键字操作
//EEPROM完成操作等待
void __eeprom_wait_for_last_operation(void)
{
STMFLASH_WaitForLastOperation(1);        //等待操作结束
}
//EEPROM,在指定位置写入一个字节数据
//addr:地址
//data:要写入的数据
void __eeprom_program_byte(unsigned short addr,unsigned char data)
{
__eeprom_wait_for_last_operation();  
   STMFLASH_Unlock(1);  
*(PointerAttr u8*)(u16)addr=data;
__eeprom_wait_for_last_operation();  
STMFLASH_Lock(1);   
}   
//EEPROM,在指定位置写入一个long型数据(4字节)
//addr:地址
//data:要写入的long型数据
void __eeprom_program_long(unsigned short addr,unsigned long data)
{
__eeprom_wait_for_last_operation();  
   STMFLASH_Unlock(1);  
*(PointerAttr u8*)(u16)addr=(u8)(data>>24);  
__eeprom_wait_for_last_operation();  
*(PointerAttr u8*)(u16)(addr+1)=(u8)(data>>16);  
__eeprom_wait_for_last_operation();  
*(PointerAttr u8*)(u16)(addr+2)=(u8)(data>>8);  
__eeprom_wait_for_last_operation();  
*(PointerAttr u8*)(u16)(addr+3)=(u8)(data&0XFF);  
__eeprom_wait_for_last_operation();  
STMFLASH_Lock(1);  
}

/**************************************************************************************
* FunctionName   : EEPWirteBlock()
* Description    : 块写入
* EntryParameter : None
* ReturnValue    : None
**************************************************************************************/
void EEPWirteBlock(u16 blockNum, u8 *pDat)
{
    //u8 tmpBuf[FLASH_BLOCK_SIZE] = {0};

    FLASH_EraseBlock(blockNum, FLASH_MEMTYPE_DATA);
    while (FLASH_GetFlagStatus(FLASH_FLAG_HVOFF) == RESET)
    {
        ;
    }

    FLASH_ProgramBlock(blockNum, FLASH_MEMTYPE_DATA, FLASH_PROGRAMMODE_FAST, pDat);
    while (FLASH_GetFlagStatus(FLASH_FLAG_HVOFF) == RESET)
    {
        ;
    }
}

使用特权

评论回复
11
l科科1987| | 2016-7-26 09:59 | 只看该作者
STM8的eeprom有个优势,可以字节写和擦除的。不像其他芯片那样,一个扇区的写和擦除

使用特权

评论回复
12
Liang118038| | 2017-2-7 18:35 | 只看该作者
jouney316 发表于 2016-7-24 10:41
这里好像用的都是寄存器,没有库函数版本的吗?

这还要什么库函数版本,本来就很简单的东西,先解锁,然后就可以直接访问EEPROM地址的存储区,直接当成一个大数组来读写操作就成,那个数据应放哪里是使用者自己安排

使用特权

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

本版积分规则

12

主题

185

帖子

0

粉丝