前言
由于在实验室中新接手了一个项目,需要在原有的硬件基础上重新写程序,于是开始用原来的主控板,但是在使用过程中发现用Jlink下载一次程序后就无法读到芯片,也无法下载程序,芯片也停止运行程序了,经过一天的折腾,终于完美解决了这个问题,所以将该问题记录下来,提供给各位参考。
1.现象
使用J-link下载完一次程序后无法再次下载程序,芯片停止运行。
2.各种解决办法
2.1 解决办法一. 修改BOOT0管脚
在网上找了大量的资料后发现有些帖子说可能是芯片的SWCLK和SWDIO管脚的状态被更改了。
一般芯片的SWCLK和SWDIO管脚都是连接一个10k的电阻接地,来实现FLASH启动。
解决办法是:
1.将BOOT0拉高
2. 按手动复位按键
3.将BOOT0在接地
我这样操作过后发现一样也读不到程序,但是在BOOT0拉高时可以读到芯片,但下载不了程序进去。
2.2 解决办法二. 采用ST-link Utility
采用ST-link Utility来擦除芯片里的程序,链接:
https://blog.youkuaiyun.com/weixin_49805374/article/details/116604048?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-1&spm=1001.2101.3001.4242
但是在操作过程中发现,芯片根本无法连接到 ST-link Utility,在多次尝试后发现在连接芯片的过程中需要按下复位键就可以连接芯片,在擦除芯片的数据的过程中也需要按键复位件,然后惊奇的发现使用Jlink可以读到芯片数据,并且可以下载进去程序, 我以为问题就这样解决了,但是 后面发现 程序只可以下载进去一次,并且程序下载进去后无法运行, 而且无法进入硬件仿真,只有在按下复位键后才能进入仿真,并且程序在运行到systikclock()后就卡死了,于是我怀疑时晶振的问题,经过检查发现原来板子上焊的是25M晶振。
3.真正的解决办法
问题的原因是板子上焊的是25M晶振,而STM32官方固件里是8M的晶振,所以在stm32的官方固件中修改过来就好了。
3.1修改STM32官方固件中的晶振参数
3.1.1 在stm32f4xx.h中 将 HSE_VALUE的参数修改为 25000000
3.1.2 在system_stm32f4xx.c中的第316行的PLL_M修改为25
于是这样就完美解决了这个问题。