__no_init volatile union
{
unsigned short WDTCTL; /* Watchdog Timer Control */
struct
{
unsigned short WDTIS0 : 1; /* */
unsigned short WDTIS1 : 1; /* */
unsigned short WDTSSEL : 1; /* */
unsigned short WDTCNTCL : 1; /* */
unsigned short WDTTMSEL : 1; /* */
unsigned short WDTNMI : 1; /* */
unsigned short WDTNMIES : 1; /* */
unsigned short WDTHOLD : 1; /* */
}WDTCTL_bit;
} @ 0x0120;
enum {
WDTIS0 = 0x0001,
WDTIS1 = 0x0002,
WDTSSEL = 0x0004,
WDTCNTCL = 0x0008,
WDTTMSEL = 0x0010,
WDTNMI = 0x0020,
WDTNMIES = 0x0040,
WDTHOLD = 0x0080
};
WDTCTL 的地址单元是 0x0120 后面这段是什么意思呢。联合体?
unsigned short WDTIS0 : 1; // 1表示字段宽度(2进制),这表示WDTISO要么是1要么是0
后面这个8个位和WDTCTL 共享存储单元。看user guide , WDTCTL 是一个16位的寄存器,WDTIS0位于其 bit0, 以此类推,WDTHOLD 是bit7 ,复位之后这几个位都是0。在MSP的C语言中,并不支持位变量。在的IO中,用这种定义方式实现了对寄存器的位变量访问。
WDTCTL=WDTPW+WDTHOLD; // 停止看门狗 这个停止看门狗的操作如何解释?
WDTCTL 很明显,是看门狗控制寄存器,而WDTPW 是一个宏定义,头文件里面是这样子的,#define WDTPW (0x5A00u),user guide 中WDTCTL是一个16位的寄存器,其中bit15-bit8名字是 WDTPW,must be written as 0x5a,这8个位必须初始化成0x5a。这句也就是完成了WDTPW的初始化并且将WDTHOLD置位, WDTHOLD置位的结果是看门狗定时器停止。
unsigned short WDTNMIES : 1; // 看门狗定时器非屏蔽中断边沿选择位。
unsigned short WDTNMI : 1; // 看门狗定时器非屏蔽中断选择
unsigned short WDTTMSEL : 1; // 看门狗定时器模式选择
unsigned short WDTCNTCL : 1; // 看门狗定时器计数器清零选择位
unsigned short WDTSSEL : 1; //看门狗定时器时钟源选择
unsigned short WDTIS0 : 1; // 看门狗定时间隔选择
unsigned short WDTIS1 : 1; // 时间间隔选择
PUC 上电清零 power up clear