打印
[ZLG-ARM]

艳兵 IAP中数组元素写FLASH问题

[复制链接]
2003|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
LYA|  楼主 | 2007-6-29 11:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
int  main(void)
{  
    uint8 err;
    uint32 i; 
    uint8 j;
    uint8 *kk;                
    uint32 Sramdata;        
//    volatile uint8 kk[256];   //用数组不知道怎么处理

    PINSEL0 = 0x00000000;            
    IO0DIR = BEEP;
    IO0SET = BEEP;

    IAP_Entry = (void(*)())IAP_ENTER_ADR;          // 初始化函数指针IAP_Entry
        
    kk=( uint8 *)Sramdata;  
   
 // Sramdata = &kk[0];  //这样取首址编译不能通过
    
    for(j=0; j<0xff; j++)
        {kk[j]=j;
        }
       
    ReadParID();                                     // 读器件ID
    BootCodeID();                                   // 读Boot版本号  
    SelSector(1,1);                                 // 选择扇区1
    EraseSector(1,1);                               // 擦除扇区1
    BlankCHK(1,1) ;                                 // 查空扇区1
    SelSector(1,1);                                 // 选择扇区1
    RamToFlash(0x00001000,Sramdata, 256);        // 写数据到扇区1 
    err = Compare(0x00001000,Sramdata, 256);     // 比较数据
   
    if(err == CMD_SUCCESS)
    {    /* 成功,蜂鸣一声 */
        IO0CLR = BEEP;
        for (i=0; i<0x3FFFFF; i++);
        IO0SET = BEEP;
    }
    else
    {    /* 失败,一直蜂鸣 */
        IO0CLR = BEEP;
    }
   
    while(1);
    return(0);
}



指针有覆盖其它数据的危险,数组的首地址又取不出来。请教大虾。

相关帖子

沙发
ayb_ice| | 2007-6-30 08:50 | 只看该作者

随便说说

RamToFlash函数要告诉我函数原型才行,我不知道它的参数类型是什么.

Sramdata = &kk[0];  //这样取首址编译不能通过
这样取首址编译不能通过是对的(有些编译器应该可以),因为Sramdata不是指针变量...

使用特权

评论回复
板凳
LYA|  楼主 | 2007-6-30 13:58 | 只看该作者

RamToFlash函数原型

uint32  RamToFlash(uint32 dst, uint32 src, uint32 no)
{  
    paramin[0] = IAP_RAMTOFLASH;             // 设置命令字
    paramin[1] = dst;                        // 设置参数
    paramin[2] = src;
    paramin[3] = no;
    paramin[4] = IAP_FCCLK;
    (*IAP_Entry)(paramin, paramout);         // 调用IAP服务程序
    
    return(paramout[0]);                     // 返回状态码
}

使用特权

评论回复
地板
ayb_ice| | 2007-6-30 14:14 | 只看该作者

随便说说


#define U32 unsigned int

uint32  RamToFlash(uint32 dst, uint32 src, uint32 no);

U32 test[256];
U32 error;

调用
error = RamToFlash(0x00001000, test, sizeof(test));        // 写数据到扇区1

上面的方法应该可以,C中规定数组名可以代表首地址,
sizeof(test)自动计算数组大小(字节),如果传递的不是
字节大小则要修改,如,sizeof(test)=256,sizeof(test)/4 = 256/4


error = RamToFlash(0x00001000, (U32)test, sizeof(test));        // 写数据到扇区1

error = RamToFlash(0x00001000, &test[0], sizeof(test));        // 写数据到扇区1

error = RamToFlash(0x00001000, (U32)(&test[0]), sizeof(test));        // 写数据到扇区1

使用特权

评论回复
5
ayb_ice| | 2007-6-30 15:15 | 只看该作者

修正一下

#define U32 unsigned int

uint32  RamToFlash(uint32 dst, uint32 src, uint32 no);

U32 test[256];
U32 error;

调用

error = RamToFlash(0x00001000, (U32)test, sizeof(test));



error = RamToFlash(0x00001000, (U32)(&test[0]), sizeof(test));

上面的方法可以,C中规定数组名可以代表首地址,(U32)test是强制把

地址test变换成U32类型,因为编译器会检查函数形参与实参是否一致,

如果不一致会出错.

sizeof(test)自动计算数组大小(字节),

如,sizeof(test)=256*4(因为一个U32是占4字节),sizeof(test)/4 = 256

使用特权

评论回复
6
LYA|  楼主 | 2007-6-30 15:18 | 只看该作者

看看

int  main(void)
{  
    uint8 err;
    uint32 i; 
    uint8 j;                
    uint8 tt[256];
    uint8 *data;
    uint8 *bdata;

    PINSEL0 = 0x00000000;            
    IO0DIR = BEEP;
    IO0SET = BEEP;

    IAP_Entry = (void(*)())IAP_ENTER_ADR;          // 初始化函数指针IAP_Entry
    
    
    for(j=0; j<0xff; j++)
        {tt[j]=0x55;
        }
        

    ReadParID();                                     // 读器件ID
    BootCodeID();                                   // 读Boot版本号  
    SelSector(8,8);                                 // 选择扇区1
    EraseSector(8,8);                                // 擦除扇区1
    BlankCHK(8,8) ;                                 // 查空扇区1
    SelSector(8,8);                                 // 选择扇区1
    RamToFlash(0x00008000,(uint32)tt, 256);        // 写数据到扇区1 
    err = Compare(0x00008000,(uint32)tt, 256);     // 比较数据
   
       
    if(err == CMD_SUCCESS)  
        {
        IO0CLR = BEEP;
        for (i=0; i<0x3FFFFF; i++);
        IO0SET = BEEP;             /* 成功,蜂鸣一声 */
        
        data=(uint8 *)0x8000;
        bdata=(uint8*)0x40003000;
          for(j=0; j<0xff; j++)
           {
            bdata[j] = ~(data[j]);    //读出验证
           }
        
          }
    else
    {    
        IO0CLR = BEEP;    /* 失败,一直蜂鸣 */
    }
   
    while(1);
    return(0);
}

使用特权

评论回复
7
LYA|  楼主 | 2007-6-30 15:51 | 只看该作者

还有一点

  

 uint8 j; 

 for(j=0; j<0xff; j++)
        {kk[j]=j;
        }
可以,为什么这样不可以
   for(j=0; j<256; j++)
        {kk[j]=j;
        }

使用特权

评论回复
8
ayb_ice| | 2007-6-30 15:55 | 只看该作者

256已经超出uint8 j的表示范围,改成U32 j即可...

使用特权

评论回复
9
LYA|  楼主 | 2007-6-30 15:58 | 只看该作者

;;

uint8不是uchar吗

使用特权

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

本版积分规则

LYA

7

主题

27

帖子

2

粉丝