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

[复制链接]
3017|11
 楼主| xiaolong12 发表于 2016-7-19 15:51 | 显示全部楼层 |阅读模式
有没有IAR环境下STM8操作eeprom的例子呢?自己写了几次都不成功
喵喵小星人 发表于 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开发板做的最好的了
yysforever 发表于 2016-7-22 11:00 | 显示全部楼层
我见有人的例程用的__eeprom这样的宏定义,这么做有什么好处呢?
冰是睡着的冰 发表于 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 放置一个变量在工作寄存器中
yesherecn 发表于 2016-7-23 11:52 | 显示全部楼层
写eeprom的过程中,是不能开中断的,不然就会出现错误,你可以在写eeprom的时候,中断都关掉。
playergatsby 发表于 2016-7-23 22:58 | 显示全部楼层
  1. 给你个例程看看
  2. #include <iostm8s103f3.h>

  3. #define        uint         unsigned    int
  4. #define        uchar        unsigned    char
  5. #define        ulong        unsigned    long

  6. #define        MASS_KEY1        0xAE
  7. #define        MASS_KEY2        0x56
  8. #define        EEP_BASE         0x4000

  9. void  delay_ms(uchar  ms)
  10. {
  11.     uchar  i,j;
  12.     while(ms--)
  13.     {
  14.         for(i=4;i!=0;i--)
  15.           for(j=100;j!=0;j--);
  16.     }
  17. }

  18. void  EEP_Init(void)
  19. {
  20.     FLASH_CR1 = 0x00;
  21.     FLASH_CR2 = 0x00;
  22.     FLASH_NCR2 = 0xff;
  23.     FLASH_DUKR = MASS_KEY1;
  24.     FLASH_DUKR = MASS_KEY2;
  25.     while(!FLASH_IAPSR_DUL);
  26. }

  27. void  eep_write(uint addr,uchar dat)
  28. {
  29.     *((uchar*)(addr + EEP_BASE)) = dat;
  30.     while(!FLASH_IAPSR_EOP);
  31. }

  32. uchar  eep_read(uint addr)
  33. {
  34.     return  *((uchar*)(EEP_BASE + addr));
  35. }

  36. void  main(void)
  37. {
  38.     asm("sim");
  39.     EEP_Init();
  40.     while(1)
  41.     {
  42.         asm("nop");
  43.     }
  44. }
jouney316 发表于 2016-7-24 10:41 | 显示全部楼层
这里好像用的都是寄存器,没有库函数版本的吗?
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)
    {
        ;
    }
}
l科科1987 发表于 2016-7-26 09:59 | 显示全部楼层
STM8的eeprom有个优势,可以字节写和擦除的。不像其他芯片那样,一个扇区的写和擦除
Liang118038 发表于 2017-2-7 18:35 来自手机 | 显示全部楼层
jouney316 发表于 2016-7-24 10:41
这里好像用的都是寄存器,没有库函数版本的吗?

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

本版积分规则

12

主题

185

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部