请你基于DSP28335写出一套看门狗程序,并解释配置看门狗 怎么设置喂狗时间 程序跑飞的复位时间
时间: 2024-03-10 18:46:00 浏览: 278
好的,以下是基于DSP28335的看门狗程序:
```c
#include "F2837xD_Device.h"
// 定义看门狗喂狗时间,单位为微秒
#define WDT_FEED_TIME 1000000
void InitWatchdog(void)
{
// 先禁止看门狗
DisableDog();
// 配置看门狗喂狗时间,这里配置为 1 秒
EALLOW;
WdRegs.WDCR.all = 0x28;
WdRegs.WDKEY.all = 0x55;
WdRegs.WDKEY.all = 0xAA;
EDIS;
// 使能看门狗
EnableDog();
}
void FeedWatchdog(void)
{
// 喂狗
EALLOW;
WdRegs.WDKEY.all = 0x55;
WdRegs.WDKEY.all = 0xAA;
EDIS;
}
void main(void)
{
// 初始化看门狗
InitWatchdog();
while (1)
{
// 喂狗
FeedWatchdog();
// 这里写程序的主要逻辑
// 如果程序跑飞,看门狗会在 WDT_FEED_TIME 后复位系统
// 所以需要在程序中定时喂狗,保证看门狗不会复位系统
DELAY_US(WDT_FEED_TIME);
}
}
```
上述程序中,我们使用了 DSP28335 的看门狗模块,通过配置看门狗的喂狗时间来实现看门狗的功能。具体来说,程序中的 `InitWatchdog` 函数用来初始化看门狗,包括禁止看门狗、配置喂狗时间和使能看门狗;`FeedWatchdog` 函数用来喂狗;`main` 函数中,我们在程序的主逻辑中加入了定时喂狗的代码,保证看门狗不会复位系统。如果程序跑飞,看门狗会在 `WDT_FEED_TIME` 后复位系统。
至于配置看门狗的喂狗时间,我们可以通过修改 `WdRegs.WDCR.all` 的值来实现。该寄存器的位定义如下:
| 位 | 描述 |
| ------ | ----------------------------------- |
| 0-12 | 看门狗喂狗时间,单位为时钟周期 |
| 13 | 禁止看门狗复位 |
| 14 | 看门狗复位系统时是否清除 RAM |
| 15 | 看门狗复位系统时是否清除 Watchdog |
| 16-31 | 保留 |
其中,位 0-12 用来配置看门狗喂狗时间,单位为时钟周期。时钟周期可以通过 `SysCtrlRegs.LOSPCP.all` 的值来计算,具体公式为:
$$\text{时钟周期}=\frac{1}{\text{LSPCLK}}=\frac{1}{\text{SYSCLK}/(\text{LOSCLKDIV}+1)}$$
其中,`SYSCLK` 为系统时钟频率,`LOSCLKDIV` 为 LSPCLK 的分频系数,默认为 2。例如,如果 `SYSCLK` 为 150 MHz,`LOSCLKDIV` 为 2,则时钟周期为 13.33 ns。因此,如果要设置喂狗时间为 1 秒,需要将 `WdRegs.WDCR.all` 的值设置为 75000000(即 1 秒 / 13.33 ns)。
至于程序跑飞的复位时间,则由看门狗喂狗时间和程序中喂狗的时间共同决定。例如,在上述程序中,如果看门狗喂狗时间为 1 秒,程序中每隔 1 秒喂狗一次,那么如果程序跑飞,看门狗就会在 1 秒后复位系统。
阅读全文