工具/软件:TI C/C++编译器
您好!
我有一个结构(KVSpair)、我想将其编程到 EEPROM 的位置0x0 中、并读回类似的结构。 我看到的只是结构中的第一个元素在读取后被填充、下一个元素导致分段故障 ISR 循环。
这是一个测试程序、用于查找密钥索引及其获取值、其中密钥和值都是字符串。
请帮助。
为了方便起见、我附加了测试代码("整个程序")、我正在对程序中相关的部分进行批注。
#define NUMKEYS 3.
/
*
*变量
*
**
*
//起始地址为0x0到0x17FC,其中 sizeof (...) 将会写入字。
#define E2PROM_TEST_ADDRESS 0x0
(小部分
* main.c
*用于计算 EEPROM 大小和块数的驱动程序
*从开始到6KB 即0x0到0x17FC 写入每个位置
*以读回该数据
*打印到 UART
(二 /
int main (void){
uint32_t e2size、e2block;
uint32_t ui32SysClock;
uint32_t ui32EEPROMInit、ui32EEPROMStatus;
//保持配置参数字符串的结构
typedef 结构{
char *键;
char *value;
}KVSpair,*dict_t;
//初始化名称值对
KVSpair KVarray[NUMKEYS]={
{"UniquePartID\0"、"GEOM-MFAM-SENSOR\0"}、
{"SerialNumber\0"、"ABCD-1294X-TM4c-xxxx\0"}、
{"MachineSerialNumber\0"、"xxxx-xx-xxxx\0"}
};
KVSpair e2prom_kV_read_value={"\0"、"\0"};//读取密钥值结构*
//******** 将 CPU 时钟设置为120 MHz //
//从 PLL 以120MHz 运行。
//
ui32SysClock = MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
SYSCTL_OSC_MAIN |
SYSCTL_USE_PLL |
SYSCTL_CFG_VCO_480)、120000000);
/* EEPROM 设置*/
SysCtlPeripheralEnable (SYSCTL_Periph_EEPROM0);// EEPROM 激活
//
//等待 EEPROM 模块准备就绪。
//
while (!SysCtlPeripheralReady (SYSCTL_Periph_EEPROM0))
{
}
//等待 EEPROM 初始化完成
ui32EEPROMInit = EEPROMInit();
//
//检查 EEPROM 初始化是否返回错误
//并通知应用程序
//
if (ui32EEPROMInit!= EEPROM_INIT_OK)
{
while (1)
{
}
}
/* UART 设置*/
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
GPIOPinConfigure (GPIO_PA0_U0RX);
GPIOPinConfigure (GPIO_PA1_U0TX);
GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1);
UARTStdioConfig (0、115200、ui32SysClock);
/********* 主要行动 /
UARTprintf ("EEPROM 测试程序\r\n");
e2size = EEPROMSizeGet ();//获取 EEPROM 大小
UARTprintf ("EEPROM 大小%d 字节\n"、e2size);
e2block = EEPROMBlockCountGet ();//获取 EEPROM 块计数
UARTprintf ("EEPROM 块计数:%d\n"、e2block);
(三
* EEPROM 的配置参数
(二 *
int i = 0;
const char * Key ="UniquePartID\0";
dict_t dict;
dict = KVarray;//指向我们分配的数据结构顶部的指针
//打印所有键
//查找密钥
char * tmpStr;
对于(i=0 <NUMKEYS;i++){
// tmpStr = strdup (dict->key);//将索引 i 处的密钥复制到 tmp str --这在 Tiva 中不起作用
tmpStr = dict->key;
if (!strcmp (tmpStr、Key)){
//将 Confif 参数字符串写入 EEPROM 并读回
UARTprintf ("写入尝试>地址%u:结构:{%s,%s}\n"、E2PROM 测试地址、dict->key、dict->value);
//等待写入操作完成
ui32EEPROMStatus = EEPROMProgram ((uint32_t *) dict、E2PROM 测试地址、sizeof (dict));//从0x0000开始写入结构
while (ui32EEPROMStatus = EEPROM_RC_working){
}//等待当前程序完成
//如果正在进行写入,请勿尝试读取
ui32EEPROMStatus = EEPROMStatusGet ();//这将返回 EEDONE 寄存器的状态
如果(!ui32EEPROMStatus)// EEDONE 寄存器在 EEPROM 空闲时全为零
EEPROMRead (((uint32_t *)&e2prom_kV_read_value、E2PROM 测试地址、sizeof (e2prom_kV_read_value));//从0x0000开始的 EEPROM 中读取结构
// EEPROMRead (((uint32_t *)&e2prom_kV_read_value.value、E2PROM 测试地址+1、sizeof (e2prom_kV_read_value.value));//从0x0000开始从 EEPROM 的结构读取
UARTprintf ("读取尝试>地址%u:结构:{%s、%s}\n"、E2PROM 测试地址、e2prom_kV_read_value.key、e2prom_kV_read_value.value);
如果(<NUMKEYS-1) dict++;
返回 i;
}
}//end for