This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 编译器/EK-TM4C1294XL:如何将 EEPROM 的两个连续位置读取到一个结构中

Guru**** 2337880 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/601625/compiler-ek-tm4c1294xl-how-to-read-two-consecutive-location-of-eeprom-into-a-structure

器件型号:EK-TM4C1294XL

工具/软件: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

e2e.ti.com/.../7534.main.c

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    第一个。 使用过去的代码( 图标)时、代码很难以这种格式读取。

    第二、您将填充 EE 内容中的两个指针。 这很不可能是正确的方法。

    第三、您的读取和写入大小不匹配

    第四、您要将以字节为单位的大小传递给 EEPROM 例程。 IIRC 正确地以字表示大小。

    Robert

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    第五:
    我的问题是从 EEPROM 到闪存的一个简单副本、请尝试不要粘贴3851行代码... )
    我(我知道很烦人)的建议是、最初的问题仅包含一些海报认为与问题直接相关的内容、然后"帮助者"可以在需要时提供更多详细信息。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    //保持配置参数字符串的结构
    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"};//读取密钥值结构*  

    //将配置参数读写到 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);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    PAVEITRA、为什么要发布第二篇帖子?

    Robert
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    因为我认为需要一个简单的问题说明、包括代码。

    谢谢你