看循环处调用栈
问题简述:
使用ST link v2或者正点原子无线dap下载程序进stm32f407ZET6里面时,出现程序无法运行问题,无法运行是指使用debug在void main第一行打断点,无法进入断点,查看汇编语言那一栏,发现在启动文件里面循环,无法跳出。
问题详述:
点击烧录按钮,烧录进度条正常跑完(debug设置是烧录完自动运行),程序不能自动运行(指正常运行到main),按第1次复位之后,程序不能正常运行(指运行到main),部分端口出现电平异常。第2次按复位按键的时候,程序大概率能进入main运行(led正常闪烁),小概率还是有问题。(但是偶尔第一次烧录就能正常运行,无须复位,led闪烁)
在部分pcb板中,多次(几次不等,时间间隔为1s左右)重复复位,led无法闪烁。
在程序正常运行时,反复点击(时间间隔为2s左右,反复次数为2次以上,具体次数不等)options-debug-debug和options-debug-flash download,也能复现问题,具体现象为,程序无法进入main(也可能进入了,但led不闪烁)。
需求:
程序下载进去芯片立即能正常运行(指运行到main)
补充:
上述的程序是指led闪烁程序。
上述的复位均是短按,时间0.5s以内。
pcb重新焊过两块,还是有这个问题,有块板长按复位问题显著改善,有块板要多次复位(五六次,但不绝对)才能偶尔正常运行一次。
主控芯片也换过一批,问题依旧。
不同电脑烧录,问题能复现
main里面只有gpio初始化和delay初始化以及while里面直接对io口电平拉高拉低并延迟。
能提供pcb工程和源代码。
这个pcb有两版,新版和旧版相比是改了部分io口(一些串口,iic),但测试时(烧录闪灯程序)已去掉外设(除烧录器)
回复提供思路或方法无论能否解决问题都有0.5kcb(评论区首次提出),0.5kcb奖励和30kcb悬赏截止时间是2023.12.1
旧版(之前能用的没有改版的)实物图如下,两块pcb通过排针连接,上面是主控,下面是驱动板。
新版(问题板实物图)
新板(有问题板)的原理图
旧板(无问题板)的AD工程文件
有问题板的AD工程文件
测试的led闪烁程序
[修改于 1年3个月前 - 2023/09/27 13:27:35]
先验证时钟问题:到官网下载个led_blink例程,打开工程,检查是否使用外部振荡器,如果是,则改为使用内部RC振荡器。
示波器检查电源质量 是否有波动 检查option字 看看是不是被烧了什么不对的bor/por wdg之类的东西
修改.s启动代码 将所有中断死循环取消 可以方便调试
更换芯片 排除芯片问题 检查关键引脚的波形
回上一楼
请问您说的关键引脚是指?我目前只排查了晶振输入引脚,boot0,boot1引脚,这几个引脚的输入是正常的
10.1进度:把有问题的pcb上的stm32f407芯片吹下来换成旧版批次的芯片就没问题了,目前怀疑是芯片有问题。
看看能不能(可能可以?)再定位一下,到底是芯片什么部分的问题
直接用全新的芯片程序都还没有烧进去都出问题
把旧版的芯片拆了,连同外围电路一起全部移到新版还是有问题
这下子是真绷不住啊,全新的芯片程序都还没烧都有问题
示波器检查电源质量 是否有波动 检查option字 看看是不是被烧了什么不对的bor/por wdg...
用ST link把芯片flash的全部数据擦写再烧录还是会有问题
3L(#925645)提到了Option字
最近在用STM8,这个Option Bytes写一些东西,会影响bootloader等内容,启动现象表现就不正常
并且Option Bytes是放在EEPROM里的,覆写flash未必能改变这些寄存器
可能和这些有关
(图中为STM8L的手册截图,不是STM32
真相了,是boot0和boot1的问题,手册上写,当使用用户闪存储存器启动模式时,boot0=0,boot1=x(我理解为任意电平的意思,直接浮空处理)
boot1的位置本来是有个下拉电阻的,我以为只要boot0=0即可,boot1电平不用管,负责硬件的队员就没有焊下拉电阻,后面我和他排查问题时根据对boot1的理解(boot0=0,boot1任意电平),也不以为然,昨天朋友排查问题把boot1下拉电阻焊了上去,问题完美解决(也可能不完美,只试了修复一块有问题的板,其他板尚未修复)。
那么问题来了:为什么boot0=0,boot1浮空会出现本帖的错误?boot0=0,boot1=x中的X不是任意电平的意思吗
当boot0为0的时候,是不需要关注boot1的,出现这种情况,只能觉得是在未焊接boot1时,你的boot0脚的电压不对。可以试着用示波器测量一下boot0,看看它是不是始终小于VInputLow。
200字以内,仅用于支线交流,主线讨论请采用回复功能。