打印
[STM8]

STM8的Flash访问求助

[复制链接]
8983|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我用的芯片是STM8S207RBT6,Flash是128K,现在我想对芯片的Flash进行操作,大概情况如下:
unsigned long FlashAddr;
FlashAddr = 0x00018000;
FLASH_PUKR = 0x56;//Flash解锁
FLASH_PUKR = 0xAE;//Flash解锁
FLASH_CR1 |= MASK_FLASH_CR1_FIX;//编程时间固定为标准编程时间
*((unsigned char*)FlashAddr) = 1;
while( (FLASH->IAPSR & (FLASH_IAPSR_EOP | FLASH_IAPSR_WR_PG_DIS)) == 0);
if(*((unsigned char*)FlashAddr) == 1)//校验
return TRUE;
else
return FALSE;
结果编译器报警,conversion from integer to smalll pointer 我查了一下,原来unsigned char型指针只占两个字节,那么这样的话,最大只能访问到0xffff,但是我用的那款芯片是128K的Flash,地址是从0x8000-0x27ffff的,所以用上面的方法就行不通了。于是我换了一种方法:
unsigned int FlashAddr;
unsigned int FlashOffset;
FlashAddr = 0x8000;
FlashOffset = 0x0001;
*((unsigned char*)FlashAddr + FlashOffset*256*256) = 1;
成功骗过了编译器,但是执行后发现校验还是不行,也就是写进去的数据读出来不对。那到底怎么样才能对0xffff以后的Flash进行操作呢?
注:用的开发环境是IAR FOR STM8,那个写Flash的操作应该是正常的,因为从0x9000一直到0xffff都是正常的,当写到0x10000的时候校验就出错了。到底怎么才能访问地址超过16位的Flash啊,正式无语。。。。。。。
沙发
kill3393913|  楼主 | 2011-1-28 14:14 | 只看该作者
那位大虾搞过啊,赶紧指点指点小弟啊

使用特权

评论回复
板凳
yinyehua| | 2011-1-28 14:59 | 只看该作者
Cosmic中倒是有个@far

使用特权

评论回复
地板
kill3393913|  楼主 | 2011-1-28 15:29 | 只看该作者
:'(我也看到了,试了一下,IAR不支持@far

使用特权

评论回复
5
meimeimei| | 2011-1-28 15:35 | 只看该作者
我在STVD下用@far好像也没有用

使用特权

评论回复
6
kill3393913|  楼主 | 2011-1-28 15:45 | 只看该作者
:funk:那怎么搞啊。。。。。。。。。。。。。

使用特权

评论回复
7
kill3393913|  楼主 | 2011-1-28 16:36 | 只看该作者
那位IAR达人指点指点啊。。。。。。。。。。

使用特权

评论回复
8
kill3393913|  楼主 | 2011-1-28 16:50 | 只看该作者
香版在不在啊,指点指点啊。搞完好回家过年啊

使用特权

评论回复
9
香水城| | 2011-1-28 21:28 | 只看该作者
不好意思,香主没有用过IAR For STM8。

使用特权

评论回复
10
香水城| | 2011-1-28 21:29 | 只看该作者
LZ可以按照3楼的思路在IAR的文档中搜索一下。

使用特权

评论回复
11
dadodo| | 2011-1-30 19:32 | 只看该作者
IAR中用__far

使用特权

评论回复
12
xzwliu| | 2011-5-22 23:03 | 只看该作者
楼主能否分享下你的FLASH 访问部分源代码?

使用特权

评论回复
13
CC2530| | 2011-5-23 07:39 | 只看该作者
*((unsigned char __far *)FlashAddr) = 1;

使用特权

评论回复
14
sed2003| | 2012-11-13 17:51 | 只看该作者
本帖最后由 sed2003 于 2012-11-13 17:53 编辑

你遇到的问题,和我完全一致!我用的是COSMIC。
STM8S207和STMS208内部结构是一样的,FLASH超过10000H以后,写不进去!

使用特权

评论回复
15
明月小厨| | 2012-11-30 14:50 | 只看该作者
本帖最后由 明月小厨 于 2012-12-12 12:08 编辑

char temp;
long add;
add = 0x000000;//4个节字了,地址范围是32位,够你用了;
temp = *(char  __far *)add;//读

*(char __far *)add = temp;//写

(12月12日订正);

使用特权

评论回复
16
readdai| | 2012-12-12 10:13 | 只看该作者
明月小厨 发表于 2012-11-30 14:50
char temp;
long add;
add = 0x000000;//4个节字了,地址范围是32位,够你用了;

请问你验证过了吗??

使用特权

评论回复
17
明月小厨| | 2012-12-12 10:40 | 只看该作者
我用的是S105,没法验证;但从语法上就是这样;
你可以把一个32位的数据强制变成指针;这样就可以了.
IAR FOR STM8的操作手册我没见过,系统帮助我也没认真看(也许没有帮助文件).

我就担心 IAR会搞些优化,把0x00000000 变成了0x00;

使用特权

评论回复
18
明月小厨| | 2012-12-12 10:56 | 只看该作者
关于指针,有三个类别:
@tiny 单字节
@near 双字节
@far  3字节
在cosmic c中是这样的;但在IAR中是怎么设置我不清楚;也许只能手动自己预设.

使用特权

评论回复
19
明月小厨| | 2012-12-12 11:13 | 只看该作者
本帖最后由 明月小厨 于 2012-12-12 11:25 编辑



IAR 我试了一下,有二点:
第一:可能需要设置成全局变量(指针变量)
第二:系统的优化部分要看一看,我试用的结果,编译说这个 (char * __far) 限定符没有实际意义;
正确的是(char __far * )

使用特权

评论回复
20
明月小厨| | 2012-12-12 11:21 | 只看该作者
char __far * myptr  = (char __far *)0x01FFFF;
编译通过了;
15楼的CC2530的办法是正确的;

使用特权

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

本版积分规则

2

主题

56

帖子

1

粉丝