* 导师视频讲解:[**去听课**](https://www.bilibili.com/video/BV1k34y1D7Vz?p=15)
>[success] **技术支持说明:**
>**1**.一般以自主学习为主
> **2**.可到官方问答社区中提问:[**去提问**](https://bbs.csdn.net/forums/zigbee)
> **3**.工程师**会尽快**解答社区问题,但他们是一线开发,【**难以保证**】解答时效,解答辛苦,感谢理解!
<br/>
## **理论基础**
* **休眠及唤醒**:CC2530内部有很多模块,例如定时器模块、收发器模块和51内核等等,这些数字模块不工作时就不耗电,我们把模块这种状态称为“**休眠**”。这些模块由“休眠”状态进入工作状态时,这个过程称为“**唤醒**”。
###
* **低功耗**:低功耗是指芯片耗电量非常少。一般地,耗电量的大小取决于芯片内部有多少模块处于休眠状态,有多少模块处于工作状态。我们也可以给低功耗分等级:芯片内部的越多模块处于休眠状态,其功耗就越低。
###
* **低功耗定时器**:也称为休眠定时器,可以定时一段时间,在这段时间内会让相关模块进入休眠状态,时间到了再将其唤醒。
CC2530中的休眠定时器是一个24 位的定时器,其时钟频率为:32768kHz
<br/>
## **电源管理模式**
CC2530有以下集中电源管理模式:
* **全功能模式**:高频晶振(16M或者32M)和低频晶振(32.768K RCOSC/XOSC)全部工作,数字处理器模块正常工作
###
* **空闲模式**:除了CPU内核停止运行之外,其他和全功能模式一样
###
* **PM1**:高频晶振关闭,低频晶振正常工作,数字核心模块正常工作
###
* **PM2**:低频晶振工作,数字核心模块关闭,系统通过RESET,外部中断或者休眠计数器溢出唤醒
###
* **PM3**:晶振全部关闭,数字处理器核心模块关闭,系统只能通过RESET或者外部中断唤醒,此模式功耗最低
<br/>
## **相关寄存器**
![](https://img.kancloud.cn/0a/82/0a82c060fc9609e0fa8df5ecc37098c6_982x1076.png =500x)
<br/>
## **寄存器配置**
休眠定时器初始化配置:
###
```
1.ST2 = 0; ST1 = 0; ST0 = 0; // 清零休眠定时器计数器
2.STIE = 1; // 开启休眠定时器中断
3.STIF = 0; // 清零休眠定时器中断标志
4.EA = 1; // 打开中断总开关
```
###
配置休眠时间:
1. 由于休眠定时器工作的时钟频率是32768HZ,也就是计数32768次为1秒!
###
2. 配置休眠时间时,只需要把当前的计数器数值读出来,加上我们需要定时的时间计数值再重新设置到寄存器中即可:
读取当前休眠定时器的计数值:
###
```
1.uint32_t sleepTimer = 0;
2.sleepTimer = (uint32_t)ST0;
3.sleepTimer |= (uint32_t)ST1 << 8;
4.sleepTimer |= (uint32_t)ST2 << 16;
```
###
加上我们需要定时的时间对应的计数次数,因为计数32768次为1秒,假设我们需要定时sec秒,那就是计数 sec \* 32768次:
###
```
1.// 更新睡眠时间
2.sleepTimer += (uint32_t)sec * 32768;
把计数值重新配置到寄存器中
1.ST2 = (uint8_t)(sleepTimer >> 16);
2.ST1 = (uint8_t)(sleepTimer >> 8);
3.ST0 = (uint8_t)(sleepTimer);
```
###
配置休眠模式:
```
1.SLEEPCMD |= mode; // 设置该定时器Bit[1:0],mode: 0~3
2.PCON = 0x01; // 进入睡眠模式
```
退出休眠模式:
```
1.// 退出休眠
2.PCON = 0x00;
```
<br/>
## **源码分析**
### 主函数:
```
void main()
{
initLed();
initSleepTimer();
while(1)
{
uint8_t i;
for (i = 0; i < 6; i++) {
LED = (LED == LED_ON)?LED_OFF : LED_ON;
delayMs(SYSCLK_32MHZ ,250);
}
DEBUG_LOG("Sleeping...\r\n");
setSleepPeriod(5);
setPowerMode(POWER_MODE_PM2);
}
}
```
  主函数初始化后做了两件事情,闪烁3次LED灯,然后设置休眠定时器的定时时间为5秒,接着设置电源管理模式为PM2,然后就开始启动进入休眠状态了(CPU不工作)。
###
  睡眠定时器中断服务函数(休眠定时器到时间后会中断,在中断处理程序中,CPU重新工作起来):
```
/*
* Sleep timer ISR
*/
#pragma vector = ST_VECTOR
__interrupt void SleepTimer_ISR(void)
{
STIF = 0; // Clear interrupt flag
setPowerMode(POWER_MODE_ACTIVE); // Entry active power mode
DEBUG_LOG("Activing...\r\n");
}
```
###
初始化休眠定时器函数:
```
static void initSleepTimer(void)
{
ST2 = 0;
ST1 = 0;
ST0 = 0;
STIE = 1;
STIF = 0;
EA = 1;
}
```
设置休眠定时器定时时间,即读出当前计数值、加入新的数值、重新设置计数器:
```
static void setSleepPeriod(uint8_t nS)
{
uint32_t sleepTimer = 0;
sleepTimer = (uint32_t)ST0;
sleepTimer |= (uint32_t)ST1 << 8;
sleepTimer |= (uint32_t)ST2 << 16;
sleepTimer += (uint32_t)nS * 32768;
ST2 = (uint8_t)(sleepTimer >> 16);
ST1 = (uint8_t)(sleepTimer >> 8);
ST0 = (uint8_t)(sleepTimer);
}
```
设置电源模式(低功耗模式):
```
static void setPowerMode(PowerMode_t mode)
{
if (mode > _POWER_MODE_MAX) {
DEBUG_LOG("Power mode not found: %d\r\n", (int)mode);
return;
}
if (mode == POWER_MODE_ACTIVE) {
PCON = 0x00;
return; // Don't sleep
}
SLEEPCMD |= mode; // Set power mode
PCON = 0x01; // Entering sleep mode
}
```
休眠定时器有4种电源模式,我们把这几种模式定义为类型PowerMode\_t:
```
/*
* Power modes: Active mode, PM1, PM2, PM3
*/
typedef enum
{
POWER_MODE_IDLE = 0,
POWER_MODE_PM1 = 1,
POWER_MODE_PM2 = 2,
POWER_MODE_PM3 = 3,
POWER_MODE_ACTIVE = 4,
_POWER_MODE_MAX = POWER_MODE_ACTIVE,
}PowerMode_t;
```
<br/>
## **调试仿真**
>[danger] 在学习本节课前,需要先掌握基本的程序下载及仿真操作,参考:[程序下载及仿真](2482302)
编译完成后,通过仿真器连接开发板和电脑,进入仿真模式:
![](https://img.kancloud.cn/96/e9/96e92a299fc68c70bdf883d73423d163_444x504.png =300x)
  可以看到,开发板在LED闪烁3次后就打印Sleep...,这个时候CC2530进入了休眠状态。休眠定时器在定时时间到了后会触发中断,中断服务函数中会让芯片重新进入正常工作状态。
<br/>
<br/>
## **项目定制**
* 如需项目定制开发,可扫码添加项目经理好友(注明“**项目定制**”)
* 定制范围:**NB-IoT**、**CATn(4G)**、**WiFi**、**ZigBee**、**BLE Mesh**以及**STM32**、**嵌入式Linux**等IoT技术方案
* 善学坊官网:[www.sxf-iot.com](https://www.sxf-iot.com/)
![](https://img.kancloud.cn/ca/73/ca739f92cab220a3059378642e3bd502_430x430.png =200x)
* 非项目定制**勿扰**,此处**非**技术支持
- 课程简介
- 配套资源下载
- 配套开发套件简介
- 简介
- 技术参数
- 电路原理图 & PCB图——标准板
- 电路原理图 & PCB图——MiNi板
- CC2530F256 核心模组
- MCU简介
- 模组尺寸 & 引脚定义
- 模组技术参数
- 电路原理图 & PCB设计图
- 封装及生产指导
- 第一部分:准备
- 1.1 小白也能读懂的 ZigBee 3.0 简介
- 1.2 IAR EW for 8051 简介与安装
- 1.3 TI Z-Stack 3.0 简介与安装
- 1.4 SmartRF Flash Programmer 下载与安装
- 1.5 串口助手简介与安装
- 1.6 SmartRF04EB 驱动程序
- 1.7 USB转串口驱动程序
- 其他软件安装(非必须)
- 1.7.1 Xshell 7 简介与安装指南
- 1.7.2 PuTTY 简介与安装
- 第二部分:51单片机入门——基于CC2530
- 第1章:CC2530 开发基础实验
- 1.1 新建工作空间及工程
- 1.2 源代码编写及编译
- 1.3 程序下载及仿真
- 1.4 固件烧录
- 第2章:GPIO实验
- 2.1 多工程管理基础
- 2.2 GPIO输出实验——LED控制
- 2.3 GPIO输入实验——机械按键
- 2.4 GPIO输入输出通用配置实验
- 2.5 GPIO外部中断实验
- 第3章:定时器实验
- 3.1 工程概述
- 3.2 定时器T1实验——查询触发
- 3.3 定时器T3实验——中断触发
- 3.4 看门狗定时器实验
- 3.5 低功耗定时器实验
- 第4章:串口通信实验
- 第5章:ADC实验——使用光照传感器
- 第6章:OLED 显示器实验
- 第7章:外设实验
- 7.1 DHT11温湿度传感器
- 7.2 NorFLASH读写实验
- 7.3 继电器控制实验
- 第三部分:Z-Stack 3.0 详解
- 第1章:Z-Stack 3.0 架构详解
- 1.1 Z-Stack 3.0.1 文件组织
- 2.2 Z-Stack 3.0.1 工程框架
- 第2章:操作系统的任务调度原理
- 第3章:OSAL 详解
- 3.1 OSAL的任务调度原理
- 3.2 任务初池始化与事件处理
- 3.3 Z-Stack 事件的应用
- 3.4 使用动态内存
- 第4章:硬件适配层应用——LED
- 4.1 HAL的文件结构和工程结构
- 4.2 HAL的架构简介
- 4.2 LED API简介
- 4.3 LED 实验
- 第5章:硬件适配层应用——按键
- 5.1 按键实验
- 5.2 HAL 按键框架详解(选修)
- 第6章:硬件适配层应用——串口
- 第7章:硬件适配层应用——显示屏
- 第8章:硬件适配层应用——ADC
- 第四部分:ZigBee 3.0 网络编程
- 第1章:ZigBee 3.0 网络原理
- 1.1 协议层次结构
- 1.2 IEEE 802.15.4协议
- 1.3 网络层
- 第2章:ZigBee 3.0 BDB
- 2.1 BDB 简介
- 2.2 BDB Commissioning Modes
- 2.3 ZigBee 3.0 组网实验
- 第3章:基于AF的数据通信
- 3.1 简单描述符
- 3.2 通信原理
- 3.3 数据发送API简介
- 3.4 ZigBee 3.0 通信实验
- 第4章:ZCL 基本原理
- 4.1 ZCL 简介
- 4.2 ZCL 内容详解
- 第5章:基于ZCL的开关命令收发
- 5.1 应用层对 ZCL API 的调用
- 5.2 ZCL 开关命令收发 API
- 5.3 ZCL 开关命令收发实验
- 第6章:基于ZCL的属性读写
- 6.1 ZCL 属性读写 API
- 6.2 ZCL 属性读写实验
- 第7章:基于ZCL的属性上报实验
- 7.1 概述
- 7.2 终端设备开发
- 7.3 协调器设备开发
- 7.4 仿真调试
- 课外篇:项目实战
- ZigBee 3.0 环境信息采集
- 基于ZigBee的农业环境信息采集
- 基于ZigBee的文件传输系统
- 基于ZigBee的光照自动开关窗帘
- 基于ZigBee的温湿度 & 光照强度采集系统
- 其他项目
- 基于ZigBee的温度和有害气体短信报警系统
- 基于ZigBee的多传感器探测与亮灯报警系统
- 基于ZigBee的温湿度、人体红外与声光报警系统
- ZigBee 3.0 多节点组网实战
- 基于ZigBee的温湿度 & 信号强度探测系统
- 课外篇:进阶选修
- 《课外篇:进阶选修》的说明
- 第1章:串口通信协议设计
- 1.1 设计基础
- 1.2 协议格式
- 第2章:优化协调器工程结构
- 2.1 工程结构
- 2.2 应用框架详解
- 2.2.1 框架说明
- 2.2.2 zbmsg
- 2.2.3 zbcategory
- 第3章:协调器上位机调试
- 3.1上位机说明
- 3.2 调试说明
- 第4章:信道及PanId的动态修改
- 4.1 串口协议
- 4.2 重要接口说明
- 4.2.1 NIB
- 4.2.2 NLME_UpdateNV
- 4.3 架构调整
- 4.4 应用
- 4.4.1 zbnwk接口实现
- 4.4.2 串口通信解析
- 4.4.3 烧录调试
- 第5章:网络短地址及MAC地址的获取
- 5.1 接口说明
- 5.1.1 描述
- 5.1.2 调用流程
- 5.1.3 异步数据
- 5.2 调试
- 第6章:入网控制及白名单
- 6.1 基本内容
- 6.1.1 入网控制
- 6.1.2 白名单
- 6.2 函数封装
- 6.3 程序调试
- 第7章:协调器分区存储管理
- 7.1 软件框架
- 7.2 应用
- 7.3 调试
- ZigBee 2 WiFi —— 基于ESP8266
- 1.使用云端服务器
- 2.源码说明与测试
- 3.ESP8266模块参考资料
- ZigBee 无线报文的抓取与分析
- 接入小米Aqara智能插座和温湿度传感器
- Z-Stack的NV应用
- 1. NV 简介
- 2. NV的读写
- 基于HAL的外部FLASH应用
- TFT显示器实验(选修)
- Lighting工程源码分析
- 9.1 ZHA Lighting工程
- 9.2 ZHA Lighting源码分析
- 9.3 Lighting亮度调节实验
- TemperatureSensor工程源码分析
- 10.1 ZHA TemperatureSensor工程
- 10.2 ZHA TemperatureSensor源码分析
- 版权声明与免责声明