我是靠谱客的博主 细心冰淇淋,这篇文章主要介绍cc2530 睡眠定时器串口显示功能描述,现在分享给大家,希望可以做个参考。

功能描述

cc2530 睡眠定时器串口显示

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
//第12次次课 (睡眠定时器方式唤醒) //体会1:切换系统主时钟16MHz和32MHz //体会2:当串口波特率比较高时候(19200),乱码多,降低后(9600)稳定, // 主要是因为双方硬件时钟不精确 #include <ioCC2530.h> typedef unsigned char uchar; typedef unsigned int uint; typedef unsigned long ulong; #define LED1 P1_0 //P1.0口控制LED1 #define LED2 P1_1 //P1.1口控制LED2 void init_xtal() {//初始化系统所用的主时钟 CLKCONCMD &=~0X40; //选择32MHz的外部晶体振荡器 while(CLKCONSTA & 0X40);//等待振荡器开启且稳定下来 CLKCONCMD &= ~0X07;//设置为时钟速度不分频=32MHZ } //延时函数msec 延时参数,值越大,延时越久 void DelayMS(uint msec) { uint i,j; for (i=0; i<msec; i++) for (j=0; j<535; j++); } void initU0() {//初始化串口0, //P72,备用位置1优先,P0_2=RX P0_3=TX. 位置2:P1_4=RX P1_5=TX PERCFG&=~(1<<0); //说明书P79, 设置串口0优先, P2DIR&=~(3<<6); //设置为外设功能,P0_2=RX P0_3=TX,必须配置这两个引脚为输出 P0SEL|=0X0C; //0000 1100 //串口模式 第7位:0=SPI同步串口模式 1=UART通用异步模式 U0CSR |=(1<<7); U0CSR |=0X40; //使能接收器 /*时钟为32MHz时的波特率设置表,当为16MHz时BAND_E加1即可 波特率 BAND_M(UxBAND) BAND_E(UxGCR[4:0]) 2400 59 6 4800 59 7 9600 59 8 14400 216 8 19200 59 9 28800 216 9 38400 59 10 57600 216 10 76800 59 11 115200 216 11 230400 216 12 */ U0BAUD|=59; //波特率=9600,小数部分BAND_M U0GCR|=8; //波特率指数部分BAND_E, U0GCR |=10;时钟=32MHz时 ,若时钟为16MHz时,BAND_E加1. UTX0IF=0; //p41, 清除串口0发送中断标志位 URX0IF=0; //p40,清除串口0接收中断标志位 IEN2 |=0X40; //p39,打开串口0发送中断开关 URX0IE =1; //P38,打开串口0接收中断开关 EA =1; //开总中断 } void U0SendString(uchar *data) { while(*data!='') { U0DBUF= *data++; while(UTX0IF==0); // (U0CSR & 0X02)//等待发送完毕 UTX0IF=0;//清除发送中断标志 } } //设置LED灯相应的IO口 void InitLed(void) { P1SEL &=0X03; //两个LED灯设置为普通端口 P1DIR |= 0x03; //P1_0 P1_1定义为输出口 LED1 = 0; LED2 = 0; //LED1灯上电默认为打开 } //设置系统工作模式mode等于0为PM0 1为PM1 2为PM2 3为PM3 void SysPowerMode(uchar mode) { if(mode>0 && mode < 4) { SLEEPCMD |= mode; //设置系统睡眠模式 PCON = 0x01; //进入睡眠模式 ,通过中断唤醒 } else { SLEEPCMD &= ~0x03; //设置系统进入PM0 PCON = 0x00; //通过中断唤醒系统 DelayMS(10); } } //初始化休眠定时器,设定后经过指定时间自行唤醒 void InitSleepTimer(void) { ST2 = 0X00; //设置睡眠定时器初始值 ST2:ST1:ST0 必须按照这个顺序来写入 ST1 = 0X00; //定时时钟为32K(rc或者xosc) ST0 = 0X00; //设置时间 STIF = 0; //睡眠定时器中断标志 0: 无中断未决 1: 中断未决 STIE = 1; //睡眠定时器中断使能 0: 中断禁止 1: 中断使能 EA = 1; //开中断 } //设置睡眠时间sec 睡眠时间 void Set_ST_Period(uint sec) { ulong sleepTimer = 0; //临时变量,取得当前睡眠定时器的计数值 sleepTimer |= ST0; //取得计数值的低8位 sleepTimer |= (ulong)ST1 << 8; //取得中级8位 sleepTimer |= (ulong)ST2 << 16; //取得高8位 //在现在的基础上,计算出应该计数到多少 sleepTimer += ((ulong)sec * (ulong)32768); ST2 = (uchar)(sleepTimer >> 16); //写入高8位 ST1 = (uchar)(sleepTimer >> 8); //写入中级8位 ST0 = (uchar) sleepTimer; //写入低8位,开始计时 } //中断处理函数 #pragma vector = ST_VECTOR __interrupt void ST_ISR(void) { EA=0;//关闭中断开关 STIF = 0; //清标志位 //醒过来了,此时进入工作状态,发送心跳包 LED2=0; //向串口发送数据包,比如GPS位置,温湿度、烟雾等等传感器数据 U0SendString("Get DATAn"); U0SendString("...n"); EA=1; } void main(void) { uchar i=0; InitLed(); //设置LED灯相应的IO口 InitSleepTimer(); //初始化休眠定时器 initU0();//初始化串口0,设置波特率57600 init_xtal();//选择系统主时钟为32MHz //现在是清醒状态,PM0模式,LED1闪烁3次提醒用户将进入睡眠模式 for (i=0; i<6; i++) { LED1 = ~LED1; LED2 = ~LED2; DelayMS(500); } while(1) { LED2 = 1; //关闭LED灯,表示要进入睡眠模式了 Set_ST_Period(5); //设置睡眠时间,睡眠5秒后唤醒系统 U0SendString("Sleep for 5s.n"); U0SendString("...n"); //进入睡眠模式PM2=关闭高频振荡器,关闭稳压器,低功耗模式,等待睡眠定时器或者外部中断 SysPowerMode(2); } }

最后

以上就是细心冰淇淋最近收集整理的关于cc2530 睡眠定时器串口显示功能描述的全部内容,更多相关cc2530内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(72)

评论列表共有 0 条评论

立即
投稿
返回
顶部