1129292_zh-CN

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 

1129292_zh-CN

1129292_zh-CN

KE KEA看门狗无法复位问题分析<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

在KE KEA实际使用过程中,很多客户遇到了看门狗无法复位的问题。有些客户发现当他们想要启用看门狗时,却无法通过设置寄存器 WDOG_CS1 中的 EN 位置位来真正启用看门狗;有些客户发现在调试模式下,WDOG_S1 寄存器的 EN 位始终是清零的,但从参考手册来看,该位应该在复位后设置,即使他们检查了代码,也确保没有禁用看门狗;还有一些客户发现当他们使用 KEXX_DRIVERS_V1.2.1_DEVD 代码时,自己设置了超时值寄存器,但看门狗无法在超时值内复位。现针对这些问题,本文进行分析并给出避免这些问题的建议。

从以上问题描述中,我们可以得知,导致这些问题的原因其实主要有两个:1、软件配置;2、调试器的使用

1.软件配置

1)启动代码禁用看门狗

在KE KEA示例代码中,芯片复位后会首先进入启动代码,启动代码总是先禁用看门狗,如果看门狗被禁用,则不能仅通过设置寄存器WDOG_CS1中的EN位置位来启用看门狗,因为寄存器WDOG_CS1中的EN位是复位后只能写入一次的位。仅当设置了 UPDATE 位并且执行解锁写入序列后经过 128 个总线时钟才可以修改它。

现在如何在启动代码中找到禁用代码?以KEXX_DRIVERS_V1.2.1_DEVD示例代码为例

IAR:从crt0.s中,会在启动函数中找到看门狗禁用代码WDOG_DisableWDOGEnableUpdate();。

1.jpg

上面的IAR启动图片是针对KE的,但是在KEA启动文件中,您无法在从飞思卡尔网站下载的KEA示例代码中看到启动函数,只有在重置发生后才能在cstartup_M_KEA128.s中找到__iar_program_start,但是__iar_program_start函数在哪里,无法在整个项目中搜索到它。其实__iar_program_start是默认的程序入口函数,它包含以下函数:

2.jpg

你会发现它会进入__low_level_init函数,看门狗禁用代码就在__low_level_init函数中。

MDK:来自 startup_MK0XZ4.s将会在SystemInit函数中找到看门狗禁用代码。

3.jpg

Codewarrior:来自__arm_start.c文件,会在__init_hardware函数中找到看门狗禁用代码。

4.jpg

2)Codewarrior脚本init_kinetis.tcl禁用看门狗

对于 Codewarrior,只需在 __arm_start.c 中注释禁用看门狗代码文件不足以检查复位后的看门狗启用情况,因为在codewarrior连接脚本init_kinetis.tcl中,还有看门狗禁用代码。

5.jpg

如果要在复位后找到寄存器 WDOG_S1 中 EN 位的状态,则必须禁用所有这些看门狗禁用代码。

3)超时寄存器配置不正确

从头文件MKE02Z2.h中,我们可以发现超时寄存器定义如下:

联合 { /* 偏移量:0x4 */

__IO uint16_t TOVAL; /**< WDOG_TOVAL 寄存器,偏移量:0x4 */

结构 { /* 偏移量:0x4 */

__IO uint8_t TOVALH; /**< 看门狗超时值寄存器:高,偏移量:0x4 */

__IO uint8_t TOVALL; /**< 看门狗超时值寄存器:低,偏移量:0x5 */

    } TOVAL8B;

这种结构意味着客户可以通过单独的 unit8 TOVALH、TOVALL 来定义看门狗超时值,或者仅使用 unint16 TOVAL 来定义它。但实际上在IAR项目使用中,举个例子,使用1khz作为看门狗的时钟源,然后要将超时值设置为1s,这意味着超时值应该是1000=0x03e8,所以其中一个客户这样配置它:

6.jpg

您可以发现,我们需要TOVALL = 0XE8,TOVALH = 0X03,但从测试结果来看,寄存器是TOVALL = 0X03,TOVALH = 0Xe8,这将导致超时值远大于1000,这就是为什么客户无法在1秒后重置mcu,因为寄存器配置不正确。这是由 IAR int16 存储字节序模式引起的,默认的 IAR 字节序模式是小端模式。

所以在实际使用中,建议使用单独的超时值定义。

2. debugger usage

在使用 IDE 进行调试模式时,一些客户发现即使他们注释掉所有看门狗禁用代码,他们仍然无法通过看门狗重置 MCU。检查寄存器WDOG_S1后,位EN为0,表示看门狗被禁用。但从参考手册中我们得知,复位后,EN位应该为1。是什么原因造成的?经过测试,我们发现这实际上是由调试器,即您正在使用的调试器硬件引起的。例如,在同一个项目中,已经注释了所有看门狗禁用代码,SEGGER JLINK仍然会禁用看门狗,但是PE opensda或PE multilink不会这样做,EN位默认启用,以下是测试图片,以codewarrior为例:

1) JLINK

7.jpg

2)PE Opensda 或 PE Multilink

8.jpg

因此,如果您想在调试模式下测试看门狗,并希望在重置后设置 EN,您可以选择 PE 调试器工具而不是 JLINK,但此 JLINK 功能只会影响调试模式,在将代码下载到芯片闪存后,重置后,WDOG_S1 中的 EN 位仍将被设置。

希望本文档能够帮助您解决看门狗无法重置的问题。

Freedom开发平台Kinetis E系列MCUKinetis EA系列MCU
标记 (1)
无评分
版本历史
最后更新:
‎01-05-2026 07:56 AM
更新人: