如何使用 AT 命令在 u-blox sara r410 上“清除非易失性内存”

问题描述

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

根据使用设备的经验,在调试上下文中使用新固件重新刷新后会出现一些奇怪的副作用(即使设备和调制解调器处于活动状态,配置失败等也会超时......所有这些都可能导致通过其他错误/参数,我知道这一点,但回到正题)。 项目管理设置了一个新条件/功能,即固件在使用 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,-; +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); +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; 
[15:05:21.283] tx: +CSDH: 0; +CPIN:,; +cmeR: 0,0; +CPMS: "ME","ME","ME";
[15:05:21.283] tx: +CNMI: 0,0; +CMMS: 0; +copS: 0,""; +CGATT: 1; +CGACT(1,1); 
[15:05:21.283] tx: +CPOL: 0,2,-,0; +CPLS: 0; +CTZR: 0; +CTZU: 0; +CSDF: 1; +CUSD: 0; 
[15:05:21.283] tx: +CIND: 5,1,0; +cpsMS: 0,"",""; +CEDRXS: 0,""; 
[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,2; 
[15:05:32.168] tx: +IPR: 115200; +cmeE: 2; +W546: 12; +CFUN:; +UAUTHREQ: 1,-; +CEREG: 0; 
[15:05:32.168] tx: +CEMODE: 0; +CSCS: "IRA"; +CRC: 0;
[15:05:32.168] tx: +CGDCONT: (1,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: "",0; 
[15:05:32.168] tx: +CSDH: 0; +CPIN:,"ME";
[15:05:32.168] tx: +CNMI: 0,-; +CGATT: 1; +CGACT(1,1); 
[15:05:32.168] tx: +CPOL: 0,0; +CPLS: 0; +CTZR: 0; +CTZU: 0; +CSDF: 1; +CUSD: 0; 
[15:05:32.168] tx: +CIND: 5,-; 
[15:05:32.168] tx: +URAT: 0,0

解决方法

正如您正确注意到的,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 中存储参数的命令,但在这种情况下,数组的大小可能会变得非常大。