简介
本文记录了在使用AutoChips芯片Flash模拟EEP过程中的一些理解
核心代码如下
#include <stdlib.h>
#include "ac780x_sweeprom.h"
#include "ac780x_debugout.h"
#define SWEEPROM_SIZE (2048UL) /* Ssoftware eeprom size(Byte) */
#define TEST_WORDS 10
uint32_t g_testA[TEST_WORDS] = {0}; /* Buffer for software eeprom read and write */
uint32_t g_testReadA[TEST_WORDS] = {0};
void SWEEPROMDemoTest()
{
uint32_t i;
uint32_t tmpCircle = 0; // 注意16位只能计算到65536后从0开始,如需更大数字需要32位
EFLASH_UnlockCtrl(); // 每次重启都需要初始化
/* initialize eeprom size 1KB, locate in the 62th page in eflash */
SWEEPROM_Init(SWEEPROM_SIZE, 60);
SWEEPROM_Erase();
for (i = 0; i < TEST_WORDS; i++)
{
g_testA[i] = i + tmpCircle;
}
tmpCircle++;
SWEEPROM_Write(0, (uint16_t *)&g_testA[0], TEST_WORDS*2);
SWEEPROM_Read(0, (uint16_t *)g_testReadA, TEST_WORDS*2);
for (i = 0; i < TEST_WORDS; i++)
{
printf("%d ", g_testReadA[i]);
}
printf("\r\n");
}
int main(void)
{
InitDebug();
InitDelay();
SWEEPROMDemoTest();
while (1)
;
}
使用ATClink查看内存
通过计算发现在65K的地方,这个数据和我们计算的60页对不上。
再测试其他页,从50页开始,发现数据还是没有变化
提出疑问
再看看上面的65K数据,65k/2=32页,想起来之前从32页写过数据,因此再改成32页。观察结果发现最后写的数据没有变化。
根据打印的结果来看,应该在202最后一个数字,结果不对
最后一个值应该是CA
怀疑是数据没有擦除,于是擦除全片数据,然后再进行读写。
每次看地址都要把开始地址往后挪一点有点麻烦,于是从第10页开始写。然后看内存。
正确结果
最终发现在5000的地址,也就是在刚好20K的地方开始写数据。
符合我们的页数设置,第10页,每页2K,即第20480的地址就是第10页的起始地址。
和SWEEPROM_SIZE的关系
页数的地址搞清楚了,和SWEEPROM_SIZE是否有关系呢?
此时修改SWEEPROM_SIZE大小来看看有何变化
SWEEPROM_SIZE设置为4096,发现没有变化,看来存储的起始位置和SWEEPROM_SIZE没有关联
测试不同页设置的结果
试一下是否都是按照这个格式来擦写
从第56页的位置开始写
结果显示正常
从第60页开始写,按照计算应该在
结果正确
注意位数——16bit和32bit
在使用16位进行存储时候,正常存储10个数,在使用32位时候,发现位数不对。
发现多出来几个数据
SWEEPROM_SIZE的限制
经过测试,从第60页开始写,大小为2048时候是正常的,如果换成4096读写失败,debug内部表现为HardFault
根据公式计算,发现4096=512X8,即8页。而60页到63页总共只有4页,因此从60页开始初始化,使用4096会报错。