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

2019-07-19 21:06发布

我在IAR FOR STM8编译器下定义了一个数组__eeprom __no_init u16 tps_[8];但是编译的时候提示错误如下:


我用的寄存器方式操作STM8S208RB  头文件就只包含了一个#include <iostm8s208rb.h> 不知是不是还需要包含相关头文件  看原子哥的固件库方式这样访问EEPROM的程序
都可以编译通过,忘指点一下小弟啊!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
正点原子
1楼-- · 2019-07-20 02:59
要想用:__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); 
}
正点原子
2楼-- · 2019-07-20 03:37
 精彩回答 2  元偷偷看……
太平洋冲浪者
3楼-- · 2019-07-20 05:31
回复【3楼】正点原子:
---------------------------------
谢谢原子哥,按照你给的方法已经搞定了,其实之前就看过你给的实现__eeprom关键字的三个函数,我跟踪来跟踪去就是没找到是在哪儿调用的,一直在问题的边缘徘徊啊! 看到这句“要想用:__eeprom关键字,必须实现三个函数。”才恍然大悟呀!
kuheye
4楼-- · 2019-07-20 06:12
 精彩回答 2  元偷偷看……
kuheye
5楼-- · 2019-07-20 09:41
 精彩回答 2  元偷偷看……
网络孤客
6楼-- · 2019-07-20 10:54
这是在程序执行过程中的操作吧。

如果我想在程序写入芯片时就把数据写入数据区,但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区地址。

哪里的问题?怎么办?


一周热门 更多>