项目场景:
在之前的博文分享中,大致介绍和实现了如何在工程中启用MCU的SWDT硬件看门狗功能(链接如下)
HC32F460开发之看门狗功能
问题描述
实现后的例程也在官方的评测板上测试过能正常运行。但是按照例程将看门狗功能加入到项目工程中,烧录到产品中去测试却发现,加入看门狗烧录过后的机器再也无法正常启动运行,去掉看门狗配置编译重烧录回来也是一样。
原因分析:
一开始发现这个问题后,可以说是毫无头绪,后面查看串口LOG发现,BootLoader LOG也没有输出,尝试重新烧录BootLoader程序后,机器又可以正常运行了。初步怀疑是BootLoader程序出问题了,导致没能正常引导应用程序的启动。而问题的原因基本可以确定是因为加入了看门狗功能后才产生的,定位了问题后,就只能慢慢翻看手册查看原因。
最后在用户手册中查找到的问题原因如下:
我们选用的是SWDT的硬件启动方式,该方式编译烧录后,会将看门狗计数器的设定信息写入到flash里。
关于ICG0寄存器的介绍,文档描述如下:
flash的地址结构如下
对于FLASH地址 0x00000400H0x0000041FH,属于flash的扇区0,在之前项目对于flash的规划中,我们将flash的扇区04规划为BootLoader的存储地址,而在应用程序中开启了看门狗功能后,更新烧录app程序后,因为选择了SWDT的硬件启动方式,需要将看门狗的设定信息写入到flash的扇区0中,由此将BootLoader程序给擦除掉,从而导致系统无法正常启动。
解决方案:
在定位了问题之后,问题就很好解决了,这边最后选择将看门狗的启动放到BootLoader中去执行,在应用程序中去执行喂狗操作,这样,后面在调试过程中更新烧录应用程序也不会把BootLoader擦除掉。