如何定义数组到指定flash地址,以及连续快速读取flash
2个问题。uint8 text={0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xa0} ;
这样一个数组,怎么定义到IAP15w单片机的指定flash地址上。比如flash地址0x3000,这里没有程序,也没有超过flash范围。
另一个是,STC的手册上写的flash数据读取都是用IAP操作,这样:
/*----------------------------
从ISP/IAP/EEPROM区域读取一字节
----------------------------*/
BYTE IapReadByte(WORD addr)
{
BYTE dat; //数据缓冲区
IAP_CONTR = ENABLE_IAP; //使能IAP
IAP_CMD = CMD_READ; //设置IAP命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_(); //等待ISP/IAP/EEPROM操作完成
dat = IAP_DATA; //读ISP/IAP/EEPROM数据
IapIdle(); //关闭IAP功能
return dat; //返回
}
我用下面的函数,用指针行不行?简单试了一下,好像读不出来数据。
void Readflashdata(uint8 pg,uint8 offset,uint8 *buf,uint8 cnt)
{
uint8 *ptr=(uint8*)(offset+pg);
while(cnt--)
*buf++=*ptr++;
} 没用过stc的,有些低端mcu用的串行flash,不支持上面的做法。 我知道cotex-M3 __attribute__( at() ) 51 和 arm 架構是不一樣的。
51 有分program space and ram space,
ARM 是 program 和 ram 都在同一個 memory address space內。 keilC51不是用code关键字修饰吗? liwei_jlu 发表于 2019-7-19 21:42
keilC51不是用code关键字修饰吗?
这个只是定义常量到flash,并不能指定地址。 xuboluan 发表于 2019-7-19 20:37
我知道cotex-M3 __attribute__( at() )
这个我知道,如果管用就不问了。
51是用 _at_ ,但变态的是被 _at_ 定义的量不能赋初始值。
const uint8 text _at_ 0x002000是可以的,但任何位置加等于号赋值都是错误的。
定义了常量又不能赋初值,不知道keil搞这个干嘛。
对了神奇的是,在keil的帮助里只有对_at_的说明,mdk的帮助里既没有_at_的,也没有__attribute__的说明。 解决。
指针取值只要定义指向code的指针 uint8 code*ptr 就可以了;一般code写前面,这里要写中间。
void Readflashdata(uint8 pg,uint8 offset,uint8 *buf,uint8 cnt)
{
uint8 code*ptr=(uint8*)(offset+pg);
while(cnt--)
*buf++=*ptr++;
}
51的绝对定位以前一定是有直接在程序里就可以定义的。我记得我用过。
现在只能是在Project->Options for Target->BL51 Locate->Code 一栏里填写定位信息。
比如code uint8 text= {0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xa0} ;
先编译一次,然后在本工程的M51文件中找
* * * * * * * C O D E M E M O R Y * * * * * * *
这下面就是code量。
名字和变量不一定对应。比如我这个text是在main.c里。
CODE 0FB0H 000EH UNIT ?CO?MAIN
这一行其实定义的就是text,
然后在BL51 Locate->Code里写 ?CO?MAIN(0x2000),再编译,text就被定义到绝对地址0x2000上了
我问也试试看看
页:
[1]