C:读取MCU整个闪存的值

时间:2017-07-12 19:27:28

标签: c memory flash-memory

我想读取MCU的整个程序闪存的内存位置值,特别是OpenMote-CC2538上的CC2538。然后,将读取值计算为当前所有值的大部分。

此时,我有以下代码用于遍历内存并获取值

uint64_t readMemory() {

unsigned char * bytes = (char *) 0x200000;
size_t size = 0x0007FFD4;
size_t i;
uint64_t amount = 0;
for (i = 0; i < size; i++) {
    amount += bytes[i];
    }

return amount;
}

uint64_t readFlashMemory() {

unsigned int * bytes = (int *) 0x200000;
size_t size = 0x0007FFD4; 
size_t i;
uint64_t amount = 0;
for (i = 0; i < size; i+=4) {
    amount += FlashGet(bytes);
    bytes++;
    }

return amount;
}

地址0x200000,其大小为0x0007FFD4。第一个函数使用char并逐个转到每个地址,而第二个函数使用flash.c文件中的现有函数FlashGet(uint32_t),它直接访问寄存器(HWREG)。

FlashGet需要一个uint32_t地址并返回一个uint32_t值,因此它的长度为4,地址应该在循环中以4移动。第一个函数使用char作为寻址,长度为1,所以地址也应该在循环中移动1。我在这些陈述中是否正确?如果是这样,我正确执行它们吗?对于第二个函数,将指针递增为1应该将其移动为4,因为它的类型为uint32_t(类似于int)。

但是,函数返回不同的值。 第一个返回:674426297757 第二个返回:8213668631160

由于两个函数都应该相同,因此一个或两个函数必须不正确,并且不会读取整个程序闪存。

如何修复这两个功能?当您有起始地址和大小时,是否有更好或更简单的方法来读取整个内存?

1 个答案:

答案 0 :(得分:3)

考虑你有一个带内容的4字节闪存

00 01 02 03

按字节值添加将为您提供0x000000000000006

通过32位int值添加,您将0x0000000003020100假设为little-endian。