【BLE】CC2541之看门狗

本篇博文最后修改时间:2017年01月06日,11:06。


一、简介

本文以SimpleBLEPeripheral工程为例,介绍看门狗的使用。


二、实验平台

协议栈版本:BLE-CC254x-1.4.0

编译软件:IAR 8.20.2

硬件平台:Smart RF开发板(主芯片CC2541)


版权声明

博主:甜甜的大香瓜

声明:喝水不忘挖井人,转载请注明出处。

原文地址:http://blog.csdn.NET/feilusia

联系方式:897503845@qq.com

香瓜BLE之CC2541群:127442605

香瓜BLE之CC2640群:557278427

香瓜BLE之Android群:541462902

香瓜单片机之STM8/STM32群:164311667
甜甜的大香瓜的小店(淘宝店):https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i

四、 实验前提
1、在进行本文步骤前,请先 阅读 以下博文:
暂无

2、在进行本文步骤前,请先 实现以下博文:
暂无


五、基础知识

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的看门狗  
  }
}

2、添加看门狗初始化的宏(hal_mcu.h中,建议与其他看门狗相关代码添加在一起)

#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的看门狗启动

3、实验结果

五向按键的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振荡器也是可以运行的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值