一、 IAR软件配置
1.打开 Project---Options,
General Options 配置如图 1.33 所示,单击圆圈所示按钮,先向上返
回上一级目录,然后打开 Texas Instruments 文件夹,选择 CC2530F256
芯片.
2.选择 Linker—Config—Linker command file 选项。单击图 1.35 所示
按钮,导出配置文件,先向上返回上一级目录,然后打开 Texas
Instruments 文件夹,选择 lnk51ew_cc2530F256.xcl(这里是使用
CC2530F256 芯片)。
3.Debugger 选项的 Driver 里选择 Texas Instruments(使用编程器仿
真),下面选择 io8051.ddf 文件
二、 IO口寄存器
1. IO 口配置我们需要配置的寄存器 。(P*SEL. P*DIR. P*INP)
P0----
P0INP:设置各个IO口的输入模式,0为上拉/下拉,1为三态模式。
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
P0_7模式 | P0_6模式 | P0_5模式 | P0_4模式 | P0_3模式 | P0_2模式 | P0_1模式 | P0_0模式 |
P0SEL:各个I/O口的功能选择,0为普通I/O功能,1为外设功能。
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
P0_7模式 | P0_6模式 | P0_5模式 | P0_4模式 | P0_3模式 | P0_2模式 | P0_1模式 | P0_0模式 |
P0DIR:各个I/O口的方向,0为输入,1为输出。
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
P0_7方向 | P0_6方向 | P0_5方向 | P0_4方向 | P0_3方向 | P0_2方向 | P0_1方向 | P0_0方向 |
P1----
P1INP:设置各个IO口的输入模式,0为上拉/下拉,1为三态模式。P1INP中只有D7~D2分别设置对应IO口输入模式。D1D0无作用。
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
P1_7模式 | P1_6模式 | P1_5模式 | P1_4模式 | P1_3模式 | P1_2模式 | P1_1模式 | P1_0模式 |
P1SEL:各个I/O口的功能选择,0为普通I/O功能,1为外设功能。
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
P1_7模式 | P1_6模式 | P1_5模式 | P1_4模式 | P1_3模式 | P1_2模式 | P1_1模式 | P1_0模式 |
P1DIR:各个I/O口的方向,0为输入,1为输出。
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
P1_7方向 | P1_6方向 | P1_5方向 | P1_4方向 | P1_3方向 | P1_2方向 | P1_1方向 | P1_0方向 |
P2----
P2INP:D0~D4控制P2_0~P2_4的输入模式,0为上拉/下拉,1为三态。
D5~D7设置对P0,P1和P2的上拉或下拉的选择。0为上拉,1为下拉。
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
P2选择 | P1选择 | P0选择 | P2_4模式 | P2_3模式 | P2_2模式 | P2_1模式 | P2_0模式 |
P2SEL:(D0到D2位)端口2功能选择,0为普通I/O功能,1为外设功能
(D3到D6) 端口1外设优先级控制。
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
* | 0:USART0优先 1:USART1优先 |
0:USART1优先 1:定时器3优先 |
0:定时器1优先 1:定时器4优先 |
0:USART0优先 1:定时器1优先 |
P2_4功能选择 | P2_3功能选择 | P2_0功能选择 |
P2DIR :D0~D4设置P2_0到P2_4的方向
D7、D6位作为端口0外设优先级的控制
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
↓ |
↓ |
未使用 |
P2_4方向 |
P2_3方向 |
P2_2方向 |
P2_1方向 |
P2_0方向 |
D7D6 |
意义 |
00 |
第1优先级:USART 0 |
01 |
第1优先级:USART 1 |
10 |
第1优先级:定时器1通道0-1 |
11 |
第1优先级:定时器1通道2-3 |
例子:
/*按照表格寄存器内容,我们对 LED1,也就是 P1_0 口进行配置,当 P1_0 输
出高电平时 LED1 被点亮。所以配置如下: */
P1SEL &=~0x01; //作为普通 IO 口
P1DIR |= 0x01; //P1_0 定义为输出
P1INP |= 0X01; //打开下拉
/*由于 CC2530 寄存器初始化时默认是: */
P1SEL =0x00;
P1DIR =0x00;
P1INP =0X00;
/*所以 IO 口初始化我们可以简化初始化指令: */
P1DIR |= 0x01; //P1_0 定义为输出
P1INP |= 0X01; //打开下拉
/****************************
按键初始化函数
*****************************/
void InitKey()
{
P0SEL &= ~0X01; //设置 P00 为普通 IO 口
P0DIR &= ~0X01; //按键在 P00 口,设置为输入模式
P0INP &= ~0x01; //打开 P00 上拉电阻,不影响
}
三、外部中断
外部中断需要配置三个寄存器 P*IEN 、PICTL 、P*IFG、IEN1。
PICTL:D0~D3设置各个端口的中断触发方式,0为上升沿触发,1为下降沿触发。
D7控制I/O引脚在输出模式下的驱动能力。选择输出驱动能力增强来补偿引脚DVDD的低I/O电压,确保在较
低的电压下的驱动能力和较高电压下相同。0为最小驱动能力增强。1为最大驱动能力增强。
|
|||||||
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
I/O驱动能力 |
未用 |
未用 |
未用 |
P2_0~P2_4 |
P1_4~P1_7 |
P1_0~P1_3 |
P0_0~P0_7 |
IEN0:中断使能0,0为中断禁止,1为中断使能
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
总中断EA |
未用 |
睡眠定时器中断 |
AES加密/解密中断 |
USART1 RX中断 |
USART0 RX中断 |
ADC中断 |
RF TX/RF FIFO中断 |
IEN1: D5为P0[7:0]中断使能位:0为中断禁止,1为中断使能,
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
未用 |
未用 |
端口0 |
定时器4 |
定时器3 |
定时器2 |
定时器1 |
DMA传输 |
IEN2:中断使能2,0为中断禁止,1为中断使能
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
未用 |
未用 |
看门狗定时器 |
端口1 |
USART1 TX |
USART0 TX |
端口2 |
RF一般中断 |
P0----
P0IFG :P0[7:0] 终端状态标志寄存器,当输入端口有中断请求时,相应的标志位置1
P0IEN : P0[7:0] 各个控制口的中断使能,0为中断禁止,1为中断使能。
P1----
P1IFG :P1[7:0] 终端状态标志寄存器,当输入端口有中断请求时,相应的标志位置1
P1IEN : P1[7:0] 各个控制口的中断使能,0为中断禁止,1为中断使能。
P2---
P2IFG:D0~D4为P2_0~P2_4的中断标志位。
D5为USD D+中断状态标志,当D+线有一个中断请求未决时设置该标志,用于检测USB挂起状态下的USB恢复事件。
当USB控制器没有挂起时不设置该标志。
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
未用 |
未用 |
USB D+ |
P2_4 |
P2_3 |
P2_2 |
P2_1 |
P2_0 |
P2IEN:D0~D4控制P2_0~P2_4的中断使能
D5控制USB D+的中断使能
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
未用 |
未用 |
USB D+ |
P2_4 |
P2_3 |
P2_2 |
P2_1 |
P2_0 |
例子:
//外部中断初始化:
void InitKey()
{
P0IEN |= 0X01; //P00 设置为中断方式
PICTL |= 0X01; // 下降沿触发
IEN1 |= 0X20; // 允许 P0 口中断;
P0IFG &= ~0x10; // 初始化中断标志;
EA = 1; //开总中断
}
/****************************
中断处理函数
*****************************/
#pragma vector = P0INT_VECTOR //格式:#pragma vector = 中断向量,
// 紧接着是中断处理程序
__interrupt void P0_ISR(void)
{
// 执行代码;
P0IFG &= ~0x10; //清中断标志
P0IF = 0; //清中断标志
}
四、定时器
IRCON:中断标志4,;0为无中断请求。1为有中断请求。
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
睡眠定时器 |
必须为0 |
端口0 |
定时器4 |
定时器3 |
定时器2 |
定时器1 |
DMA完成 |
TIMIF:定时器1的溢出中断屏蔽与定时器3、4的中断标志。D6为定时器1的溢出中断屏蔽,0为屏蔽,1为使能,默认为1.D5~D0为定时器3和4中各个通道的中断标志。
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
未用 |
T1溢出中断使能 |
T4通道1中断标志 |
T4通道0中断标志 |
T4溢出标志中断标志 |
T3通道1 |
T3通道0 |
T3溢出中断标志 |
1. T1(查询方式)
T1CTL:定时器1的控制,D1D0控制运行模式,D3D2设置分频划分值
D7 |
D6 |
D5 |
D4 |
D3D2 |
D1D0 |
未用 |
未用 |
未用 |
未用 |
00:不分频 |
00:暂停运行 |
T1STAT:定时器1的状态寄存器,D4~D0为通道4~通道0的中断标志,D5为溢出标志位,当计数到最终技术值是自动置1。
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
未用 |
未用 |
溢出中断 |
通道4中断 |
通道3中断 |
通道2中断 |
通道1中断 |
通道0中断 |
T1CCTL0~T1CCTL4:定时器1通道0~通道4的工作方式设置。D1D0为捕捉模式选择:00为不捕捉,01为上升沿捕获,10为下降沿捕获,11为上升或下降沿都捕获。
D2位为捕获或比较的选择,0为捕获模式,1为比较模式。D5D4D3为比较模式的选择:000为发生比较式输出端置1,001为发生比较时输出端清0,010为比较时输出翻转,其他模式较少使用。
D7 |
D6 |
D5D4D3 |
D2 |
D1D0 |
未用 |
未用 |
比较模式 |
捕获/比较 |
捕捉模式 |
例子:
//定时器 1 初始化:
void InitT1() //系统不配置工作时钟时使用内部 RC 振荡器,即 16MHz
{
T1CTL = 0x0d; //128 分频,自动重装 0X0000-0XFFFF
//T1STAT = 0x21; //通道 0, 中断有效 0010 0001
}
void main(void)
{
uchar count;
//调用初始化函数
InitT1();
while(1)
{
if(IRCON>0) //查询方式
{ IRCON=0;
if(++count==1) //约 1s 周期性闪烁
{
count=0;
//执行代码
}
}
}
重点:系统在不配置工作频率时默认为 2 分频,即 32M/2=16M,所以定时
器每次溢出时T=1/(16M/128)*65536≈0.5s, 所以总时间Ta=T*count=0.5*1=0.5S切换 1 次状态。
2.定时器 T3/4(中断方式) (8 位)
T3 定时器主要是配置三个寄存器 T3CTL,T3CCTL0,T3CC0,T3CCTL1,T3CC1。
T3CTL/T4CTL:定时器3或定时器4的方式控制寄存器。D7D6D5设置分频:000为无分频、001为2分频、010为4分频、011为8分频、100为16分频、101为32分频、110为64分频,111为128分频。D4为启动位,启动时1,停止工作为0。D3位为中断使能位,0为禁止,1为使能,默认为1;D2为复位,置1时定时器复位。D1D0为计数器模式选择:该位与T1CTL的D1D0位意义相同。
D7D6D5 |
D4 |
D3 |
D2 |
D1D0 |
分频 |
启动定时器 |
溢出中断 |
清除计数器 |
计数模式 |
T3CCTL0/T3CCTL1/T4CCTL0/T4CCTL1:定时器3或定时器4的通道0和通道1的方式控制,D6为该通道的中断使能位,0为禁止,1为使能,默认为1;D5~D0与T1CCTL0相同
D7 |
D6 |
D5D4D3 |
D1 |
D0 |
未用 |
中断使能 |
比较模式 |
捕获/比较 |
捕捉模式 |
例子:
使用 T3 定时器(8 位),
中断方式。寄存器配置如下:
T3CTL |= 0x08 ; //开溢出中断
T3IE = 1; //开总中断和 T3 中断
T3CTL |=0XE0; //128 分频,128/16000000*N=0.5S,N=65200
T3CTL &= ~0X03; //自动重装 00->0xff 65200/256=254(次)
T3CTL |=0X10; //启动
EA = 1; //开总中断
/************************************
中断函数
************************************/
#pragma vector = T3_VECTOR //定时器 T3
__interrupt void T3_ISR(void)
{
IRCON = 0x00; //清中断标志, 也可由硬件自动完成
if(++count>254) //254 次中断后 LED 取反,闪烁一轮(约为 0.5 秒时间)
{
count = 0; // 计数清零
//执行代码
}
}
五、串口通讯
UART0 对应的外部设备 IO 引脚关系为:
P0_2------RX
P0_3------TX
UART1 对应的外部设备 IO 引脚关系为:
P0_5------RX
P0_4------TX
能够分别运行于异步 USART 模式或者同步 SPI 模式
USART 模式的操作具有下列特点:
1、8 位或者 9 位负载数据
2、奇校验、偶校验或者无奇偶校验
3、配置起始位和停止位电平
4、配置 LSB 或者 MSB 首先传送
5、独立收发中断
6、独立收发 DMA 触发
CC2530 配置串口的一般步骤:
1、 配置 IO,使用外部设备功能。此处配置 P0_2 和 P0_3 用作串口 UART0
2、 配置相应串口的控制和状态寄存器。此处配置 UART0 的工作寄存器
3、 配置串口工作的波特率。此处配置为波特率为 115200
寄存器具体配置如下:
PERCFG = 0x00; //位置 1 P0 口
P0SEL = 0x0c; //P0_2,P0_3 用作串口(外部设备功能)
P2DIR &= ~0XC0; //P0 优先作为 UART0
U0CSR |= 0x80; //设置为 UART 方式
U0GCR |= 11;
U0BAUD |= 216; //波特率设为 115200
UTX0IF = 0; //UART0 TX 中断标志初始置位 0
PERCFG:设置部分外设的I/O位置,0为默认I位置1,1为默认位置2
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
未用 |
定时器1 |
定时器3 |
定时器4 |
未用 |
未用 |
USART1 |
USART0 |
P0SEL:见上文。
P2DIR :见上文。
串口的波特率设置可以从 CC2530 的 datasheet 中查得波特率由下式求得:
波特率 |
指数值 |
小数部分 |
2400 |
6 |
59 |
4800 |
7 |
59 |
9600 |
8 |
59 |
14400 |
8 |
216 |
19200 |
9 |
59 |
28800 |
9 |
216 |
38400 |
10 |
59 |
57600 |
10 |
216 |
76800 |
11 |
59 |
115200 |
11 |
216 |
230400 |
12 |
216 |
设置系统时钟源: CLKCONCMD:时钟频率控制寄存器。
D7 |
D6 |
D5~D3 |
D2~D0 |
32KHZ时间振荡器选择 |
系统时钟选择 |
定时器输出标记 |
系统主时钟选择 |
D7位为32KHZ时间振荡器选择,,0为32KRC震荡,1为32K晶振。默认为1。
D6位为系统时钟选择。0为32M晶振,1为16M RC震荡。当D7位为0时D6必须为1。
D5~D3为定时器输出标记。000为32MHZ,001为16MHZ,010为8MHZ,011为4MHZ,100为2MHZ,101为 1MHZ,110为500KHZ,111为250KHZ。默认为001。需要注意的是:当D6为1时,定时器频率最高可采用频率为16MHZ。
D2~D0:系统主时钟选择:000为32MHZ,001为16MHZ,010为8MHZ,011为4MHZ,100为2MHZ,101为1MHZ,110为500KHZ,111为250KHZ。当D6为1时,系统主时钟最高可采用频率为16MHZ。
等待晶振稳定: CLKCONSTA:时间频率状态寄存器。
D7 |
D6 |
D5~D3 |
D2~D0 |
当前32KHZ时间振荡器 |
当前系统时钟 |
当前定时器输出标记 |
当前系统主时钟 |
D7位为当前32KHZ时间振荡器频率。0为32KRC震荡,1为32K晶振。
D6位为当前系统时钟选择。0为32M晶振,1为16M RC震荡。
D5~D3为当前定时器输出标记。000为32MHZ,001为16MHZ,010为8MHZ,011为4MHZ,100为2MHZ,101为 1MHZ,110为500KHZ,111为250KHZ。
D2~D0为当前系统主时钟。000为32MHZ,001为16MHZ,010为8MHZ,011为4MHZ,100为2MHZ,101为1MHZ,110为500KHZ,111为250KHZ。
例子:
串口发送函数请参考下面源程序:
源程序代码(全)
/**************************************
描述:在串口调试助手上可以看到不停地
收到 CC2530 发过来的:HELLO WEBEE
波特率:115200bps
**************************************/
#include
#include
#define uint unsigned int
#define uchar unsigned char
//定义 LED 的端口
#define LED1 P1_0
#define LED2 P1_1
//函数声明
void Delay_ms(uint);
void initUART(void);
void UartSend_String(char *Data,int len);
char Txdata[14]; //存放”HELLO WEBEE “共 14 个字符串
/****************************************************************
延时函数
****************************************************************/
void Delay_ms(uint n)
{
uint I,j;
for(i=0;i
串口接收和发送(send & receive)
寄存器配置请参考上方实验 1 的表格。实验 1 较实验 1 增加了串口接收功
能,故寄存器配置有所改变,如下。
CLKCONCMD &= ~0x40; // 设置系统时钟源为 32MHZ 晶振
while(CLKCONSTA & 0x40); // 等待晶振稳定
CLKCONCMD &= ~0x47; // 设置系统主时钟频率为 32MHZ
PERCFG = 0x00; //位置 1 P0 口
P0SEL = 0x3c; //P0_2,P0_3,P0_4,P0_5用作串口,第二功能
P2DIR &= ~0XC0; //P0 优先作为 UART0 ,优先级
U0CSR |= 0x80; //UART 方式
U0GCR |= 11; //U0GCR 与 U0BAUD 配合
U0BAUD |= 216; // 波特率设为 115200
UTX0IF = 0; //UART0 TX 中断标志初始置位 1 (收发时候)
U0CSR |= 0X40; //允许接收
IEN0 |= 0x84; // 开总中断,接收中断
源程序代码(部分) 请读者自行分析
/**************************************
程序描述:例以 abc#方式发送,#为结束符,
返回 abc。波特率:115200bps
**************************************/
/****************************************************************
串口初始化函数
****************************************************************/
void InitUart()
{
CLKCONCMD &= ~0x40; // 设置系统时钟源为 32MHZ 晶振
while(CLKCONSTA & 0x40); // 等待晶振稳定
CLKCONCMD &= ~0x47; // 设置系统主时钟频率为 32MHZ
PERCFG = 0x00; //位置 1 P0 口
P0SEL = 0x3c; //P0_2,P0_3,P0_4,P0_5 用作串口,第二功能
P2DIR &= ~0XC0; //P0 优先作为 UART0 ,优先级
U0CSR |= 0x80; //UART 方式
U0GCR |= 11; //U0GCR 与 U0BAUD 配合
U0BAUD |= 216; // 波特率设为 115200
UTX0IF = 0; //UART0 TX 中断标志初始置位 1 (收发时候)
U0CSR |= 0X40; //允许接收
IEN0 |= 0x84; // 开总中断,接收中断
}
/****************************************************************
串口发送字符串函数
****************************************************************/
void Uart_Send_String(char *Data,int len)
{
{
int j;
for(j=0;j
六、睡眠唤醒
前言:
Zigbee 的特点就是远距离低功耗的无线传输设备,节点模块闲时可以进入睡眠模式,在需要传输数据时候进行唤醒,能进一步节省电量。本章将讲述CC2530 在睡眠模式下的 2 种唤醒方法:外部中断唤醒和定时器唤醒。 睡眠定时器用于设置系统进入和退出低功耗睡眠模式之间的周期。还用于当系统进入低功耗模式后,维持 MAC 定时器(T2)的定时。其特性如下: 长达 24 位定时计数器,运行在 32.768KHZ 的工作频率。24 位的比较器具有中断和 DMA 触发功能在 PM2 低功耗模式下运行系统电源管理(工作方式如下):
1. 全功能模式,高频晶振(16M 或者 32M )和低频晶振(32.768K RCOSC/XOSC )全部工作, 数字处理模块正常工作。
2. PM1 : 高频晶振(16M 或者 32M )关闭,低频晶振(32.768K RCOSC/XOSC )工作,数字核心模块正常工作。
3. PM2 :低频晶振(32.768K RCOSC/XOSC )工作, 数字核心模块关闭,系统通过 RESET,外部中断或者睡眠计数器溢出唤醒。
4. PM3 : 晶振全部关闭,数字处理核心模块关闭,系统只能通过 RESET 或外部中断唤醒。此模式下功耗最低。
1.中断唤醒 CC2530 需要配置的主要寄存器如下:PCON ,SLEEPCMD
配置方法:
SLEEPCMD |= i; // 设置系统睡眠模式,i=0,1,2,3
PCON = 0x01; // 进入睡眠模式 ,通过中断打断
PCON = 0x00; // 系统唤醒 ,通过中断打断
例子:
源程序代码(全)
/**********************************************
程序描述:LED2 闪烁 5 次后进入睡眠状态,通
过按下按键 S1 产生外部中断进行唤
醒,重新进入工作模式。
***********************************************/
#include
#define uint unsigned int
#define uchar unsigned char
//定义控制 LED 灯和按键的端口
#define LED2 P1_1 //定义 LED2 为 P11 口控制
#define KEY1 P0_0
//函数声明
void Delayms(uint); //延时函数
void InitLed(void); //初始化 P1 口
void SysPowerMode(uchar sel); //系统工作模式
/****************************
延时函数
*****************************/
void Delayms(uint xms) //i=xms 即延时 i 毫秒
{
uint I,j;
for(i=xms;i>0;i--)
for(j=587;j>0;j--);
}
/****************************
//初始化程序
*****************************/
void InitLed(void)
{
P1DIR |= 0x02; //P1_1 定义为输出
PICTL |= 0x02; //下降沿触发
LED2 = 0; //LED2 灯熄灭
P0INP &= ~0X01; //设置 P0 口输入电路模式为上拉/ 下拉
P0IEN |= 0X01; //P00 设置为中断方式
PICTL |= 0X01; // 下降沿触发
}
/***************************************************************
系统工作模式选择函数
* para1 0 1 2 3
* mode PM0 PM1 PM2 PM3
***************************************************************/
void SysPowerMode(uchar mode)
{
uchar I,j;
I = mode;
if(mode<4)
{
SLEEPCMD |= I; // 设置系统睡眠模式
for(j=0;j<4;j++);
PCON = 0x01; // 进入睡眠模式 ,通过中断打断
}
else
{
PCON = 0x00; // 系统唤醒 ,通过中断打断
}
}
/***************************
主函数
***************************/
void main(void)
{
uchar count = 0;
InitLed(); //调用初始化函数
IEN1 |= 0X20; //开 P0 口总中断
P0IFG |= 0x00; //清中断标志
EA = 1;
while(1)
{
LED2=~LED2;
if(++count>=10)
{
count=0;
SysPowerMode(3); //5 次闪烁后进入睡眠状态 PM3,
//等待按键 S1 中断唤醒
}
Delayms(500);
}
}
/*****************************************
中断处理函数-系统唤醒
*****************************************/
#pragma vector = P0INT_VECTOR
__interrupt void P0_ISR(void)
{
if(P0IFG>0)
{
P0IFG = 0; //清标志位
}
P0IF = 0;
SysPowerMode(4); //正常工作模式
}
2.定时器唤醒
24bit 定时器::ST0 ,ST1 ,ST2
唤醒时间寄存器有以下配置方法:
UINT32 sleepTimer = 0;
sleepTimer |= ST0;
sleepTimer |= (UINT32)ST1 << 8;
sleepTimer |= (UINT32)ST2 << 16;
sleepTimer += ((UINT32)sec * (UINT32)32768) //低速晶振;
ST2 = (UINT8)(sleepTimer >> 16);
ST1 = (UINT8)(sleepTimer >> 8);
ST0 = (UINT8) sleepTimer;
配置完毕后 sleepTimer 与 ST2<<16|ST1<<8|ST0 相差 sec 秒时间(低速晶振)
七、看门狗
具体配置可如下:
Init_Watchdog:
WDCTL = 0x00; //这是必须的,打开 IDLE 才能设置看门狗
WDCTL |= 0x08; //时间间隔一秒,看门狗模式
FeedDog:
WDCTL = 0xa0; //按寄存器描述来喂狗
WDCTL = 0x50;
源程序代码(全)
/**************************************/
程序描述:打开看门狗后,得记得喂狗,不然
系统就会不停地复位了。把喂狗注
释掉观察 LED1 现象
**************************************/
#include
#define uint unsigned int
#define uchar unsigned char
//定义控制 LED 灯的端口
#define LED1 P1_0
#define LED2 P1_1 //定义 LED2 为 P11 口控制
//函数声明
void Delayms(uint xms); //延时函数
void InitLed(void); //初始化 P1 口
/****************************
//延时函数
*****************************/
void Delayms(uint xms) //i=xms 即延时 i 毫秒
{
uint I,j;
for(i=xms;i>0;i--)
for(j=587;j>0;j--);
}
/****************************
//初始化程序
*****************************/
void InitLed(void)
{
P1DIR |= 0x03; //P1_0、P1_1 定义为输出
P1INP |= 0X03; //打开下拉
LED1 = 0; //LED1 灯熄灭
LED2 = 0; //LED2 灯熄灭
}
void Init_Watchdog(void)
{
WDCTL = 0x00; //这是必须的,打开 IDLE 才能设置看门狗
WDCTL |= 0x08; //时间间隔一秒,看门狗模式
}
void FeetDog(void)
{
WDCTL = 0xa0;
WDCTL = 0x50;
}
/***************************
//主函数
***************************/
void main(void)
{
InitLed(); //调用初始化函数
Init_Watchdog();
LED1=1;
while(1)
{
LED2=~LED2; //仅指示作用。
Delayms(300);
LED1=0;
//通过注释测试,观察 LED1,系统在不停复位。
FeetDog(); //喂狗,防止程序跑飞
}
}