搜索
bottom↓
回复: 18

GD32F103VET6替换STM32遇到的奇怪问题

[复制链接]

出0入0汤圆

发表于 2022-10-18 18:25:36 | 显示全部楼层 |阅读模式
一个STM32F103VET6的产品,已经好多年,现在还有一些小量出货。因为STM32涨价的原因,今年用GD32F103VET6替换,移植没什么难度,也已经成功出了几批货,但最近这一批,突然出现了问题。程序写入后,板怎么也调不出来,晶振根本就不起振,换晶振,换MCU也不行。
巧在这个产品同一个硬件平台,支持A、B两份程序,简单讲这两个程序是Master和Slave关系,调不出来的是B程序的板。这两个在STM32和GD32两者环境下都是使用过没问题的,尝试写入A程序,能工作,一切正常,这证明了硬件没有问题。当前的环境是MDK 5.17,JLinkV8,反复烧写程序没问题,可以排除工具的原因;A程序的代码量(code 176K)比B程序(code 119K)大,因此也不可能是用小容量芯片冒充大容量芯片的问题。
调整GD32移植时在stm32f10x.h,stm32f10x_flash.c程序中的修改部分,没有用。晶振不起振,不是硬件,而是程序停在HardFault_Handler,死机。Debug看到R14=0xfffffff9, MSP指向的memory是0xacacacac这样的空值,网上关于HardFault调试的技巧没什么用。在startup文件中调整stack/heap大小,也没有用。
想找出B程序是否存在野指针之类的Bug,用削减的方法减少B程序实际的工作,但写入后都是死机。无奈之下另起一个project,重构B程序,将序底层和中间层逐步加入,在main()中,基本的GPIO/RCC初始化后while(1)输出LED on/off,是可以工作的,串口printf也有输出。逐渐增加main()中调用的程序,到一定程度就不行了;追踪这些新加的程序,是一些根本没有被调用到的函数,以及一些A程序、B程序共用的函数。AB两个程序底层和中间层代码是共用的。走不下去,从源程序上无法找出问题。
这个新建的测试project,用的是default的编译配置:Use MicroLib, Optimization=default(无),One ELF Section per Function=true。Optimization改成Level3/optimize for time,也能运行;但去掉"One ELF Section per Function"就不行,这时程序量大得多,从66K code变到119K;去掉MicroLib,启用"#pragma import(__use_no_semihosting) ",也可以运行,但工作程序一增加,还是死机。
回头再用A程序测,启用"One ELF Section per Function",或者去掉Use MicroLib两个配置,都能编译通过,写入STM32的板工作没有问题,但写入GD32的就死机。
感觉和源程序无关,和code size无关,而是与不同程序模块在flash中的定位有关,要分析map文件。这也太困难了,毕竟已经好多年没做 stm32了,现在对单片机也兴趣缺缺。还是选择放弃,产品上退回stm32,好在stm32的价格已经差不多降回来了。
不过还是希望找到原因。不想简单的用国产芯片质量来推脱,但确实这些个替代还有许多诡异的问题。

出0入115汤圆

发表于 2022-10-18 18:27:44 来自手机 | 显示全部楼层
程序的库有换吗,gd32很稳定的。

出0入0汤圆

发表于 2022-10-18 18:36:31 来自手机 | 显示全部楼层
1、堆栈设置大些试试,可能堆栈溢出导致。
2、gd32f103的flash跟stm32f103的结构不一样,好像是上来先把256k还是128k导入到ram里跑,如果跨越了256k还是128k,会导致操作延时很大,从而导致一些工作异常。

出0入442汤圆

发表于 2022-10-18 18:54:04 来自手机 | 显示全部楼层
lz你这个可能调了gd不支持的外设配置,比如flash控制。这种需要汇编单步进去,看看到哪一步出错。

出100入312汤圆

发表于 2022-10-18 20:35:37 来自手机 | 显示全部楼层
应该不是芯片质量问题

出105入79汤圆

发表于 2022-10-18 21:32:49 | 显示全部楼层
本帖最后由 qwe2231695 于 2022-10-18 21:34 编辑

已经成功出了几批货,拿老的对比一下,排除芯片批次问题。 新的芯片可能碰巧改动了一个外设。拿勘误手册看下,芯片版本是不是不一样。

有B程序源码的话,在线debug一下就能找到原因

追加: 你说  “逐渐增加main()中调用的程序,到一定程度就不行了“ ,那估计还是要继续找。耐心找到问题根本原因。

出0入16汤圆

发表于 2022-10-18 21:42:43 | 显示全部楼层
现在都用GD32了,稳定性还可以,推荐直接使用GD的库,一步步替换认证

出0入984汤圆

发表于 2022-10-18 22:03:50 | 显示全部楼层
gd32用jlink总会遇到奇奇怪怪的问题,换daplink试试

出0入13汤圆

发表于 2022-10-18 22:23:42 | 显示全部楼层
我都是烧STM的HEX啊....我觉得GD不好用,这个是我个人初步研究的结果!后面换了一部分GD....后面主力STM32+STC....

出0入0汤圆

 楼主| 发表于 2022-10-19 09:47:10 | 显示全部楼层
三年模拟 发表于 2022-10-18 18:27
程序的库有换吗,gd32很稳定的。
(引用自2楼)

库和源程序都没有改动。这是产品化了的东西。

出0入0汤圆

 楼主| 发表于 2022-10-19 09:51:51 | 显示全部楼层
罗小蘑菇 发表于 2022-10-18 18:36
1、堆栈设置大些试试,可能堆栈溢出导致。
2、gd32f103的flash跟stm32f103的结构不一样,好像是上来先把256 ...
(引用自3楼)

1。stack/heap修改过,不起作用、
2。这个正是我怀疑的,因为A、B两个程序一个小于128K,一个大于128K。但是从flash加载到ram中的机制不知道怎么调它,自己搞个bootloader ?,那也太高难度了。

出100入85汤圆

发表于 2022-10-19 10:53:31 来自手机 | 显示全部楼层
把晶振起振等待时间加长,改成10倍试试

出0入0汤圆

 楼主| 发表于 2022-10-19 10:58:44 | 显示全部楼层
whatcanitbe 发表于 2022-10-19 10:53
把晶振起振等待时间加长,改成10倍试试
(引用自12楼)

HSE_STARTUP_TIMEOUT,在移植GD32时就改成了0xffff, STM32的0x0500也试过,没用。不会是这么简单的原因

出0入17汤圆

发表于 2022-10-19 12:41:02 | 显示全部楼层
chunxx 发表于 2022-10-19 09:51
1。stack/heap修改过,不起作用、
2。这个正是我怀疑的,因为A、B两个程序一个小于128K,一个大于128K。 ...
(引用自11楼)

大小128k的部分其实没啥问题,这2块flash是一样的flash,只是大于128k的部分没有缓存,可以理解为直接在flash上运行的,而前128k的部分是在sram中运行的。不影响功能,速度不一样而已。

出0入0汤圆

发表于 2022-10-19 13:08:35 | 显示全部楼层
chunxx 发表于 2022-10-19 09:51
1。stack/heap修改过,不起作用、
2。这个正是我怀疑的,因为A、B两个程序一个小于128K,一个大于128K。 ...
(引用自11楼)

第2个问题,是芯片自己加载的,我们控制不了。

还想到一个问题,有的时候KEIL会出些莫名其妙的问题,也有可能keil的工程文件乱了,你可以试试把你跑不起来B程序的源代码导入到你能跑起来的A程序的工程里,重新编译下试试。

出0入0汤圆

 楼主| 发表于 2022-10-19 16:47:48 | 显示全部楼层
罗小蘑菇 发表于 2022-10-19 13:08
第2个问题,是芯片自己加载的,我们控制不了。

还想到一个问题,有的时候KEIL会出些莫名其妙的问题,也 ...
(引用自15楼)

您注意看我做过的工作。我建一个新project,逐步导入源程序,就是按这个思路做的,失败了,定位不到源程序上。

出0入362汤圆

发表于 2022-10-19 16:58:05 | 显示全部楼层
先打开Usage/memmgr/bus fault, 然后再试试, 看能不能缩小问题范围?

应该是加个这个
SCB->SHCSR |= (7UL << 16);    // enable  memmanage/bus/usage error
然后在stm32f10x_it.c里加上
  1. void MemManage_Handler(void)
  2. {
  3.     while(1);
  4. }               // MPU Fault Handler
  5. void BusFault_Handler(void)
  6. {
  7.     while(1);
  8. }                  // Bus Fault Handler
  9. void UsageFault_Handler(void)
  10. {
  11.     while(1);
  12. }           // Usage Fault Handler
复制代码

出45入29汤圆

发表于 2022-10-20 07:48:53 | 显示全部楼层
本帖最后由 foric 于 2022-10-20 07:50 编辑

我也在用103VE,对比发现APM32不用做任何改动直接兼容STM32
GD和雅特力还是需要改代码,差点意思。
极海APM32F103VET6 已陆续在几款产品上用了6000片,好评

出0入0汤圆

 楼主| 发表于 2022-10-20 15:52:41 | 显示全部楼层
tomzbj 发表于 2022-10-19 16:58
先打开Usage/memmgr/bus fault, 然后再试试, 看能不能缩小问题范围?

应该是加个这个
(引用自17楼)

SCB这个方法我没试过,按这个意见折腾了一个上午,还是一上来就锁死在hardfault。
不过受到启发,在memory watch中检测0xe000ed28这一块,这个应该就是SCB的fault状态寄存器,正常工作的程序是0,死机的程序,这个的值是0x00001400;第2个byte就是Busfault,应该就是这个。但是再查下去,到bit一级就搞不懂什么意思了,虽然每个字都认识.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

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

本版积分规则

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

GMT+8, 2024-4-29 10:32

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

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