【问题标题】:How To "clear non volatile memory" on u-blox sara r410 using AT commands如何使用 AT 命令在 u-blox sara r410 上“清除非易失性内存”
【发布时间】:2021-01-27 18:54:57
【问题描述】:

我正在通过 UART 接口使用 STM32L4xx 和 Sara R410m u-blox 调制解调器 开发定制设备。固件是用 C 语言编写的。有一个额外的 USB 端口,因此在使用 GPIO 引脚启用调制解调器后,可以通过 u-blox m-center 向调制解调器发送具有更多图形界面的 AT-Command。 驱动程序本身不是问题。

根据使用该设备的经验,在调试上下文中使用新固件重新刷新后会出现一些奇怪的副作用(即使设备和调制解调器处于活动状态,配置失败等也会超时......所有这些都可能导致通过其他错误/参数,我知道,但回到重点)。 项目管理设置了一个新条件/功能,即固件在使用 GPIO 开启设备后,必须在写入新参数之前清除非易失性存储器

我已经在数据表第 381 页中找到了将它们的值存储在非易失性存储器中的命令列表: https://www.u-blox.com/sites/default/files/SARA-R4_ATCommands_%28UBX-17003787%29.pdf

我已经阅读了大约一周的数据表,但找不到清除非易失性内存或将出厂设置写入其中的解决方案。

也许你们可以帮助我或有建议吗?

编辑:尝试 AT&F0 或 ATZ 删除配置文件,查看日志文件内容:

[15:05:21.268] rx: AT&V
[15:05:21.268] tx: AT&V
[15:05:21.283] tx:
[15:05:21.283] tx: ACTIVE PROFILE: &C: 1; &D: 1; &F: e; Q: e; V: 1; X: 1; Z: e; &S: 1; 
[15:05:21.283] tx: &W: 0; \Q: 3; E: 1; L: 0; M: 0; &Y: 0; 0: 0; 50: 0; 54: 10; 55: 8; 56: 2; 
[15:05:21.283] tx: S7: 0; 58: 2; 510: 14; S3: 13; S2: 43; 512: 50; +ICE: 3,1; +IFC: 2,2; 
[15:05:21.283] tx: +IPR: 115200; +CMEE: 2; +W546: 12; +CFUN:; +UAUTHREQ: 1,0,-; +CEREG: 0; 
[15:05:21.283] tx: +CEMODE: 0; +CSCS: "IRA"; +CRC: 0;
[15:05:21.283] tx: +CGDCONT: (1,"IP","iot.lnce.net","0.0.0.0",0,0,0,0); +CGDSCONT: ; 
[15:05:21.283] tx: +CGEREP: 0,0; +CGSMS: 1; +CSMS: 0; +CMGF: 0; +CSAS: 0; +GRES: 0; 
[15:05:21.283] tx: +CSCA: "",; +CSMP: „0,0; +CREG: 0; +CGREG: 0; +CGPIAF: 0,0,0,0; 
[15:05:21.283] tx: +CSDH: 0; +CPIN: ,; +CMER: 0,0,0,0,0; +CPMS: "ME","ME","ME";
[15:05:21.283] tx: +CNMI: 0,0,0,0,0; +CMMS: 0; +COPS: 0,0,""; +CGATT: 1; +CGACT(1,1); 
[15:05:21.283] tx: +CPOL: 0,2,-,0,0,0,0; +CPLS: 0; +CTZR: 0; +CTZU: 0; +CSDF: 1; +CUSD: 0; 
[15:05:21.283] tx: +CIND: 5,1,1,0,0,1,1,0,1,0,0,0; +CPSMS: 0,"","","",""; +CEDRXS: 0,1,""; 
[15:05:21.283] tx: +URAT: 0,0; +UMNOPROF: 0; +UPSV: 0,0
[15:05:21.283] tx:
[15:05:21.283] tx: OK
[15:05:26.776] rx: AT&F8
[15:05:26.778] tx: AT&F8
[15:05:26.778] tx:
[15:05:26.778] tx: OK
[15:05:32.146] rx: AT&V
[15:05:32.152] tx: AT&V
[15:05:32.168] tx:
[15:05:32.168] tx: ACTIVE PROFILE: &C: 1; &D: 1; &F: 0; Q: e; V: 1; X: 1; Z: 0; &S: 1; 
[15:05:32.168] tx: &W: 0; \Q: 3; E: 1; L: 0; M: 0; &Y: e; 0: e; 50: e; S4: 10; S5: 8; S6: 2; 
[15:05:32.168] tx: S7: 0; S8: 2; 510: 14; S3: 13; S2: 43; 512: 50; +ICE: 3,1; +IFC: 2,2; 
[15:05:32.168] tx: +IPR: 115200; +CMEE: 2; +W546: 12; +CFUN:; +UAUTHREQ: 1,0,-; +CEREG: 0; 
[15:05:32.168] tx: +CEMODE: 0; +CSCS: "IRA"; +CRC: 0;
[15:05:32.168] tx: +CGDCONT: (1,"IP","iot.lnce.net","0.0.0.0",0,0,0,0); +CGDSCONT: ; 
[15:05:32.168] tx: +CGEREP: 0,0; +CGSMS: 1; +CSMS: 0; +CMGF: 0; +CSAS: 0; +GRES: 0; 
[15:05:32.168] tx: +CSCA: "",; +CSMP: „0,0; +CREG: 0; +CGREG: 0; +CGPIAF: 0,0,0,0; 
[15:05:32.168] tx: +CSDH: 0; +CPIN: ,; +CMER: 0,0,0,0,0; +CPMS: "ME","ME","ME";
[15:05:32.168] tx: +CNMI: 0,0,0,0,0; +CMMS: 0; +COPS: 0,0,-; +CGATT: 1; +CGACT(1,1); 
[15:05:32.168] tx: +CPOL: 0,2,-,0,0,0,0; +CPLS: 0; +CTZR: 0; +CTZU: 0; +CSDF: 1; +CUSD: 0; 
[15:05:32.168] tx: +CIND: 5,1,1,0,0,1,1,0,1,0,0,0; +CPSMS: 0,"","","",""; +CEDRXS: 0,1,-; 
[15:05:32.168] tx: +URAT: 0,0; +UMNOPROF: 0; +UPSV: 0,0

【问题讨论】:

  • “重置为默认配置”或“设置为出厂配置”呢?是别的吗?
  • @Lundin 这些命令 AT&F0 和 ATZ 似乎只重置了一个活动的配置文件。在使用 u-blox m-center 进行测试时,没有执行重置...

标签: c memory embedded at-command modem


【解决方案1】:

正如您正确注意到的,AT&F0 不是您要查找的内容,因为它会将属于配置文件 0 的参数重置为默认值。NVM 参数属于不同的集合:实际上,它们在硬件重置时是原生持久的,无需提供任何进一步的命令。而配置文件参数需要AT&W0命令将当前配置保存在配置文件0中,并需要AT&P0命令使其成为启动时的默认配置文件。

一些uBlox产品,例如Sara N2-N3,有一个特定的AT命令来重置NVM参数区:AT+UFACTORY

语法:
AT+UFACTORY=<fs_op>,<nvm_op>

其中:
<fs_op> 是对 FS 执行的操作(0:不恢复;1:已擦除 FS 闪存扇区,2:FS中存储的所有文件都被删除)

<nvm_op> 是对 NVM 参数执行的操作(0:不恢复;1:已擦除 NVM 闪存扇区,2:保留)

所以你会得到你所需要的发行

AT+UFACTORY=0,1

很遗憾,Sara-R4 模块目前似乎不支持此命令。出于这个原因,我只能建议一个解决方法。这是策略:

  • 分析您在应用程序中更改的所有 NVM 参数
  • 使用要恢复的所有默认值定义一个字符串数组
  • 循环发送相应命令的数组的所有元素,以便恢复所有可以更改的参数

类似

#define MAX_CMD_SIZE 50

static char DefaultNVMPars[][MAX_CMD_SIZE] = 
{
    "AT+IPR=115200", //baudrate
    "ATE0"           //echo enabled
};

void SendATCommand(char *cmd); // a function that sends to AT port the string in input, appending '\r'

void ResetNVMPars(void)
{
    int i;

    for(i=0; i<(sizeof(DefaultNVMPars)/sizeof(DefaultNVMPars[0]); i++)
    {
        SendATCommand(DefaultNVMPars[i]);
    }
}

当然这样,为了限制DefaultNVMPars 的大小,你必须限制它并注意你在应用程序中使用的任何新命令。另一方面,您可以使用在 NVM 中存储参数的所有命令进行填充,但在这种情况下,数组的大小可能会变得非常大。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-05
    • 2018-04-22
    相关资源
    最近更新 更多