搜索
bottom↓
回复: 31

用过STM32G070的朋友有没有遇到过掉程序的情况

[复制链接]

出0入46汤圆

发表于 2022-6-28 16:37:25 | 显示全部楼层 |阅读模式
本帖最后由 工程师030 于 2022-6-28 16:39 编辑

我们公司用这个芯片做了两个项目,一个是4G是数据采集上传模块,还有一个是机柜空调的主板。
两种产品都有BootLoader,数据保存也是在内置的flash中。现在的情况是:
1、        4G的设备做个升级测试,280台左右的设备通过4G下载固件先保存到用不到的flash扇区中,其中有2台没有下载成功。
        因程序没有开启看门狗,到我手上的时候看起来是死机状态,拿到样机重新下载程序仿真。通过Jlink在memory窗口看出program的过程数据没有写入。
        随后我将设备断电重新开,并打开4G升级又可以进行了,另外一个设备直接断电也可以升级了,感觉非常奇怪。
2、        机柜空调主板出厂的时候我们都会上工装检测,但是到用户手里面总会时不时的又设备出现只能进boot loader但是进入不了主程序的情况,
        上电显示进入boot loader,感觉该跳转主程序的时候发生了重启。这种的主板我在上电后发指令通过boot对主程序进行升级也能操作,但是没完成就触发了看门狗复位,又重头开始。
        感觉像是主程序损坏或者丢了一样。这个程序跑了RTX系统,用户也极少会设置参数,频繁写flash保存参数的可能基本排除,而且也不应该对主程序有影响。此问题发生概率大概千分之几。
以上经历不知道有没有坛友遇到过,这个芯片虽然FLASH寿命1000次,但是也不至于会发生我说的问题。

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出100入312汤圆

发表于 2022-6-28 16:39:46 来自手机 | 显示全部楼层
把整个flash读回校验下

出0入46汤圆

 楼主| 发表于 2022-6-28 16:42:31 | 显示全部楼层
akey3000 发表于 2022-6-28 16:39
把整个flash读回校验下
(引用自2楼)

基站空调的主板出厂都有加密,读不了,除非找人破解了

出100入312汤圆

发表于 2022-6-28 16:46:31 来自手机 | 显示全部楼层
把参数保存写flash部分屏蔽了试试。一般客户处出现的,实验室也能复现

出0入46汤圆

 楼主| 发表于 2022-6-28 16:49:37 | 显示全部楼层
akey3000 发表于 2022-6-28 16:46
把参数保存写flash部分屏蔽了试试。一般客户处出现的,实验室也能复现
(引用自4楼)

测试阶段包括老化阶段均未出现,客户那边也是使用了年把才出现的

出0入0汤圆

发表于 2022-6-28 17:34:10 | 显示全部楼层
用着G070CBT6和G031G8T6,有bootloader和app,但参数都是保存在外部数据flash中,暂时没有发现你说的现像。一般这种远程更新我们是先保存到外部flash中,设置标识,用bootloader更新前,把它读出来先校验一遍是否正确再起动更新流程。

出0入46汤圆

 楼主| 发表于 2022-6-29 09:14:32 | 显示全部楼层
sunjianmax232 发表于 2022-6-28 17:34
用着G070CBT6和G031G8T6,有bootloader和app,但参数都是保存在外部数据flash中,暂时没有发现你说的现像。 ...
(引用自6楼)

为省成本和引脚,没有使用外置的flash,我保存完了也会读flash和收到的数据进行校验

出0入1209汤圆

发表于 2022-6-29 10:31:45 | 显示全部楼层
看1过程描述大概率是你的程序有bug的。我们这边的做法是升级放到boot区里做。设备收到升级指令后,往flash里写一个标识然后重启到boot区,boot区检查到标识后,连接服务器然后擦除APP区,然后从服务器接收数据直接写入APP区域,最后校验数据无误后擦除升级标识,然后重启。

出0入46汤圆

 楼主| 发表于 2022-6-29 11:20:06 | 显示全部楼层
kitten 发表于 2022-6-29 10:31
看1过程描述大概率是你的程序有bug的。我们这边的做法是升级放到boot区里做。设备收到升级指令后,往flash ...
(引用自8楼)

1的程序boot功能只转移数据,不联网。主程序负责接收数据并存到没用到的flash里面,写入校验完成后写标识重启。重启进入boot将数据转移到主程序地址。
问题是主程序写数据的时候看到flash还是0xff的状态,数据没写上去。

出0入1209汤圆

发表于 2022-6-29 13:25:23 | 显示全部楼层
本帖最后由 kitten 于 2022-6-29 13:27 编辑
工程师030 发表于 2022-6-29 11:20
1的程序boot功能只转移数据,不联网。主程序负责接收数据并存到没用到的flash里面,写入校验完成后写标识 ...
(引用自9楼)


那不就是flash写入问题嘛,楼上给你出招了,应该读出整个flash看看,不需要用仿真模式,仿真模式下可能会有别的问题。另外boot里做联网的好处是即使升级失败,设备也不需要退回来,最多是让客户断电重启一下,boot就重新请求数据了。甚至可以做成上电时按下某个按键,设备就强制进入boot升级模式。这样不用怕设备升级挂掉。因为无论设备代码做的如何完善,都无法避免升级时断电的风险,虽然是小概率事件。而放到boot里升级,boot代码不需要更新,所以不怕断电损坏,设备任何时刻都可以断电只要重新上电就会重新请求升级的。

出615入1076汤圆

发表于 2022-6-29 13:59:13 | 显示全部楼层
本帖最后由 dukelec 于 2022-6-29 14:02 编辑
工程师030 发表于 2022-6-29 11:20
1的程序boot功能只转移数据,不联网。主程序负责接收数据并存到没用到的flash里面,写入校验完成后写标识 ...
(引用自9楼)


> 写入校验完成后写标识重启

> 问题是主程序写数据的时候看到flash还是0xff的状态,数据没写上去

既然沒寫上去,是怎麼通過你的校验的?

我的做法跟你類似,bootloader 不聯網,app 聯網下載 app_new 到本地專屬區域,下載完畢要再計算一下本地的 app_new 的 crc,確保沒寫錯,才寫標誌重啓讓 bootloader 升級,bootloader 還要再比對一下 app_new 的 crc,沒問題才把 app_new 搬到 app 區域

只不過我固件比較大,app_new 是在外部 spi nor flash

同意樓上,不要用 jtag 仿真,用串口打印才靠譜

你下載的新固件應該是加密傳輸的吧,建議 bootloader 增加讀寫 flash 的接口,同樣加密傳輸 flash 內容,這樣便可以讀取 flash 內容做比較,同時不怕泄密

出0入16汤圆

发表于 2022-6-29 14:05:58 | 显示全部楼层
dukelec 发表于 2022-6-29 13:59
> 写入校验完成后写标识重启

> 问题是主程序写数据的时候看到flash还是0xff的状态,数据没写上去
(引用自11楼)

你这种做法问题不大,而且占用CODE也小,而且Boot任何程序都可以通用,校验分为两部分
第一:下载校验 主程序下载完成后回读Flash校验通过写标识重启升级
第二:安装校验 Boot中擦除完,写Flash后重新读一遍主程序校验没问题后清除升级标识,校验失败就重写或者进入异常流程,保证安装肯定成功

出0入46汤圆

 楼主| 发表于 2022-6-29 14:24:58 | 显示全部楼层
dukelec 发表于 2022-6-29 13:59
> 写入校验完成后写标识重启

> 问题是主程序写数据的时候看到flash还是0xff的状态,数据没写上去
(引用自11楼)

数据是1K一次的下载,服务器发来的时候是带校验的,接收完了会校验数据,正确会写flash,我描述的可能不是太清楚,是数据没有写进flash,并且尝试2次退出了升级。
这个问题不好复现,用仿真器正好捕捉到这么一次,找到了这个问题,不知道是不是和我用fastProgram有关联

出0入1209汤圆

发表于 2022-6-29 15:58:16 | 显示全部楼层
工程师030 发表于 2022-6-29 14:24
数据是1K一次的下载,服务器发来的时候是带校验的,接收完了会校验数据,正确会写flash,我描述的可能不 ...
(引用自13楼)

网络不好的情况下1K/次  可能会出现数据接收不完整的问题,你是每1K校验一次么?校验不通过应该重新请求这一包数据,而不是错误两次就退出了。你这样的逻辑成功率到现场环境成功率应该不会高

出0入16汤圆

发表于 2022-6-29 16:03:45 | 显示全部楼层
工程师030 发表于 2022-6-29 14:24
数据是1K一次的下载,服务器发来的时候是带校验的,接收完了会校验数据,正确会写flash,我描述的可能不 ...
(引用自13楼)

你这个校验必须带整个文件校验,帧校验归帧校验,所有帧下载完成后,把完整的固件包读出来校验一遍没问题了再重启安装,有问题则重新下载,同理,安装完成后也可以把Flash数据读出来校验一遍,检查安装是否正确。固件升级必须严谨,不能有一丝出错,不然就变砖了

出0入46汤圆

 楼主| 发表于 2022-6-29 16:31:26 | 显示全部楼层
kitten 发表于 2022-6-29 15:58
网络不好的情况下1K/次  可能会出现数据接收不完整的问题,你是每1K校验一次么?校验不通过应该重新请求 ...
(引用自14楼)

当然是每次收到数据都会校验,有问题会重新请求的,两次不成功才退出升级

出0入46汤圆

 楼主| 发表于 2022-6-29 16:32:44 | 显示全部楼层
初音之恋 发表于 2022-6-29 16:03
你这个校验必须带整个文件校验,帧校验归帧校验,所有帧下载完成后,把完整的固件包读出来校验一遍没问题 ...
(引用自15楼)

数据都是1K大小接收的,每收1K都会校验,不正确还会请求,不存在接受错误问题,是数据没写入到FLASH中,仿真看到的还是0XFF

出0入16汤圆

发表于 2022-6-29 16:40:15 | 显示全部楼层
本帖最后由 初音之恋 于 2022-6-29 17:11 编辑
工程师030 发表于 2022-6-29 16:32
数据都是1K大小接收的,每收1K都会校验,不正确还会请求,不存在接受错误问题,是数据没写入到FLASH中, ...
(引用自17楼)


我的意思是最重要的校验手段是Flash写进去以后和读出来以后一致才算是一次成功的校验,你看人家离线烧录器有的都是写一个数据回读一个数据保证一致的,整个固件包回读校验可以保证服务器发的和你Flash回读出来的数据100%一致,可以防止各种意外状况出现变砖

出0入46汤圆

 楼主| 发表于 2022-6-29 20:57:05 | 显示全部楼层
初音之恋 发表于 2022-6-29 16:40
我的意思是最重要的校验手段是Flash写进去以后和读出来以后一致才算是一次成功的校验,你看人家离线烧录 ...
(引用自18楼)

这个当然有,就是校验不对上的仿真器看的

出0入1209汤圆

发表于 2022-6-29 21:56:07 | 显示全部楼层
工程师030 发表于 2022-6-29 16:31
当然是每次收到数据都会校验,有问题会重新请求的,两次不成功才退出升级 ...
(引用自16楼)

首先两次不成功,这个次数太少了,网络堵塞,网络不良太正常了。我们用2G网络的时候都是请求50次的。50次请求不成功,每间隔一小时2G断电重新注册网络连接服务器,然后再重试。
其次是既然你都抓到了程序没有写入flash,那检查没写入的原因,最好是不要用仿真,而是在关键位置加打印输出日志,最后在用jlink读出整个的flash用winhex自己看数据。
最后写入没成功有可能擦除的时间过长,看门狗复位导致,flash擦除时间要按照最长时间算。擦除前,擦除后,写入前,写入后,都要刷新看门狗。也有可能擦除/写入位置越界,导致程序挂掉。还有可能是程序bug,写入前没有解锁flash导致。你要自己加打印慢慢判断了。

出15入178汤圆

发表于 2022-6-30 08:57:48 | 显示全部楼层
用另一家芯片(非ST)遇到程序不对的问题,故障现场还在,经技术支持分析实锤了,为此我特意加了程序自检。

出0入46汤圆

 楼主| 发表于 2022-6-30 09:06:20 | 显示全部楼层
kitten 发表于 2022-6-29 21:56
首先两次不成功,这个次数太少了,网络堵塞,网络不良太正常了。我们用2G网络的时候都是请求50次的。50次 ...
(引用自20楼)

确实是最可行的解决方案了,第二种空调主板的应用您能给点建议吗?到用户手上一年以上才会出现,而且给客户的程序都是加密过的,我感觉是主程序数据异常且在boot中未知原因喂不了狗

出0入46汤圆

 楼主| 发表于 2022-6-30 09:07:36 | 显示全部楼层
2nd 发表于 2022-6-30 08:57
用另一家芯片(非ST)遇到程序不对的问题,故障现场还在,经技术支持分析实锤了,为此我特意加了程序自检。 ...
(引用自21楼)

是烧录器写完之后程序数据不对吗?

出1315入193汤圆

发表于 2022-6-30 10:37:25 | 显示全部楼层
现场参数,保存内部flash
是不是可靠性不高
老生常谈的话题

出0入1209汤圆

发表于 2022-6-30 10:58:45 | 显示全部楼层
机柜空调主板出厂的时候我们都会上工装检测,但是到用户手里面总会时不时的又设备出现只能进boot loader但是进入不了主程序的情况,
        上电显示进入boot loader,感觉该跳转主程序的时候发生了重启。这种的主板我在上电后发指令通过boot对主程序进行升级也能操作,但是没完成就触发了看门狗复位,又重头开始。
--------------------------------------
不太清楚你整个的OTA流程,你提供的信息过于零散。  但是有一个地方不对劲,就是你发指令通过BOOT进行升级的时候,没完成就触发了看门狗复位,这个根据你的逻辑分析一下。另外建议你们服务器上也记录一份设备OTA日志。

出0入46汤圆

 楼主| 发表于 2022-6-30 12:14:14 | 显示全部楼层
kitten 发表于 2022-6-30 10:58
机柜空调主板出厂的时候我们都会上工装检测,但是到用户手里面总会时不时的又设备出现只能进boot loader但 ...
(引用自25楼)

多谢您的建议,这个主板没有联网,BOOT有串口接收功能,收到相应指令后等待电脑给程序数据,数据正确则会写入flash,直至程序数据接收完成。
boot里面肯定是有定时喂狗的,正常情况下也都是工作正常,升级的时候也不会出现喂不了狗的情况。
刚才看了程序唯一的可能是RTC中断进不了,主程序判断标志位未置位,所以没进去喂狗,同时计数也不能递减为0,所以没跳转主程序,这可能是唯一的可能了。
但问题是RTC初始化的时候会读取看门狗复位状态,如果看门狗引发重启,则将RTC时钟源设为内置LSI,因此还是不好解释程序进入boot后并一直重启的现象

出0入1209汤圆

发表于 2022-6-30 15:10:01 | 显示全部楼层
工程师030 发表于 2022-6-30 12:14
多谢您的建议,这个主板没有联网,BOOT有串口接收功能,收到相应指令后等待电脑给程序数据,数据正确则会 ...
(引用自26楼)

中断喂狗不是一个好方法,flash擦除和写入的时候都是不响应中断的。这个问题导致你喂狗失败吧

出0入46汤圆

 楼主| 发表于 2022-6-30 15:28:11 | 显示全部楼层
kitten 发表于 2022-6-30 15:10
中断喂狗不是一个好方法,flash擦除和写入的时候都是不响应中断的。这个问题导致你喂狗失败吧 ...
(引用自27楼)

中断后变量置位,主程序读取后喂狗,看门狗也不是立刻复位的,差不多2秒才复位,不可能中断一直进不去的

出0入75汤圆

发表于 2022-6-30 16:00:24 | 显示全部楼层
工程师030 发表于 2022-6-30 15:28
中断后变量置位,主程序读取后喂狗,看门狗也不是立刻复位的,差不多2秒才复位,不可能中断一直进不去的 ...
(引用自28楼)

G070的Flash有ECC,ECC错误有没有处理,NMI中断有没有处理?

出0入46汤圆

 楼主| 发表于 2022-6-30 16:21:06 | 显示全部楼层
Doding 发表于 2022-6-30 16:00
G070的Flash有ECC,ECC错误有没有处理,NMI中断有没有处理?
(引用自29楼)

ECC错误、NMI中断都没处理,ECC之前还真没了解过,是写数据的时候才会触发的吗?
Data in Flash memory words are 72-bits wide: eight bits are added per each double word (64 bits). The ECC mechanism supports:
• One error detection and correction
• Two errors detection
When one error is detected and corrected, the flag ECCC (ECC correction) is set in FLASH ECC register (FLASH_ECCR). If ECCCIE is set, an interrupt is generated.
When two errors are detected, a flag ECCD (ECC detection) is set in FLASH ECC register (FLASH_ECCR). In this case, a NMI is generated.
When an ECC error is detected, the address of the failing double word is saved in ADDR_ECC[16:0] bitfield of the FLASH_ECCR register. ADDR_ECC[2:0] are always cleared. The bus-ID of the CPU accessing the address is saved in CPUID[2:0].
While ECCC or ECCD is set, FLASH_ECCR is not updated if a new ECC error occurs.
FLASH_ECCR is updated only when ECC flags are cleared.
Note: For a virgin data: 0xFF FFFF FFFF FFFF FFFF, one error is detected and corrected, but two errors detection is not supported.
When an ECC error is reported, a new read at the failing address may not generate an ECC error if the data is still present in the current buffer, even if ECCC and ECCD are cleared. If this is not the desired behavior, the user must reset the cache.
以下来自谷歌翻译:
闪存字中的数据为 72 位宽:每个双字(64 位)添加 8 位。 ECC 机制支持:
• 一次错误检测和纠正
• 两个错误检测
当检测到并纠正一个错误时,在 FLASH ECC 寄存器 (FLASH_ECCR) 中设置标志 ECCC(ECC 纠正)。如果设置了 ECCCIE,则会产生中断。
当检测到两个错误时,在 FLASH ECC 寄存器 (FLASH_ECCR) 中设置一个标志 ECCD(ECC 检测)。在这种情况下,会生成 NMI。
当检测到 ECC 错误时,失败双字的地址保存在 FLASH_ECCR 寄存器的 ADDR_ECC[16:0] 位域中。 ADDR_ECC[2:0] 总是被清除。访问该地址的 CPU 的总线 ID 保存在 CPUID[2:0] 中。
在设置 ECCC 或 ECCD 时,如果发生新的 ECC 错误,则不会更新 FLASH_ECCR。
FLASH_ECCR 仅在 ECC 标志被清除时更新。
注意:对于原始数据:0xFF FFFF FFFF FFFF FFFF,检测并纠正一个错误,但不支持检测两个错误。
当报告 ECC 错误时,如果数据仍然存在于当前缓冲区中,则在失败地址处的新读取可能不会产生 ECC 错误,即使 ECCC 和 ECCD 被清除也是如此。如果这不是期望的行为,用户必须重置缓存。
--------------------------------------------------------------------------------------
那么出现了ECC错误是意味这flash无法正常存储了吗?我该如何操作呢?

出0入75汤圆

发表于 2022-6-30 18:22:58 | 显示全部楼层
工程师030 发表于 2022-6-30 16:21
ECC错误、NMI中断都没处理,ECC之前还真没了解过,是写数据的时候才会触发的吗?
Data in Flash memory w ...
(引用自30楼)

大量操作时有可能会触发ECC错误,ST有相关例程可以参考,错误不处理有可能导致读写失败。

出0入0汤圆

发表于 2022-7-6 09:23:25 | 显示全部楼层
STM32G070,用了很多,没发现丢固件。

但需要注意的是,flash要写入的话,对应扇区需要全部擦除才能写入。

另外记得还有一个什么锁需要关闭。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-15 23:35

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表