首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在微控制器的内部Flash上编写.hex文件?

如何在微控制器的内部Flash上编写.hex文件?
EN

Stack Overflow用户
提问于 2012-12-06 11:14:00
回答 2查看 5.3K关注 0票数 0

我想写一个28 kb大小的".hex“文件,上面提到的32 kb.The大小的内部flashROM是用来初始化flashROM的。下面将介绍我为编写该文件和代码所做的工作:

  • 我有一个英特尔十六进制格式的.hex文件,我必须读写到内部FlashROM of At91(8051)微控制器。
  • 以“.hex”模式打开rb+文件。
  • 获取文件的长度并将指针设置为开始地址(零地址)。
  • 由于我需要逐页编写该文件,并且在我的示例中页面大小为256字节,所以我已经将该文件除以256。
  • 在那之后,我得试着写那个文件。

请让我知道我哪里出错了。代码如下所示。

代码语言:javascript
复制
int a,b; int size,last_chunk; FILE *file; char *buffer1,name[20]; unsigned long fileLen;

file = fopen("flashROM.hex", "rb+");
if (!file)
{
    fprintf(stderr, "Unable to open file %s", name);
    return;
}

fseek(file, 0, SEEK_END);
fileLen=ftell(file);
printf("the file length is:%d\n",fileLen);
fseek(file, 0, SEEK_SET);

//Allocate memory
buffer1 =(char *)malloc(fileLen+1);

if (!buffer1)
{
    fprintf(stderr, "Memory error!");
            fclose(file);
    return;
}

//Read file contents into buffer
fread(buffer1, fileLen, 1, file);
/* We have to divide the entire file into chunks of 256 bytes*/
size = fileLen/256;
printf("\nsize = %d\n",size);
last_chunk = fileLen%256;
printf("\nlast chunk = %d bytes\n",last_chunk);

address = 0x0000;
printf("File upgradation should start from :%.4x",address);

for(a=0;a<=size;a++)
{
    write(fd,&buffer1,size);
    printf("Iteration=[%d]\t Data=[%x]\n",a,*buffer1);
    usleep(5000);
}
for(b=0;b<=last_chunk;b++)
{
    write(fd,&buffer1,1);
    usleep(5000);
}

在执行上述程序的二进制之后,下面将介绍我的结果:

代码语言:javascript
复制
    Writing upgrade file
    the file length is:30855

    size = 120

    last chunk = 135 bytes
    File upgradation should start from :0000
    Iteration=[0]    Data=[3a]
    Iteration=[1]    Data=[3a]
    Iteration=[2]    Data=[3a]
    Iteration=[3]    Data=[3a]
    Iteration=[4]    Data=[3a]
    Iteration=[5]    Data=[3a]
    Iteration=[6]    Data=[3a]
    Iteration=[7]    Data=[3a]

我不知道,为什么数据总是"3a",还不清楚。请让我知道我在编程中做错了什么。

EN

回答 2

Stack Overflow用户

发布于 2012-12-06 11:59:55

您需要一个特殊的工具来读取.hex文件,并执行将其写入控制器的闪存所需的任何操作(JTAG,通过任何通信方式与引导加载程序交谈,.)。

该工具取决于您特定的微控制器系列。8051是不够的信息,有各种各样的8051从许多供应商。

票数 5
EN

Stack Overflow用户

发布于 2012-12-06 11:16:14

尝试使用"wb+"作为fopen的模式

如果文件还不存在,以可写方式打开该文件将创建该文件。

您编写数据的代码看起来也很可疑。您是将指向缓冲区的指针的指针传递到write,而不是向缓冲区传递简单的指针。我也没有看到指针增加,所以您正在重复编写相同的数据。

您可以尝试将您的编写代码替换为以下内容:

代码语言:javascript
复制
char* ptr = buffer1;
for(a=0;a<=size;a++)
{
    write(fd,ptr,size);
    ptr+=size;
    printf("Iteration=[%d]\t Data=[%x]\n",a,*buffer1);
    usleep(5000);
}
for(b=0;b<=last_chunk;b++)
{
    write(fd,ptr,1);
    usleep(5000);
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13742432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档