silence_sky 发表于 2019-7-19 17:52:26

如何定义数组到指定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++;
}

gao_hailong 发表于 2019-7-19 18:52:17

没用过stc的,有些低端mcu用的串行flash,不支持上面的做法。

xuboluan 发表于 2019-7-19 20:37:02

我知道cotex-M3   __attribute__( at() )

jarodzz 发表于 2019-7-19 20:51:23

51 和 arm 架構是不一樣的。
51 有分program space and ram space,
ARM 是 program 和 ram 都在同一個 memory address space內。

liwei_jlu 发表于 2019-7-19 21:42:29

keilC51不是用code关键字修饰吗?

silence_sky 发表于 2019-7-20 16:27:55

liwei_jlu 发表于 2019-7-19 21:42
keilC51不是用code关键字修饰吗?

这个只是定义常量到flash,并不能指定地址。

silence_sky 发表于 2019-7-20 16:34:34

xuboluan 发表于 2019-7-19 20:37
我知道cotex-M3   __attribute__( at() )

这个我知道,如果管用就不问了。


51是用 _at_ ,但变态的是被 _at_ 定义的量不能赋初始值。
const uint8 text _at_ 0x002000是可以的,但任何位置加等于号赋值都是错误的。
定义了常量又不能赋初值,不知道keil搞这个干嘛。

对了神奇的是,在keil的帮助里只有对_at_的说明,mdk的帮助里既没有_at_的,也没有__attribute__的说明。

silence_sky 发表于 2019-7-22 10:42:18

解决。
指针取值只要定义指向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上了

xml2028 发表于 2022-5-6 00:07:34

我问也试试看看
页: [1]
查看完整版本: 如何定义数组到指定flash地址,以及连续快速读取flash