本篇以SimpleBLEPeripheral工程为例,介绍看门狗的使用。
二、实验平台
协议栈版本:BLE-CC254x-1.4.0
编译软件:IAR 8.20.2
硬件平台:Smart RF开发板
三、版权声明
博主:甜甜的大香瓜
声明:喝水不忘挖井人,转载请注明出处。
原文地址:http://blog.csdn.net/feilusia
联系方式:[email protected]
技术交流QQ群:127442605
1、看门狗是什么?
答:CC2541的看门狗是一个具有15bit counter的定时器。
如果在一定的时间内没有通过“喂狗”来清除看门狗的counter,则看门狗会产生一个热复位,使代码从头开始跑。
2、什么情况下需要使用看门狗?
答:
1)代码跑飞时。
2)配置完新的参数需要重启设备时。
3、看门狗的定时器能当做普通定时器来使用吗?
答:可以,看门狗有timer mode。
4、看门狗一旦开启,是否能停下来?
答:不能,除非产生了系统复位。
5、看门狗有几个定时时间?
答:4个。1S、0.25S、15.625ms、1.9ms。
6、看门狗使用的是什么晶振?
答:内部或外部的32K晶振。
7、低功耗下看门狗仍然在运行吗?
答:PM3模式下内、外部的32K晶振都不起振,会导致看门狗无法正常运行。
五、使用外部32K晶振的测试代码
1、修改按键处理代码(SimpleBLEPeripheral.c中)
static void simpleBLEPeripheral_HandleKeys( uint8 shift, uint8 keys ) { VOID shift; // Intentionally unreferenced parameter if ( keys & HAL_KEY_SW_6 ) { HalLcdWriteString( "WD_KICK", HAL_LCD_LINE_3 ); WD_KICK(); //喂狗 } if ( keys & HAL_KEY_UP ) { HalLcdWriteString( "WD_INIT_1000MS", HAL_LCD_LINE_3 ); WD_INIT_1000MS(); //启动1S看门狗 } if ( keys & HAL_KEY_DOWN ) { HalLcdWriteString( "WD_INIT_250MS", HAL_LCD_LINE_3 ); WD_INIT_250MS(); //启动250MS看门狗 } if ( keys & HAL_KEY_LEFT ) { HalLcdWriteString( "WD_INIT_15_625MS", HAL_LCD_LINE_3 ); WD_INIT_15_625MS();//启动15.625MS看门狗 } if ( keys & HAL_KEY_RIGHT ) { HalLcdWriteString( "WD_INIT_1_9MS", HAL_LCD_LINE_3 ); WD_INIT_1_9MS(); //启动1.9MS看门狗 } if ( keys & HAL_KEY_CENTER ) { HalLcdWriteString( "HAL_SYSTEM_RESET", HAL_LCD_LINE_3 ); HAL_SYSTEM_RESET(); //实际上是启动了1.9ms的看门狗 } }
#define WD_INIT_1000MS() st( WDCTL = 0x00; WDCTL |= 0x08; ) //间隔时间为1000MS的看门狗启动 #define WD_INIT_250MS() st( WDCTL = 0x00; WDCTL |= 0x01; WDCTL |= 0x08; ) //间隔时间为250MS的看门狗启动 #define WD_INIT_15_625MS() st( WDCTL = 0x00; WDCTL |= 0x02; WDCTL |= 0x08; ) //间隔时间为15.625MS的看门狗启动 #define WD_INIT_1_9MS() st( WDCTL = 0x00; WDCTL |= 0x03; WDCTL |= 0x08; ) //间隔时间为1.9MS的看门狗启动
五向按键的5个键按下最终都会时间各异地复位代码,同时会直观地显示在oled上。而在复位之前按下“S1”键都能起到“喂狗”的续命效果。
六、使用内部32K RC振荡器的测试代码
1、在以上代码修改的基础上,修改为使用内部32K RC振荡器
/* Board Initialization */ #define HAL_BOARD_INIT() \ { \ /* Set to 16Mhz to set 32kHz OSC, then back to 32MHz \ START_HSOSC_XOSC(); \ SET_OSC_TO_HSOSC(); \ SET_32KHZ_OSC(); */ \ SET_OSC_TO_XOSC(); \ STOP_HSOSC(); \ \ /* Enable cache prefetch mode. */ \ PREFETCH_ENABLE(); \ }由于CC2541默认就是使用内部32K的RC振荡器,因此只要把设置成外部32K晶振的代码注释即可。
注:详情可以参看本博客的博文《CC2541之解析协议栈的晶振初始化过程》。
2、实验结果
与外部晶振一样,都能达到复位效果(外部晶振会更精确)。
因此,看门狗使用内部32K的RC振荡器也是可以运行的。