CC2640之看门狗

测试环境


协议栈版本:BLE-STACK V2.1

IAR开发环境版本:IAR for Arm 7.40

硬件设备:Amo-SmartRF v2.0 开发板(对应TI官方的SmartRF06EB 开发板)

示例测试Demo工程:simpleBLEPeripheral工程




系统驱动层RTOS配置


1.打开C:\ti\tirtos_simplelink_2_13_00_06\packages\ti\boards\SRF06EB\CC2650EM_7ID目录下的Board.c文件,在文件的最后添加如下代码:

/*
*  ============================= WatchDog Begin===========================
*/
#include <ti/drivers/Watchdog.h>
#include <ti/drivers/watchdog/WatchdogCC26XX.h>

/* Watchdog objects */
WatchdogCC26XX_Object watchdogCC26XXObjects[SENSORTAG_CC2650_WATCHDOGCOUNT];

/* Watchdog configuration structure */
const WatchdogCC26XX_HWAttrs watchdogCC26XXHWAttrs[SENSORTAG_CC2650_WATCHDOGCOUNT] = {
    /* SENSORTAG_CC2650_WATCHDOG0 with 1 sec period at default CPU clock freq */
    {WDT_BASE, INT_WATCHDOG},
};

const Watchdog_Config Watchdog_config[] = {
    {&WatchdogCC26XX_fxnTable, &watchdogCC26XXObjects[0], &watchdogCC26XXHWAttrs[0]},
    {NULL, NULL, NULL},
};

/*
*  ============================= WatchDog End============================
*/

2.打开C:\ti\tirtos_simplelink_2_13_00_06\packages\ti\boards\SRF06EB\CC2650EM_7ID目录下的Board.h文件,在文件的最后添加如下代码:

/*!
*  @def    CC2650_WatchdogName
*  @brief  Enum of Watchdogs on the CC2650 dev board
*/
typedef enum CC2650_WatchdogName {
	CC2650_WATCHDOG0 = 0,
	CC2650_WATCHDOGCOUNT
} CC2650_WatchdogName;

/*!
*  @def    SENSORTAG_CC2650_WatchdogName
*  @brief  Enum of Watchdogs on the SENSORTAG_CC2650 dev board
*/
typedef enum SENSORTAG_CC2650_WatchdogName {
	SENSORTAG_CC2650_WATCHDOG0 = 0,
	SENSORTAG_CC2650_WATCHDOGCOUNT
} SENSORTAG_CC2650_WatchdogName;

这样,RTOS中看门狗部分就配置好了,下面我们来看看应用层是如何配置的。




应用层配置


1.将驱动中看门狗相关的文件添加到编译选项中,选择CC2640App--->右键点击Drivers--->Add--->Add Files...,操作截图如下:



2.上述操作之后,会弹出文件添加的对话框,找到C:\ti\tirtos_simplelink_2_13_00_06\packages\ti\drivers目录下的Watchdog.cWatchdog.h文件,选中之后,点击打开添加到工程中。操作显示如下:



3.选择CC2640App--->右键点击Drivers--->Add--->Add Group...,操作截图如下:



在弹出的对话框中输入WATCHDOG,操作显示如下:



点击OK之后,结果如下:



Drivers”文件夹下生成WATCHDOG文件夹。


4.在刚生成的WATCHDOG”文件夹下添加WatchdogCC26XX.cWatchdogCC26XX.h,这两个文件所在的路径为C:\ti\tirtos_simplelink_2_13_00_06\packages\ti\drivers\watchdog,操作显示如下:





选中文件,点击打开,即可成功添加文件。


5.应用层初始化中调用看门狗的接口,打开C:\ti\simplelink\ble_cc26xx_2_01_00_44423\Projects\ble\SimpleBLEPeripheral\CC26xx\Source\Application目录下的simpleBLEPeripheral.c文件,在该文件中添加头文件引用:

#include <ti/drivers/Watchdog.h>

并添加我们封装的两个函数,源码如下:

void wdtCallback(UArg handle) 
{
	Watchdog_clear((Watchdog_Handle)handle);
}

void wdtInitFxn() 
{
	Watchdog_Params wp;
	Watchdog_Handle watchdog;
	Watchdog_Params_init(&wp);
	wp.callbackFxn    = wdtCallback;
	wp.debugStallMode = Watchdog_DEBUG_STALL_ON;
	wp.resetMode      = Watchdog_RESET_ON;

	watchdog = Watchdog_open(Board_WATCHDOG, &wp);
	Watchdog_setReload(watchdog, 1500000); // 1sec (WDT runs always at 48MHz/32)
}

然后,在simpleBLEPeripheral.c文件的开头部分声明wdtInitFxn函数,截图如下:



最后,在simpleBLEPeripheral.c文件的初始化函数SimpleBLEPeripheral_init中调用看门狗wdtInitFxn函数。截图如下:



下面,我们来说明一下上述封装的两个函数,首先,我们可以看到wdtInitFxn函数中wp.callbackFxn的配置,该回调函数的配置是用来清除看门狗计时的,其实也就相当于我们常说的喂狗操作。在没有软件错误、程序正常允许的情况下,会定时触发该回调来喂狗,如果程序运行出现问题,该回调无法触发,看门狗达到设定的超时时间就会触发重启。

 

至于看门狗超时时间设置的问题,有的人会问为什么设置1500000就是1s呢?我们知道CC2640运行在48MHZ的频率,通过查阅资料,如下:




我们可以看到,计算看门狗超时时间的时候,需要除以32,也就是48MHZ除以32等于1.5MHZ,看门狗运行在1.5MHZ的频率上,也就是每计数一次等于1/1500000秒的时间,所以要实现1s超时时间,需要计数1500000次。这就是上面设置计数1500000即为1s的由来。

 

 

通过上述配置,我们的看门狗功能就添加完成了,通过实测,该看门狗配置方式可以起作用。另外,可能还有别的看门狗配置方法,后面研究出来之后,我们再继续讨论。








  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
以下是一个基本的参考代码,可以实现 cc2530 定时发送字符串并进入睡眠模式的功能: ```c #include "ioCC2530.h" #define TIMER_PRESCALER 128 // 定时器预分频器设为128 #define TIMER_PERIOD 62500 // 定时器计数值设为62500,相当于1s void InitUART(void) { // 设置串口波特率为115200 PERCFG &= ~0x40; P0SEL |= 0x0C; P2DIR &= ~0xC0; U0CSR |= 0x80; U0GCR |= 11; U0BAUD = 216; U0CSR &= ~0x80; } void SendString(char *str) { // 发送字符串 while (*str != '\0') { U0DBUF = *str; while (!(U0CSR & 0x02)); U0CSR &= ~0x02; str++; } } void InitTimer(void) { // 设置定时器 T2CTL |= 0x04; T2CTL &= ~0x03; T2CTL &= ~0x18; T2CTL |= 0x08; T2PR = TIMER_PRESCALER - 1; T2 = TIMER_PERIOD; T2CTL |= 0x10; } void EnterSleepMode(void) { // 进入睡眠模式 PCON |= 0x01; _BIS_SR(LPM3_bits + GIE); } void main(void) { WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗定时器 InitUART(); InitTimer(); while (1) { SendString("Hello, world!\r\n"); EnterSleepMode(); } } ``` 在这个例子中,我们使用 cc2530 的串口模块来发送字符串,使用定时器模块来定时发送字符串,并在发送完毕后进入睡眠模式。在代码中,我们设置了定时器的预分频器为128,计数值为62500,这样定时器的周期就是1秒。当定时器定时到达时,会触发定时器中断,并调用 EnterSleepMode 函数来进入睡眠模式。在睡眠模式中,cc2530 会进入低功耗状态,以节省功耗。 当您使用这个参考代码时,需要注意以下几点: 1. 根据您的具体需求修改定时器的预分频器和计数值,以达到您想要的定时周期; 2. 根据您的具体需求修改 SendString 函数中要发送的字符串; 3. 根据您的具体需求修改 EnterSleepMode 函数中的睡眠模式和触发条件。 希望这个参考代码能够对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值