KEAMCU看门狗不复位的原因分析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
【经验分享】KE KEA看门狗不复位的几点说明
最近发现有些网友在使用KE,KEA系列的看门狗时,发现配置后,看门狗不能正常复位,或者是设置的复位时间不对等问题。而且这些网友基本上使用官方例程添加看门狗代码,或者是自己使用CW新建一个工程遇到这样的问题。所以,为了方便后来者,在这里总结下大家遇到问题的原因以及相关的解决方法。
下面来具体讲解遇到问题的原因以及解决方法:
1,主程序配置看门狗不复位
谈到这点,首先需要认真的阅读下KE,KEA系列的相关用户手册的WDOG章节以及第三章中关于WDOG的讲解,在关于WDOG的寄存器中,有些是复位后只写一次的,写第二次无效,比如WDOG_CS1,WDOG_CS2中的window 使能,分频使能,时钟源选择等。这里,需要注意,WDOG_CS1[EN]是看门狗的使能位,默认是使能的,上电后一旦禁止,后续第二次开启是无效的。
而我们官方例程中,为了防止看门狗上电复位,在代码启动时,就会做一个看门狗关闭的动作,所以后续如果需要使用看门狗,就要先把启动代码中的看门狗禁止代码屏蔽,从而使能看门狗。
很多网友在主程序中配置相应的看门狗使能代码,发现程序不能实现看门狗复位的原因正是因为没有屏蔽掉启动代码中的看门狗禁止程序。下面以
KEXX_DRIVERS_V1.2.1_DEVD 为例,讲解下在IAR, KEIL, CW中的启动代码看门狗屏蔽情况。
(1)IAR启动代码
从上图中可以看到,IAR启动先进入start函数,进入cpu文件夹中start.c文件,发现,start函数的第一句就是:WDOG_DisableWDOGEnableUpdate(); 即关闭看门狗。如果实际使用想实现具体的看门狗配置,可以直接在这个地方配置看门狗并及时喂狗,防止在程序没有进入到main程序就mcu看门狗复位。
这里给出一个看门狗配置的例子:
从上图中,可以看到KEIL的启动代码,进入main之前首先进入到SystemInit函数中,在CPU文件夹的Start.c中可以找到SystemInit函数,这个函数里面统一是关于关闭看门狗的代码,如果是KEIL工程,那么就需要在这个地方屏蔽掉关闭看门狗的代码,可以加上自己的看门狗初始化代码,例子见(1)。
(3)CW启动代码
从上图可以看到,CW启动会先进入到_init_hardware();函数,而在
Project_Setting -> startup_code 文件夹中的kinetis_sysinit.c中可以看到
_init_hardware();函数,这个函数里面同样执行了关闭看门狗的代码。如果使用的是CW,并想开启看门狗,就需要这块地方的看门狗禁止代码屏蔽。
如果是自己新建的CW代码,同样需要注意这个地方的启动代码,默认生成代码会关闭看门狗。
2,配置的看门狗复位时间不准确
在使用KEXX_DRIVERS_V1.2.1_DEVD的过程中,尤其是配置看门狗溢出时间值的时候,会发现某些情况下配置的时钟值并不是对的,这里以IAR工程为例。在手册中定义看门狗溢出时间的寄存器是分为两个的,分别为高字节WDOG_TOVALH和低字节WDOG_TOVALL两个寄存器。如果选择1KHZ的看门狗时钟源,想实现1S
的看门狗复位,那么就需要给看门狗溢出时间的值设为1000,即0X03E8。按照头文件的定义,如下:
(1)两个寄存器直接设置
可以看到,这种方法设置出来的WDOG_TOVALH和WDOG_TOVALL寄存器的值已经反掉了,原因就是IAR中的内存存放是按照小端存放的形式,如果定义的是一个uint16_t类型的,这时候存放到内存地址,是按照低字节的放在较小地址,高字节
的放在较大地址,这里就导致,0X03E8值中0XE8放到了地址
0X400520004(WDOG_TOVALH),0X03放到了地址0X400520005(WDOG_TOVALL),
从而导致实际的溢出寄存器值反了,导致溢出时间不准现象。
(2)分开单独设置
按照头文件中的联合体定义,还可以分开设置WDOG_TOVALH和WDOG_TOVALL 寄存器,实际上如果分开定义,由于联合体中,结构体TOVALH 和TOVALL两个是8位的,这样就不会涉及到小端对齐,使得16位数据高低字节存放地址和实际地址不符的现象,TOVALH的定义地址还是0X400520004,TOVALL的定义地址还是0X400520005。所以按照如下分开定义就可以实现正确的看门狗溢出时间定义。
如果大家还是想整体定义16位的,那么就需要高低自己调一下顺序,因为我发现在IAR的属性设置里面,设置大小端存储的地方已经灰掉,不可以设置。