OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6767|回复: 7

IAR 像访问内存一样访问STM8 EEPROM编译时报错

[复制链接]

4

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2013-8-2
在线时间
0 小时
发表于 2013-10-16 16:39:37 | 显示全部楼层 |阅读模式
我在IAR FOR STM8编译器下定义了一个数组__eeprom __no_init u16 tps_[8];但是编译的时候提示错误如下:


我用的寄存器方式操作STM8S208RB  头文件就只包含了一个#include <iostm8s208rb.h> 不知是不是还需要包含相关头文件  看原子哥的固件库方式这样访问EEPROM的程序
都可以编译通过,忘指点一下小弟啊!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-10-16 18:32:40 | 显示全部楼层
要想用:__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); 
}
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-10-16 18:33:39 | 显示全部楼层
//解锁STM8S的FLASH
//0,程序存储区(FLASH)解锁
//1,数据存储区(EEPROM)解锁
void STMFLASH_Unlock(u8 type)
{
    if(type==0) //程序存储区(FLASH)解锁
    {
        FLASH->UKR=FLASH_UNLOCK_KEY1;
        FLASH->UKR=FLASH_UNLOCK_KEY2;
    } 
    else //数据区(EEPROM)解锁
    {
        FLASH->DUKR=FLASH_UNLOCK_KEY2; //注意,这里和数据手册写的有出入!!! 
        FLASH->DUKR=FLASH_UNLOCK_KEY1;
    } 
while(!(FLASH->IAPSR&(1<<3))); //等待解锁成功
}
//STM8S的FLASH上锁
//0,程序存储区(FLASH)上锁
//1,数据存储区(EEPROM)上锁
void STMFLASH_Lock(u8 type)
{
if(type==0)FLASH->IAPSR&=~(1<<1); //主程序存储区(FLASH)上锁
else FLASH->IAPSR&=~(1<<3); //数据存储区(EEPROM)上锁

//等待FLASH操作完成
//type:
//0,等待程序存储区(FLASH)操作
//1,等待数据存储区(EEPROM)操作
//返回值:0,成功;1,失败.
u8 STMFLASH_WaitForLastOperation(u8 type)
{
    u8  status=0X00;
    u32 timeout=0XFFFFF; 
#if defined(STM8S208)||defined(STM8S207)||defined(STM8S007)||defined(STM8S105)||\
    defined(STM8S005)||defined(STM8AF52Ax)||defined(STM8AF62Ax)||defined(STM8AF626x)  
    if(type==0)//等待FLASH操作结束
    {
        while((status==0x00)&&timeout)
        {
            status=FLASH->IAPSR&(1<<2|1<<0);
            timeout--;
        }
    }else //等待EEPROM操作结束
    {
        while((status==0x00)&&timeout)
        {
            status=FLASH->IAPSR&(1<<6|1<<0);
            timeout--;           
        }
    }
#else//STM8S103, STM8S903
while(status&&timeout)
{
status=FLASH->IAPSR&(1<<2|1<<0);
timeout--;    
}
#endif 
    if(timeout==0)return 1;
return 0; 
}
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2013-8-2
在线时间
0 小时
 楼主| 发表于 2013-10-17 12:54:57 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
谢谢原子哥,按照你给的方法已经搞定了,其实之前就看过你给的实现__eeprom关键字的三个函数,我跟踪来跟踪去就是没找到是在哪儿调用的,一直在问题的边缘徘徊啊! 看到这句“要想用:__eeprom关键字,必须实现三个函数。”才恍然大悟呀!
回复 支持 反对

使用道具 举报

25

主题

78

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
234
金钱
234
注册时间
2015-12-16
在线时间
32 小时
发表于 2016-7-5 16:19:54 | 显示全部楼层
我也没碰到同样的问题,
楼上没看明白
是不是要编写3个函数啊,稀里糊涂了.........................
回复 支持 反对

使用道具 举报

25

主题

78

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
234
金钱
234
注册时间
2015-12-16
在线时间
32 小时
发表于 2016-7-6 10:17:56 | 显示全部楼层
是不是要编写一个.c文件,装入这三个函数
请两位指点,谢谢
顶起来................
回复 支持 反对

使用道具 举报

14

主题

140

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1108
金钱
1108
注册时间
2015-12-20
在线时间
118 小时
发表于 2016-10-3 22:36:24 | 显示全部楼层
这是在程序执行过程中的操作吧。

如果我想在程序写入芯片时就把数据写入数据区,但STVP载入时出现错误,
在IAR中,我定义数组
数据定义时:
__eeprom u8 XXX[640] = {xxx,xxx,........,} ;//共640个常量数据

在STVP中载入HEX文件时提示一堆类似的错误:(以下是其中一条)
FILE : line 38: Address 0x4251 is out of range and is ignored!

地址刚好是STM8S103F3P6的DATA区地址。

哪里的问题?怎么办?


回复 支持 反对

使用道具 举报

14

主题

140

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1108
金钱
1108
注册时间
2015-12-20
在线时间
118 小时
发表于 2016-10-4 17:24:23 | 显示全部楼层
正点原子 发表于 2013-10-16 18:32
要想用:__eeprom关键字,必须实现三个函数。
//以下三个函数,以支持IAR独有的__eeprom关键字操作
//EEPROM ...

这三个函数与库函数eeprom的操作有什么区别?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 05:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表