历史上的今天
今天是:2024年10月19日(星期六)
2019年10月19日 | MSP430学习笔记-看门狗
2019-10-19 来源:eefocus
WDTCTL 看门狗控制寄存器

WDTCTL 由两部分组成:
高 8 位是对 WDT 操作的控制命令。要写入操作 WDT 的控制命令,出于安全原因必须先正确写入高字节
看门狗口令。口令位 5AH,如果口令写错将导致系统复位。
读 WDTCTL 时,不需要口令,可直接读取地址 120H 中的内容,读出数据低字节位 WDTCTL 的值,高字
节始终位 69H。WDTCTL 除了看门狗定时器的控制位之外,还有两个用于设置 NMI 引脚功能。
WDTISx:选择看门狗定时器的计时输出
其中 T 是 WDTCNT 的输入时钟源周期。
0 T×2的15次方
1 T×2的13次方
2 T×2的9次方
3 T×2的6次方
WDTSSEL:选择 WDTCNT 的时钟源
0 SMCLK
1 ACLK
由 WDTISx 及 WDTSSEL 位便可确定 WDT 定时时间,因此通过软件对计数器设置不同的初始值就可实现
不同时间的定时。与其他定时器不同之处在于,WDT 最多只能定时 8 种和时钟源相关的时间。
下表列出了 WDT 可选的定时时间(晶振为 32.768KHz,SMCLK=1MHz)。

WDTCNTCL:看门狗计数器清零位
0: 无操作
1: 将 WDTCTL 的值清零
当该位为 1 时,清除 WDTCNT。
WDTTMSEL:工作模式选择
0 看门狗模式;
1 定时器模式。
WDTNMI:选择 RST/NMI 引脚功能(在 PUC 后被复位)
0 RST/NMI 引脚为复位端;
1 RST/NMI 引脚为边沿触发的非屏蔽中断输入。
WDTNMIES:选择中断的边沿触发方式
0
1
WDTHOLD:停止看门狗计数器
0 WDT 功能激活
1 时钟禁止输入,计数停止
WDTCNT 计数单元

WDTCNT 时 16 位增计数器,由于 MSP430 所选定的时钟电路产生的固定周期脉冲信号对计数器进行加
法计数。如果计数器事先被预置的初始状态不同,那么从开始计数到计数溢出为止的时间就不同。
WDTCNT 不能直接通过软件直接通过软件存取,必须通过看门狗定时器的控制寄存器 WDTCTL 来控制。
IE1 中断允许寄存器

WDTIE:看门狗定时器模式中断允许控制位
0 看门狗定时器中断禁止
1 看门狗定时器中断允许
NMIIE:非屏蔽中断允许控制位
0 禁止非屏蔽中断
1 允许非屏蔽中断
IFG1 中断标志寄存器

WDTIFG:看门狗定时器模式中断标志
0 无看门狗定时器中断标志
1 有看门狗定时器中断标志
NMIIFG:非屏蔽中断标志
0 无非屏蔽中断标志
1 有非屏蔽中断标志
看门狗定时器操作
用户可以通过 WDTCTL 寄存器中的 WDTTMSEL 和 WDTHOLD 控制位设置 WDT 工作在看门狗模式、定
时器模式和低功耗模式。
看门狗模式
由于在上电复位或系统复位时,WDTCNT 和 WDTCL 两寄存器内容被全部清除(晶振为 32768Hz,
SMCLK=1MHz):
复位后,工作在看门狗模式,以 ACLK 为时钟,WDT 定时时间为 32ms。
上述情况将导致 WDT 的运行自动进入看门狗模式。
所以,用户软件一般都需要进行如下操作:
进行 WDT 的初始化:设置合适的时间(通过 SSEL、IS0、IS1 位来选定)。
周期性的对 WDTCNT 清零:防止 WDT 溢出,保证 WDT 的正确使用。
在看门狗模式下,如果计数器超过了定时时间,就会产生复位和激活系统上电清除信号,系统从上电 复位的地址重启动。
如果系统不用看门狗功能,应该在程序开始处禁止看门狗功能。
定时器模式
WDTCTL 的 WDTTMSEL 位置位选择定时器模式。这一模式产生选定时间的周期性中断。定时时间
可以通过 WDTCTL 的 WDTCNCTL 位置位来开始。
改变定时时间而不同时清楚 WDTCNT 将导致不可预料的系统立即复位或中断。定时时间可以通过 WDTCTL 的 CNCTL 位置位来开始。
如果先后分别进行清除和定时时间选择,则可能立即引起不可预料的系统复位或中断。
另外,在终场工作时。改变时钟源可能导致 WDTCNT 额外的计数时钟。
低功耗模式
当系统不需要 WDT 做看门狗和定时器时,可关闭 WDT 以减小功耗。
控制位 WDTHOLD=1 时关闭 WDT,这时看门狗停止工作。
看门狗定时器头文件定义
在 msp430x14x.h 头文件中定义如下:
/************************************************************
* WATCHDOG TIMER
************************************************************/
#define WDTCTL_ (0x0120) /* Watchdog Timer Control */
DEFW( WDTCTL , WDTCTL_)
/* The bit names have been prefixed with "WDT" */
#define WDTIS0 (0x0001)
#define WDTIS1 (0x0002)
#define WDTSSEL (0x0004)
#define WDTCNTCL (0x0008)
#define WDTTMSEL (0x0010)
#define WDTNMI (0x0020)
#define WDTNMIES (0x0040)
#define WDTHOLD (0x0080)
#define WDTPW (0x5A00)
/* WDT-interval times [1ms] coded with Bits 0-2 */
/* WDT is clocked by fMCLK (assumed 1MHz) */
#define WDT_MDLY_32 (WDTPW+WDTTMSEL+WDTCNTCL) /* 32ms interval (default) */
#define WDT_MDLY_8 (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS0) /* 8ms " */
#define WDT_MDLY_0_5 (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1) /* 0.5ms " */
#define WDT_MDLY_0_064 (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1+WDTIS0) /* 0.064ms " */
/* WDT is clocked by fACLK (assumed 32KHz) */
#define WDT_ADLY_1000 (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL) /* 1000ms " */
#define WDT_ADLY_250 (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS0) /* 250ms " */
#define WDT_ADLY_16 (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS1) /* 16ms " */
#define WDT_ADLY_1_9 (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS1+WDTIS0)/* 1.9ms " */
/* Watchdog mode -> reset after expired time */
/* WDT is clocked by fMCLK (assumed 1MHz) */
#define WDT_MRST_32 (WDTPW+WDTCNTCL) /* 32ms interval (default) */
#define WDT_MRST_8 (WDTPW+WDTCNTCL+WDTIS0) /* 8ms " */
#define WDT_MRST_0_5 (WDTPW+WDTCNTCL+WDTIS1) /* 0.5ms " */
#define WDT_MRST_0_064 (WDTPW+WDTCNTCL+WDTIS1+WDTIS0) /* 0.064ms " */
/* WDT is clocked by fACLK (assumed 32KHz) */
#define WDT_ARST_1000 (WDTPW+WDTCNTCL+WDTSSEL) /* 1000ms " */
#define WDT_ARST_250 (WDTPW+WDTCNTCL+WDTSSEL+WDTIS0) /* 250ms " */
#define WDT_ARST_16 (WDTPW+WDTCNTCL+WDTSSEL+WDTIS1) /* 16ms " */
#define WDT_ARST_1_9 (WDTPW+WDTCNTCL+WDTSSEL+WDTIS1+WDTIS0) /* 1.9ms " */
所以我们使用 WDT 的时候可以直接写成下面的形式:
做定时器用:
WDTCTL = WDT_ADLY_1000; // 以 ACLK 延迟 1000ms
WDTCTL = WDT_MDLY_32; // 以 SMCLK 延迟 32ms
// 记得要开 IE1 中的 WDTIE 和_EINT();
做看门狗用:
WDTCTL = WDT_ARST_1000; // 以 ACLK 设定 1000ms 的看门狗
WDTCTL = WDT_MRST_32; // 以 SMCLK 设定 32ms 的看门狗
// 由于在看门狗的定义里面包含 WDTCNCTL
// 所以需要喂狗的时候只需要再写一边 WDTCTL = WDT_MRST_32; 就行了
史海拾趣
|
阻抗匹配是指信号源或者传输线跟负载之间的一种合适的搭配方式。阻抗匹配分为低频和高频两种情况讨论。 我们先从直流电压源驱动一个负载入手。实际的电压源总是有内阻的,我们可以把一个实际电压源,等效成一个理想的 ...… 查看全部问答> |
|
IO pad里面的high-volt tolerant 是什么意思? 是新手,刚刚接触PAD,我看有的IO pad介绍里面有“high-volt tolerant”这个内容,“high-volt tolerant” 是什么意思? 是说这个IO pad可以在PAD端的电压很高的情况下也能正常工作还是说PAD端的电压的变化范围可以很大 ...… 查看全部问答> |
|
刚开始学windows mobile编程,最近在做编程的时候碰到一个问题,我用mfc smart device建了一个对话框工程,然后在对话框上加了几个按钮,没有其他操作,但是模拟的时候手机屏幕上却一片空白,没有显示按钮,这是为什么呢?之前做了一个hello的win32 ...… 查看全部问答> |
|
关于DXP中ERC检查的一些问题,谢谢大家的帮忙了!!急急急~~ 我在画好原理图后进行了DXP的ERC检查,检查完后,出现了以下几个问题,帮忙解决一下吧~~ 1. 例如NetU1_15 contains IO pin and output pin objects(pin U1_15) 2. 例如GND contains IO pin and Power pin objects(pin U4-4、16、20、21、22等) 3 ...… 查看全部问答> |
|
我在对Nor flash进行擦时 最后擦除完成或者对字编程操作完成后,进行校验的函数如下: bool SST39VF320X::Check_Toggle_Ready (U32 Dst, U32 MaxCycles) { U16 CurrData, PreData; U32 TimeOut = 0; ...… 查看全部问答> |
|
我用keil 在编译一个c语言工程的时候,总是提示error c129: missing \";\" before \'typedef\'; 但是我的源程序根本就没有语法方面的错误,后来我在网上搜了一下,说是因为keil 对中文的支持问题,程序中可能出现全角的;或者空格等等 ...… 查看全部问答> |
|
最近买了块OLED的屏幕,结果调试的时候总是每行只能写一个汉字,写两个或者更多的话就花屏。 调试了两天了,总是不行,也找不到原因。 程序是参考 买屏幕时店家附送的例程。单片机是C8051F310。OLED的驱动芯片是SH1101A ,C86端已经接到V ...… 查看全部问答> |
|
大家好,我现在用STM8与TSC2046 进行SPI通信,读触摸屏的坐标。 现在我要端口模拟SPI已与TSC2046进行正常通信,但现在想用自有的SPI模块与其通信,但是老是不行。请教一下各位大虾。最好能提供代码供学习,谢谢!!! 我的SPI初始化:MCU为 ...… 查看全部问答> |




